///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2010 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
///////////////////////////////////////////////////////////////////////////////
#include <cppdb/driver_manager.h>
#include <cppdb/conn_manager.h>
#include "test.h"
#include "dummy_driver.h"
#if ( defined(WIN32) || defined(_WIN32) || defined(__WIN32) ) && !defined(__CYGWIN__)
# ifndef NOMINMAX
# define NOMINMAX
# endif
# include <windows.h>
void sleep(int x)
{
Sleep(1000*x);
}
#else
# include <stdlib.h>
#endif
void test_driver_manager()
{
cppdb::ref_ptr<cppdb::backend::connection> c1,c2,c3,c4;
cppdb::driver_manager &dm = cppdb::driver_manager::instance();
std::cout << "Testing drivers collection" << std::endl;
cppdb::connections_manager &cm = cppdb::connections_manager::instance();
dm.install_driver("dummy",new dummy::loadable_driver());
TEST(dummy::drivers==1);
dm.collect_unused();
TEST(dummy::drivers==0);
dm.install_driver("dummy",new dummy::loadable_driver());
c1=dm.connect("dummy:");
TEST(dummy::connections==1);
dm.collect_unused();
TEST(dummy::drivers==1);
TEST(dummy::connections==1);
c2=dm.connect("dummy:");
dm.collect_unused();
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
c1=0;
TEST(dummy::connections==1);
c2=0;
TEST(dummy::connections==0);
TEST(dummy::drivers==1);
dm.collect_unused();
TEST(dummy::drivers==0);
THROWS(c1=dm.connect("dummy:"),cppdb::cppdb_error);
std::cout << "Testing connection pooling" << std::endl;
dm.install_driver("dummy",new dummy::loadable_driver());
c1=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
TEST(dummy::connections==1);
c2=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
TEST(dummy::connections==2);
c3=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
TEST(dummy::connections==3);
c1.reset();
TEST(dummy::connections==3);
c2.reset();
TEST(dummy::connections==3);
c3.reset();
TEST(dummy::connections==2);
c3=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
cm.gc();
dm.collect_unused();
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
cm.gc();
dm.collect_unused();
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
sleep(3);
TEST(dummy::connections==2);
TEST(dummy::drivers==1);
cm.gc();
dm.collect_unused();
TEST(dummy::connections==1);
TEST(dummy::drivers==1);
c3.reset();
TEST(dummy::connections==1);
TEST(dummy::drivers==1);
sleep(3);
cm.gc();
dm.collect_unused();
TEST(dummy::connections==0);
TEST(dummy::drivers==0);
}
void test_stmt_cache()
{
cppdb::ref_ptr<cppdb::backend::connection> c;
cppdb::ref_ptr<cppdb::backend::statement> s1,s2,s3;
cppdb::driver_manager &dm = cppdb::driver_manager::instance();
dm.install_driver("dummy",new dummy::loadable_driver());
c=dm.connect("dummy:@use_prepared=off");
s1=c->prepare("test1");
s2=c->prepare("test2");
TEST(dummy::statements==2);
s1.reset();
TEST(dummy::statements==1);
s2.reset();
TEST(dummy::statements==0);
c=dm.connect("dummy:@use_prepared=on;@stmt_cache_size=3");
s1=c->prepare("test1");
s1=c->prepare("test2");
s1=c->prepare("test3");
TEST(dummy::statements==3);
s1=c->prepare("test4");
TEST(dummy::statements==4);
s1=c->prepare("test5");
TEST(dummy::statements==4);
s1.reset();
s1=c->prepare("test3");
TEST(dummy::statements==3);
s1.reset();
TEST(dummy::statements==3);
c->clear_cache();
TEST(dummy::statements==0);
s1=c->prepare("test");
s1.reset();
s1=c->prepare("test");
TEST(dummy::statements==1);
s1=c->prepare("test1");
TEST(dummy::statements==2);
s2=c->prepare("test1");
TEST(dummy::statements==3);
s1.reset();
s2.reset();
TEST(dummy::statements==2);
}
int main()
{
try {
test_driver_manager();
}
CATCH_BLOCK()
try {
test_stmt_cache();
}
CATCH_BLOCK()
SUMMARY();
}