From 14337cf5b302c5385f0ae1393caf6df7e83fc539 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Sat, 07 Dec 2019 06:52:19 +0000
Subject: [PATCH] 1. 允许绑定字段到std::optional和std::any 2. 增加函数bind_fields可以一次绑定到多个字段 3. 查询函数返回数据库对象自身,以支持链式调用

---
 include/qtl_sqlite.hpp |   42 ++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 42 insertions(+), 0 deletions(-)

diff --git a/include/qtl_sqlite.hpp b/include/qtl_sqlite.hpp
index 157c82f..b0e1807 100644
--- a/include/qtl_sqlite.hpp
+++ b/include/qtl_sqlite.hpp
@@ -224,6 +224,48 @@
 		bind_field(index, value.data(), value.size());
 	}
 
+#ifdef _QTL_ENABLE_CPP17
+
+	template<typename T>
+	inline void bind_field(size_t index, std::optional<T>&& value)
+	{
+		int type = get_column_type(index);
+		if (type == SQLITE_NULL)
+		{
+			value.reset();
+		}
+		else
+		{
+			qtl::bind_field(*this, index, *value);
+		}
+	}
+
+	inline void bind_field(size_t index, std::any&& value)
+	{
+		int type = get_column_type(index);
+		switch(type)
+		{
+		case SQLITE_NULL:
+			value.reset();
+		case SQLITE_INTEGER:
+			value = sqlite3_column_int64(m_stmt, index);
+			break;
+		case SQLITE_FLOAT:
+			value = sqlite3_column_double(m_stmt, index);
+			break;
+		case SQLITE_TEXT:
+			value.emplace<std::string_view>((const char*)sqlite3_column_text(m_stmt, index), sqlite3_column_bytes(m_stmt, index));
+			break;
+		case SQLITE_BLOB:
+			value.emplace<const_blob_data>(sqlite3_column_text(m_stmt, index), sqlite3_column_bytes(m_stmt, index));
+			break;
+		default:
+			throw sqlite::error(SQLITE_MISMATCH);
+		}
+	}
+
+#endif // C++17
+
 	size_t find_field(const char* name) const
 	{
 		size_t count=get_column_count();

--
Gitblit v1.9.3