transactd 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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