#include "stdafx.h" #include "TestOdbc.h" #include #include #include "md5.h" using namespace std; struct TestOdbcRecord { uint32_t id; char name[33]; qtl::odbc::timestamp create_time; TestOdbcRecord() { memset(this, 0, sizeof(TestOdbcRecord)); } void print() const { printf("ID=\"%d\", Name=\"%s\"\n", id, name); } }; namespace qtl { template<> inline void bind_record(qtl::odbc::statement& command, TestOdbcRecord&& v) { qtl::bind_field(command, (size_t)0, v.id); qtl::bind_field(command, 1, v.name); qtl::bind_field(command, 2, v.create_time); } } 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: "<& id, const std::string& name, const qtl::odbc::timestamp& create_time) { printf("ID=\"%d\", Name=\"%s\"\n", id.data, name.data()); }); m_db.query("select * from test where id=?", id, [](const TestOdbcRecord& record) { printf("ID=\"%d\", Name=\"%s\"\n", record.id, record.name); }); m_db.query("select * from test where id=?", id, &TestOdbcRecord::print); } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } } void TestOdbc::test_insert() { try { m_db.execute("insert into test(Name, CreateTime) values(?, CURRENT_TIMESTAMP)", "test_user"); m_db.query_first("SELECT @@IDENTITY", id); } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } TEST_ASSERT_MSG(id>0, "insert failture."); } void TestOdbc::test_insert2() { try { uint64_t affected=0; qtl::odbc::statement stmt=m_db.open_command("insert into test(Name, CreateTime) values(?, CURRENT_TIMESTAMP)"); qtl::execute(stmt, &affected, "second_user", "third_user"); TEST_ASSERT_MSG(affected==2, "Cannot insert 2 records to table test."); } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } } void TestOdbc::test_update() { try { m_db.execute_direct("update test set Name=? WHERE ID=?", NULL, "other_user", id); } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } TEST_ASSERT_MSG(id>0, "insert failture."); } void TestOdbc::test_clear() { try { m_db.simple_execute("delete from test"); } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } } void TestOdbc::test_iterator() { try { cout<<"after insert all:"<("select ID, Name, CreateTime from test")) { printf("ID=\"%d\", Name=\"%s\"\n", record.id, record.name); } } catch(qtl::odbc::error& e) { ASSERT_EXCEPTION(e); } } void TestOdbc::test_insert_blob() { try { #ifdef _WIN32 const char filename[]="C:\\windows\\explorer.exe"; #else const char filename[]="/bin/sh"; #endif //_WIN32 fstream fs(filename, ios::binary|ios::in); TEST_ASSERT_MSG(fs, "Cannot open test file."); unsigned char md5[16]={0}; char md5_hex[33]={0}; get_md5(fs, md5); cout<<"MD5 of file "< buffer; MD5_CTX context; MD5Init(&context); while(!is.eof()) { is.read(&buffer.front(), buffer.size()); MD5Update(&context, (unsigned char*)buffer.data(), (unsigned int)is.gcount()); } MD5Final(result, &context); } void TestOdbc::print_hex(const unsigned char* data, size_t n) { cout<