/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2010-2011 Artyom Beilis (Tonkikh) // // Distributed under: // // the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // or (at your opinion) under: // // The MIT License // (See accompanying file MIT.txt or a copy at // http://www.opensource.org/licenses/mit-license.php) // /////////////////////////////////////////////////////////////////////////////// #include #include #include #include #define TEST(x) do { if(x) break; std::ostringstream ss; ss<<"Failed in " << __LINE__ <<' '<< #x; throw std::runtime_error(ss.str()); } while(0) class my_specific_a : public cppdb::connection_specific_data { public: int val; my_specific_a(int v=0) : val(v) {} }; class my_specific_b : public cppdb::connection_specific_data { public: int val; my_specific_b(int v=0) : val(v) {} }; int call_counter = 0; void caller(cppdb::session &) { call_counter++; } struct functor_caller { void operator()(cppdb::session &) const { call_counter++; } }; int main(int argc,char **argv) { std::cout << "Testing CppDB version `" << cppdb::version_string() << "' " << cppdb::version_number() << std::endl; std::string cs = "sqlite3:db=db.db"; if(argc >= 2) { cs = argv[1]; } try { cppdb::session sql(cs); try { sql << "DROP TABLE test" << cppdb::exec; } catch(cppdb::cppdb_error const &e){} if(sql.engine() == "sqlite3") { sql<< "create table test ( id integer primary key autoincrement not null, " "n integer, f real , t timestamp ,name text )" << cppdb::exec; } else if(sql.engine() == "mysql") { sql<< "create table test ( id integer primary key auto_increment not null, " "n integer, f real , t timestamp ,name text )" << cppdb::exec; } else if(sql.engine() == "postgresql" ) { sql<< "create table test ( id serial primary key not null " ",n integer, f double precision , t timestamp ,name text )" << cppdb::exec; } else if(sql.engine() == "mssql" ) { sql<< "create table test ( id integer identity(1,1) primary key not null " ",n integer, f double precision , t datetime ,name text )" << cppdb::exec; } else { std::cerr << "Unknown engine: " << sql.engine() << std::endl; return 1; } std::tm t; std::time_t tt; tt=std::time(NULL); t = *std::localtime(&tt); std::cout<> id >> k >> cppdb::into(f,tag) >> atime >> name; std::cout <> val; TEST(val == 10); res.clear(); cppdb::statement stat = sql<<"delete from test where 1<>0" << cppdb::exec; std::cout<<"Deleted "<()==0); TEST(sql.get_specific()!=0); TEST(sql.get_specific()->val==10); sql.reset_specific(new my_specific_b(20)); TEST(sql.get_specific()!=0); TEST(sql.get_specific()!=0); TEST(sql.get_specific()->val==10); TEST(sql.get_specific()->val==20); sql.reset_specific(); TEST(sql.get_specific()==0); TEST(sql.get_specific()!=0); my_specific_a *p = sql.release_specific(); TEST(p!=0); delete p; TEST(sql.get_specific()==0); TEST(sql.release_specific() == 0); TEST(call_counter == 0); TEST(sql.once_called()==false); sql.once(&caller); TEST(sql.once_called()==true); TEST(call_counter == 1); sql.once(&caller); TEST(call_counter == 1); sql.close(); bool have_pool = cs.find("@pool_size")!=std::string::npos; sql.open(cs); TEST(sql.once_called()==have_pool); sql.once(functor_caller()); TEST(have_pool ? call_counter == 1 : call_counter == 2); } catch(std::exception const &e) { std::cerr << "ERROR: " << e.what() << std::endl; return 1; } std::cout << "Ok" << std::endl; return 0; }