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
@@ -12,8 +12,8 @@
12
12
  GNU General Public License for more details.
13
13
 
14
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
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
17
  02111-1307, USA.
18
18
  =================================================================*/
19
19
  #include "hsCommandExecuter.h"
@@ -31,11 +31,11 @@ namespace bzs
31
31
  {
32
32
  namespace db
33
33
  {
34
- using namespace engine::mysql;
34
+ using namespace engine::mysql;
35
35
  namespace protocol
36
36
  {
37
- using namespace transactd;
38
- using namespace transactd::connection;
37
+ using namespace transactd;
38
+ using namespace transactd::connection;
39
39
  namespace hs
40
40
  {
41
41
 
@@ -44,646 +44,675 @@ namespace hs
44
44
  //-----------------------------------------------------------------------
45
45
  ha_rkey_function request::seekFlag()
46
46
  {
47
- switch(table.key.logical)
48
- {
49
- case HS_LG_EQUAL:return HA_READ_KEY_EXACT;
50
- case HS_LG_GREATER:return HA_READ_AFTER_KEY;
51
- case HS_LG_GREATEROREQUAL:return HA_READ_KEY_OR_NEXT;
52
- case HS_LG_LESS:return HA_READ_BEFORE_KEY;
53
- case HS_LG_LESSOREQUAL:return HA_READ_KEY_OR_PREV;
54
- }
55
- return HA_READ_KEY_EXACT;
47
+ switch (table.key.logical)
48
+ {
49
+ case HS_LG_EQUAL:
50
+ return HA_READ_KEY_EXACT;
51
+ case HS_LG_GREATER:
52
+ return HA_READ_AFTER_KEY;
53
+ case HS_LG_GREATEROREQUAL:
54
+ return HA_READ_KEY_OR_NEXT;
55
+ case HS_LG_LESS:
56
+ return HA_READ_BEFORE_KEY;
57
+ case HS_LG_LESSOREQUAL:
58
+ return HA_READ_KEY_OR_PREV;
59
+ }
60
+ return HA_READ_KEY_EXACT;
56
61
  }
57
62
 
58
63
  bool request::naviSame()
59
64
  {
60
- return (table.key.logical == HS_LG_EQUAL);
65
+ return (table.key.logical == HS_LG_EQUAL);
61
66
  }
62
67
 
63
68
  bool request::naviForward()
64
69
  {
65
- return (table.key.logical == HS_LG_GREATER)||(table.key.logical == HS_LG_GREATEROREQUAL);
70
+ return (table.key.logical == HS_LG_GREATER) ||
71
+ (table.key.logical == HS_LG_GREATEROREQUAL);
66
72
  }
67
73
 
68
- void seriarizeRecordsetBegin(engine::mysql::table* tb, resultBuffer& buf
69
- , bool sendBforeValue)
74
+ void seriarizeRecordsetBegin(engine::mysql::table* tb, resultBuffer& buf,
75
+ bool sendBforeValue)
70
76
  {
71
- if (sendBforeValue)
72
- {
73
- buf.append("0\t");
74
- buf.append((int)tb->useFields().size());
75
- }
77
+ if (sendBforeValue)
78
+ {
79
+ buf.append("0\t");
80
+ buf.append((int)tb->useFields().size());
81
+ }
76
82
  }
77
83
 
78
- void seriarizeRecord(engine::mysql::table* tb, resultBuffer& buf, bool sendBforeValue)
84
+ void seriarizeRecord(engine::mysql::table* tb, resultBuffer& buf,
85
+ bool sendBforeValue)
79
86
  {
80
- if (sendBforeValue)
81
- {
82
- for (int i=0;i<tb->useFields().size();i++)
83
- {
84
- buf.append("\t");
85
- int size;
86
- const char* p = tb->valStr(tb->useFields()[i], size);
87
- if (size == -1)
88
- buf.append("\0");
89
- else
90
- buf.append(p, size);
91
- }
92
- }
87
+ if (sendBforeValue)
88
+ {
89
+ for (int i = 0; i < (int)tb->useFields().size(); i++)
90
+ {
91
+ buf.append("\t");
92
+ int size;
93
+ const char* p = tb->valStr(tb->useFields()[i], size);
94
+ if (size == -1)
95
+ buf.append("\0");
96
+ else
97
+ buf.append(p, size);
98
+ }
99
+ }
93
100
  }
94
101
 
95
- void seriarizeRecordsetEnd(engine::mysql::table* tb, resultBuffer& buf
96
- , int count, bool sendBforeValue)
102
+ void seriarizeRecordsetEnd(engine::mysql::table* tb, resultBuffer& buf,
103
+ int count, bool sendBforeValue)
97
104
  {
98
- if (!sendBforeValue)
99
- {
100
- buf.append("0\t1\t");
101
- buf.append(count);
102
- buf.append("\n");
103
- }else
104
- buf.append("\n");
105
+ if (!sendBforeValue)
106
+ {
107
+ buf.append("0\t1\t");
108
+ buf.append(count);
109
+ buf.append("\n");
110
+ }
111
+ else
112
+ buf.append("\n");
105
113
  }
106
114
 
107
115
  void writeError(int error, resultBuffer& buf, const char* msg)
108
116
  {
109
- buf.append(error);
110
- buf.append("\t");
111
- buf.append(msg);
112
- buf.append("\n");
117
+ buf.append(error);
118
+ buf.append("\t");
119
+ buf.append(msg);
120
+ buf.append("\n");
113
121
  }
114
122
 
115
123
  void writeStatus(int stat, resultBuffer& buf, int option)
116
124
  {
117
- int v = 0;
118
- v = std::min(stat, 1);
119
- buf.append(v);
120
- buf.append("\t");
121
- buf.append(option);
122
- buf.append("\n\0");
125
+ int v = 0;
126
+ v = std::min(stat, 1);
127
+ buf.append(v);
128
+ buf.append("\t");
129
+ buf.append(option);
130
+ buf.append("\n\0");
123
131
  }
124
132
 
125
133
  //-----------------------------------------------------------------------
126
134
  // clas dbExecuter
127
135
  //-----------------------------------------------------------------------
128
- #define READ_SUCCESS 0
129
- #define FILTER_MATCH READ_SUCCESS
130
- #define FILTER_SKIP 1
131
- #define FILTER_BREAK 2
136
+ #define READ_SUCCESS 0
137
+ #define FILTER_MATCH READ_SUCCESS
138
+ #define FILTER_SKIP 1
139
+ #define FILTER_BREAK 2
132
140
 
133
141
  int update(request& req, engine::mysql::table* tb, int type)
134
142
  {
135
- tb->beginUpdate(tb->keyNum());
136
- tb->setUseValues(req.table.values, type);
137
- tb->update(true);
138
- return tb->stat();
143
+ tb->beginUpdate(tb->keyNum());
144
+ tb->setUseValues(req.table.values, type);
145
+ tb->update(true);
146
+ return tb->stat();
139
147
  }
140
148
 
141
149
  int del(request& req, engine::mysql::table* tb, int type)
142
150
  {
143
- tb->beginDel();
144
- tb->del();
145
- return tb->stat();
151
+ tb->beginDel();
152
+ tb->del();
153
+ return tb->stat();
146
154
  }
147
155
 
148
156
  inline bool match(short logical, int v)
149
157
  {
150
- switch(logical)
151
- {
152
- case HS_LG_EQUAL:return (v==0); //==
153
- case HS_LG_GREATER:return (v>0); //>
154
- case HS_LG_LESS:return (v<0); //<
155
- case HS_LG_NOTEQUAL:return (v!=0); //!=
156
- case HS_LG_GREATEROREQUAL:return (v>=0); //>=
157
- case HS_LG_LESSOREQUAL:return (v<=0); //<=
158
- }
159
- return false;
158
+ switch (logical)
159
+ {
160
+ case HS_LG_EQUAL:
161
+ return (v == 0); //==
162
+ case HS_LG_GREATER:
163
+ return (v > 0); //>
164
+ case HS_LG_LESS:
165
+ return (v < 0); //<
166
+ case HS_LG_NOTEQUAL:
167
+ return (v != 0); //!=
168
+ case HS_LG_GREATEROREQUAL:
169
+ return (v >= 0); //>=
170
+ case HS_LG_LESSOREQUAL:
171
+ return (v <= 0); //<=
172
+ }
173
+ return false;
160
174
  }
161
175
 
162
176
  int filter(engine::mysql::table* tb, request::table::filters_type& filters)
163
177
  {
164
- for(size_t i=0;i<filters.size();++i)
165
- {
166
- request::table::filter& f = filters[i];
167
- if (f.col >= tb->useFields().size())
168
- THROW_BZS_ERROR_WITH_MSG("fcol");
169
- Field* fd = tb->field(tb->useFields()[f.col]);
170
- uchar tmp[1024]={NULL};
171
- if (fd->pack_length() > 1024)
172
- THROW_BZS_ERROR_WITH_MSG("field_length > 1024");
173
- memcpy(tmp, fd->ptr, fd->pack_length());
174
- tb->setValue(fd->field_index, f.value, 0);
175
- int v = fd->cmp(tmp, fd->ptr);
176
- memcpy(fd->ptr, tmp, fd->pack_length());
177
- if (!match(f.logical, v))
178
- return (f.type=='F') ? FILTER_SKIP : FILTER_BREAK;
179
-
180
- }
181
- return FILTER_MATCH;
178
+ for (size_t i = 0; i < filters.size(); ++i)
179
+ {
180
+ request::table::filter& f = filters[i];
181
+ if (f.col >= (int)tb->useFields().size())
182
+ THROW_BZS_ERROR_WITH_MSG("fcol");
183
+ Field* fd = tb->field(tb->useFields()[f.col]);
184
+ uchar tmp[1024] = { 0 };
185
+ if (fd->pack_length() > 1024)
186
+ THROW_BZS_ERROR_WITH_MSG("field_length > 1024");
187
+ memcpy(tmp, fd->ptr, fd->pack_length());
188
+ tb->setValue(fd->field_index, f.value, 0);
189
+ int v = fd->cmp(tmp, fd->ptr);
190
+ memcpy(fd->ptr, tmp, fd->pack_length());
191
+ if (!match(f.logical, v))
192
+ return (f.type == 'F') ? FILTER_SKIP : FILTER_BREAK;
193
+ }
194
+ return FILTER_MATCH;
182
195
  }
183
196
 
184
197
  inline int type(request& req)
185
198
  {
186
- if (req.op == HS_OP_UPDATE_INC) return UPDATE_INC;
187
- if (req.op == HS_OP_UPDATE_DEC) return UPDATE_DEC;
188
- return UPDATE_REPLACE;
199
+ if (req.op == HS_OP_UPDATE_INC)
200
+ return UPDATE_INC;
201
+ if (req.op == HS_OP_UPDATE_DEC)
202
+ return UPDATE_DEC;
203
+ return UPDATE_REPLACE;
189
204
  }
190
205
 
191
- inline int dbExecuter::readAfter(request& req, engine::mysql::table* tb, resultBuffer& buf,changeFunc func)
206
+ inline int dbExecuter::readAfter(request& req, engine::mysql::table* tb,
207
+ resultBuffer& buf, changeFunc func)
192
208
  {
193
- int ret = filter(tb, req.table.filters);
194
- if (ret == FILTER_MATCH)
195
- {
196
- if (req.result.offset==0)
197
- {
198
- seriarizeRecord(tb, buf, req.result.returnBeforeValue);
199
- if (func)
200
- func(req, tb, type(req));
201
- return READ_SUCCESS;
202
- }
203
- --req.result.offset;
204
- return FILTER_SKIP;
205
- }
206
- return ret;
209
+ int ret = filter(tb, req.table.filters);
210
+ if (ret == FILTER_MATCH)
211
+ {
212
+ if (req.result.offset == 0)
213
+ {
214
+ seriarizeRecord(tb, buf, req.result.returnBeforeValue);
215
+ if (func)
216
+ func(req, tb, type(req));
217
+ return READ_SUCCESS;
218
+ }
219
+ --req.result.offset;
220
+ return FILTER_SKIP;
221
+ }
222
+ return ret;
207
223
  }
208
224
 
209
225
  inline void setKeyValues(request& req, engine::mysql::table* tb, int index)
210
226
  {
211
- if (req.table.in.keypart >= tb->keyDef(tb->keyNum()).user_defined_key_parts)
212
- THROW_BZS_ERROR_WITH_MSG("icol");
213
- tb->clearBuffer();
214
- if (index != -1)
215
- tb->setKeyValues(req.table.key.values, req.table.in.keypart, &(req.table.in.values[index]));
216
- else
217
- tb->setKeyValues(req.table.key.values, -1);
218
-
219
- }
220
-
221
- void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb, resultBuffer& buf, changeFunc func)
222
- {
223
- int count = 0;
224
- int curInValueIndex = req.table.in.values.size() ? 0: -1;
225
- int offset = req.result.offset;
226
- int filterResult = 0;
227
- seriarizeRecordsetBegin(tb, buf, req.result.returnBeforeValue);
228
-
229
- setKeyValues(req, tb, curInValueIndex);
230
- if (curInValueIndex >= 0) ++curInValueIndex;
231
- tb->seekKey(req.seekFlag());
232
- if (tb->stat()==0)
233
- {
234
- filterResult = readAfter(req, tb, buf, func);
235
- if (filterResult == READ_SUCCESS) ++count;
236
- }
237
- if (((tb->stat()==0) && (filterResult != FILTER_BREAK))
238
- || (curInValueIndex > -1))
239
- {
240
- for (size_t i=1;i<req.result.limit + offset;i++)
241
- {
242
- if (curInValueIndex > -1)
243
- {
244
- if (curInValueIndex >= req.table.in.values.size())
245
- break;
246
- setKeyValues(req, tb, curInValueIndex++);
247
- tb->seekKey(req.seekFlag());
248
- }else
249
- {
250
- if (req.naviSame())
251
- tb->getNextSame();
252
- else if (req.naviForward())
253
- tb->getNext();
254
- else
255
- tb->getPrev();
256
- }
257
-
258
- if (tb->stat()) break;
259
- filterResult = readAfter(req, tb, buf, func);
260
- if (filterResult == READ_SUCCESS) ++count;
261
- if (tb->stat() || (filterResult == FILTER_BREAK)) break;
262
- }
263
- }
264
- seriarizeRecordsetEnd(m_tb, buf, count, req.result.returnBeforeValue);
265
-
266
- }
267
-
268
- int dbExecuter::commandExec(std::vector<request>& requests, char* result, size_t& size, netsvc::server::buffers* optionalData)
269
- {
270
- request& req = requests[0];
271
- resultBuffer buf(result);
272
- try
273
- {
274
- switch(req.op)
275
- {
276
- case HS_OP_QUIT:
277
- return EXECUTE_RESULT_QUIT;
278
- case HS_OP_AUTH:
279
- writeStatus(0, buf, 1);//allways success.
280
- break;
281
- case HS_OP_OPEN:
282
- {
283
- checkNewHandle(req.handle);
284
- database* db = getDatabase(req.db.name, 0/*cid*/);
285
- m_tb = db->openTable(req.table.name, req.table.openMode, NULL);
286
- addHandle(getDatabaseID(0/*cid*/), m_tb->id(), req.handle);
287
- m_tb = getTable(req.handle);
288
- m_tb->setUseFieldList(req.table.fields);
289
- m_tb->setKeyNum(req.table.key.name);
290
- writeStatus(m_tb->stat(), buf, 1);
291
- break;
292
- }
293
- case HS_OP_INSERT:
294
- {
295
- m_tb = getTable(req.handle, SQLCOM_INSERT);
296
- m_tb->clearBuffer();
297
- m_tb->setUseValues(req.table.values, 0);
298
- m_tb->insert(true);
299
- writeStatus(m_tb->stat(), buf, 1);
300
- break;
301
- }
302
- case HS_OP_UPDATE_INC:
303
- case HS_OP_UPDATE_DEC:
304
- case HS_OP_UPDATE:
305
- {
306
- m_tb = getTable(req.handle, SQLCOM_UPDATE);
307
- doRecordOperation(req, m_tb, buf, update);
308
- break;
309
- }
310
- case HS_OP_DELETE:
311
- {
312
- m_tb = getTable(req.handle, SQLCOM_UPDATE);
313
- doRecordOperation(req, m_tb, buf, del);
314
- break;
315
- }
316
- case HS_OP_READ:
317
- {
318
- m_tb = getTable(req.handle);
319
- doRecordOperation(req, m_tb, buf, NULL);
320
- break;
321
- }
322
- }
323
- if (m_tb)m_tb->unUse();
324
- size = buf.size();
325
- return EXECUTE_RESULT_SUCCESS;
326
- }
327
-
328
- catch(bzs::rtl::exception &e)
329
- {
330
- clenupNoException();
331
- const std::string* msg = getMsg(e);
332
- const int* code = getCode(e);
333
- if(code && msg)
334
- writeError(*code, buf, msg->c_str());
335
- else
336
- {
337
- if(msg)
338
- writeError(1, buf, msg->c_str());
339
- else
340
- writeError(1, buf, "");
341
- sql_print_error("%s", boost::diagnostic_information(e).c_str());
342
- }
343
- printErrorMessage(code, msg);
344
- }
345
-
346
- catch(...)
347
- {
348
- clenupNoException();
349
- writeError(1, buf, "Unknown error.");
350
- }
351
- size = buf.size();
352
- return EXECUTE_RESULT_SUCCESS;
227
+ if (req.table.in.keypart >= tb->keyDef(tb->keyNum()).user_defined_key_parts)
228
+ THROW_BZS_ERROR_WITH_MSG("icol");
229
+ tb->clearBuffer();
230
+ if (index != -1)
231
+ tb->setKeyValues(req.table.key.values, req.table.in.keypart,
232
+ &(req.table.in.values[index]));
233
+ else
234
+ tb->setKeyValues(req.table.key.values, -1);
235
+ }
236
+
237
+ void dbExecuter::doRecordOperation(request& req, engine::mysql::table* tb,
238
+ resultBuffer& buf, changeFunc func)
239
+ {
240
+ int count = 0;
241
+ int curInValueIndex = req.table.in.values.size() ? 0 : -1;
242
+ int offset = req.result.offset;
243
+ int filterResult = 0;
244
+ seriarizeRecordsetBegin(tb, buf, req.result.returnBeforeValue);
245
+
246
+ setKeyValues(req, tb, curInValueIndex);
247
+ if (curInValueIndex >= 0)
248
+ ++curInValueIndex;
249
+ tb->seekKey(req.seekFlag(), tb->keymap());
250
+ if (tb->stat() == 0)
251
+ {
252
+ filterResult = readAfter(req, tb, buf, func);
253
+ if (filterResult == READ_SUCCESS)
254
+ ++count;
255
+ }
256
+ if (((tb->stat() == 0) && (filterResult != FILTER_BREAK)) ||
257
+ (curInValueIndex > -1))
258
+ {
259
+ for (int i = 1; i < req.result.limit + offset; i++)
260
+ {
261
+ if (curInValueIndex > -1)
262
+ {
263
+ if (curInValueIndex >= (int)req.table.in.values.size())
264
+ break;
265
+ setKeyValues(req, tb, curInValueIndex++);
266
+ tb->seekKey(req.seekFlag(), tb->keymap());
267
+ }
268
+ else
269
+ {
270
+ if (req.naviSame())
271
+ tb->getNextSame(tb->keymap());
272
+ else if (req.naviForward())
273
+ tb->getNext();
274
+ else
275
+ tb->getPrev();
276
+ }
277
+
278
+ if (tb->stat())
279
+ break;
280
+ filterResult = readAfter(req, tb, buf, func);
281
+ if (filterResult == READ_SUCCESS)
282
+ ++count;
283
+ if (tb->stat() || (filterResult == FILTER_BREAK))
284
+ break;
285
+ }
286
+ }
287
+ seriarizeRecordsetEnd(m_tb, buf, count, req.result.returnBeforeValue);
288
+ }
289
+
290
+ int dbExecuter::commandExec(std::vector<request>& requests,
291
+ netsvc::server::netWriter* nw)
292
+ {
293
+ request& req = requests[0];
294
+ resultBuffer buf(nw->ptr());
295
+ size_t& size = nw->datalen;
296
+ try
297
+ {
298
+ switch (req.op)
299
+ {
300
+ case HS_OP_QUIT:
301
+ return EXECUTE_RESULT_QUIT;
302
+ case HS_OP_AUTH:
303
+ writeStatus(0, buf, 1); // allways success.
304
+ break;
305
+ case HS_OP_OPEN:
306
+ {
307
+ checkNewHandle(req.handle);
308
+ database* db = getDatabase(req.db.name, 0 /*cid*/);
309
+ m_tb = db->openTable(req.table.name, req.table.openMode, NULL);
310
+ addHandle(getDatabaseID(0 /*cid*/), m_tb->id(), req.handle);
311
+ m_tb = getTable(req.handle);
312
+ m_tb->setUseFieldList(req.table.fields);
313
+ m_tb->setKeyNum(req.table.key.name);
314
+ writeStatus(m_tb->stat(), buf, 1);
315
+ break;
316
+ }
317
+ case HS_OP_INSERT:
318
+ {
319
+ m_tb = getTable(req.handle, SQLCOM_INSERT);
320
+ m_tb->clearBuffer();
321
+ m_tb->setUseValues(req.table.values, 0);
322
+ m_tb->insert(true);
323
+ writeStatus(m_tb->stat(), buf, 1);
324
+ break;
325
+ }
326
+ case HS_OP_UPDATE_INC:
327
+ case HS_OP_UPDATE_DEC:
328
+ case HS_OP_UPDATE:
329
+ {
330
+ m_tb = getTable(req.handle, SQLCOM_UPDATE);
331
+ doRecordOperation(req, m_tb, buf, update);
332
+ break;
333
+ }
334
+ case HS_OP_DELETE:
335
+ {
336
+ m_tb = getTable(req.handle, SQLCOM_UPDATE);
337
+ doRecordOperation(req, m_tb, buf, del);
338
+ break;
339
+ }
340
+ case HS_OP_READ:
341
+ {
342
+ m_tb = getTable(req.handle);
343
+ doRecordOperation(req, m_tb, buf, NULL);
344
+ break;
345
+ }
346
+ }
347
+ if (m_tb)
348
+ m_tb->unUse();
349
+ size = buf.size();
350
+ return EXECUTE_RESULT_SUCCESS;
351
+ }
352
+
353
+ catch (bzs::rtl::exception& e)
354
+ {
355
+ clenupNoException();
356
+ const std::string* msg = getMsg(e);
357
+ const int* code = getCode(e);
358
+ if (code && msg)
359
+ writeError(*code, buf, msg->c_str());
360
+ else
361
+ {
362
+ if (msg)
363
+ writeError(1, buf, msg->c_str());
364
+ else
365
+ writeError(1, buf, "");
366
+ sql_print_error("%s", boost::diagnostic_information(e).c_str());
367
+ }
368
+ printErrorMessage(code, msg);
369
+ }
370
+
371
+ catch (...)
372
+ {
373
+ clenupNoException();
374
+ writeError(1, buf, "Unknown error.");
375
+ }
376
+ size = buf.size();
377
+ return EXECUTE_RESULT_SUCCESS;
353
378
  }
354
379
 
355
380
  // ---------------------------------------------------------------------------
356
- // class commandExecuter
381
+ // class commandExecuter
357
382
  // ---------------------------------------------------------------------------
358
- #define PARSEREAD_START 0
359
- #define PARSEREAD_COMMAND 1
360
- #define PARSEREAD_HANDLEID 2
361
- #define PARSEREAD_SEEKCMD 3
362
- #define PARSEREAD_DBNAME 4
363
- #define PARSEREAD_TABLENAME 5
364
- #define PARSEREAD_INDEXNAME 6
365
- #define PARSEREAD_FIELDS 7
366
- #define PARSEREAD_KEYVAL_COUNT 8
367
- #define PARSEREAD_KEYVAL 9
368
- #define PARSEREAD_LIMIT 10
369
- #define PARSEREAD_OFFSET 11
370
- #define PARSEREAD_DATA_COUNT 12
371
- #define PARSEREAD_DATA_VAL 13
372
- #define PARSEREAD_IN_MODE 15
373
- #define PARSEREAD_IN_KEYPART 16
374
- #define PARSEREAD_IN_COUNT 17
375
- #define PARSEREAD_IN_VAL 18
376
- #define PARSEREAD_FL_TYPE 19
377
- #define PARSEREAD_FL_LOG 20
378
- #define PARSEREAD_FL_COL 21
379
- #define PARSEREAD_FL_VAL 22
383
+ #define PARSEREAD_START 0
384
+ #define PARSEREAD_COMMAND 1
385
+ #define PARSEREAD_HANDLEID 2
386
+ #define PARSEREAD_SEEKCMD 3
387
+ #define PARSEREAD_DBNAME 4
388
+ #define PARSEREAD_TABLENAME 5
389
+ #define PARSEREAD_INDEXNAME 6
390
+ #define PARSEREAD_FIELDS 7
391
+ #define PARSEREAD_KEYVAL_COUNT 8
392
+ #define PARSEREAD_KEYVAL 9
393
+ #define PARSEREAD_LIMIT 10
394
+ #define PARSEREAD_OFFSET 11
395
+ #define PARSEREAD_DATA_COUNT 12
396
+ #define PARSEREAD_DATA_VAL 13
397
+ #define PARSEREAD_IN_MODE 15
398
+ #define PARSEREAD_IN_KEYPART 16
399
+ #define PARSEREAD_IN_COUNT 17
400
+ #define PARSEREAD_IN_VAL 18
401
+ #define PARSEREAD_FL_TYPE 19
402
+ #define PARSEREAD_FL_LOG 20
403
+ #define PARSEREAD_FL_COL 21
404
+ #define PARSEREAD_FL_VAL 22
405
+
406
+ inline void setHandleID(const std::string& src, int& parseMode, request* req)
380
407
 
381
- inline void setHandleID(const std::string& src, int &parseMode, request* req)
382
408
  {
383
- req->handle = (short)atol(src.c_str());
384
- if (req->op == HS_OP_OPEN)
385
- parseMode = PARSEREAD_DBNAME;
386
- else
387
- parseMode = PARSEREAD_SEEKCMD;
409
+ req->handle = (short)atol(src.c_str());
410
+ if (req->op == HS_OP_OPEN)
411
+ parseMode = PARSEREAD_DBNAME;
412
+ else
413
+ parseMode = PARSEREAD_SEEKCMD;
388
414
  }
389
415
 
390
- inline void setCmd(const std::string& src, int &parseMode, request* req)
416
+ inline void setCmd(const std::string& src, int& parseMode, request* req)
391
417
  {
392
- if (src[0] >= '0' && src[0] <= '9')
393
- return setHandleID(src, parseMode, req);
394
- else
395
- req->op = src[0];
396
- parseMode = PARSEREAD_HANDLEID;
418
+ if (src[0] >= '0' && src[0] <= '9')
419
+ return setHandleID(src, parseMode, req);
420
+ else
421
+ req->op = src[0];
422
+ parseMode = PARSEREAD_HANDLEID;
397
423
  }
398
424
 
399
- inline void setChangeCmd(const std::string& src, int &parseMode, request* req)
425
+ inline void setChangeCmd(const std::string& src, int& parseMode, request* req)
400
426
  {
401
- req->op = src[0];
402
- if (req->table.key.logical && (req->op == HS_OP_INSERT))
403
- req->op = HS_OP_UPDATE_INC;
404
- req->result.returnBeforeValue = (src[1] == '?');
405
- if (req->op == HS_OP_INSERT)
406
- parseMode = PARSEREAD_DATA_COUNT;
407
- else
408
- parseMode = PARSEREAD_DATA_VAL;
427
+ req->op = src[0];
428
+ if (req->table.key.logical && (req->op == HS_OP_INSERT))
429
+ req->op = HS_OP_UPDATE_INC;
430
+ req->result.returnBeforeValue = (src[1] == '?');
431
+ if (req->op == HS_OP_INSERT)
432
+ parseMode = PARSEREAD_DATA_COUNT;
433
+ else
434
+ parseMode = PARSEREAD_DATA_VAL;
409
435
  }
410
436
 
411
- inline void setSeekCmd(const std::string& src, int &parseMode, request* req)
437
+ inline void setSeekCmd(const std::string& src, int& parseMode, request* req)
412
438
  {
413
- if ((src[0] == HS_OP_INSERT)|| (src[0] == HS_OP_UPDATE)|| (src[0] == HS_OP_DELETE))
414
- return setChangeCmd(src, parseMode, req);
415
- req->table.key.logical = src[0];
416
- if ((src.size()>1) && (src[1] == '='))
417
- req->table.key.logical += 0xff;
418
- req->result.returnBeforeValue = true;
419
- parseMode = PARSEREAD_KEYVAL_COUNT;
439
+ if ((src[0] == HS_OP_INSERT) || (src[0] == HS_OP_UPDATE) ||
440
+ (src[0] == HS_OP_DELETE))
441
+ return setChangeCmd(src, parseMode, req);
442
+ req->table.key.logical = src[0];
443
+ if ((src.size() > 1) && (src[1] == '='))
444
+ req->table.key.logical += 0xff;
445
+ req->result.returnBeforeValue = true;
446
+ parseMode = PARSEREAD_KEYVAL_COUNT;
420
447
  }
421
448
 
422
- inline void setDbname(const std::string& src, int &parseMode, request* req)
449
+ inline void setDbname(const std::string& src, int& parseMode, request* req)
423
450
  {
424
- strncpy(req->db.name, src.c_str(), DEBNAME_SIZE);
425
-
426
- parseMode = PARSEREAD_TABLENAME;
451
+ strncpy(req->db.name, src.c_str(), DEBNAME_SIZE);
452
+
453
+ parseMode = PARSEREAD_TABLENAME;
427
454
  }
428
455
 
429
- inline void setTablename(const std::string& src, int &parseMode, request* req)
456
+ inline void setTablename(const std::string& src, int& parseMode, request* req)
430
457
  {
431
- strncpy(req->table.name, src.c_str(), TABELNAME_SIZE);
432
- req->table.openMode = TD_OPEN_NORMAL;
433
- parseMode = PARSEREAD_INDEXNAME;
458
+ strncpy(req->table.name, src.c_str(), TABELNAME_SIZE);
459
+ req->table.openMode = TD_OPEN_NORMAL;
460
+ parseMode = PARSEREAD_INDEXNAME;
434
461
  }
435
462
 
436
- inline void setIndexname(const std::string& src, int &parseMode, request* req)
463
+ inline void setIndexname(const std::string& src, int& parseMode, request* req)
437
464
  {
438
- strncpy(req->table.key.name, src.c_str(), INDEXNAME_SIZE);
439
- parseMode = PARSEREAD_FIELDS;
465
+ strncpy(req->table.key.name, src.c_str(), INDEXNAME_SIZE);
466
+ parseMode = PARSEREAD_FIELDS;
440
467
  }
441
468
 
442
- inline void setValueCount(const std::string& src, int &parseMode,int &count)
469
+ inline void setValueCount(const std::string& src, int& parseMode, int& count)
443
470
  {
444
- count = atol(src.c_str());
471
+ count = atol(src.c_str());
445
472
  }
446
473
 
447
- inline void setValue(const std::string& src, int &parseMode, std::vector<std::string>& values,int &count)
474
+ inline void setValue(const std::string& src, int& parseMode,
475
+ std::vector<std::string>& values, int& count)
448
476
  {
449
- if (count)
450
- {
451
- values.push_back(src);
452
- --count;
453
- }
477
+ if (count)
478
+ {
479
+ values.push_back(src);
480
+ --count;
481
+ }
454
482
  }
455
483
 
456
- inline bool setLimit(const std::string& src, int &parseMode, request* req)
484
+ inline bool setLimit(const std::string& src, int& parseMode, request* req)
457
485
  {
458
- if ((src[0]>='0') && (src[0]<='9'))
459
- {
460
- req->result.limit = atol(src.c_str());
461
- parseMode = PARSEREAD_OFFSET;
462
- return false;
463
- }
464
- parseMode = PARSEREAD_IN_MODE;
465
- return true;
486
+ if ((src[0] >= '0') && (src[0] <= '9'))
487
+ {
488
+ req->result.limit = atol(src.c_str());
489
+ parseMode = PARSEREAD_OFFSET;
490
+ return false;
491
+ }
492
+ parseMode = PARSEREAD_IN_MODE;
493
+ return true;
466
494
  }
467
495
 
468
- inline void setOffset(const std::string& src, int &parseMode, request* req)
496
+ inline void setOffset(const std::string& src, int& parseMode, request* req)
469
497
  {
470
- req->result.offset = atol(src.c_str());
471
- parseMode = PARSEREAD_IN_MODE;
498
+ req->result.offset = atol(src.c_str());
499
+ parseMode = PARSEREAD_IN_MODE;
472
500
  }
473
501
 
474
- inline void setFields(const std::string& src, int &parseMode, request* req)
502
+ inline void setFields(const std::string& src, int& parseMode, request* req)
475
503
  {
476
- req->table.fields = src;
477
- parseMode = PARSEREAD_START;
504
+ req->table.fields = src;
505
+ parseMode = PARSEREAD_START;
478
506
  }
479
507
 
480
- inline bool setInMode(const std::string& src, int &parseMode, request* req)
508
+ inline bool setInMode(const std::string& src, int& parseMode, request* req)
481
509
  {
482
- if (src[0] == '@')
483
- {
484
- parseMode = PARSEREAD_IN_KEYPART;
485
- return false;
486
- }
487
- parseMode = PARSEREAD_FL_TYPE;
488
- return true;
510
+ if (src[0] == '@')
511
+ {
512
+ parseMode = PARSEREAD_IN_KEYPART;
513
+ return false;
514
+ }
515
+ parseMode = PARSEREAD_FL_TYPE;
516
+ return true;
489
517
  }
490
518
 
491
- inline void setInKeyPart(const std::string& src, int &parseMode, request* req)
519
+ inline void setInKeyPart(const std::string& src, int& parseMode, request* req)
492
520
  {
493
- req->table.in.keypart = (short)atol(src.c_str());
494
- parseMode = PARSEREAD_IN_COUNT;
521
+ req->table.in.keypart = (short)atol(src.c_str());
522
+ parseMode = PARSEREAD_IN_COUNT;
495
523
  }
496
524
 
497
- inline bool setFilterType(const std::string& src, int &parseMode, request* req)
525
+ inline bool setFilterType(const std::string& src, int& parseMode, request* req)
498
526
  {
499
- if ((src[0] == 'F') || (src[0] == 'W'))
500
- {
501
- request::table::filter f;
502
- f.type = src[0];
503
- req->table.filters.push_back(f);
504
-
505
- parseMode = PARSEREAD_FL_LOG;
506
- return false;
507
- }
508
- parseMode = PARSEREAD_SEEKCMD;
509
- return true;
527
+ if ((src[0] == 'F') || (src[0] == 'W'))
528
+ {
529
+ request::table::filter f;
530
+ f.type = src[0];
531
+ req->table.filters.push_back(f);
532
+
533
+ parseMode = PARSEREAD_FL_LOG;
534
+ return false;
535
+ }
536
+ parseMode = PARSEREAD_SEEKCMD;
537
+ return true;
510
538
  }
511
539
 
512
- inline void setFilterLog(const std::string& src, int &parseMode, request* req)
540
+ inline void setFilterLog(const std::string& src, int& parseMode, request* req)
513
541
  {
514
- request::table::filter& f = req->table.filters[req->table.filters.size()-1];
515
- f.logical = src[0];
516
- if ((src.size()>1) && (src[1] == '='))
517
- f.logical += 0xff;
518
- else if ((src.size()>1) && (src[1] == '>'))
519
- f.logical += 0xfe;
520
- parseMode = PARSEREAD_FL_COL;
542
+ request::table::filter& f =
543
+ req->table.filters[req->table.filters.size() - 1];
544
+ f.logical = src[0];
545
+ if ((src.size() > 1) && (src[1] == '='))
546
+ f.logical += 0xff;
547
+ else if ((src.size() > 1) && (src[1] == '>'))
548
+ f.logical += 0xfe;
549
+ parseMode = PARSEREAD_FL_COL;
521
550
  }
522
551
 
523
- inline void setFilterCol(const std::string& src, int &parseMode, request* req)
552
+ inline void setFilterCol(const std::string& src, int& parseMode, request* req)
524
553
  {
525
- request::table::filter& f = req->table.filters[req->table.filters.size()-1];
526
- f.col = (short)atol(src.c_str());
527
- parseMode = PARSEREAD_FL_VAL;
554
+ request::table::filter& f =
555
+ req->table.filters[req->table.filters.size() - 1];
556
+ f.col = (short)atol(src.c_str());
557
+ parseMode = PARSEREAD_FL_VAL;
528
558
  }
529
559
 
530
- inline void setFilterVal(const std::string& src, int &parseMode, request* req)
560
+ inline void setFilterVal(const std::string& src, int& parseMode, request* req)
531
561
  {
532
- request::table::filter& f = req->table.filters[req->table.filters.size()-1];
533
- f.value = src;
534
- parseMode = PARSEREAD_FL_TYPE;
562
+ request::table::filter& f =
563
+ req->table.filters[req->table.filters.size() - 1];
564
+ f.value = src;
565
+ parseMode = PARSEREAD_FL_TYPE;
535
566
  }
536
567
 
537
568
  commandExecuter::commandExecuter(__int64 /*parent*/)
538
- :m_dbExec(new dbExecuter())
569
+ : m_dbExec(new dbExecuter())
539
570
  {
540
-
541
571
  }
542
572
 
543
573
  commandExecuter::~commandExecuter()
544
574
  {
545
- m_dbExec.reset();
575
+ m_dbExec.reset();
546
576
  }
547
577
 
548
- size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered, bool& comp)const
578
+ size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
579
+ bool& comp) const
549
580
  {
550
- if (transfered)
551
- {
552
- const char* tmp = p + transfered - 1;
553
- comp = (*tmp=='\n');
554
- }
555
- if (!comp && transfered < strlen(p)+10)
556
- return transfered + 64000;
557
- return 0;
581
+ if (transfered)
582
+ {
583
+ const char* tmp = p + transfered - 1;
584
+ comp = (*tmp == '\n');
585
+ }
586
+ if (!comp && transfered < strlen(p) + 10)
587
+ return transfered + 64000;
588
+ return 0;
558
589
  }
559
590
 
560
591
  char* readTorkn(std::string& buf, char* src, const char* end)
561
592
  {
562
- buf.erase();
563
- while(!((*src=='\t') || (*src=='\n')|| (*src=='\r')))
564
- {
565
- if (src == end)
566
- break;
567
- if (*src == 0x01)
568
- *(++src) -= 0x040;
569
- buf.append(1, *src);
570
- ++src;
571
- }
572
- return ++src;
593
+ buf.erase();
594
+ while (!((*src == '\t') || (*src == '\n') || (*src == '\r')))
595
+ {
596
+ if (src == end)
597
+ break;
598
+ if (*src == 0x01)
599
+ *(++src) -= 0x040;
600
+ buf.append(1, *src);
601
+ ++src;
602
+ }
603
+ return ++src;
573
604
  }
574
605
 
575
606
  bool commandExecuter::parse(const char* ptr, size_t size)
576
607
  {
577
- m_requests.clear();
578
- char* p = (char*)ptr;
579
- const char* end = p + size;
580
- int parseMode = PARSEREAD_START;
581
- request* req ;
582
- int keyval_count = 0;
583
- int data_count = INT_MAX;
584
- int in_count = 0;
585
- bool skip = false;
586
- std::string buf;
587
- buf.reserve(1024);
588
- while (p != end)
589
- {
590
- if (skip == false)
591
- p = readTorkn(buf, p, end);
592
- else
593
- skip = false;
594
- if (buf.size() == 0)
595
- break;
596
- switch(parseMode)
597
- {
598
- case PARSEREAD_START:
599
- m_requests.push_back(request());
600
- req = &m_requests[m_requests.size()-1];
601
- parseMode = PARSEREAD_COMMAND;
602
- skip = true;
603
- break;
604
- case PARSEREAD_COMMAND:
605
- setCmd(buf, parseMode, req);
606
- break;
607
- case PARSEREAD_HANDLEID:
608
- setHandleID(buf, parseMode, req);
609
- break;
610
- case PARSEREAD_SEEKCMD:
611
- setSeekCmd(buf, parseMode, req);
612
- break;
613
- case PARSEREAD_DATA_COUNT:
614
- setValueCount(buf, parseMode, data_count);
615
- parseMode = PARSEREAD_DATA_VAL;
616
- break;
617
- case PARSEREAD_DATA_VAL:
618
- setValue(buf, parseMode, req->table.values, data_count);
619
- if (data_count==0)
620
- parseMode = PARSEREAD_START;
621
- break;
622
- case PARSEREAD_KEYVAL_COUNT:
623
- setValueCount(buf, parseMode, keyval_count);
624
- parseMode = PARSEREAD_KEYVAL;
625
- break;
626
- case PARSEREAD_KEYVAL:
627
- setValue(buf, parseMode, req->table.key.values, keyval_count);
628
- if (keyval_count==0)
629
- parseMode = PARSEREAD_LIMIT;
630
- break;
631
- case PARSEREAD_DBNAME:
632
- setDbname(buf, parseMode, req);
633
- break;
634
- case PARSEREAD_TABLENAME:
635
- setTablename(buf, parseMode, req);
636
- break;
637
- case PARSEREAD_INDEXNAME:
638
- setIndexname(buf, parseMode, req);
639
- break;
640
- case PARSEREAD_FIELDS:
641
- setFields(buf, parseMode, req);
642
- break;
643
- case PARSEREAD_LIMIT:
644
- skip = setLimit(buf, parseMode, req);
645
- break;
646
- case PARSEREAD_OFFSET:
647
- setOffset(buf, parseMode, req);
648
- break;
649
- case PARSEREAD_IN_MODE:
650
- skip = setInMode(buf, parseMode, req);
651
- break;
652
- case PARSEREAD_IN_KEYPART:
653
- setInKeyPart(buf, parseMode, req);
654
- break;
655
- case PARSEREAD_IN_COUNT:
656
- setValueCount(buf, parseMode, in_count);
657
- parseMode = PARSEREAD_IN_VAL;
658
- break;
659
- case PARSEREAD_IN_VAL:
660
- setValue(buf, parseMode, req->table.in.values, in_count);
661
- if (in_count==0)
662
- parseMode = PARSEREAD_FL_TYPE;
663
- break;
664
- case PARSEREAD_FL_TYPE:
665
- skip = setFilterType(buf, parseMode, req);
666
- break;
667
- case PARSEREAD_FL_LOG:
668
- setFilterLog(buf, parseMode, req);
669
- break;
670
- case PARSEREAD_FL_COL:
671
- setFilterCol(buf, parseMode, req);
672
- parseMode = PARSEREAD_FL_VAL;
673
- break;
674
- case PARSEREAD_FL_VAL:
675
- setFilterVal(buf, parseMode, req);
676
- break;
677
- }
678
-
679
- }
680
- return !(m_requests.size()==0);
681
- }
682
-
683
-
684
- }//namespace hs
685
- }//namespace protocol
686
- }//namespace db
687
- }//namespace bzs
608
+ m_requests.clear();
609
+ char* p = (char*)ptr;
610
+ const char* end = p + size;
611
+ int parseMode = PARSEREAD_START;
612
+ int keyval_count = 0;
613
+ int data_count = INT_MAX;
614
+ int in_count = 0;
615
+ bool skip = false;
616
+ std::string buf;
617
+ buf.reserve(1024);
618
+ request* req = NULL;
619
+ while (p != end)
620
+ {
621
+ if (skip == false)
622
+ p = readTorkn(buf, p, end);
623
+ else
624
+ skip = false;
625
+ if (buf.size() == 0)
626
+ break;
627
+ switch (parseMode)
628
+ {
629
+ case PARSEREAD_START:
630
+ m_requests.push_back(request());
631
+ req = &m_requests[m_requests.size() - 1];
632
+ parseMode = PARSEREAD_COMMAND;
633
+ skip = true;
634
+ break;
635
+ case PARSEREAD_COMMAND:
636
+ setCmd(buf, parseMode, req);
637
+ break;
638
+ case PARSEREAD_HANDLEID:
639
+ setHandleID(buf, parseMode, req);
640
+ break;
641
+ case PARSEREAD_SEEKCMD:
642
+ setSeekCmd(buf, parseMode, req);
643
+ break;
644
+ case PARSEREAD_DATA_COUNT:
645
+ setValueCount(buf, parseMode, data_count);
646
+ parseMode = PARSEREAD_DATA_VAL;
647
+ break;
648
+ case PARSEREAD_DATA_VAL:
649
+ setValue(buf, parseMode, req->table.values, data_count);
650
+ if (data_count == 0)
651
+ parseMode = PARSEREAD_START;
652
+ break;
653
+ case PARSEREAD_KEYVAL_COUNT:
654
+ setValueCount(buf, parseMode, keyval_count);
655
+ parseMode = PARSEREAD_KEYVAL;
656
+ break;
657
+ case PARSEREAD_KEYVAL:
658
+ setValue(buf, parseMode, req->table.key.values, keyval_count);
659
+ if (keyval_count == 0)
660
+ parseMode = PARSEREAD_LIMIT;
661
+ break;
662
+ case PARSEREAD_DBNAME:
663
+ setDbname(buf, parseMode, req);
664
+ break;
665
+ case PARSEREAD_TABLENAME:
666
+ setTablename(buf, parseMode, req);
667
+ break;
668
+ case PARSEREAD_INDEXNAME:
669
+ setIndexname(buf, parseMode, req);
670
+ break;
671
+ case PARSEREAD_FIELDS:
672
+ setFields(buf, parseMode, req);
673
+ break;
674
+ case PARSEREAD_LIMIT:
675
+ skip = setLimit(buf, parseMode, req);
676
+ break;
677
+ case PARSEREAD_OFFSET:
678
+ setOffset(buf, parseMode, req);
679
+ break;
680
+ case PARSEREAD_IN_MODE:
681
+ skip = setInMode(buf, parseMode, req);
682
+ break;
683
+ case PARSEREAD_IN_KEYPART:
684
+ setInKeyPart(buf, parseMode, req);
685
+ break;
686
+ case PARSEREAD_IN_COUNT:
687
+ setValueCount(buf, parseMode, in_count);
688
+ parseMode = PARSEREAD_IN_VAL;
689
+ break;
690
+ case PARSEREAD_IN_VAL:
691
+ setValue(buf, parseMode, req->table.in.values, in_count);
692
+ if (in_count == 0)
693
+ parseMode = PARSEREAD_FL_TYPE;
694
+ break;
695
+ case PARSEREAD_FL_TYPE:
696
+ skip = setFilterType(buf, parseMode, req);
697
+ break;
698
+ case PARSEREAD_FL_LOG:
699
+ setFilterLog(buf, parseMode, req);
700
+ break;
701
+ case PARSEREAD_FL_COL:
702
+ setFilterCol(buf, parseMode, req);
703
+ parseMode = PARSEREAD_FL_VAL;
704
+ break;
705
+ case PARSEREAD_FL_VAL:
706
+ setFilterVal(buf, parseMode, req);
707
+ break;
708
+ }
709
+ }
710
+ return !(m_requests.size() == 0);
711
+ }
712
+
713
+ } // namespace hs
714
+ } // namespace protocol
715
+ } // namespace db
716
+ } // namespace bzs
688
717
 
689
718
  #endif // USE_HANDLERSOCKET