transactd 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +46 -67
  3. data/BUILD_WIN-JA +106 -63
  4. data/CMakeLists.txt +40 -15
  5. data/README +219 -75
  6. data/README-JA +207 -76
  7. data/README_ORMSRCGEN +118 -0
  8. data/README_ORMSRCGEN-JA +115 -0
  9. data/bin/common/tdclc_32_2_0.dll +0 -0
  10. data/bin/common/tdclc_64_2_0.dll +0 -0
  11. data/build/common/check_for_link_iconv.cmake +18 -14
  12. data/build/common/create_symlink.cmake.in +25 -0
  13. data/build/common/get_boost_libs.cmake +23 -23
  14. data/build/common/options.cmake +0 -66
  15. data/build/common/smart_install.cmake +3 -3
  16. data/build/common/transactd.rc.in +15 -5
  17. data/build/common/transactd_cl_common.cmake +37 -18
  18. data/build/common/transactd_cl_output.cmake +55 -13
  19. data/build/common/transactd_common.cmake +108 -31
  20. data/build/swig/php/generate.cmake.in +15 -17
  21. data/build/swig/php/generate.cmd.in +15 -9
  22. data/build/swig/php/php.swg +124 -82
  23. data/build/swig/php/transactd.no_yield.php +4494 -0
  24. data/build/swig/php/transactd.no_yield.php.git.patch +685 -0
  25. data/build/swig/php/transactd.no_yield.php.patch +685 -0
  26. data/build/swig/php/transactd.yield.php +4461 -0
  27. data/build/swig/php/transactd.yield.php.git.patch +652 -0
  28. data/build/swig/php/transactd.yield.php.patch +652 -0
  29. data/build/swig/referencecounter.h +79 -0
  30. data/build/swig/ruby/ruby.swg +226 -76
  31. data/build/swig/ruby/threadBlockRegionWrapper.h +71 -0
  32. data/build/swig/ruby/without_gvl.swg +87 -0
  33. data/build/swig/tdcl.i +659 -170
  34. data/build/swig/validatablepointer.h +91 -0
  35. data/build/tdclc/CMakeLists.txt +49 -34
  36. data/build/tdclc/{tdclc_64.cbproj → tdclc.cbproj} +65 -20
  37. data/build/tdclc/tdclc.rc +0 -0
  38. data/build/tdclcpp/CMakeLists.txt +84 -20
  39. data/build/tdclcpp/tdclcpp.rc +0 -0
  40. data/build/tdclcpp/{tdclcpp_bcb_64.cbproj → tdclcpp_bc.cbproj} +168 -44
  41. data/build/tdclrb/CMakeLists.txt +84 -66
  42. data/build/tdclrb/bldgem/extconf.rb +28 -3
  43. data/build/tdclrb/gem/helper.rb +11 -1
  44. data/build/tdclrb/gem_output.cmake +20 -16
  45. data/index_ja.html +15 -0
  46. data/source/bzs/db/IBlobBuffer.h +15 -17
  47. data/source/bzs/db/blobBuffer.h +186 -140
  48. data/source/bzs/db/blobStructs.h +37 -37
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +34 -34
  50. data/source/bzs/db/engine/mysql/bookmark.h +150 -147
  51. data/source/bzs/db/engine/mysql/database.cpp +1721 -1526
  52. data/source/bzs/db/engine/mysql/database.h +608 -370
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +213 -201
  54. data/source/bzs/db/engine/mysql/dbManager.h +115 -104
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +49 -50
  56. data/source/bzs/db/engine/mysql/errorMessage.h +25 -26
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +55 -61
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +326 -292
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +63 -55
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +182 -125
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +121 -121
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +20 -20
  63. data/source/bzs/db/engine/mysql/percentageKey.h +241 -228
  64. data/source/bzs/db/protocol/ICommandExecuter.h +18 -17
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +543 -514
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +155 -158
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +213 -180
  68. data/source/bzs/db/protocol/tdap/btrDate.h +39 -37
  69. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +173 -0
  70. data/source/bzs/db/protocol/tdap/client/activeTable.h +165 -0
  71. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +370 -0
  72. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +13 -23
  73. data/source/bzs/db/protocol/tdap/client/client.cpp +81 -68
  74. data/source/bzs/db/protocol/tdap/client/client.h +361 -320
  75. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +17 -22
  76. data/source/bzs/db/protocol/tdap/client/connMgr.h +17 -19
  77. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +243 -0
  78. data/source/bzs/db/protocol/tdap/client/connectionPool.h +109 -0
  79. data/source/bzs/db/protocol/tdap/client/database.cpp +327 -219
  80. data/source/bzs/db/protocol/tdap/client/database.h +141 -118
  81. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +60 -62
  82. data/source/bzs/db/protocol/tdap/client/databaseManager.h +255 -0
  83. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +315 -202
  84. data/source/bzs/db/protocol/tdap/client/dbDef.h +40 -32
  85. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +390 -371
  86. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +148 -56
  87. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +149 -57
  88. data/source/bzs/db/protocol/tdap/client/export.h +35 -0
  89. data/source/bzs/db/protocol/tdap/client/field.cpp +1985 -0
  90. data/source/bzs/db/protocol/tdap/client/field.h +393 -0
  91. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +14 -14
  92. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +11 -14
  93. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +123 -0
  94. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +58 -0
  95. data/source/bzs/db/protocol/tdap/client/fields.h +178 -0
  96. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +13 -16
  97. data/source/bzs/db/protocol/tdap/client/fileDDF.h +11 -17
  98. data/source/bzs/db/protocol/tdap/client/filter.h +423 -259
  99. data/source/bzs/db/protocol/tdap/client/groupComp.h +117 -0
  100. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +818 -0
  101. data/source/bzs/db/protocol/tdap/client/groupQuery.h +281 -0
  102. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +14 -17
  103. data/source/bzs/db/protocol/tdap/client/indexDDF.h +11 -14
  104. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +231 -0
  105. data/source/bzs/db/protocol/tdap/client/memRecord.h +145 -0
  106. data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +448 -0
  107. data/source/bzs/db/protocol/tdap/client/memRecordset.h +159 -0
  108. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +300 -173
  109. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +53 -36
  110. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +171 -128
  111. data/source/bzs/db/protocol/tdap/client/nsTable.h +121 -87
  112. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +173 -0
  113. data/source/bzs/db/protocol/tdap/client/recordset.cpp +209 -0
  114. data/source/bzs/db/protocol/tdap/client/recordset.h +86 -0
  115. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +596 -0
  116. data/source/bzs/db/protocol/tdap/client/request.h +227 -170
  117. data/source/bzs/db/protocol/tdap/client/serializer.cpp +1288 -0
  118. data/source/bzs/db/protocol/tdap/client/serializer.h +295 -0
  119. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +9 -12
  120. data/source/bzs/db/protocol/tdap/client/sharedData.h +18 -16
  121. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +494 -473
  122. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +51 -53
  123. data/source/bzs/db/protocol/tdap/client/stringConverter.h +214 -148
  124. data/source/bzs/db/protocol/tdap/client/table.cpp +929 -1665
  125. data/source/bzs/db/protocol/tdap/client/table.h +413 -87
  126. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +642 -534
  127. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +25 -40
  128. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +11 -15
  129. data/source/bzs/db/protocol/tdap/client/trdormapi.h +378 -437
  130. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -1
  131. data/source/bzs/db/protocol/tdap/fieldComp.h +127 -0
  132. data/source/bzs/db/protocol/tdap/myDateTime.cpp +352 -345
  133. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +75 -78
  134. data/source/bzs/db/protocol/tdap/mysql/characterset.h +18 -19
  135. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +216 -199
  136. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +23 -14
  137. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +354 -314
  138. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +57 -47
  139. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +905 -739
  140. data/source/bzs/db/protocol/tdap/mysql/request.h +152 -159
  141. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1044 -879
  142. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +87 -81
  143. data/source/bzs/db/protocol/tdap/tdapRequest.h +162 -130
  144. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +368 -166
  145. data/source/bzs/db/protocol/tdap/tdapSchema.h +702 -566
  146. data/source/bzs/db/protocol/tdap/tdapcapi.h +387 -353
  147. data/source/bzs/db/transactd/appBuilderImple.h +21 -20
  148. data/source/bzs/db/transactd/appModule.cpp +350 -98
  149. data/source/bzs/db/transactd/appModule.h +31 -37
  150. data/source/bzs/db/transactd/connManager.cpp +138 -135
  151. data/source/bzs/db/transactd/connManager.h +28 -21
  152. data/source/bzs/db/transactd/connectionRecord.h +39 -39
  153. data/source/bzs/db/transactd/transactd.cpp +217 -203
  154. data/source/bzs/env/boost_bcb_link.h +131 -0
  155. data/source/bzs/env/compiler.h +136 -79
  156. data/source/bzs/env/crosscompile.cpp +57 -57
  157. data/source/bzs/env/crosscompile.h +130 -115
  158. data/source/bzs/env/fileopen.h +7 -8
  159. data/source/bzs/env/mbcswchrLinux.cpp +4 -9
  160. data/source/bzs/env/mbcswchrLinux.h +37 -34
  161. data/source/bzs/env/tcharMinGW.h +59 -0
  162. data/source/bzs/env/tstring.h +90 -95
  163. data/source/bzs/example/changeSchema.cpp +22 -23
  164. data/source/bzs/example/changeSchema_c.cpp +22 -24
  165. data/source/bzs/example/connection_pool_c.cpp +49 -104
  166. data/source/bzs/example/createDatabase.cpp +40 -47
  167. data/source/bzs/example/createDatabase_c.cpp +38 -43
  168. data/source/bzs/example/deleteRecords.cpp +10 -15
  169. data/source/bzs/example/deleteRecords_c.cpp +10 -14
  170. data/source/bzs/example/dropDatabase.cpp +3 -9
  171. data/source/bzs/example/dropDatabase_c.cpp +5 -6
  172. data/source/bzs/example/insertRecords.cpp +37 -29
  173. data/source/bzs/example/insertRecords_c.cpp +19 -25
  174. data/source/bzs/example/ormap_c.cpp +621 -0
  175. data/source/bzs/example/queryData.cpp +371 -0
  176. data/source/bzs/example/queryData.h +16 -0
  177. data/source/bzs/example/query_c.cpp +109 -0
  178. data/source/bzs/example/readRecords.cpp +27 -27
  179. data/source/bzs/example/readRecords_c.cpp +25 -23
  180. data/source/bzs/example/updateRecords.cpp +16 -21
  181. data/source/bzs/example/updateRecords_c.cpp +8 -12
  182. data/source/bzs/example/update_with_transaction.cpp +21 -24
  183. data/source/bzs/example/update_with_transaction_c.cpp +12 -15
  184. data/source/bzs/example/useORMRecord.cpp +177 -0
  185. data/source/bzs/netsvc/client/tcpClient.cpp +167 -156
  186. data/source/bzs/netsvc/client/tcpClient.h +541 -489
  187. data/source/bzs/netsvc/server/IAppModule.h +119 -32
  188. data/source/bzs/netsvc/server/iserver.h +21 -23
  189. data/source/bzs/netsvc/server/serverCpt.cpp +421 -391
  190. data/source/bzs/netsvc/server/serverCpt.h +41 -43
  191. data/source/bzs/netsvc/server/serverPipe.cpp +580 -565
  192. data/source/bzs/netsvc/server/serverPipe.h +44 -45
  193. data/source/bzs/netsvc/server/serverTpool.cpp +333 -303
  194. data/source/bzs/netsvc/server/serverTpool.h +38 -43
  195. data/source/bzs/rtl/benchmark.cpp +91 -31
  196. data/source/bzs/rtl/benchmark.h +76 -22
  197. data/source/bzs/rtl/datetime.cpp +231 -233
  198. data/source/bzs/rtl/datetime.h +16 -16
  199. data/source/bzs/rtl/debuglog.cpp +48 -51
  200. data/source/bzs/rtl/debuglog.h +55 -44
  201. data/source/bzs/rtl/exception.h +55 -48
  202. data/source/bzs/rtl/stl_uty.cpp +27 -28
  203. data/source/bzs/rtl/stl_uty.h +28 -29
  204. data/source/bzs/rtl/stringBuffers.cpp +8 -6
  205. data/source/bzs/rtl/stringBuffers.h +16 -9
  206. data/source/bzs/rtl/strtrim.cpp +90 -91
  207. data/source/bzs/rtl/strtrim.h +14 -16
  208. data/source/bzs/test/tdclatl/bench_query_atl.js +647 -0
  209. data/source/bzs/test/tdclatl/bench_tdclatl.js +303 -303
  210. data/source/bzs/test/tdclatl/test_query_atl.js +669 -0
  211. data/source/bzs/test/tdclphp/bench.php +357 -0
  212. data/source/bzs/test/tdclphp/transactd_Test.php +907 -303
  213. data/source/bzs/test/tdclphp/transactd_blob_Test.php +21 -49
  214. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +41 -75
  215. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +23 -37
  216. data/source/bzs/test/tdclphp/transactd_pool_Test.php +120 -0
  217. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +4 -6
  218. data/source/bzs/test/tdclrb/prepare.rb +15 -12
  219. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +29 -32
  220. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -29
  221. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +18 -19
  222. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +107 -0
  223. data/source/bzs/test/tdclrb/transactd_spec.rb +734 -142
  224. data/source/bzs/test/transactdBench/query_bench.cpp +156 -0
  225. data/source/bzs/test/transactdBench/scaling_bench.cpp +265 -0
  226. data/source/bzs/test/transactdBench/transactdBench.cpp +107 -83
  227. data/source/bzs/test/transactdBench/transactdBench2.cpp +122 -83
  228. data/source/bzs/test/transactdBench/workerBase.cpp +5 -0
  229. data/source/bzs/test/transactdBench/workerBase.h +88 -0
  230. data/source/bzs/test/transactdBench/workerMySQLImple.h +333 -0
  231. data/source/bzs/test/transactdBench/workerTransactdImple.h +201 -0
  232. data/source/bzs/test/trdclengn/test_blob.cpp +121 -73
  233. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1244 -426
  234. data/source/global/ormsrcgen/confParam.h +80 -0
  235. data/source/global/ormsrcgen/fieldName.cpp +77 -0
  236. data/source/global/ormsrcgen/fieldName.h +43 -0
  237. data/source/global/ormsrcgen/main.cpp +196 -0
  238. data/source/global/ormsrcgen/srcgen.cpp +763 -0
  239. data/source/global/ormsrcgen/srcgen.h +72 -0
  240. data/source/global/ormsrcgen/template/fieldNameList_sample.txt +2 -0
  241. data/source/global/ormsrcgen/template/ormDataClass_template.cpp +48 -0
  242. data/source/global/ormsrcgen/template/ormDataClass_template.h +34 -0
  243. data/source/global/ormsrcgen/template/ormMapClass_template.cpp +51 -0
  244. data/source/global/ormsrcgen/template/ormMapClass_template.h +62 -0
  245. data/source/global/ormsrcgen/template/template.cnf +38 -0
  246. data/source/global/querystmts/querystmts.cpp +237 -0
  247. data/source/global/tdclatl/ConnectParams.cpp +77 -0
  248. data/source/global/tdclatl/ConnectParams.h +70 -0
  249. data/source/global/tdclatl/Database.cpp +132 -128
  250. data/source/global/tdclatl/Database.h +60 -49
  251. data/source/global/tdclatl/DbDef.cpp +68 -64
  252. data/source/global/tdclatl/DbDef.h +36 -36
  253. data/source/global/tdclatl/Field.cpp +12 -17
  254. data/source/global/tdclatl/Field.h +15 -12
  255. data/source/global/tdclatl/FieldDef.cpp +75 -36
  256. data/source/global/tdclatl/FieldDef.h +38 -19
  257. data/source/global/tdclatl/FieldDefs.cpp +74 -0
  258. data/source/global/tdclatl/FieldDefs.h +56 -0
  259. data/source/global/tdclatl/FieldNames.cpp +99 -0
  260. data/source/global/tdclatl/FieldNames.h +66 -0
  261. data/source/global/tdclatl/Flags.cpp +75 -37
  262. data/source/global/tdclatl/Flags.h +13 -12
  263. data/source/global/tdclatl/GroupQuery.cpp +119 -0
  264. data/source/global/tdclatl/GroupQuery.h +65 -0
  265. data/source/global/tdclatl/KeyDef.cpp +15 -14
  266. data/source/global/tdclatl/KeyDef.h +20 -17
  267. data/source/global/tdclatl/KeySegment.cpp +13 -12
  268. data/source/global/tdclatl/PooledDbManager.cpp +223 -0
  269. data/source/global/tdclatl/PooledDbManager.h +76 -0
  270. data/source/global/tdclatl/QueryBase.cpp +206 -127
  271. data/source/global/tdclatl/QueryBase.h +55 -59
  272. data/source/global/tdclatl/Record.cpp +214 -0
  273. data/source/global/tdclatl/Record.h +96 -0
  274. data/source/global/tdclatl/Recordset.cpp +278 -0
  275. data/source/global/tdclatl/Recordset.h +83 -0
  276. data/source/global/tdclatl/RecordsetQuery.cpp +118 -0
  277. data/source/global/tdclatl/RecordsetQuery.h +126 -0
  278. data/source/global/tdclatl/Table.cpp +57 -60
  279. data/source/global/tdclatl/Table.h +32 -29
  280. data/source/global/tdclatl/TableDef.cpp +63 -62
  281. data/source/global/tdclatl/TableDef.h +20 -22
  282. data/source/global/tdclatl/TdVersion.cpp +3 -3
  283. data/source/global/tdclatl/TdVersion.h +15 -11
  284. data/source/global/tdclatl/_IDatabaseEvents_CP.h +99 -92
  285. data/source/global/tdclatl/activeTable.cpp +355 -0
  286. data/source/global/tdclatl/activeTable.h +79 -0
  287. data/source/global/tdclatl/dllmain.cpp +4 -3
  288. data/source/global/tdclatl/dllmain.h +7 -6
  289. data/source/global/tdclatl/keySegment.h +22 -18
  290. data/source/global/tdclatl/resource.h +0 -0
  291. data/source/global/tdclatl/stdafx.h +6 -4
  292. data/source/global/tdclatl/targetver.h +0 -1
  293. data/source/global/tdclatl/tdclatl.cpp +10 -5
  294. data/source/global/tdclatl/tdclatl.idl +530 -14
  295. data/source/linux/charsetConvert.h +78 -79
  296. data/source/linux/linuxTypes.h +9 -12
  297. data/source/linux/tchar.h +168 -166
  298. data/transactd.gemspec +24 -16
  299. metadata +98 -12
  300. data/bin/common/tdclc_32_1_2.dll +0 -0
  301. data/bin/common/tdclc_64_1_2.dll +0 -0
  302. data/build/tdclc/tdclc_32.cbproj +0 -173
  303. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +0 -232
  304. data/build/tdclrb/GEM_VERSION +0 -3
  305. data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -43
  306. data/source/bzs/example/useORM.cpp +0 -585
@@ -0,0 +1,1288 @@
1
+ /*=================================================================
2
+ Copyright (C) 2014 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ =================================================================*/
19
+ #pragma hdrstop
20
+ #include "serializer.h"
21
+
22
+ #pragma package(smart_init)
23
+ #ifdef BCB_32
24
+ #pragma option push
25
+ #pragma option -Vbr-
26
+ #pragma option -vi-
27
+ #endif
28
+
29
+ #include <bzs/db/protocol/tdap/client/groupQuery.h>
30
+ #include <bzs/db/protocol/tdap/client/activeTable.h>
31
+ #include <boost/serialization/vector.hpp>
32
+ #include <boost/serialization/shared_ptr.hpp>
33
+ #include <boost/serialization/export.hpp>
34
+ #include <boost/archive/xml_oarchive.hpp>
35
+ #include <boost/archive/xml_iarchive.hpp>
36
+ #include <fstream>
37
+
38
+ #ifdef __BCPLUSPLUS__
39
+ #define BZS_LINK_BOOST_SERIALIZATION
40
+ #include <bzs/env/boost_bcb_link.h>
41
+ #endif
42
+
43
+ using namespace boost::archive;
44
+ using namespace boost::serialization;
45
+
46
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::sum, "sum");
47
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::count, "count");
48
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::avg, "avg");
49
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::min, "min");
50
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::max, "max");
51
+
52
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::readStatement,
53
+ "readStatement");
54
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::readHasMany,
55
+ "readHasMany");
56
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::orderByStatement,
57
+ "orderByStatement");
58
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::matchByStatement,
59
+ "matchByStatement");
60
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::groupByStatement,
61
+ "groupByStatement");
62
+ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::reverseOrderStatement,
63
+ "reverseOrderStatement");
64
+
65
+ BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::groupFuncBase, 1)
66
+
67
+ namespace bzs
68
+ {
69
+ namespace db
70
+ {
71
+ namespace protocol
72
+ {
73
+ namespace tdap
74
+ {
75
+ namespace client
76
+ {
77
+
78
+ client::query* replaceQueryParams(client::query* tq, client::query& tmpq,
79
+ struct queryStatementsImple* parent);
80
+
81
+ void toU8(std::_tstring& src, std::string& dst)
82
+ {
83
+ #ifdef _UNICODE
84
+ char buf[2048];
85
+ WideCharToMultiByte(CP_UTF8, 0, src.c_str(), -1, buf, 2048, NULL, NULL);
86
+ dst = buf;
87
+
88
+ #else
89
+ dst = src;
90
+ #endif
91
+ }
92
+
93
+ void fromU8(std::string& src, std::_tstring& dst)
94
+ {
95
+ #ifdef _UNICODE
96
+ wchar_t buf[2048];
97
+ MultiByteToWideChar(CP_UTF8, 0, src.c_str(), -1, buf, 2048);
98
+ dst = buf;
99
+ #else
100
+ dst = src;
101
+ #endif
102
+ }
103
+
104
+ template <class Archive>
105
+ void serialize_string(Archive& ar, const char* name, std::_tstring& v)
106
+ {
107
+ std::string s;
108
+ if (!Archive::is_loading::value)
109
+ toU8(v, s);
110
+ ar& boost::serialization::make_nvp(name, s);
111
+ if (Archive::is_loading::value)
112
+ fromU8(s, v);
113
+ }
114
+
115
+ template <class Archive>
116
+ void serialize(Archive&, executable&, const unsigned int)
117
+ {
118
+ }
119
+
120
+ template <class Archive>
121
+ void serialize(Archive& ar, sortField& q, const unsigned int)
122
+ {
123
+
124
+ serialize_string(ar, "name", q.name);
125
+ ar& boost::serialization::make_nvp("asc", q.asc);
126
+ }
127
+
128
+ template <class Archive>
129
+ void serialize(Archive& ar, sortFields& q, const unsigned int)
130
+ {
131
+ int count = (int)q.m_params.size();
132
+ ar& boost::serialization::make_nvp("count", count);
133
+ for (int i = 0; i < count; i++)
134
+ {
135
+ if (Archive::is_loading::value)
136
+ {
137
+ sortField f;
138
+ ar& boost::serialization::make_nvp("field", f);
139
+ q.m_params.push_back(f);
140
+ }
141
+ else
142
+ ar& boost::serialization::make_nvp("field", q.m_params[i]);
143
+ }
144
+ }
145
+
146
+ template <class Archive>
147
+ void serialize(Archive& ar, groupByStatement& q, const unsigned int /*version*/)
148
+ {
149
+ boost::serialization::base_object<executable>(q);
150
+ ar& boost::serialization::make_nvp(
151
+ "keyFields", boost::serialization::base_object<fieldNames>(q));
152
+ ar& boost::serialization::make_nvp("functions", *q.m_statements);
153
+ }
154
+
155
+ template <class Archive>
156
+ void serialize(Archive& ar, matchByStatement& q, const unsigned int /*version*/)
157
+ {
158
+ boost::serialization::base_object<executable>(q);
159
+ ar& make_nvp("matchByStatement",
160
+ boost::serialization::base_object<recordsetQuery>(q));
161
+ }
162
+
163
+ template <class Archive>
164
+ void serialize(Archive& ar, orderByStatement& q, const unsigned int /*version*/)
165
+ {
166
+ boost::serialization::base_object<executable>(q);
167
+ ar& boost::serialization::make_nvp("sortFields", *q.m_sortFields);
168
+ }
169
+
170
+ template <class Archive>
171
+ void serialize(Archive& /*ar*/, reverseOrderStatement& q,
172
+ const unsigned int /*version*/)
173
+ {
174
+ boost::serialization::base_object<executable>(q);
175
+ }
176
+
177
+ template <class Archive>
178
+ void serialize(Archive& ar, readStatement& q, const unsigned int /*version*/)
179
+ {
180
+ boost::serialization::base_object<executable>(q);
181
+ ar& boost::serialization::make_nvp(
182
+ "keyFields", boost::serialization::base_object<fieldNames>(q));
183
+ ar& boost::serialization::make_nvp(
184
+ "query", boost::serialization::base_object<query>(q));
185
+ ar& boost::serialization::make_nvp("params", *q.internalPtr());
186
+ }
187
+
188
+ template <class Archive>
189
+ void serialize(Archive& ar, readHasMany& q, const unsigned int /*version*/)
190
+ {
191
+
192
+ ar& boost::serialization::make_nvp(
193
+ "readStatement", boost::serialization::base_object<readStatement>(q));
194
+ ar& boost::serialization::make_nvp("params", *q.internalPtr());
195
+ }
196
+
197
+ template <class Archive>
198
+ void serialize(Archive& ar, queryBase& q, const unsigned int version)
199
+ {
200
+ split_free(ar, q, version);
201
+ }
202
+
203
+ template <class Archive>
204
+ void save(Archive& ar, const queryBase& q, const unsigned int /*version*/)
205
+ {
206
+ std::_tstring s = q.toString();
207
+
208
+ serialize_string(ar, "queryString", s);
209
+ int v = q.getReject();
210
+ ar& make_nvp("reject", v);
211
+ v = q.getLimit();
212
+ ar& make_nvp("limit", v);
213
+ v = q.getOptimize();
214
+ ar& make_nvp("optimize", v);
215
+ v = q.isBookmarkAlso();
216
+ ar& make_nvp("boolmarkAlso", v);
217
+ v = q.isAll();
218
+ ar& make_nvp("isAll", v);
219
+ }
220
+
221
+ template <class Archive>
222
+ void load(Archive& ar, queryBase& q, const unsigned int /*version*/)
223
+ {
224
+ std::_tstring s;
225
+ int v;
226
+
227
+ q.reset();
228
+ serialize_string(ar, "queryString", s);
229
+ q.queryString(s.c_str());
230
+
231
+ ar& make_nvp("reject", v);
232
+ q.reject(v);
233
+
234
+ ar& make_nvp("limit", v);
235
+ q.limit(v);
236
+
237
+ ar& make_nvp("optimize", v);
238
+ q.optimize((queryBase::eOptimize)v);
239
+
240
+ ar& make_nvp("boolmarkAlso", v);
241
+ q.bookmarkAlso(v != 0);
242
+
243
+ ar& make_nvp("isAll", v);
244
+ if (v)
245
+ q.all();
246
+ }
247
+
248
+ template <class Archive>
249
+ void serialize(Archive& ar, fieldNames& q, const unsigned int /*version*/)
250
+ {
251
+ int count = q.count();
252
+ ar& boost::serialization::make_nvp("count", count);
253
+ std::_tstring s;
254
+ for (int i = 0; i < count; i++)
255
+ {
256
+ if (Archive::is_loading::value)
257
+ {
258
+ serialize_string(ar, "value", s);
259
+ q.addValue(s.c_str());
260
+ }
261
+ else
262
+ {
263
+ s = q.getValue(i);
264
+ serialize_string(ar, "value", s);
265
+ }
266
+ }
267
+ }
268
+
269
+ template <class Archive>
270
+ void serialize(Archive& ar, query& q, const unsigned int /*version*/)
271
+ {
272
+ ar& make_nvp("readQuery", boost::serialization::base_object<queryBase>(q));
273
+ }
274
+
275
+ template <class Archive>
276
+ void serialize(Archive& ar, recordsetQuery& q, const unsigned int /*version*/)
277
+ {
278
+ queryBase* qq = q.internalQuery();
279
+ ar& make_nvp("recordsetQuery", *qq);
280
+ }
281
+
282
+ template <class Archive>
283
+ void serialize(Archive& ar, groupFuncBase& q, const unsigned int ver)
284
+ {
285
+ ar& boost::serialization::make_nvp(
286
+ "query", boost::serialization::base_object<recordsetQuery>(q));
287
+
288
+ fieldNames& fns = q.targetNames();
289
+ if (ver >= 1)
290
+ ar& make_nvp("targetNames", fns);
291
+
292
+ std::_tstring s;
293
+
294
+ if (Archive::is_loading::value)
295
+ {
296
+ // For compatibility
297
+ if (ver < 1)
298
+ {
299
+ serialize_string(ar, "targetName", s);
300
+ q.targetNames().addValue(s.c_str());
301
+ }
302
+ serialize_string(ar, "resultName", s);
303
+ q.setResultName(s.c_str());
304
+ }
305
+ else
306
+ {
307
+ if (q.resultName())
308
+ s = q.resultName();
309
+ else
310
+ s = _T("");
311
+ serialize_string(ar, "resultName", s);
312
+ }
313
+ }
314
+
315
+ template <class Archive>
316
+ void serialize(Archive& ar, sum& q, const unsigned int /*version*/)
317
+ {
318
+ ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
319
+ }
320
+
321
+ template <class Archive>
322
+ void serialize(Archive& ar, count& q, const unsigned int /*version*/)
323
+ {
324
+ ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
325
+ }
326
+
327
+ template <class Archive>
328
+ void serialize(Archive& ar, avg& q, const unsigned int /*version*/)
329
+ {
330
+ ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
331
+ }
332
+
333
+ template <class Archive>
334
+ void serialize(Archive& ar, min& q, const unsigned int /*version*/)
335
+ {
336
+ ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
337
+ }
338
+
339
+ template <class Archive>
340
+ void serialize(Archive& ar, max& q, const unsigned int /*version*/)
341
+ {
342
+ ar& make_nvp("param", boost::serialization::base_object<groupFuncBase>(q));
343
+ }
344
+
345
+ template <class Archive>
346
+ void serialize(Archive& ar, groupQuery& q, const unsigned int /*version*/)
347
+ {
348
+ fieldNames& v = const_cast<fieldNames&>(q.getKeyFields());
349
+ ar& make_nvp("keyFields", v);
350
+ }
351
+
352
+ struct aliasPair
353
+ {
354
+ std::_tstring first;
355
+ std::_tstring second;
356
+ aliasPair() {}
357
+ aliasPair(const _TCHAR* f, const _TCHAR* s) : first(f), second(s) {}
358
+ };
359
+
360
+ typedef aliasPair alias_type;
361
+
362
+ template <class Archive>
363
+ void serialize(Archive& ar, alias_type& q, const unsigned int /*version*/)
364
+ {
365
+ std::_tstring s = q.first;
366
+ std::_tstring s2 = q.second;
367
+ serialize_string(ar, "first", s);
368
+ serialize_string(ar, "second", s2);
369
+ if (Archive::is_loading::value)
370
+ {
371
+ q.first = s;
372
+ q.second = s2;
373
+ }
374
+ }
375
+
376
+ //---------------------------------------------------------------------------
377
+ // class executable
378
+ //---------------------------------------------------------------------------
379
+ void executable::release()
380
+ {
381
+ delete this;
382
+ };
383
+
384
+ //---------------------------------------------------------------------------
385
+ // class groupByStatement
386
+ //---------------------------------------------------------------------------
387
+ class prepairedValues
388
+ {
389
+ const std::vector<std::_tstring>* m_values;
390
+ mutable int m_index;
391
+
392
+ public:
393
+ inline void setValues(const std::vector<std::_tstring>* values)
394
+ {
395
+ m_values = values;
396
+ m_index = 0;
397
+ }
398
+
399
+ const _TCHAR* replace(const _TCHAR* v) const
400
+ {
401
+ if (_tcscmp(v, _T("?")) == 0)
402
+ {
403
+ if (m_index >= (int)m_values->size())
404
+ THROW_BZS_ERROR_WITH_MSG(_T("Too few values for prepair."));
405
+ return (*m_values)[m_index++].c_str();
406
+ }
407
+ return v;
408
+ }
409
+ };
410
+
411
+ //---------------------------------------------------------------------------
412
+ // class groupByStatement
413
+ //---------------------------------------------------------------------------
414
+ groupByStatement* groupByStatement::create()
415
+ {
416
+ return new groupByStatement();
417
+ }
418
+
419
+ groupByStatement::groupByStatement()
420
+ : fieldNames(), m_statements(new std::vector<groupFuncBase*>())
421
+ {
422
+ }
423
+
424
+ groupByStatement::~groupByStatement()
425
+ {
426
+ reset();
427
+ delete m_statements;
428
+ }
429
+
430
+ groupFuncBase& groupByStatement::addFunction(eFunc v,
431
+ const fieldNames& targetNames,
432
+ const _TCHAR* resultName)
433
+ {
434
+ groupFuncBase* func;
435
+ switch (v)
436
+ {
437
+ case fsum:
438
+ func = new client::sum(targetNames, resultName);
439
+ break;
440
+ case fcount:
441
+ func = new client::count(resultName);
442
+ break;
443
+ case favg:
444
+ func = new client::avg(targetNames, resultName);
445
+ break;
446
+ case fmin:
447
+ func = new client::min(targetNames, resultName);
448
+ break;
449
+ case fmax:
450
+ func = new client::max(targetNames, resultName);
451
+ break;
452
+ };
453
+ m_statements->push_back(func);
454
+ return *func;
455
+ }
456
+
457
+ groupFuncBase& groupByStatement::function(int index)
458
+ {
459
+ assert(index >= 0 && index < (int)m_statements->size());
460
+ return *((*m_statements)[index]);
461
+ }
462
+
463
+ groupByStatement& groupByStatement::reset()
464
+ {
465
+ for (int i = 0; i < (int)m_statements->size(); ++i)
466
+ delete ((*m_statements)[i]);
467
+ m_statements->clear();
468
+ fieldNames::reset();
469
+ return *this;
470
+ }
471
+
472
+ int groupByStatement::size() const
473
+ {
474
+ return (int)m_statements->size();
475
+ }
476
+
477
+ void groupByStatement::execute(recordset& rs)
478
+ {
479
+ const _TCHAR* keys[8] = { NULL };
480
+ for (int i = 0; i < count(); ++i)
481
+ keys[i] = getValue(i);
482
+ groupQuery q;
483
+ q.keyField(keys[0], keys[1], keys[2], keys[3], keys[4], keys[5], keys[6],
484
+ keys[7]);
485
+ std::vector<boost::shared_ptr<groupFuncBase> > statements;
486
+ for (int i = 0; i < (int)m_statements->size(); ++i)
487
+ {
488
+ boost::shared_ptr<groupFuncBase> p((*m_statements)[i]->clone());
489
+ statements.push_back(p);
490
+ query* pq = p->internalQuery();
491
+ replaceQueryParams(NULL, *pq, m_parent);
492
+ q.addFunction(p.get());
493
+ }
494
+ rs.groupBy(q);
495
+ }
496
+
497
+ //---------------------------------------------------------------------------
498
+ // class matchByStatement
499
+ //---------------------------------------------------------------------------
500
+ matchByStatement* matchByStatement::create()
501
+ {
502
+ return new matchByStatement();
503
+ }
504
+
505
+ void matchByStatement::execute(recordset& rs)
506
+ {
507
+ client::query q;
508
+ client::query* ret = replaceQueryParams(internalQuery(), q, m_parent);
509
+ if (ret != internalQuery())
510
+ {
511
+ recordsetQuery rq;
512
+ *rq.internalQuery() = *ret;
513
+ rs.matchBy(rq);
514
+ }
515
+ else
516
+ rs.matchBy(*this);
517
+ }
518
+
519
+ //---------------------------------------------------------------------------
520
+ // class orderByStatement
521
+ //---------------------------------------------------------------------------
522
+ orderByStatement* orderByStatement::create()
523
+ {
524
+ return new orderByStatement();
525
+ }
526
+
527
+ orderByStatement::orderByStatement() : m_sortFields(new sortFields())
528
+ {
529
+ }
530
+
531
+ orderByStatement::~orderByStatement()
532
+ {
533
+ delete m_sortFields;
534
+ }
535
+
536
+ void orderByStatement::execute(recordset& rs)
537
+ {
538
+ rs.orderBy(*m_sortFields);
539
+ }
540
+
541
+ void orderByStatement::add(const _TCHAR* name, bool asc)
542
+ {
543
+ m_sortFields->add(name, asc);
544
+ }
545
+
546
+ int orderByStatement::size() const
547
+ {
548
+ return (int)m_sortFields->size();
549
+ }
550
+
551
+ const sortField& orderByStatement::get(int index) const
552
+ {
553
+ return (*m_sortFields)[index];
554
+ }
555
+
556
+ orderByStatement& orderByStatement::reset()
557
+ {
558
+ m_sortFields->clear();
559
+ return *this;
560
+ }
561
+
562
+ //---------------------------------------------------------------------------
563
+ // class reverseOrderStatement
564
+ //---------------------------------------------------------------------------
565
+ reverseOrderStatement* reverseOrderStatement::create()
566
+ {
567
+ return new reverseOrderStatement();
568
+ }
569
+
570
+ void reverseOrderStatement::execute(recordset& rs)
571
+ {
572
+ rs.reverse();
573
+ };
574
+
575
+ //---------------------------------------------------------------------------
576
+ // struct queryStatementsImple
577
+ //---------------------------------------------------------------------------
578
+ struct queryStatementsImple
579
+ {
580
+ idatabaseManager* dbm;
581
+ database* db;
582
+ int id;
583
+ std::_tstring title;
584
+ std::_tstring description;
585
+ std::vector<executable*> statements;
586
+ prepairedValues pv;
587
+
588
+ inline queryStatementsImple() : dbm(NULL), db(NULL){};
589
+
590
+ ~queryStatementsImple() { reset(); }
591
+
592
+ void reset()
593
+ {
594
+ for (int i = 0; i < (int)statements.size(); ++i)
595
+ statements[i]->release();
596
+ statements.clear();
597
+ title = _T("");
598
+ description = _T("");
599
+ id = 0;
600
+ }
601
+
602
+ inline void execute(recordset& rs, executeListner* listner)
603
+ {
604
+ for (size_t i = 0; i < statements.size(); ++i)
605
+ {
606
+ statements[i]->execute(rs);
607
+ if (listner)
608
+ listner->onExecuted(statements[i], rs);
609
+ }
610
+ }
611
+
612
+ private:
613
+ friend class boost::serialization::access;
614
+ template <class Archive>
615
+ void serialize(Archive& ar, const unsigned int version);
616
+ };
617
+
618
+ //---------------------------------------------------------------------------
619
+ // struct queryStatementImple
620
+ //---------------------------------------------------------------------------
621
+ struct queryStatementImple
622
+ {
623
+ struct queryStatementsImple* parent;
624
+ std::_tstring database;
625
+ std::_tstring table;
626
+ int option;
627
+ fieldNames* keyFields;
628
+ client::query* query;
629
+ readStatement::eReadType readType;
630
+ short index;
631
+ // int dbIndex;
632
+
633
+ std::vector<alias_type> aliases;
634
+
635
+ queryStatementImple(){};
636
+
637
+ void alias(const _TCHAR* src, const _TCHAR* dst)
638
+ {
639
+ aliases.push_back(alias_type(src, dst));
640
+ }
641
+
642
+ inline void use(idatabaseManager* dbm, const connectParams* p)
643
+ {
644
+ /*dbIndex = dbm->findDbIndex(p);
645
+ if (dbIndex==-1)
646
+ return false;*/
647
+ dbm->use(p);
648
+ // return dbm->db()->isOpened();
649
+ }
650
+
651
+ inline void use(client::database* db, const connectParams* p)
652
+ {
653
+ if (db && db->isOpened())
654
+ return;
655
+ if (p)
656
+ connectOpen(db, *p, false);
657
+ }
658
+
659
+ template <class Database> inline void execute(recordset& rs, Database db)
660
+ {
661
+
662
+ const _TCHAR* keys[8] = { NULL };
663
+ for (int i = 0; i < keyFields->count(); ++i)
664
+ keys[i] = parent->pv.replace(keyFields->getValue(i));
665
+
666
+ client::query q;
667
+ client::query* tq = replaceQueryParams(query, q, parent);
668
+
669
+ if (database != _T(""))
670
+ {
671
+ connectParams p(database.c_str());
672
+ use(db, &p);
673
+ }
674
+ else
675
+ use(db, NULL);
676
+
677
+ /*if (!isOpened(db, p)) //Change current db in dbm
678
+ connect(db, p, false); //Change current db in dbm
679
+ */
680
+
681
+ activeTable at(db, table.c_str());
682
+ at.index(index).option(option);
683
+ for (int i = 0; i < (int)aliases.size(); ++i)
684
+ at.alias(aliases[i].first.c_str(), aliases[i].second.c_str());
685
+ if (readType == readStatement::opRead)
686
+ {
687
+ at.keyValue(keys[0], keys[1], keys[2], keys[3], keys[4], keys[5],
688
+ keys[6], keys[7]);
689
+ at.read(rs, *tq);
690
+ }
691
+ else if (readType == readStatement::opJoin)
692
+ at.join(rs, *tq, keys[0], keys[1], keys[2], keys[3], keys[4],
693
+ keys[5], keys[6], keys[7]);
694
+ else if (readType == readStatement::opOuterJoin)
695
+ at.outerJoin(rs, *tq, keys[0], keys[1], keys[2], keys[3], keys[4],
696
+ keys[5], keys[6], keys[7]);
697
+ }
698
+
699
+ private:
700
+ friend class boost::serialization::access;
701
+ template <class Archive>
702
+ void serialize(Archive& ar, const unsigned int version)
703
+ {
704
+ ar& make_nvp("readType", readType);
705
+ serialize_string(ar, "database", database);
706
+ serialize_string(ar, "table", table);
707
+ ar& make_nvp("index", index);
708
+ int count = (int)aliases.size();
709
+ ar& boost::serialization::make_nvp("alias_count", count);
710
+ alias_type a;
711
+ for (int i = 0; i < count; i++)
712
+ {
713
+ if (!Archive::is_loading::value)
714
+ a = aliases[i];
715
+ ar& make_nvp("alias", a);
716
+ if (Archive::is_loading::value)
717
+ aliases.push_back(a);
718
+ }
719
+ }
720
+ };
721
+
722
+ // template <class Archive>
723
+ // void serialize(Archive& ar, readStatement& q, const unsigned int version);
724
+
725
+ template <class Archive>
726
+ void queryStatementsImple::serialize(Archive& ar, const unsigned int version)
727
+ {
728
+ ar& make_nvp("id", id);
729
+ serialize_string(ar, "title", title);
730
+ serialize_string(ar, "description", description);
731
+ ar& make_nvp("items", statements);
732
+ if (Archive::is_loading::value)
733
+ {
734
+ for (int i = 0; i < (int)statements.size(); ++i)
735
+ {
736
+ readStatement* p = dynamic_cast<readStatement*>(statements[i]);
737
+ if (p)
738
+ p->m_impl->parent = this;
739
+ else
740
+ {
741
+ matchByStatement* pm =
742
+ dynamic_cast<matchByStatement*>(statements[i]);
743
+ if (pm)
744
+ pm->m_parent = this;
745
+ else
746
+ {
747
+ groupByStatement* pg =
748
+ dynamic_cast<groupByStatement*>(statements[i]);
749
+ if (pg)
750
+ pg->m_parent = this;
751
+ }
752
+ }
753
+ }
754
+ }
755
+ }
756
+
757
+ //---------------------------------------------------------------------------
758
+ // class readStatement
759
+ //---------------------------------------------------------------------------
760
+ readStatement* readStatement::create()
761
+ {
762
+ return new readStatement();
763
+ }
764
+
765
+ readStatement::readStatement() : m_impl(new queryStatementImple)
766
+ {
767
+ m_impl->keyFields = this;
768
+ m_impl->query = this;
769
+ }
770
+
771
+ readStatement::~readStatement()
772
+ {
773
+ delete m_impl;
774
+ }
775
+
776
+ const _TCHAR* readStatement::getDatabaseUri() const
777
+ {
778
+ return m_impl->database.c_str();
779
+ }
780
+
781
+ readStatement& readStatement::databaseUri(const _TCHAR* v)
782
+ {
783
+ m_impl->database = v;
784
+ return *this;
785
+ }
786
+
787
+ const _TCHAR* readStatement::getTableName() const
788
+ {
789
+ return m_impl->table.c_str();
790
+ }
791
+
792
+ readStatement& readStatement::tableName(const _TCHAR* v)
793
+ {
794
+ m_impl->table = v;
795
+ return *this;
796
+ }
797
+
798
+ int readStatement::getIndex() const
799
+ {
800
+ return m_impl->index;
801
+ }
802
+
803
+ readStatement& readStatement::index(int v)
804
+ {
805
+ m_impl->index = v;
806
+ return *this;
807
+ }
808
+
809
+ int readStatement::getOption() const
810
+ {
811
+ return m_impl->option;
812
+ }
813
+
814
+ readStatement& readStatement::option(int v)
815
+ {
816
+ m_impl->option = v;
817
+ return *this;
818
+ }
819
+
820
+ readStatement::eReadType readStatement::getReadType() const
821
+ {
822
+ return m_impl->readType;
823
+ }
824
+
825
+ readStatement& readStatement::readType(readStatement::eReadType v)
826
+ {
827
+ m_impl->readType = v;
828
+ return *this;
829
+ }
830
+
831
+ queryStatementImple* readStatement::internalPtr() const
832
+ {
833
+ return m_impl;
834
+ }
835
+
836
+ readStatement& readStatement::alias(const _TCHAR* src, const _TCHAR* dst)
837
+ {
838
+ m_impl->alias(src, dst);
839
+ return *this;
840
+ }
841
+
842
+ readStatement& readStatement::reset()
843
+ {
844
+ query::reset();
845
+ fieldNames::reset();
846
+ m_impl->aliases.clear();
847
+ return *this;
848
+ }
849
+
850
+ int readStatement::aliasCount() const
851
+ {
852
+ return (int)m_impl->aliases.size();
853
+ }
854
+
855
+ const _TCHAR* readStatement::getAliasFirst(int index) const
856
+ {
857
+ return m_impl->aliases[index].first.c_str();
858
+ }
859
+
860
+ const _TCHAR* readStatement::getAliasSecond(int index) const
861
+ {
862
+ return m_impl->aliases[index].second.c_str();
863
+ }
864
+
865
+ void readStatement::execute(recordset& rs)
866
+ {
867
+ if (m_impl->parent->dbm)
868
+ m_impl->execute(rs, m_impl->parent->dbm);
869
+ else if (m_impl->parent->db)
870
+ m_impl->execute(rs, m_impl->parent->db);
871
+ }
872
+
873
+ //---------------------------------------------------------------------------
874
+ // class queryExecuter
875
+ //---------------------------------------------------------------------------
876
+ queryStatements* queryStatements::create(idatabaseManager& dbm)
877
+ {
878
+ return new queryStatements(dbm);
879
+ }
880
+
881
+ queryStatements* queryStatements::create(database* db)
882
+ {
883
+ return new queryStatements(db);
884
+ }
885
+
886
+ void queryStatements::release()
887
+ {
888
+ delete this;
889
+ }
890
+
891
+ queryStatements::queryStatements(idatabaseManager& dbm)
892
+ : m_impl(new queryStatementsImple)
893
+ {
894
+ m_impl->dbm = &dbm;
895
+ }
896
+
897
+ queryStatements::queryStatements(database* db)
898
+ : m_impl(new queryStatementsImple)
899
+ {
900
+ m_impl->db = db;
901
+ }
902
+
903
+ queryStatements::~queryStatements()
904
+ {
905
+ delete m_impl;
906
+ }
907
+
908
+ int queryStatements::getId() const
909
+ {
910
+ return m_impl->id;
911
+ }
912
+
913
+ queryStatements& queryStatements::id(int v)
914
+ {
915
+ m_impl->id = v;
916
+ return *this;
917
+ }
918
+
919
+ const _TCHAR* queryStatements::getTitle() const
920
+ {
921
+ return m_impl->title.c_str();
922
+ }
923
+
924
+ queryStatements& queryStatements::title(const _TCHAR* v)
925
+ {
926
+ m_impl->title = v;
927
+ return *this;
928
+ }
929
+
930
+ const _TCHAR* queryStatements::getDescription() const
931
+ {
932
+ return m_impl->description.c_str();
933
+ }
934
+
935
+ queryStatements& queryStatements::description(const _TCHAR* v)
936
+ {
937
+ m_impl->description = v;
938
+ return *this;
939
+ }
940
+
941
+ readStatement* queryStatements::addRead(readStatement::eReadType type)
942
+ {
943
+ readStatement* p = readStatement::create();
944
+ p->readType(type);
945
+ p->m_impl->parent = this->m_impl;
946
+ m_impl->statements.push_back(p);
947
+ return p;
948
+ }
949
+
950
+ readHasMany* queryStatements::addHasManyRead()
951
+ {
952
+ readHasMany* p = readHasMany::create();
953
+ m_impl->statements.push_back(p);
954
+ return p;
955
+ }
956
+
957
+ groupByStatement* queryStatements::addGroupBy()
958
+ {
959
+ groupByStatement* p = groupByStatement::create();
960
+ p->m_parent = this->m_impl;
961
+ m_impl->statements.push_back(p);
962
+ return p;
963
+ }
964
+
965
+ orderByStatement* queryStatements::addOrderBy()
966
+ {
967
+ orderByStatement* p = orderByStatement::create();
968
+ m_impl->statements.push_back(p);
969
+ return p;
970
+ }
971
+
972
+ matchByStatement* queryStatements::addMatchBy()
973
+ {
974
+ matchByStatement* p = matchByStatement::create();
975
+ p->m_parent = this->m_impl;
976
+ m_impl->statements.push_back(p);
977
+ return p;
978
+ }
979
+
980
+ reverseOrderStatement* queryStatements::addReverseOrder()
981
+ {
982
+ reverseOrderStatement* p = reverseOrderStatement::create();
983
+ m_impl->statements.push_back(p);
984
+ return p;
985
+ }
986
+
987
+ executable* queryStatements::get(int index)
988
+ {
989
+ return m_impl->statements[index];
990
+ }
991
+
992
+ void queryStatements::pop_back()
993
+ {
994
+ m_impl->statements.pop_back();
995
+ }
996
+
997
+ int queryStatements::size() const
998
+ {
999
+ return (int)m_impl->statements.size();
1000
+ }
1001
+
1002
+ queryStatementsImple* queryStatements::internalPtr() const
1003
+ {
1004
+ return m_impl;
1005
+ }
1006
+
1007
+ void queryStatements::save(const _TCHAR* filename)
1008
+ {
1009
+ #ifdef _UNICODE
1010
+ char p[MAX_PATH];
1011
+ WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filename, -1, p, MAX_PATH,
1012
+ NULL, NULL);
1013
+ #else
1014
+ const char* p = filename;
1015
+
1016
+ #endif
1017
+ std::ofstream file(p);
1018
+ xml_oarchive oa(file);
1019
+ queryStatementsImple& queryStatements = *m_impl;
1020
+ oa << BOOST_SERIALIZATION_NVP(queryStatements);
1021
+ }
1022
+
1023
+ void queryStatements::load(const _TCHAR* filename)
1024
+ {
1025
+
1026
+ #ifdef _UNICODE
1027
+ char p[MAX_PATH];
1028
+ WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, filename, -1, p, MAX_PATH,
1029
+ NULL, NULL);
1030
+
1031
+ #else
1032
+ const char* p = filename;
1033
+
1034
+ #endif
1035
+ m_impl->reset();
1036
+ std::ifstream file(p);
1037
+ xml_iarchive ia(file);
1038
+ queryStatementsImple& queryStatements = *m_impl;
1039
+ ia >> BOOST_SERIALIZATION_NVP(queryStatements);
1040
+ }
1041
+
1042
+ void queryStatements::save(std::stringstream& sf)
1043
+ {
1044
+ xml_oarchive oa(sf);
1045
+ queryStatementsImple& queryStatements = *m_impl;
1046
+ oa << BOOST_SERIALIZATION_NVP(queryStatements);
1047
+ }
1048
+
1049
+ void queryStatements::load(std::stringstream& sf)
1050
+ {
1051
+ m_impl->reset();
1052
+ xml_iarchive ia(sf);
1053
+ queryStatementsImple& queryStatements = *m_impl;
1054
+ ia >> BOOST_SERIALIZATION_NVP(queryStatements);
1055
+ }
1056
+
1057
+ void queryStatements::execute(recordset& rs,
1058
+ const std::vector<std::_tstring>* values,
1059
+ executeListner* listner)
1060
+ {
1061
+ m_impl->pv.setValues(values);
1062
+ m_impl->execute(rs, listner);
1063
+ }
1064
+
1065
+ void queryStatements::clear()
1066
+ {
1067
+ m_impl->reset();
1068
+ }
1069
+
1070
+ int queryStatements::statementType(int index)
1071
+ {
1072
+ if (dynamic_cast<readHasMany*>(m_impl->statements[index]))
1073
+ return 2;
1074
+ if (dynamic_cast<readStatement*>(m_impl->statements[index]))
1075
+ return 1;
1076
+ if (dynamic_cast<groupByStatement*>(m_impl->statements[index]))
1077
+ return 3;
1078
+ if (dynamic_cast<orderByStatement*>(m_impl->statements[index]))
1079
+ return 4;
1080
+ if (dynamic_cast<matchByStatement*>(m_impl->statements[index]))
1081
+ return 5;
1082
+ if (dynamic_cast<reverseOrderStatement*>(m_impl->statements[index]))
1083
+ return 6;
1084
+
1085
+ return 0;
1086
+ }
1087
+
1088
+ readStatement* queryStatements::getReadStatement(executable* e)
1089
+ {
1090
+ return dynamic_cast<readStatement*>(e);
1091
+ }
1092
+
1093
+ readHasMany* queryStatements::getReadHasMany(executable* e)
1094
+ {
1095
+ return dynamic_cast<readHasMany*>(e);
1096
+ }
1097
+
1098
+ groupByStatement* queryStatements::getGroupByStatement(executable* e)
1099
+ {
1100
+ return dynamic_cast<groupByStatement*>(e);
1101
+ }
1102
+
1103
+ orderByStatement* queryStatements::getOrderByStatement(executable* e)
1104
+ {
1105
+ return dynamic_cast<orderByStatement*>(e);
1106
+ }
1107
+
1108
+ matchByStatement* queryStatements::getMatchByStatement(executable* e)
1109
+ {
1110
+ return dynamic_cast<matchByStatement*>(e);
1111
+ }
1112
+
1113
+ reverseOrderStatement* queryStatements::getReverseOrderStatement(executable* e)
1114
+ {
1115
+ return dynamic_cast<reverseOrderStatement*>(e);
1116
+ }
1117
+
1118
+ const readStatement*
1119
+ queryStatements::getReadStatement(const executable* e) const
1120
+ {
1121
+ return dynamic_cast<const readStatement*>(e);
1122
+ }
1123
+
1124
+ const readHasMany* queryStatements::getReadHasMany(const executable* e) const
1125
+ {
1126
+ return dynamic_cast<const readHasMany*>(e);
1127
+ }
1128
+
1129
+ const groupByStatement*
1130
+ queryStatements::getGroupByStatement(const executable* e) const
1131
+ {
1132
+ return dynamic_cast<const groupByStatement*>(e);
1133
+ }
1134
+
1135
+ const orderByStatement*
1136
+ queryStatements::getOrderByStatement(const executable* e) const
1137
+ {
1138
+ return dynamic_cast<const orderByStatement*>(e);
1139
+ }
1140
+
1141
+ const matchByStatement*
1142
+ queryStatements::getMatchByStatement(const executable* e) const
1143
+ {
1144
+ return dynamic_cast<const matchByStatement*>(e);
1145
+ }
1146
+
1147
+ const reverseOrderStatement*
1148
+ queryStatements::getReverseOrderStatement(const executable* e) const
1149
+ {
1150
+ return dynamic_cast<const reverseOrderStatement*>(e);
1151
+ }
1152
+
1153
+ //---------------------------------------------------------------------------
1154
+ // struct readHasManyImple
1155
+ //---------------------------------------------------------------------------
1156
+
1157
+ struct readHasManyImple
1158
+ {
1159
+ fieldNames columns;
1160
+ recordsets rss;
1161
+
1162
+ void reset()
1163
+ {
1164
+ rss.clear();
1165
+ columns.reset();
1166
+ }
1167
+
1168
+ template <class Archive>
1169
+ void serialize(Archive& ar, const unsigned int version)
1170
+ {
1171
+ ar& make_nvp("columns", columns);
1172
+ }
1173
+ };
1174
+
1175
+ //---------------------------------------------------------------------------
1176
+ // class readHasMany
1177
+ //---------------------------------------------------------------------------
1178
+
1179
+ readHasMany::readHasMany()
1180
+ : readStatement(), m_readHasManyImpl(new readHasManyImple)
1181
+ {
1182
+ }
1183
+
1184
+ readHasMany::~readHasMany()
1185
+ {
1186
+ delete m_readHasManyImpl;
1187
+ }
1188
+
1189
+ readHasManyImple* readHasMany::internalPtr() const
1190
+ {
1191
+ return m_readHasManyImpl;
1192
+ }
1193
+
1194
+ recordsets& readHasMany::recordsets()
1195
+ {
1196
+ return m_readHasManyImpl->rss;
1197
+ }
1198
+
1199
+ void readHasMany::addkeyValueColumn(const _TCHAR* name)
1200
+ {
1201
+ m_readHasManyImpl->columns.addValue(name);
1202
+ }
1203
+
1204
+ const _TCHAR* readHasMany::getkeyValueColumn(int index) const
1205
+ {
1206
+ return m_readHasManyImpl->columns.getValue(index);
1207
+ }
1208
+
1209
+ int readHasMany::keyValueColumns() const
1210
+ {
1211
+ return m_readHasManyImpl->columns.count();
1212
+ }
1213
+
1214
+ readHasMany& readHasMany::reset()
1215
+ {
1216
+ readStatement::reset();
1217
+ m_readHasManyImpl->reset();
1218
+ return *this;
1219
+ }
1220
+
1221
+ void readHasMany::execute(recordset& rs)
1222
+ {
1223
+ m_readHasManyImpl->rss.clear();
1224
+
1225
+ std::vector<int> indexes;
1226
+ const fielddefs* fds = rs.fieldDefs();
1227
+ for (int i = 0; i < m_readHasManyImpl->columns.count(); ++i)
1228
+ indexes.push_back(fds->indexByName(getkeyValueColumn(i)));
1229
+
1230
+ for (int i = 0; i < (int)rs.size(); ++i)
1231
+ {
1232
+ fieldNames::reset();
1233
+ // setkey values
1234
+ for (int j = 0; j < (int)indexes.size(); ++j)
1235
+ {
1236
+ const _TCHAR* p = rs[i][indexes[j]].c_str();
1237
+ addValue(p);
1238
+ if (j == 0)
1239
+ addLogic(getkeyValueColumn(j), _T("="), p);
1240
+ else
1241
+ addLogic(_T("and"), getkeyValueColumn(j), _T("="), p);
1242
+ }
1243
+ recordset* tmp = new recordset();
1244
+ boost::shared_ptr<recordset> r(tmp,
1245
+ boost::bind(&recordset::release, tmp));
1246
+ m_readHasManyImpl->rss.push_back(r);
1247
+ readStatement::execute(*r);
1248
+ }
1249
+ }
1250
+
1251
+ client::query* replaceQueryParams(client::query* tq, client::query& tmpq,
1252
+ queryStatementsImple* parent)
1253
+ {
1254
+
1255
+ int n = 0;
1256
+ if (tq)
1257
+ n = tq->whereTokens();
1258
+ else
1259
+ n = tmpq.whereTokens();
1260
+ if (n)
1261
+ {
1262
+ if (tq)
1263
+ tmpq = *tq;
1264
+ for (int i = 0; i < n; ++i)
1265
+ {
1266
+ if (_tcscmp(tmpq.getWhereToken(i), _T("?")) == 0)
1267
+ tmpq.setWhereToken(i,
1268
+ parent->pv.replace(tmpq.getWhereToken(i)));
1269
+ }
1270
+ return &tmpq;
1271
+ }
1272
+ return tq;
1273
+ }
1274
+
1275
+ readHasMany* readHasMany::create()
1276
+ {
1277
+ return new readHasMany();
1278
+ }
1279
+
1280
+ } // namespace client
1281
+ } // namespace tdap
1282
+ } // namespace protocol
1283
+ } // namespace db
1284
+ } // namespace bzs
1285
+
1286
+ #ifdef BCB_32
1287
+ #pragma option pop
1288
+ #endif