From f046bd8361574f0823001bc06ad00032d7192ba8 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Tue, 14 May 2019 13:35:14 +0000
Subject: [PATCH] 提供以标准流的方式直接操纵MySQL的BLOB字段 修正一些错误

---
 README.md |   28 ++++++++++++++++++++++------
 1 files changed, 22 insertions(+), 6 deletions(-)

diff --git a/README.md b/README.md
index fdbfb59..e89d4d2 100644
--- a/README.md
+++ b/README.md
@@ -115,15 +115,16 @@
 1. 为你的字符串类型,对 qtl::bind_string_helper 实现一个专门化。如果该字符串类型有符合标准库字符串语义的以下成员函数,可以跳过这一步:assign,clear,resize,data,size;
 2. 为你的字符串类型,对 qtl::bind_field 实现一个专门化;
 
-因为QT的QString有兼容标准库的成员函数,所以绑定到QString只需要一步:
+因为 QT 的 QByteArray 有兼容标准库的成员函数,所以绑定到 QByteArray 只需要一步:
+一般数据库不提供到 QChar/QString 的绑定,所以只能先用 QByteArray 接收数据,然后转换为 QString。
 
 ```C++
 namespace qtl
 {
 	template<typename Command>
-	inline void bind_field(Command& command, size_t index, QString&& value)
+	inline void bind_field(Command& command, size_t index, QByteArray&& value)
 	{
-		command.bind_field(index, bind_string(std::forward<QString>(value)));
+		command.bind_field(index, bind_string(std::forward<QByteArray>(value)));
 	}
 }
 
@@ -186,8 +187,14 @@
 | float | float |
 | double | double |
 | char<br>varchar | const char*<br>std::string |
-| blob<br>binary<br>text | qtl::const_blob_data<br>std::istream |
+| blob<br>binary<br>text | qtl::const_blob_data<br>std::istream<br>qtl::mysql::blob_writer |
 | date<br>time<br>datetime<br/>timestamp | qtl::mysql::time |
+
+blob_writer是一个函数,它的定义如下:
+```C++
+typedef std::function<void(std::ostream&)> blob_writer;
+```
+该函数通过std::ostream类型的参数向BLOB字段写入数据。因为MySQL API的限制,该流基本只能向前移动,并不建议对该流随意调整写入位置。
 
 ### MySQL的字段数据绑定
 
@@ -199,10 +206,19 @@
 | bigint | int64_t<br/>uint64_t |
 | float | float |
 | double | double |
-| char<br>varchar | char[N]<br>std::array&lt;char, N&gt;<br>std::string |
-| blob<br>binary<br>text | qtl::blob_data<br>std::ostream |
+| char<br>varchar | char[N]<br>std::array&lt;char, N&gt;<br>std::string<br>std::istream
+| blob<br>binary<br>text | qtl::blob_data<br>std::ostream<br>qtl::mysql::blobbuf
 | date<br>time<br>datetime<br>timestamp | qtl::mysql::time |
 
+可以通过qtl::mysql::blobbuf读取BLOB字段的数据:
+```C++
+void read_blob(qtl::mysql::blobbuf& buf) {
+	istream s(&buf);
+	...
+};
+```
+因为MySQL API的限制,该流只能向前移动,并不建议对该流随意调整读取位置。
+
 ### MySQL相关的C++类
 - qtl::mysql::database
 表示一个MySQL的数据库连接,程序主要通过这个类操纵数据库。

--
Gitblit v1.9.3