From 18b8205f3984bff211131f82e4c0a1e33886ea64 Mon Sep 17 00:00:00 2001
From: znone <glyc@sina.com.cn>
Date: Tue, 27 Aug 2019 12:35:52 +0000
Subject: [PATCH] 提供以标准流的方式直接操纵ODBC的BLOB字段
---
test/TestOdbc.cpp | 62 ++++++++++++++++++++++++++++++
1 files changed, 61 insertions(+), 1 deletions(-)
diff --git a/test/TestOdbc.cpp b/test/TestOdbc.cpp
index c018451..3230362 100644
--- a/test/TestOdbc.cpp
+++ b/test/TestOdbc.cpp
@@ -29,7 +29,7 @@
template<>
inline void bind_record<qtl::odbc::statement, TestOdbcRecord>(qtl::odbc::statement& command, TestOdbcRecord&& v)
{
- qtl::bind_field(command, 0, v.id);
+ qtl::bind_field(command, (size_t)0, v.id);
qtl::bind_field(command, 1, v.name);
qtl::bind_field(command, 2, v.create_time);
}
@@ -38,6 +38,7 @@
TestOdbc::TestOdbc() : m_db(m_env)
{
m_db.open("DRIVER={SQL Server};SERVER=(local);UID=;PWD=;Trusted_Connection=yes;DATABASE=test");
+ //m_db.open("DRIVER={SQL Server};SERVER=(local);UID=;PWD=;Trusted_Connection=no;DATABASE=test;UID=sa;PWD=111111;");
cout<<"DBMS: "<<m_db.dbms_name()<<endl;
cout<<"SERVER: "<<m_db.server_name()<<endl;
cout<<"USER: "<<m_db.user_name()<<endl;
@@ -53,6 +54,8 @@
TEST_ADD(TestOdbc::test_iterator)
TEST_ADD(TestOdbc::test_insert_blob)
TEST_ADD(TestOdbc::test_select_blob)
+ TEST_ADD(TestOdbc::test_insert_stream)
+ TEST_ADD(TestOdbc::test_fetch_stream)
}
void TestOdbc::test_dual()
@@ -230,6 +233,62 @@
ASSERT_EXCEPTION(e);
}
}
+void TestOdbc::test_insert_stream()
+{
+ try
+ {
+ qtl::blob_writer writer = [](std::ostream& s) {
+ for (size_t i = 0; i != 100; i++)
+ {
+ s << i << ": ";
+ for (size_t j = 0; j <= i; j++)
+ s << char('a' + j % 26);
+ s << endl;
+ for (size_t j = 0; j <= i; j++)
+ s << '-';
+ s << endl;
+ }
+ };
+ m_db.execute("INSERT INTO test_stream ([Data]) values(?)",
+ writer);
+ m_db.query_first("SELECT @@IDENTITY", id);
+ }
+ catch (qtl::odbc::error& e)
+ {
+ ASSERT_EXCEPTION(e);
+ }
+}
+
+void TestOdbc::test_fetch_stream()
+{
+ try
+ {
+ m_db.query("SELECT Data from test_stream", [](qtl::odbc::blobbuf&& buf) {
+ istream s(&buf);
+ string str;
+ while (!s.eof())
+ {
+ getline(s, str);
+ cout << str << endl;
+ }
+ s.clear(ios_base::goodbit | ios_base::eofbit);
+ s.seekg(0, ios::beg);
+ if (s.good())
+ {
+ cout << "again:" << endl;
+ while (!s.eof())
+ {
+ getline(s, str);
+ cout << str << endl;
+ }
+ }
+ });
+ }
+ catch (qtl::odbc::error& e)
+ {
+ ASSERT_EXCEPTION(e);
+ }
+}
void TestOdbc::get_md5(std::istream& is, unsigned char* result)
{
@@ -249,6 +308,7 @@
cout<<hex;
for(size_t i=0; i!=n; i++)
cout<<(data[i]&0xFF);
+ cout<<dec;
}
int main(int argc, char* argv[])
--
Gitblit v1.9.3