From 9ed5ee9526d36df8d5b96fd461c08c7c56e1dc04 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Sat, 15 Apr 2017 09:32:33 +0000
Subject: [PATCH] 支持返回多结果集的查询

---
 include/qtl_sqlite.hpp |   59 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/include/qtl_sqlite.hpp b/include/qtl_sqlite.hpp
index 20f7e00..f316bed 100644
--- a/include/qtl_sqlite.hpp
+++ b/include/qtl_sqlite.hpp
@@ -40,7 +40,8 @@
 	statement() : m_stmt(NULL), m_fetch_result(SQLITE_OK) { }
 	statement(const statement&) = delete;
 	statement(statement&& src) 
-		: m_stmt(src.m_stmt), m_fetch_result(src.m_fetch_result)
+		: m_stmt(src.m_stmt), m_fetch_result(src.m_fetch_result),
+		m_tail_text(std::forward<std::string>(src.m_tail_text))
 	{
 		src.m_stmt=NULL;
 		src.m_fetch_result=SQLITE_OK;
@@ -52,6 +53,7 @@
 		{
 			m_stmt=src.m_stmt;
 			m_fetch_result=src.m_fetch_result;
+			m_tail_text=std::forward<std::string>(src.m_tail_text);
 			src.m_stmt=NULL;
 			src.m_fetch_result=SQLITE_OK;
 		}
@@ -64,8 +66,13 @@
 
 	void open(sqlite3* db, const char* query_text, size_t text_length=-1)
 	{
+		const char* tail=NULL;
 		close();
-		verify_error(sqlite3_prepare_v2(db, query_text, (int)text_length, &m_stmt, NULL));
+		verify_error(sqlite3_prepare_v2(db, query_text, (int)text_length, &m_stmt, &tail));
+		if(tail!=NULL)
+			m_tail_text.assign(tail, query_text+text_length);
+		else
+			m_tail_text.clear();
 	}
 
 	void close()
@@ -245,19 +252,17 @@
 	{
 		return sqlite3_column_text(m_stmt, col);
 	}
-	void get_value(int col, std::string&& value) const
+
+	template<typename CharT>
+	const CharT* get_text_value(int col) const;
+
+	template<typename T>
+	void get_value(int col, qtl::bind_string_helper<T>&& value) const
 	{
+		typedef typename qtl::bind_string_helper<T>::char_type char_type;
 		int bytes=sqlite3_column_bytes(m_stmt, col);
 		if(bytes>0)
-			value.assign((const char*)sqlite3_column_text(m_stmt, col), bytes/sizeof(char));
-		else
-			value.clear();
-	}
-	void get_value(int col, std::wstring&& value) const
-	{
-		int bytes=sqlite3_column_bytes16(m_stmt, col);
-		if(bytes>0)
-			value.assign((const wchar_t*)sqlite3_column_text16(m_stmt, col), bytes/sizeof(wchar_t));
+			value.assign(get_text_value<char_type>(col), bytes/sizeof(char_type));
 		else
 			value.clear();
 	}
@@ -326,6 +331,23 @@
 		return result;
 	}
 
+	bool next_result()
+	{
+		sqlite3* db=sqlite3_db_handle(m_stmt);
+		int count=0;
+		do
+		{
+			trim_string(m_tail_text, " \t\r\n");
+			if(!m_tail_text.empty())
+			{
+				open(db, m_tail_text.data(), m_tail_text.size());
+				count=sqlite3_column_count(m_stmt);
+				m_fetch_result=SQLITE_OK;
+			}
+		}while(!m_tail_text.empty() && count==0);
+		return count>0;;
+	}
+
 	int affetced_rows()
 	{
 		sqlite3* db=sqlite3_db_handle(m_stmt);
@@ -340,6 +362,8 @@
 
 protected:
 	sqlite3_stmt* m_stmt;
+	std::string m_tail_text;
+	
 	int m_fetch_result;
 	void verify_error(int e)
 	{
@@ -462,6 +486,17 @@
 	return stmt;
 }
 
+template<>
+inline const char* statement::get_text_value<char>(int col) const
+{
+	return (const char*)sqlite3_column_text(m_stmt, col);
+}
+template<>
+inline const wchar_t* statement::get_text_value<wchar_t>(int col) const
+{
+	return (const wchar_t*)sqlite3_column_text16(m_stmt, col);
+}
+
 }
 
 }

--
Gitblit v1.9.3