C++DB is the database layer that was designed to work with C++CMS. This customized version is used within Ye Ol' Pi Shack.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

167 lines
4.4 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 2010-2011 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
  4. //
  5. // Distributed under:
  6. //
  7. // the Boost Software License, Version 1.0.
  8. // (See accompanying file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. //
  11. // or (at your opinion) under:
  12. //
  13. // The MIT License
  14. // (See accompanying file MIT.txt or a copy at
  15. // http://www.opensource.org/licenses/mit-license.php)
  16. //
  17. ///////////////////////////////////////////////////////////////////////////////
  18. #include <cppdb/driver_manager.h>
  19. #include <cppdb/conn_manager.h>
  20. #include "test.h"
  21. #include "dummy_driver.h"
  22. #if ( defined(WIN32) || defined(_WIN32) || defined(__WIN32) ) && !defined(__CYGWIN__)
  23. # ifndef NOMINMAX
  24. # define NOMINMAX
  25. # endif
  26. # include <windows.h>
  27. void sleep(int x)
  28. {
  29. Sleep(1000*x);
  30. }
  31. #else
  32. # include <stdlib.h>
  33. # include <unistd.h>
  34. #endif
  35. void test_driver_manager()
  36. {
  37. cppdb::ref_ptr<cppdb::backend::connection> c1,c2,c3,c4;
  38. cppdb::driver_manager &dm = cppdb::driver_manager::instance();
  39. std::cout << "Testing drivers collection" << std::endl;
  40. cppdb::connections_manager &cm = cppdb::connections_manager::instance();
  41. dm.install_driver("dummy",new dummy::loadable_driver());
  42. TEST(dummy::drivers==1);
  43. dm.collect_unused();
  44. TEST(dummy::drivers==0);
  45. dm.install_driver("dummy",new dummy::loadable_driver());
  46. c1=dm.connect("dummy:");
  47. TEST(dummy::connections==1);
  48. dm.collect_unused();
  49. TEST(dummy::drivers==1);
  50. TEST(dummy::connections==1);
  51. c2=dm.connect("dummy:");
  52. dm.collect_unused();
  53. TEST(dummy::connections==2);
  54. TEST(dummy::drivers==1);
  55. c1=0;
  56. TEST(dummy::connections==1);
  57. c2=0;
  58. TEST(dummy::connections==0);
  59. TEST(dummy::drivers==1);
  60. dm.collect_unused();
  61. TEST(dummy::drivers==0);
  62. THROWS(c1=dm.connect("dummy:"),cppdb::cppdb_error);
  63. std::cout << "Testing connection pooling" << std::endl;
  64. dm.install_driver("dummy",new dummy::loadable_driver());
  65. c1=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
  66. TEST(dummy::connections==1);
  67. c2=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
  68. TEST(dummy::connections==2);
  69. c3=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
  70. TEST(dummy::connections==3);
  71. c1.reset();
  72. TEST(dummy::connections==3);
  73. c2.reset();
  74. TEST(dummy::connections==3);
  75. c3.reset();
  76. TEST(dummy::connections==2);
  77. c3=cm.open("dummy:@pool_size=2;@pool_max_idle=2");
  78. TEST(dummy::connections==2);
  79. TEST(dummy::drivers==1);
  80. cm.gc();
  81. dm.collect_unused();
  82. TEST(dummy::connections==2);
  83. TEST(dummy::drivers==1);
  84. TEST(dummy::connections==2);
  85. TEST(dummy::drivers==1);
  86. cm.gc();
  87. dm.collect_unused();
  88. TEST(dummy::connections==2);
  89. TEST(dummy::drivers==1);
  90. sleep(3);
  91. TEST(dummy::connections==2);
  92. TEST(dummy::drivers==1);
  93. cm.gc();
  94. dm.collect_unused();
  95. TEST(dummy::connections==1);
  96. TEST(dummy::drivers==1);
  97. c3.reset();
  98. TEST(dummy::connections==1);
  99. TEST(dummy::drivers==1);
  100. sleep(3);
  101. cm.gc();
  102. dm.collect_unused();
  103. TEST(dummy::connections==0);
  104. TEST(dummy::drivers==0);
  105. }
  106. void test_stmt_cache()
  107. {
  108. cppdb::ref_ptr<cppdb::backend::connection> c;
  109. cppdb::ref_ptr<cppdb::backend::statement> s1,s2,s3;
  110. cppdb::driver_manager &dm = cppdb::driver_manager::instance();
  111. dm.install_driver("dummy",new dummy::loadable_driver());
  112. c=dm.connect("dummy:@use_prepared=off");
  113. s1=c->prepare("test1");
  114. s2=c->prepare("test2");
  115. TEST(dummy::statements==2);
  116. s1.reset();
  117. TEST(dummy::statements==1);
  118. s2.reset();
  119. TEST(dummy::statements==0);
  120. c=dm.connect("dummy:@use_prepared=on;@stmt_cache_size=3");
  121. s1=c->prepare("test1");
  122. s1=c->prepare("test2");
  123. s1=c->prepare("test3");
  124. TEST(dummy::statements==3);
  125. s1=c->prepare("test4");
  126. TEST(dummy::statements==4);
  127. s1=c->prepare("test5");
  128. TEST(dummy::statements==4);
  129. s1.reset();
  130. s1=c->prepare("test3");
  131. TEST(dummy::statements==3);
  132. s1.reset();
  133. TEST(dummy::statements==3);
  134. c->clear_cache();
  135. TEST(dummy::statements==0);
  136. s1=c->prepare("test");
  137. s1.reset();
  138. s1=c->prepare("test");
  139. TEST(dummy::statements==1);
  140. s1=c->prepare("test1");
  141. TEST(dummy::statements==2);
  142. s2=c->prepare("test1");
  143. TEST(dummy::statements==3);
  144. s1.reset();
  145. s2.reset();
  146. TEST(dummy::statements==2);
  147. }
  148. int main()
  149. {
  150. try {
  151. test_driver_manager();
  152. }
  153. CATCH_BLOCK()
  154. try {
  155. test_stmt_cache();
  156. }
  157. CATCH_BLOCK()
  158. SUMMARY();
  159. }