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,86 @@
1
+ #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
2
+ #define BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
3
+ /*=================================================================
4
+ Copyright (C) 2014 BizStation Corp All rights reserved.
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
+ 02111-1307, USA.
20
+ =================================================================*/
21
+ #include "groupQuery.h"
22
+
23
+ namespace bzs
24
+ {
25
+ namespace db
26
+ {
27
+ namespace protocol
28
+ {
29
+ namespace tdap
30
+ {
31
+ namespace client
32
+ {
33
+
34
+ class DLLLIB recordset
35
+ {
36
+
37
+ friend class activeTable;
38
+ class recordsetImple* m_imple;
39
+
40
+ public:
41
+ typedef std::vector<row_ptr>::iterator iterator;
42
+
43
+ recordset();
44
+ recordset(const recordset& r);
45
+ recordset& operator=(const recordset& r);
46
+ ~recordset();
47
+ recordset* clone() const;
48
+ row& operator[](size_t index) const;
49
+ row& first() const;
50
+ row& last() const;
51
+ size_t size() const;
52
+ size_t count() const;
53
+ void clearRecords();
54
+ const fielddefs* fieldDefs() const;
55
+ void clear();
56
+ recordset& top(recordset& c, int n) const;
57
+ iterator begin();
58
+ iterator end();
59
+ iterator erase(size_t index);
60
+ iterator erase(const iterator& it);
61
+ void removeField(int index);
62
+ recordset& matchBy(recordsetQuery& rq);
63
+ recordset& groupBy(groupQuery& gq);
64
+ recordset& orderBy(const _TCHAR* name1, const _TCHAR* name2 = NULL,
65
+ const _TCHAR* name3 = NULL, const _TCHAR* name4 = NULL,
66
+ const _TCHAR* name5 = NULL, const _TCHAR* name6 = NULL,
67
+ const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL);
68
+ recordset& orderBy(const sortFields& orders);
69
+ recordset& reverse();
70
+ void appendField(const _TCHAR* name, int type, short len);
71
+ recordset& operator+=(const recordset& r);
72
+ void release();
73
+ static recordset* create();
74
+
75
+ #ifdef _DEBUG
76
+ void dump();
77
+ #endif
78
+ };
79
+
80
+ } // namespace client
81
+ } // namespace tdap
82
+ } // namespace protocol
83
+ } // namespace db
84
+ } // namespace bzs
85
+
86
+ #endif // BZS_DB_PROTOCOL_TDAP_CLIENT_RECORDSET_H
@@ -0,0 +1,596 @@
1
+ #ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H
2
+ #define BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H
3
+ /*=================================================================
4
+ Copyright (C) 2014 BizStation Corp All rights reserved.
5
+
6
+ This program is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ This program is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with this program; if not, write to the Free Software
18
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19
+ 02111-1307, USA.
20
+ =================================================================*/
21
+ #include "trdormapi.h"
22
+ #include "groupQuery.h"
23
+ #ifdef _DEBUG
24
+ #include <iostream>
25
+ #endif
26
+
27
+ namespace bzs
28
+ {
29
+ namespace db
30
+ {
31
+ namespace protocol
32
+ {
33
+ namespace tdap
34
+ {
35
+ namespace client
36
+ {
37
+
38
+ struct sortDescription
39
+ {
40
+ short index;
41
+ bool asc;
42
+ };
43
+
44
+ class recordsetSorter
45
+ {
46
+ const std::vector<sortDescription>& m_sortDesc;
47
+
48
+ public:
49
+ recordsetSorter(std::vector<sortDescription>& sortDesc)
50
+ : m_sortDesc(sortDesc)
51
+ {
52
+ }
53
+ bool operator()(const row_ptr& l, const row_ptr r) const
54
+ {
55
+ std::vector<sortDescription>::const_iterator it = m_sortDesc.begin();
56
+ while (it != m_sortDesc.end())
57
+ {
58
+ int ret = (*l)[(*it).index].comp((*r)[(*it).index], 0);
59
+ if (ret)
60
+ return ((*it).asc) ? (ret < 0) : (ret > 0);
61
+
62
+ ++it;
63
+ }
64
+ return false;
65
+ }
66
+ };
67
+
68
+ class multiRecordAlocatorImple : public multiRecordAlocator
69
+ {
70
+ class recordsetImple* m_rs;
71
+ const std::vector<std::vector<int> >* m_joinRowMap;
72
+ int m_rowOffset;
73
+ int m_addType;
74
+ int m_curFirstFiled;
75
+
76
+ public:
77
+ inline multiRecordAlocatorImple(recordsetImple* rs);
78
+ inline void init(size_t recordCount, size_t recordLen, int addType,
79
+ const table* tb);
80
+ inline unsigned char* ptr(size_t row, int stat);
81
+ inline void setRowOffset(int v) { m_rowOffset = v; }
82
+ inline void setJoinType(int v) { m_addType = v; }
83
+ inline void setInvalidRecord(size_t row, bool v);
84
+ inline void setCurFirstFiled(int v) { m_curFirstFiled = v; }
85
+ inline void
86
+ setJoinRowMap(const std::vector<std::vector<int> >* v /*, size_t size*/)
87
+ {
88
+ m_joinRowMap = v; /*m_joinMapSize = size;*/
89
+ }
90
+ inline const std::vector<std::vector<int> >* joinRowMap() const
91
+ {
92
+ return m_joinRowMap;
93
+ }
94
+ inline void duplicateRow(int row, int count);
95
+ inline void removeLastMemBlock(int row);
96
+ };
97
+
98
+ class recordsetImple
99
+ {
100
+ friend class multiRecordAlocatorImple;
101
+ boost::shared_ptr<fielddefs> m_fds;
102
+ boost::shared_ptr<multiRecordAlocatorImple> m_mra;
103
+ std::vector<row_ptr> m_recordset;
104
+ std::vector<boost::shared_ptr<autoMemory> > m_memblock;
105
+ std::vector<boost::shared_ptr<fielddefs> > m_unionFds;
106
+
107
+ /* for registerMemoryBlock temp data */
108
+ size_t m_joinRows;
109
+
110
+ /*
111
+ for optimazing join.
112
+ If the first reading is using by unique key , set that field count.
113
+ */
114
+ short m_uniqueReadMaxField;
115
+
116
+ public:
117
+ typedef std::vector<row_ptr>::iterator iterator;
118
+
119
+ private:
120
+ void registerMemoryBlock(unsigned char* ptr, size_t size, size_t recordLen,
121
+ int addtype, const table* tb = NULL)
122
+ {
123
+ autoMemory* am = new autoMemory(ptr, size, 0, true);
124
+ m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
125
+ unsigned char* p = am->ptr;
126
+ // copy fileds
127
+ if (addtype & mra_nextrows)
128
+ {
129
+ if (addtype == mra_nextrows)
130
+ m_mra->setRowOffset((int)m_recordset.size()); // no join
131
+ else
132
+ m_mra->setRowOffset((int)m_joinRows); // Join
133
+ }
134
+ else
135
+ {
136
+ // assert(tb);
137
+ m_joinRows = 0;
138
+ m_mra->setRowOffset(0);
139
+ m_mra->setCurFirstFiled((int)m_fds->size());
140
+ if (tb)
141
+ m_fds->copyFrom(tb);
142
+ if (tb && (addtype == mra_nojoin))
143
+ {
144
+ const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
145
+ m_uniqueReadMaxField = (kd.segments[0].flags.bit0 == false)
146
+ ? (short)m_fds->size()
147
+ : 0;
148
+ }
149
+ }
150
+
151
+ *(am->endFieldIndex) = (short)m_fds->size();
152
+ size_t rows = size / recordLen;
153
+
154
+ // set record pointer to each record
155
+ if ((addtype & mra_innerjoin) || (addtype & mra_outerjoin))
156
+ {
157
+ // Join optimazing
158
+ const std::vector<std::vector<int> >* jmap = m_mra->joinRowMap();
159
+
160
+ if (jmap)
161
+ {
162
+ // At Join that if some base records reference to a joined
163
+ // record
164
+ // that the joined record pointer is shared by some
165
+ // base records.
166
+ for (int i = 0; i < (int)rows; ++i)
167
+ {
168
+ const std::vector<int>& map = (*jmap)[i + m_joinRows];
169
+ for (int j = 0; j < (int)map.size(); ++j)
170
+ m_recordset[map[j]]->setRecordData(
171
+ p + recordLen * i, 0, am->endFieldIndex, false);
172
+ }
173
+ }
174
+ else
175
+ {
176
+ for (int i = 0; i < (int)rows; ++i)
177
+ m_recordset[i + m_joinRows]->setRecordData(
178
+ p + recordLen * i, 0, am->endFieldIndex, false);
179
+ }
180
+ m_joinRows += rows;
181
+ }
182
+ else
183
+ { // create new record
184
+ size_t reserveSize = m_recordset.size() + rows;
185
+ m_recordset.reserve(reserveSize);
186
+ for (int i = 0; i < (int)rows; ++i)
187
+ {
188
+ row_ptr rec(memoryRecord::create(*m_fds),
189
+ &memoryRecord::release);
190
+ rec->setRecordData(p + recordLen * i, 0, am->endFieldIndex,
191
+ false);
192
+ m_recordset.push_back(rec);
193
+ }
194
+ }
195
+ }
196
+
197
+ void makeSortFields(const _TCHAR* name,
198
+ std::vector<sortDescription>& sortDesc, bool asc = true)
199
+ {
200
+ sortDescription sd;
201
+ sd.index = m_fds->indexByName(name);
202
+ if (sd.index == -1)
203
+ THROW_BZS_ERROR_WITH_MSG(_T("orderBy:Invalid field name"));
204
+ sd.asc = asc;
205
+ sortDesc.push_back(sd);
206
+ }
207
+
208
+ int getMemBlockIndex(unsigned char* ptr) const
209
+ {
210
+ for (int i = 0; i < (int)m_memblock.size(); ++i)
211
+ {
212
+ const boost::shared_ptr<autoMemory>& am = m_memblock[i];
213
+ if ((ptr >= am->ptr) && (ptr < am->ptr + am->size))
214
+ return i;
215
+ }
216
+ assert(0);
217
+ return -1;
218
+ }
219
+
220
+ // Duplicate row for hasManyJoin
221
+ void duplicateRow(int row, int count)
222
+ {
223
+ row_ptr& r = m_recordset[row];
224
+ memoryRecord* p = dynamic_cast<memoryRecord*>(r.get());
225
+
226
+ m_recordset.reserve(m_recordset.size() + count);
227
+ m_recordset.insert(m_recordset.begin() + row, count, row_ptr());
228
+ for (int i = 0; i < count; ++i)
229
+ m_recordset[i + row].reset(new memoryRecord(*p),
230
+ &memoryRecord::release);
231
+ }
232
+
233
+ public:
234
+ inline recordsetImple()
235
+ : m_fds(fielddefs::create(), boost::bind(&fielddefs::release, _1)),
236
+ m_joinRows(0), m_uniqueReadMaxField(0)
237
+ {
238
+ m_mra.reset(new multiRecordAlocatorImple(this));
239
+ }
240
+
241
+ inline ~recordsetImple() {}
242
+
243
+ inline void checkIndex(size_t index)
244
+ {
245
+ if (index >= m_recordset.size())
246
+ THROW_BZS_ERROR_WITH_MSG(_T("Invalid row index of recordset."));
247
+ }
248
+
249
+ /* This clone is deep copy.
250
+ But text and blob field data memory are shared.
251
+ */
252
+ inline recordsetImple* clone() const
253
+ {
254
+ recordsetImple* p = new recordsetImple();
255
+ p->m_joinRows = m_joinRows;
256
+ p->m_uniqueReadMaxField = m_uniqueReadMaxField;
257
+ p->m_unionFds = m_unionFds;
258
+ p->m_fds.reset(m_fds->clone(), boost::bind(&fielddefs::release, _1));
259
+
260
+ std::vector<__int64> offsets;
261
+ for (int i = 0; i < (int)m_memblock.size(); ++i)
262
+ {
263
+ autoMemory* am = new autoMemory(m_memblock[i]->ptr,
264
+ m_memblock[i]->size, 0, true);
265
+ *am->endFieldIndex = *m_memblock[i]->endFieldIndex;
266
+ p->m_memblock.push_back(boost::shared_ptr<autoMemory>(am));
267
+ offsets.push_back((__int64)(am->ptr - m_memblock[i]->ptr));
268
+ }
269
+
270
+ for (int i = 0; i < (int)m_recordset.size(); ++i)
271
+ {
272
+ memoryRecord* row =
273
+ dynamic_cast<memoryRecord*>(m_recordset[i].get());
274
+ memoryRecord* mr = memoryRecord::create(*p->m_fds);
275
+ row_ptr rec(mr, &memoryRecord::release);
276
+ p->m_recordset.push_back(rec);
277
+
278
+ for (int j = 0; j < (int)row->memBlockSize(); ++j)
279
+ {
280
+ const autoMemory& mb = row->memBlock(j);
281
+ int index = getMemBlockIndex(mb.ptr);
282
+ #pragma warn -8072
283
+ unsigned char* ptr = mb.ptr + offsets[index];
284
+ #pragma warn .8072
285
+ const boost::shared_ptr<autoMemory>& am = p->m_memblock[index];
286
+ mr->setRecordData(ptr, mb.size, am->endFieldIndex, mb.owner);
287
+ }
288
+ }
289
+ return p;
290
+ }
291
+
292
+ inline short uniqueReadMaxField() const { return m_uniqueReadMaxField; }
293
+
294
+ inline void clearRecords()
295
+ {
296
+ m_recordset.clear();
297
+ m_uniqueReadMaxField = 0;
298
+ }
299
+
300
+ inline const fielddefs* fieldDefs() const { return m_fds.get(); }
301
+
302
+ inline void clear()
303
+ {
304
+ clearRecords();
305
+ m_fds->clear();
306
+ m_unionFds.clear();
307
+ m_memblock.clear();
308
+ }
309
+
310
+ inline row_ptr& getRow(size_t index) { return m_recordset[index]; }
311
+
312
+ inline row& operator[](size_t index) const
313
+ {
314
+ return *m_recordset[index].get();
315
+ }
316
+
317
+ inline row& first() const
318
+ {
319
+ if (m_recordset.size() == 0)
320
+ THROW_BZS_ERROR_WITH_MSG(_T("Invalid index of recordset."));
321
+ return *m_recordset[0].get();
322
+ }
323
+
324
+ inline row& last() const
325
+ {
326
+ if (m_recordset.size() == 0)
327
+ THROW_BZS_ERROR_WITH_MSG(_T("Invalid index of recordset."));
328
+ return *m_recordset[m_recordset.size() - 1].get();
329
+ }
330
+
331
+ inline recordsetImple& top(recordsetImple& c, int n) const
332
+ {
333
+ c = *this;
334
+ c.clearRecords();
335
+ n = std::min(n, (int)m_recordset.size());
336
+ for (int i = 0; i < n; ++i)
337
+ c.push_back(m_recordset[i]);
338
+ return c;
339
+ }
340
+
341
+ inline iterator begin() { return m_recordset.begin(); }
342
+
343
+ inline iterator end() { return m_recordset.end(); }
344
+
345
+ inline iterator erase(size_t index)
346
+ {
347
+ return m_recordset.erase(m_recordset.begin() + index);
348
+ }
349
+
350
+ inline iterator erase(const iterator& it) { return m_recordset.erase(it); }
351
+
352
+ inline void push_back(row_ptr r) { m_recordset.push_back(r); };
353
+
354
+ inline size_t size() const { return m_recordset.size(); }
355
+
356
+ inline size_t count() const { return m_recordset.size(); }
357
+
358
+ void readBefore(const table_ptr tb, const aliasMap_type* alias)
359
+ {
360
+ tb->setMra(m_mra.get());
361
+ m_fds->setAliases(alias);
362
+ }
363
+
364
+ typedef fielddefs header_type;
365
+ typedef int key_type;
366
+ typedef row_ptr row_type;
367
+ typedef row row_pure_type;
368
+
369
+ key_type resolvKeyValue(const std::_tstring& name, bool noexception = false)
370
+ {
371
+ int index = m_fds->indexByName(name);
372
+ if (index != -1)
373
+ return index;
374
+ if (!noexception)
375
+ THROW_BZS_ERROR_WITH_MSG(_T("groupQuery:Invalid key name"));
376
+
377
+ return (key_type)m_fds->size();
378
+ }
379
+
380
+ inline void removeField(int index)
381
+ {
382
+ m_fds->remove(index);
383
+ for (int i = 0; i < (int)m_unionFds.size(); ++i)
384
+ m_unionFds[i]->remove(index);
385
+
386
+ for (int i = 0; i < (int)m_memblock.size(); ++i)
387
+ {
388
+ if (*(m_memblock[i]->endFieldIndex) > index)
389
+ {
390
+ short v = *(m_memblock[i]->endFieldIndex) - 1;
391
+ *(m_memblock[i]->endFieldIndex) = v;
392
+ }
393
+ }
394
+ }
395
+
396
+ inline recordsetImple& matchBy(recordsetQuery& rq)
397
+ {
398
+ m_fds->setAliases(NULL);
399
+ if (m_recordset.size())
400
+ {
401
+ rq.init(fieldDefs());
402
+ for (int i = (int)m_recordset.size() - 1; i >= 0; --i)
403
+ if (!rq.match(m_recordset[i]))
404
+ erase(i);
405
+ }
406
+ return *this;
407
+ }
408
+
409
+ inline recordsetImple& groupBy(groupQuery& gq)
410
+ {
411
+ m_fds->setAliases(NULL);
412
+ if (m_recordset.size())
413
+ gq.grouping(*this);
414
+ return *this;
415
+ }
416
+
417
+ inline recordsetImple&
418
+ orderBy(const _TCHAR* name1, const _TCHAR* name2 = NULL,
419
+ const _TCHAR* name3 = NULL, const _TCHAR* name4 = NULL,
420
+ const _TCHAR* name5 = NULL, const _TCHAR* name6 = NULL,
421
+ const _TCHAR* name7 = NULL, const _TCHAR* name8 = NULL)
422
+ {
423
+ if (m_recordset.size())
424
+ {
425
+ std::vector<sortDescription> sds;
426
+ makeSortFields(name1, sds, true);
427
+ if (name2)
428
+ makeSortFields(name2, sds, true);
429
+ if (name3)
430
+ makeSortFields(name3, sds, true);
431
+ if (name4)
432
+ makeSortFields(name4, sds, true);
433
+ if (name5)
434
+ makeSortFields(name5, sds, true);
435
+ if (name6)
436
+ makeSortFields(name6, sds, true);
437
+ if (name7)
438
+ makeSortFields(name7, sds, true);
439
+ if (name8)
440
+ makeSortFields(name8, sds, true);
441
+ std::sort(begin(), end(), recordsetSorter(sds));
442
+ }
443
+ return *this;
444
+ }
445
+
446
+ inline recordsetImple& orderBy(const sortFields& orders)
447
+ {
448
+ if (m_recordset.size())
449
+ {
450
+ std::vector<sortDescription> sds;
451
+
452
+ for (int i = 0; i < (int)orders.size(); ++i)
453
+ makeSortFields(orders[i].name.c_str(), sds, orders[i].asc);
454
+
455
+ std::sort(begin(), end(), recordsetSorter(sds));
456
+ }
457
+ return *this;
458
+ }
459
+
460
+ inline recordsetImple& reverse()
461
+ {
462
+ std::reverse(begin(), end());
463
+ return *this;
464
+ }
465
+
466
+ inline void appendField(const _TCHAR* name, int type, short len)
467
+ {
468
+ assert(m_fds->size());
469
+ fielddef fd((*m_fds)[0]);
470
+ fd.len = len;
471
+ fd.pos = 0;
472
+ fd.type = type;
473
+ fd.setName(name);
474
+ m_fds->push_back(&fd);
475
+ for (int i = 0; i < (int)m_unionFds.size(); ++i)
476
+ m_unionFds[i]->push_back(&fd);
477
+ registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
478
+ }
479
+
480
+ inline recordsetImple& operator+=(const recordsetImple& r)
481
+ {
482
+ if (!m_fds->canUnion(*r.m_fds))
483
+ THROW_BZS_ERROR_WITH_MSG(_T("Recordsets are different format"));
484
+
485
+ m_recordset.reserve(m_recordset.size() + r.size());
486
+ m_unionFds.push_back(r.m_fds);
487
+ for (size_t i = 0; i < r.size(); ++i)
488
+ m_recordset.push_back(r.m_recordset[i]);
489
+ for (size_t i = 0; i < r.m_memblock.size(); ++i)
490
+ m_memblock.push_back(r.m_memblock[i]);
491
+ return *this;
492
+ }
493
+
494
+ #ifdef _DEBUG
495
+ void dump()
496
+ {
497
+ const fielddefs& fields = *fieldDefs();
498
+ for (int j = 0; j < (int)fields.size(); ++j)
499
+ std::tcout << fields[j].name() << _T("\t");
500
+ std::tcout << _T("\n");
501
+
502
+ for (int i = 0; i < (int)size(); ++i)
503
+ {
504
+ row& m = (operator[](i));
505
+ for (int j = 0; j < (int)m.size(); ++j)
506
+ {
507
+ std::tcout << m[(short)j].c_str() << _T("\t");
508
+ if (j == (int)m.size() - 1)
509
+ std::tcout << _T("\n");
510
+ }
511
+ }
512
+ }
513
+ #endif
514
+ };
515
+
516
+ inline multiRecordAlocatorImple::multiRecordAlocatorImple(recordsetImple* rs)
517
+ : m_rs(rs), m_joinRowMap(NULL), m_rowOffset(0), m_addType(0),
518
+ m_curFirstFiled(0)
519
+ {
520
+ }
521
+
522
+ inline void multiRecordAlocatorImple::init(size_t recordCount, size_t recordLen,
523
+ int addType, const table* tb)
524
+ {
525
+ m_rs->registerMemoryBlock(NULL, recordCount * recordLen, recordLen,
526
+ addType | m_addType, tb);
527
+ }
528
+
529
+ inline unsigned char* multiRecordAlocatorImple::ptr(size_t row, int stat)
530
+ {
531
+ int col = (stat == mra_current_block) ? m_curFirstFiled : 0;
532
+ size_t rowNum = m_joinRowMap ? (*m_joinRowMap)[row + m_rowOffset][0]
533
+ : row + m_rowOffset;
534
+ return (*m_rs)[rowNum].ptr(col);
535
+ }
536
+
537
+ inline void multiRecordAlocatorImple::setInvalidRecord(size_t row, bool v)
538
+ {
539
+ if (m_joinRowMap)
540
+ {
541
+ const std::vector<int>& map = (*m_joinRowMap)[row + m_rowOffset];
542
+ for (int j = 0; j < (int)map.size(); ++j)
543
+ (*m_rs)[map[j]].setInvalidRecord(v);
544
+ }
545
+ else
546
+ (*m_rs)[row + m_rowOffset].setInvalidRecord(v);
547
+ }
548
+
549
+ inline void multiRecordAlocatorImple::duplicateRow(int row, int count)
550
+ {
551
+ m_rs->duplicateRow(row, count);
552
+ }
553
+
554
+ inline void multiRecordAlocatorImple::removeLastMemBlock(int row)
555
+ {
556
+ (*m_rs)[row].removeLastMemBlock();
557
+ }
558
+
559
+ template <> inline recordsetImple::iterator begin(recordsetImple& m)
560
+ {
561
+ return m.begin();
562
+ }
563
+ template <> inline recordsetImple::iterator end(recordsetImple& m)
564
+ {
565
+ return m.end();
566
+ }
567
+ template <> inline void push_back(recordsetImple& m, row_ptr c)
568
+ {
569
+ }
570
+
571
+ /* for groupby */
572
+ template <> inline void clear(recordsetImple& m)
573
+ {
574
+ return m.clearRecords();
575
+ }
576
+
577
+ /* for groupby */
578
+ template <>
579
+ inline recordsetImple::key_type
580
+ resolvKeyValue(recordsetImple& m, const std::_tstring& name, bool noexception)
581
+ {
582
+ return m.resolvKeyValue(name, noexception);
583
+ }
584
+
585
+ inline row* create(recordsetImple& m, int)
586
+ {
587
+ return NULL;
588
+ }
589
+
590
+ } // namespace client
591
+ } // namespace tdap
592
+ } // namespace protocol
593
+ } // namespace db
594
+ } // namespace bzs
595
+
596
+ #endif // BZS_DB_PROTOCOL_TDAP_CLIENT_MEMRECORDSETIMPLE_H