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
 
@@ -34,1056 +34,1221 @@
34
34
  #include <bzs/db/transactd/connManager.h>
35
35
  #include <bzs/rtl/exception.h>
36
36
 
37
-
38
37
  namespace bzs
39
38
  {
40
39
  namespace db
41
40
  {
42
-
43
- using namespace engine::mysql;
44
-
41
+
42
+ using namespace engine::mysql;
43
+
45
44
  namespace protocol
46
45
  {
47
- using namespace transactd;
48
- using namespace transactd::connection;
46
+ using namespace transactd;
47
+ using namespace transactd::connection;
49
48
  namespace tdap
50
49
  {
51
50
  namespace mysql
52
51
  {
53
52
 
54
- static const char* TableNameTitle = "dbfile=";
55
- static const char* BdfNameTitle = ".bdf";
53
+ static const char* TableNameTitle = "dbfile=";
54
+ static const char* BdfNameTitle = ".bdf";
56
55
 
57
- std::string& toLowerCaseName(std::string& name , bool forSql)
56
+ class smartReadRecordsHandler
57
+ {
58
+ ReadRecordsHandler* m_hdr;
59
+ bool m_ended;
60
+
61
+ public:
62
+ smartReadRecordsHandler(ReadRecordsHandler* hdr)
63
+ : m_hdr(hdr), m_ended(false)
64
+ {
65
+ }
66
+ unsigned int end()
67
+ {
68
+ m_ended = true;
69
+ return m_hdr->end();
70
+ }
71
+
72
+ ~smartReadRecordsHandler()
73
+ {
74
+ if (!m_ended)
75
+ m_hdr->end();
76
+ }
77
+ };
78
+
79
+ std::string& toLowerCaseName(std::string& name, bool forSql)
58
80
  {
59
- if (forSql)
60
- {
61
- char tmp[MAX_PATH];
62
- strcpy_s(tmp, MAX_PATH, name.c_str());
63
- my_casedn_str(global_system_variables.collation_server, tmp);
64
- name = tmp;
65
- }
66
- else
67
- boost::algorithm::to_lower(name);
68
- return name;
81
+ if (forSql)
82
+ {
83
+ char tmp[MAX_PATH];
84
+ strcpy_s(tmp, MAX_PATH, name.c_str());
85
+ my_casedn_str(global_system_variables.collation_server, tmp);
86
+ name = tmp;
87
+ }
88
+ else
89
+ boost::algorithm::to_lower(name);
90
+ return name;
69
91
  }
70
92
 
71
93
  std::string getDatabaseName(const request& req, bool forSql)
72
94
  {
73
- std::vector<std::string> ssc ;
74
- std::vector<std::string> ss ;
75
- if (req.keybuf)
76
- {
77
- std::string s((const char*)req.keybuf);
78
- split(ssc, s, "\t");
79
- if (ssc.size())
80
- {
81
- if (forSql && ssc.size()>1)
82
- ssc.erase(ssc.begin(), ssc.begin()+1);
83
- std::string path = ssc[0];
84
- std::string derim = "/";
85
- split(ss, path, derim); /* tdap://serverName/dbName?dbfile=xxx */
86
- if (ss.size()>3)
87
- {
88
- std::vector<std::string> db;
89
- split(db, ss[3], "?");
90
- if (db.size()>0)
91
- {
92
- if (g_tableNmaeLower)
93
- toLowerCaseName(db[0], forSql);
94
- return db[0];
95
- }
96
- }
97
- }
98
- }
99
- return "";
95
+ std::vector<std::string> ssc;
96
+ std::vector<std::string> ss;
97
+ if (req.keybuf)
98
+ {
99
+ std::string s((const char*)req.keybuf);
100
+ split(ssc, s, "\t");
101
+ if (ssc.size())
102
+ {
103
+ if (forSql && ssc.size() > 1)
104
+ ssc.erase(ssc.begin(), ssc.begin() + 1);
105
+ std::string path = ssc[0];
106
+ std::string derim = "/";
107
+ split(ss, path, derim); /* tdap://serverName/dbName?dbfile=xxx */
108
+ if (ss.size() > 3)
109
+ {
110
+ std::vector<std::string> db;
111
+ split(db, ss[3], "?");
112
+ if (db.size() > 0)
113
+ {
114
+ if (g_tableNmaeLower)
115
+ toLowerCaseName(db[0], forSql);
116
+ return db[0];
117
+ }
118
+ }
119
+ }
120
+ }
121
+ return "";
100
122
  }
101
123
 
102
124
  std::string getTableName(const std::string& src, bool forSql)
103
125
  {
104
- std::vector<std::string> ssc ;
105
- split(ssc, src, "\t");
106
- if (forSql && ssc.size()>1)
107
- ssc.erase(ssc.begin(), ssc.begin()+1);
108
-
109
- std::string name = ssc[0];
110
- size_t pos = name.find(TableNameTitle);
111
- if (pos != std::string::npos)
112
- {
113
- pos += strlen(TableNameTitle);
114
- while ((name[pos] == '/')||(name[pos] == '\\'))
115
- {
116
- if (++pos == name.size())
117
- return "";
118
- }
119
- size_t pos2 = name.find("." , pos);
120
- if (pos2 == std::string::npos)
121
- pos2 = name.size();
122
- size_t pos3 = name.find("&" , pos);
123
- if (pos3 != std::string::npos && (pos3 < pos2))
124
- pos2 = pos3;
125
-
126
- name = name.substr(pos, pos2 - pos);
127
- if (g_tableNmaeLower)
128
- toLowerCaseName(name, forSql);
129
- return name;
130
- }
131
-
132
- return "";
126
+ std::vector<std::string> ssc;
127
+ split(ssc, src, "\t");
128
+ if (forSql && ssc.size() > 1)
129
+ ssc.erase(ssc.begin(), ssc.begin() + 1);
130
+
131
+ std::string name = ssc[0];
132
+ size_t pos = name.find(TableNameTitle);
133
+ if (pos != std::string::npos)
134
+ {
135
+ pos += strlen(TableNameTitle);
136
+ while ((name[pos] == '/') || (name[pos] == '\\'))
137
+ {
138
+ if (++pos == name.size())
139
+ return "";
140
+ }
141
+ size_t pos2 = name.find(".", pos);
142
+ if (pos2 == std::string::npos)
143
+ pos2 = name.size();
144
+ size_t pos3 = name.find("&", pos);
145
+ if (pos3 != std::string::npos && (pos3 < pos2))
146
+ pos2 = pos3;
147
+
148
+ name = name.substr(pos, pos2 - pos);
149
+ if (g_tableNmaeLower)
150
+ toLowerCaseName(name, forSql);
151
+ return name;
152
+ }
153
+
154
+ return "";
133
155
  }
134
156
 
135
157
  std::string getTableName(const request& req, bool forSql)
136
158
  {
137
-
138
- if (req.keybuf)
139
- {
140
- std::string s((const char*)req.keybuf, req.keylen);
141
- return getTableName(s, forSql);
142
- }
143
- return "";
159
+
160
+ if (req.keybuf)
161
+ {
162
+ std::string s((const char*)req.keybuf, req.keylen);
163
+ return getTableName(s, forSql);
164
+ }
165
+ return "";
144
166
  }
145
167
 
146
168
  const char* getOwnerName(const request& req)
147
169
  {
148
- const char* p = (const char*)req.data;
149
- if (*req.datalen && (p[*req.datalen-1] == 0x00))
150
- return p;
151
- return "";
170
+ const char* p = (const char*)req.data;
171
+ if (*req.datalen && (p[*req.datalen - 1] == 0x00))
172
+ return p;
173
+ return "";
152
174
  }
153
175
 
154
176
  void dumpStdErr(int op, request& req, table* tb)
155
177
  {
156
- boost::scoped_array<char> msg(new char[1024]);
157
-
158
-
159
- sprintf_s(msg.get(),1024, "[Transactd] Exception:op=%d Handle=%d tablename=%s datalen=%d"
160
- " keynum=%d keylen=%d \n"
161
- , op, req.pbk->handle
162
- , tb ? tb->name().c_str() : ""
163
- , *req.datalen
164
- , req.keyNum, req.keylen);
165
- sql_print_error("%s", msg.get());
166
- //dump Keybuf
167
- if (req.keylen && req.keybuf)
168
- {
169
- sprintf_s(msg.get(),1024,"[Transactd] Dump key buffer\n");
170
- sql_print_error("%s",msg.get());
171
- char* p = (char*)req.keybuf;
172
- bzs::rtl::debuglog::dump(stderr, (char*)req.keybuf, req.keylen, 256);
173
- }
174
- //dump databuffer
175
- if (*req.datalen && req.data)
176
- {
177
- sprintf_s(msg.get(),1024, "[Transactd] Dump data buffer\n");
178
- sql_print_error("%s",msg.get());
179
- bzs::rtl::debuglog::dump(stderr, (char*)req.data, (int)*req.datalen, 256);
180
- }
178
+ boost::scoped_array<char> msg(new char[1024]);
179
+
180
+ sprintf_s(msg.get(), 1024,
181
+ "[Transactd] Exception:op=%d Handle=%d tablename=%s datalen=%d"
182
+ " keynum=%d keylen=%d \n",
183
+ op, req.pbk->handle, tb ? tb->name().c_str() : "", *req.datalen,
184
+ req.keyNum, req.keylen);
185
+ sql_print_error("%s", msg.get());
186
+ // dump Keybuf
187
+ if (req.keylen && req.keybuf)
188
+ {
189
+ sprintf_s(msg.get(), 1024, "[Transactd] Dump key buffer\n");
190
+ sql_print_error("%s", msg.get());
191
+ bzs::rtl::debuglog::dump(stderr, (char*)req.keybuf, req.keylen, 256);
192
+ }
193
+ // dump databuffer
194
+ if (*req.datalen && req.data)
195
+ {
196
+ sprintf_s(msg.get(), 1024, "[Transactd] Dump data buffer\n");
197
+ sql_print_error("%s", msg.get());
198
+ bzs::rtl::debuglog::dump(stderr, (char*)req.data, (int)*req.datalen,
199
+ 256);
200
+ }
181
201
  }
182
202
 
183
203
  //-------------------------------------------------------------
184
204
  // class dbExecuter
185
205
  //-------------------------------------------------------------
186
206
 
187
- dbExecuter::dbExecuter():dbManager(),m_readHandler(new ReadRecordsHandler())
188
- ,m_blobBuffer(new blobBuffer())
207
+ dbExecuter::dbExecuter()
208
+ : dbManager(), m_readHandler(new ReadRecordsHandler()),
209
+ m_blobBuffer(new blobBuffer())
189
210
  {
190
-
191
211
  }
192
212
 
193
213
  dbExecuter::~dbExecuter()
194
214
  {
195
- delete m_blobBuffer;
196
- delete m_readHandler;
215
+ delete m_blobBuffer;
216
+ delete m_readHandler;
197
217
  }
198
218
 
199
219
  void dbExecuter::connect(request& req)
200
220
  {
201
- req.paramMask = 0;
202
- if (req.keyNum == LG_SUBOP_DISCONNECT)
203
- releaseDatabse(req.cid);
204
- else
205
- {
206
- std::string dbname = getDatabaseName(req);
207
- std::string dbSqlname = getDatabaseName(req, FOR_SQL);
208
- //exec SQL use database
209
- if (dbname != "")
210
- {
211
- database* db = getDatabase(dbname.c_str(), req.cid);
212
- dbSqlname.insert(0, "use ");
213
- req.result = ddl_execSql(db->thd(), dbSqlname);
214
- }
215
- }
216
-
221
+ req.paramMask = 0;
222
+ if (req.keyNum == LG_SUBOP_DISCONNECT)
223
+ dbManager::releaseDatabase(req.cid);
224
+ else
225
+ {
226
+ std::string dbname = getDatabaseName(req);
227
+ std::string dbSqlname = getDatabaseName(req, FOR_SQL);
228
+ // exec SQL use database
229
+ if (dbname != "")
230
+ {
231
+ database* db = getDatabase(dbname.c_str(), req.cid);
232
+ dbSqlname.insert(0, "use ");
233
+ req.result = ddl_execSql(db->thd(), dbSqlname);
234
+ }
235
+ }
217
236
  }
218
237
 
219
238
  void dbExecuter::releaseDatabase(request& req, int op)
220
239
  {
221
- req.paramMask = 0;
222
- if ((op == TD_RESET_CLIENT)&&(req.keyNum !=0))
223
- req.result = 1;
224
- else
225
- releaseDatabse(req.cid);
240
+ req.paramMask = 0;
241
+ if ((op == TD_RESET_CLIENT) && (req.keyNum != 0))
242
+ req.result = 1;
243
+ else
244
+ dbManager::releaseDatabase(req.cid);
226
245
  }
227
246
 
228
247
  std::string dbExecuter::makeSQLcreateTable(const request& req)
229
248
  {
230
- return (const char*)req.data;
231
- //return sql;
249
+ return (const char*)req.data;
250
+ // return sql;
232
251
  }
233
252
 
234
253
  int dbExecuter::errorCode(int ha_error)
235
- {//see mysqld_error.h or my_base.h or dbManager.h
236
-
237
- if (ha_error < HA_ERR_FIRST)
238
- return ha_error;
239
- else if (ha_error==HA_ERR_KEY_NOT_FOUND)
240
- return STATUS_NOT_FOUND_TI;
241
- else if (ha_error == HA_ERR_END_OF_FILE)
242
- return STATUS_EOF;
243
- else if (ha_error == HA_ERR_FOUND_DUPP_KEY)
244
- return STATUS_DUPPLICATE_KEYVALUE;
245
- else if(ha_error == HA_ERR_CRASHED_ON_USAGE)
246
- return STATUS_IO_ERROR;
247
- else if (ha_error ==HA_ERR_NO_ACTIVE_RECORD)
248
- return STATUS_NO_CURRENT;
249
- else if ((ha_error == HA_ERR_LOCK_WAIT_TIMEOUT)
250
- ||(ha_error==HA_ERR_LOCK_DEADLOCK)||(ha_error == ER_LOCK_WAIT_TIMEOUT))
251
- return STATUS_LOCK_ERROR;
252
- else if (ha_error == STATUS_INVALID_LOCKTYPE)
253
- return STATUS_INVALID_LOCKTYPE;
254
- else if(ha_error==HA_ERR_AUTOINC_ERANGE)
255
- return STATUS_DUPPLICATE_KEYVALUE;
256
- else if (ha_error==ER_PARSE_ERROR)
257
- return STATUS_CANT_CREATE;
258
- else if(ha_error == ER_TABLE_EXISTS_ERROR)
259
- return STATUS_TABLE_EXISTS_ERROR;
260
- else if (ha_error == DBM_ERROR_TABLE_USED)
261
- return STATUS_CANNOT_LOCK_TABLE;
262
- return 25000 + ha_error;
263
-
254
+ { // see mysqld_error.h or my_base.h or dbManager.h
255
+
256
+ if (ha_error < HA_ERR_FIRST)
257
+ return ha_error;
258
+ else if (ha_error == HA_ERR_KEY_NOT_FOUND)
259
+ return STATUS_NOT_FOUND_TI;
260
+ else if (ha_error == HA_ERR_END_OF_FILE)
261
+ return STATUS_EOF;
262
+ else if (ha_error == HA_ERR_FOUND_DUPP_KEY)
263
+ return STATUS_DUPPLICATE_KEYVALUE;
264
+ else if (ha_error == HA_ERR_CRASHED_ON_USAGE)
265
+ return STATUS_IO_ERROR;
266
+ else if (ha_error == HA_ERR_NO_ACTIVE_RECORD)
267
+ return STATUS_NO_CURRENT;
268
+ else if ((ha_error == HA_ERR_LOCK_WAIT_TIMEOUT) ||
269
+ (ha_error == HA_ERR_LOCK_DEADLOCK) ||
270
+ (ha_error == ER_LOCK_WAIT_TIMEOUT))
271
+ return STATUS_LOCK_ERROR;
272
+ else if (ha_error == STATUS_INVALID_LOCKTYPE)
273
+ return STATUS_INVALID_LOCKTYPE;
274
+ else if (ha_error == HA_ERR_AUTOINC_ERANGE)
275
+ return STATUS_DUPPLICATE_KEYVALUE;
276
+ else if (ha_error == ER_PARSE_ERROR)
277
+ return STATUS_CANT_CREATE;
278
+ else if (ha_error == ER_TABLE_EXISTS_ERROR)
279
+ return STATUS_TABLE_EXISTS_ERROR;
280
+ else if (ha_error == DBM_ERROR_TABLE_USED)
281
+ return STATUS_CANNOT_LOCK_TABLE;
282
+ return 25000 + ha_error;
264
283
  }
265
284
 
266
285
  bool isMetaDb(const request& req)
267
286
  {
268
-
269
- char buf[MAX_PATH];
270
- strncpy(buf, (char*)req.keybuf, MAX_PATH);
271
- _strlwr(buf);
272
- char_m* st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
273
- if (st==NULL)
274
- st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
275
- return (st != NULL);
287
+
288
+ char buf[MAX_PATH];
289
+ strncpy(buf, (char*)req.keybuf, MAX_PATH);
290
+ _strlwr(buf);
291
+ char_m* st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
292
+ if (st == NULL)
293
+ st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
294
+ return (st != NULL);
276
295
  }
277
296
 
278
297
  inline void dbExecuter::doCreateTable(request& req)
279
298
  {
280
- // if table name is mata table and database is nothing
281
- // then cretate database too.
282
- std::string dbname = getDatabaseName(req);
283
- std::string dbSqlname = getDatabaseName(req, FOR_SQL);
284
- if (dbname != "")
285
- {
286
- std::string cmd;
287
- database* db = getDatabase(dbname.c_str(), req.cid);
288
-
289
- if (isMetaDb(req))
290
- {//for database operation
291
- if ((req.keyNum == 0) && (db->existsDatabase()==false))
292
- req.result = ddl_createDataBase(db->thd(), dbSqlname);
293
- else if (req.keyNum == CR_SUBOP_DROP)
294
- {
295
- std::string tableName = getTableName(req);
296
- if (db->existsTable(tableName))
297
- req.result = ddl_dropTable(db, tableName, dbSqlname, getTableName(req, FOR_SQL));
298
- if (req.result == 0)
299
- req.result = ddl_dropDataBase(db->thd(), dbname, dbSqlname);
300
- req.result = errorCodeSht(req.result);
301
- return;
302
- }
303
- }
304
- if (req.result==0)
305
- {//table operation
306
- if ((req.result = ddl_useDataBase(db->thd(), dbSqlname))==0)
307
- {
308
- std::string tableSqlName = getTableName(req, FOR_SQL);
309
- std::string tableName = getTableName(req);
310
- if (req.keyNum == CR_SUBOP_DROP)// -128 is delete
311
- {
312
-
313
- if (db->existsTable(tableName))
314
- req.result = ddl_dropTable(db, tableName, dbSqlname, tableSqlName);
315
- }
316
- else if (req.keyNum == CR_SUBOP_RENAME)
317
- {//rename new is keybuf
318
- request reqold;
319
- reqold.keybuf = req.data;
320
- reqold.keylen = *req.datalen;
321
- req.result = ddl_renameTable(db
322
- , getTableName(reqold)/*oldname*/
323
- , dbSqlname
324
- , getTableName(reqold, FOR_SQL)/*oldname*/
325
- , tableSqlName/*newName*/);
326
-
327
- }
328
- else if (req.keyNum == CR_SUBOP_SWAPNAME)
329
- {//swap name name2 = keybuf
330
- request reqold;
331
- reqold.keybuf = req.data;
332
- reqold.keylen = *req.datalen;
333
- req.result = ddl_replaceTable(db
334
- , getTableName(reqold)/*oldname*/
335
- , tableName /*newName*/
336
- , dbSqlname
337
- , getTableName(reqold, FOR_SQL)/*oldname*/
338
- , tableSqlName /*newName*/);
339
-
340
- }
341
- else
342
- {//create
343
- if (req.data==NULL)
344
- req.result = 1;
345
- else
346
- { //-1 is overwrite
347
- if ((req.keyNum == CR_SUB_FLAG_EXISTCHECK) && (db->existsTable(tableName)))
348
- req.result = ddl_dropTable(db, tableName, dbSqlname, tableSqlName);
349
- if (req.result == 0)
350
- req.result = ddl_execSql(db->thd(), makeSQLcreateTable(req));
351
- }
352
- }
353
- }
354
- }
355
- }
356
- else
357
- req.result = 1;
358
- req.result = errorCodeSht(req.result);
299
+ // if table name is mata table and database is nothing
300
+ // then cretate database too.
301
+ std::string dbname = getDatabaseName(req);
302
+ std::string dbSqlname = getDatabaseName(req, FOR_SQL);
303
+ if (dbname != "")
304
+ {
305
+ std::string cmd;
306
+ database* db = getDatabase(dbname.c_str(), req.cid);
307
+
308
+ if (isMetaDb(req))
309
+ { // for database operation
310
+ if ((req.keyNum == 0) && (db->existsDatabase() == false))
311
+ req.result = ddl_createDataBase(db->thd(), dbSqlname);
312
+ else if (req.keyNum == CR_SUBOP_DROP)
313
+ {
314
+ std::string tableName = getTableName(req);
315
+ if (db->existsTable(tableName))
316
+ req.result = ddl_dropTable(db, tableName, dbSqlname,
317
+ getTableName(req, FOR_SQL));
318
+ if (req.result == 0)
319
+ req.result = ddl_dropDataBase(db->thd(), dbname, dbSqlname);
320
+ req.result = errorCodeSht(req.result);
321
+ return;
322
+ }
323
+ }
324
+ if (req.result == 0)
325
+ { // table operation
326
+ if ((req.result = ddl_useDataBase(db->thd(), dbSqlname)) == 0)
327
+ {
328
+ std::string tableSqlName = getTableName(req, FOR_SQL);
329
+ std::string tableName = getTableName(req);
330
+ if (req.keyNum == CR_SUBOP_DROP) // -128 is delete
331
+ {
332
+
333
+ if (db->existsTable(tableName))
334
+ req.result = ddl_dropTable(db, tableName, dbSqlname,
335
+ tableSqlName);
336
+ }
337
+ else if (req.keyNum == CR_SUBOP_RENAME)
338
+ { // rename new is keybuf
339
+ request reqold;
340
+ reqold.keybuf = req.data;
341
+ reqold.keylen = *req.datalen;
342
+ req.result = ddl_renameTable(
343
+ db, getTableName(reqold) /*oldname*/
344
+ ,
345
+ dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
346
+ ,
347
+ tableSqlName /*newName*/);
348
+ }
349
+ else if (req.keyNum == CR_SUBOP_SWAPNAME)
350
+ { // swap name name2 = keybuf
351
+ request reqold;
352
+ reqold.keybuf = req.data;
353
+ reqold.keylen = *req.datalen;
354
+ req.result = ddl_replaceTable(
355
+ db, getTableName(reqold) /*oldname*/
356
+ ,
357
+ tableName /*newName*/
358
+ ,
359
+ dbSqlname, getTableName(reqold, FOR_SQL) /*oldname*/
360
+ ,
361
+ tableSqlName /*newName*/);
362
+ }
363
+ else
364
+ { // create
365
+ if (req.data == NULL)
366
+ req.result = 1;
367
+ else
368
+ { //-1 is overwrite
369
+ if ((req.keyNum == CR_SUB_FLAG_EXISTCHECK) &&
370
+ (db->existsTable(tableName)))
371
+ req.result = ddl_dropTable(db, tableName, dbSqlname,
372
+ tableSqlName);
373
+ if (req.result == 0)
374
+ req.result =
375
+ ddl_execSql(db->thd(), makeSQLcreateTable(req));
376
+ }
377
+ }
378
+ }
379
+ }
380
+ }
381
+ else
382
+ req.result = 1;
383
+ req.result = errorCodeSht(req.result);
359
384
  }
360
385
 
361
- //open table and assign handle
386
+ // open table and assign handle
362
387
  inline void dbExecuter::doOpenTable(request& req)
363
388
  {
364
- std::string dbname = getDatabaseName(req);
365
- if (dbname != "")
366
- {
367
- database* db = getDatabase(dbname.c_str(), req.cid);
368
- m_tb = db->openTable(getTableName(req), req.keyNum, getOwnerName(req));// if error occured that throw exception
369
- req.result = db->stat();
370
- if (m_tb)
371
- {
372
- req.pbk->handle = addHandle(getDatabaseID(req.cid), m_tb->id());
373
- m_tb = getTable(req.pbk->handle);
374
- m_tb->setBlobBuffer(m_blobBuffer);
375
- req.paramMask = P_MASK_POSBLK;
376
- }
377
- }
378
- else
379
- req.result = 1;
389
+ std::string dbname = getDatabaseName(req);
390
+ if (dbname != "")
391
+ {
392
+ database* db = getDatabase(dbname.c_str(), req.cid);
393
+ m_tb = db->openTable(
394
+ getTableName(req), req.keyNum,
395
+ getOwnerName(req)); // if error occured that throw exception
396
+ req.result = db->stat();
397
+ if (m_tb)
398
+ {
399
+ req.pbk->handle = addHandle(getDatabaseID(req.cid), m_tb->id());
400
+ m_tb = getTable(req.pbk->handle);
401
+ m_tb->setBlobBuffer(m_blobBuffer);
402
+ req.paramMask = P_MASK_POSBLK;
403
+ }
404
+ }
405
+ else
406
+ req.result = 1;
380
407
  }
381
408
 
382
409
  inline void readAfter(request& req, table* tb, dbExecuter* dbm)
383
410
  {
384
- if (tb->stat()==0)
385
- {
386
- if ((req.op>=TD_KEY_EQUAL_KO)&& (req.op <= TD_KEY_LAST_KO))
387
- req.paramMask = P_MASK_POSBLK;
388
- else
389
- {
390
- req.paramMask = P_MASK_READRESULT;
391
- if (tb->blobFields())
392
- req.paramMask |=P_MASK_BLOBBODY;
393
- req.data = tb->record();
394
- }
395
- }
396
- req.result = dbm->errorCodeSht(tb->stat());
411
+ if (tb->stat() == 0)
412
+ {
413
+ if ((req.op >= TD_KEY_EQUAL_KO) && (req.op <= TD_KEY_LAST_KO))
414
+ req.paramMask = P_MASK_POSBLK;
415
+ else
416
+ {
417
+ req.paramMask = P_MASK_READRESULT;
418
+ if (tb->blobFields())
419
+ req.paramMask |= P_MASK_BLOBBODY;
420
+ req.data = tb->record();
421
+ }
422
+ }
423
+ req.result = dbm->errorCodeSht(tb->stat());
397
424
  }
398
425
 
399
426
  inline void dbExecuter::doSeekKey(request& req, int op)
400
427
  {
401
- bool read = true;
402
- m_tb = getTable(req.pbk->handle);
403
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
404
- {
405
- m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
406
- if (read)
407
- {
408
- ha_rkey_function flag;
409
- if (op == TD_KEY_SEEK)
410
- flag = HA_READ_KEY_EXACT;
411
- else if (op == TD_KEY_AFTER)
412
- flag = HA_READ_AFTER_KEY;
413
- else if (op == TD_KEY_OR_AFTER)
414
- flag = HA_READ_KEY_OR_NEXT;
415
- else if (op == TD_KEY_BEFORE)
416
- flag = HA_READ_BEFORE_KEY;
417
- else if (op == TD_KEY_OR_BEFORE)
418
- flag = HA_READ_KEY_OR_PREV;
419
- m_tb->seekKey(flag);
420
- }
421
- }
422
- readAfter(req, m_tb, this);
428
+ bool read = true;
429
+ m_tb = getTable(req.pbk->handle);
430
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
431
+ {
432
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
433
+ if (read)
434
+ {
435
+ ha_rkey_function flag = HA_READ_KEY_EXACT;
436
+ if (op == TD_KEY_SEEK)
437
+ flag = HA_READ_KEY_EXACT;
438
+ else if (op == TD_KEY_AFTER)
439
+ flag = HA_READ_AFTER_KEY;
440
+ else if (op == TD_KEY_OR_AFTER)
441
+ flag = HA_READ_KEY_OR_NEXT;
442
+ else if (op == TD_KEY_BEFORE)
443
+ flag = HA_READ_BEFORE_KEY;
444
+ else if (op == TD_KEY_OR_BEFORE)
445
+ flag = HA_READ_KEY_OR_PREV;
446
+ m_tb->seekKey(flag, m_tb->keymap());
447
+ }
448
+ }
449
+ readAfter(req, m_tb, this);
423
450
  }
424
451
 
425
452
  inline void dbExecuter::doMoveFirst(request& req)
426
453
  {
427
- m_tb = getTable(req.pbk->handle);
428
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
429
- {
430
- if (m_tb->isNisKey(m_tb->keyNum()))
431
- {
432
- m_tb->clearKeybuf();
433
- m_tb->seekKey(HA_READ_KEY_OR_NEXT);
434
- }else
435
- m_tb->getFirst();
436
- }
437
- readAfter(req, m_tb, this);
454
+ m_tb = getTable(req.pbk->handle);
455
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
456
+ {
457
+ if (m_tb->isNisKey(m_tb->keyNum()))
458
+ {
459
+ m_tb->clearKeybuf();
460
+ m_tb->seekKey(HA_READ_KEY_OR_NEXT, m_tb->keymap());
461
+ }
462
+ else
463
+ m_tb->getFirst();
464
+ }
465
+ readAfter(req, m_tb, this);
438
466
  }
439
467
 
440
468
  inline void dbExecuter::doMoveKey(request& req, int op)
441
469
  {
442
- m_tb = getTable(req.pbk->handle);
443
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
444
- {
445
- if (op== TD_KEY_FIRST)
446
- m_tb->getFirst();
447
- else if (op== TD_KEY_LAST)
448
- m_tb->getLast();
449
- else if (op== TD_KEY_NEXT)
450
- m_tb->getNext();
451
- else if (op== TD_KEY_PREV)
452
- m_tb->getPrev();
453
- }
454
- readAfter(req, m_tb, this);
470
+ m_tb = getTable(req.pbk->handle);
471
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
472
+ {
473
+ if (op == TD_KEY_FIRST)
474
+ m_tb->getFirst();
475
+ else if (op == TD_KEY_LAST)
476
+ m_tb->getLast();
477
+ else if (op == TD_KEY_NEXT)
478
+ m_tb->getNext();
479
+ else if (op == TD_KEY_PREV)
480
+ m_tb->getPrev();
481
+ }
482
+ readAfter(req, m_tb, this);
455
483
  }
456
484
 
457
- inline int dbExecuter::doReadMultiWithSeek(request& req, int op, char* resultBuffer
458
- , size_t& size, netsvc::server::buffers* optionalData)
485
+ inline int dbExecuter::doReadMultiWithSeek(request& req, int op,
486
+ netsvc::server::netWriter* nw)
459
487
  {
460
- int ret = 1;
461
- m_tb = getTable(req.pbk->handle);
462
- char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
463
- if (m_tb->setKeyNum(keynum))
464
- {
465
- m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
466
- m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT : HA_READ_KEY_OR_PREV);
467
-
468
- extRequest* ereq = (extRequest*)req.data;
469
- req.result = m_readHandler->begin(m_tb, ereq, true
470
- , resultBuffer, RETBUF_EXT_RESERVE_SIZE, *req.datalen, (op == TD_KEY_GE_NEXT_MULTI));
471
- if (req.result != 0)
472
- return 1;
473
- if (m_tb->stat() == 0)
474
- {
475
- if (op == TD_KEY_GE_NEXT_MULTI)
476
- m_tb->getNextExt(m_readHandler, true);
477
- else if (op == TD_KEY_LE_PREV_MULTI)
478
- m_tb->getPrevExt(m_readHandler, true);
479
- }
480
- req.result = errorCodeSht(m_tb->stat());
481
- DEBUG_WRITELOG2(op, req);
482
- size = req.serializeForExt(m_tb, resultBuffer, m_readHandler->end());
483
- if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
484
- size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
485
-
486
- DEBUG_PROFILE_END_OP(1, op)
487
- ret = EXECUTE_RESULT_SUCCESS;
488
-
489
- }
490
- if (m_tb)m_tb->unUse();
491
- return ret;
488
+ DEBUG_MEMDUMP("doReadMultiWithSeek ", req.data, (*((short*)req.data)))
489
+ int ret = 1;
490
+ m_tb = getTable(req.pbk->handle);
491
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
492
+ if (m_tb->setKeyNum(keynum))
493
+ {
494
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
495
+ m_tb->seekKey((op == TD_KEY_GE_NEXT_MULTI) ? HA_READ_KEY_OR_NEXT
496
+ : HA_READ_KEY_OR_PREV,
497
+ m_tb->keymap());
498
+
499
+ extRequest* ereq = (extRequest*)req.data;
500
+ bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
501
+
502
+ // smartReadRecordsHandler scope
503
+ {
504
+ smartReadRecordsHandler srrh(m_readHandler);
505
+ req.result = m_readHandler->begin(m_tb, ereq, true, nw,
506
+ (op == TD_KEY_GE_NEXT_MULTI),
507
+ noBookmark, false);
508
+ if (req.result != 0)
509
+ return ret;
510
+ if (m_tb->stat() == 0)
511
+ {
512
+ if (op == TD_KEY_GE_NEXT_MULTI)
513
+ m_tb->getNextExt(m_readHandler, true, noBookmark);
514
+ else if (op == TD_KEY_LE_PREV_MULTI)
515
+ m_tb->getPrevExt(m_readHandler, true, noBookmark);
516
+ }
517
+ req.result = errorCodeSht(m_tb->stat());
518
+ DEBUG_WRITELOG2(op, req);
519
+ }
520
+ short dummy = 0;
521
+ size_t& size = nw->datalen;
522
+ size = req.serializeForExt(m_tb, nw);
523
+ char* resultBuffer = nw->ptr();
524
+ netsvc::server::buffers* optionalData = nw->optionalData();
525
+ if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
526
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
527
+ FILE_MAP_SIZE, optionalData, dummy);
528
+
529
+ DEBUG_PROFILE_END_OP(1, op)
530
+ ret = EXECUTE_RESULT_SUCCESS;
531
+ }
532
+ if (m_tb)
533
+ m_tb->unUse();
534
+ return ret;
492
535
  }
493
536
 
494
- inline int dbExecuter::doReadMulti(request& req, int op, char* resultBuffer
495
- , size_t& size, netsvc::server::buffers* optionalData)
537
+ inline int dbExecuter::doReadMulti(request& req, int op,
538
+ netsvc::server::netWriter* nw)
496
539
  {
497
- int ret = 1;
498
- m_tb = getTable(req.pbk->handle);
499
- extRequest* ereq = (extRequest*)req.data;
500
- bool incCurrent = !((ereq->type[0]=='E') && (ereq->type[1]=='G'));
501
- bool forword = (op == TD_KEY_NEXT_MULTI) || (op == TD_POS_NEXT_MULTI);
502
- req.result = m_readHandler->begin(m_tb, ereq,(op != TD_KEY_SEEK_MULTI)
503
- , resultBuffer, RETBUF_EXT_RESERVE_SIZE, *req.datalen, forword);
504
- if (req.result == 0)
505
- {
506
- if (op == TD_KEY_SEEK_MULTI)
507
- {
508
- char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
509
- if (m_tb->setKeyNum(keynum))
510
- req.result = errorCodeSht(seekEach(ereq));
511
- else
512
- {
513
- if (m_tb)m_tb->unUse();
514
- return ret;
515
- }
516
- }
517
- else
518
- {
519
- if (op == TD_KEY_NEXT_MULTI)
520
- m_tb->getNextExt(m_readHandler, incCurrent);
521
- else if (op == TD_KEY_PREV_MULTI)
522
- m_tb->getPrevExt(m_readHandler, incCurrent);
523
- else if (op == TD_POS_NEXT_MULTI)
524
- m_tb->stepNextExt(m_readHandler, incCurrent);
525
- else if (op == TD_POS_PREV_MULTI)
526
- m_tb->stepPrevExt(m_readHandler, incCurrent);
527
- req.result = errorCodeSht(m_tb->stat());
528
- }
529
- DEBUG_WRITELOG2(op, req);
530
- size = req.serializeForExt(m_tb, resultBuffer, m_readHandler->end());
531
- if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
532
- size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
533
-
534
- DEBUG_PROFILE_END_OP(1, op)
535
-
536
- ret = EXECUTE_RESULT_SUCCESS;
537
- }
538
- if (m_tb)m_tb->unUse();
539
- return ret;
540
+ DEBUG_MEMDUMP("doReadMulti ", req.data, (*((short*)req.data)))
541
+ int ret = 1;
542
+ m_tb = getTable(req.pbk->handle);
543
+ extRequest* ereq = (extRequest*)req.data;
544
+ bool incCurrent = (ereq->itype & FILTER_CURRENT_TYPE_INC) != 0;
545
+ bool noBookmark = (ereq->itype & FILTER_CURRENT_TYPE_NOBOOKMARK) != 0;
546
+
547
+ bool forword = (op == TD_KEY_NEXT_MULTI) || (op == TD_POS_NEXT_MULTI);
548
+ if (op == TD_KEY_SEEK_MULTI)
549
+ {
550
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
551
+ if (!m_tb->setKeyNum(keynum))
552
+ {
553
+ if (m_tb)
554
+ m_tb->unUse();
555
+ return ret;
556
+ }
557
+ }
558
+ // smartReadRecordsHandler scope
559
+ {
560
+ smartReadRecordsHandler srrh(m_readHandler);
561
+ req.result = m_readHandler->begin(m_tb, ereq, (op != TD_KEY_SEEK_MULTI),
562
+ nw, forword, noBookmark,
563
+ (op == TD_KEY_SEEK_MULTI));
564
+ if (req.result != 0)
565
+ {
566
+ if (m_tb)
567
+ m_tb->unUse();
568
+ return ret;
569
+ }
570
+ if (op == TD_KEY_SEEK_MULTI)
571
+ req.result =
572
+ errorCodeSht(seekEach((extRequestSeeks*)req.data, noBookmark));
573
+ else
574
+ {
575
+ if (op == TD_KEY_NEXT_MULTI)
576
+ m_tb->getNextExt(m_readHandler, incCurrent, noBookmark);
577
+ else if (op == TD_KEY_PREV_MULTI)
578
+ m_tb->getPrevExt(m_readHandler, incCurrent, noBookmark);
579
+ else if (op == TD_POS_NEXT_MULTI)
580
+ m_tb->stepNextExt(m_readHandler, incCurrent, noBookmark);
581
+ else if (op == TD_POS_PREV_MULTI)
582
+ m_tb->stepPrevExt(m_readHandler, incCurrent, noBookmark);
583
+ req.result = errorCodeSht(m_tb->stat());
584
+ }
585
+ DEBUG_WRITELOG2(op, req);
586
+ }
587
+
588
+ short dummy = 0;
589
+ size_t& size = nw->datalen;
590
+ size = req.serializeForExt(m_tb, nw);
591
+
592
+ char* resultBuffer = nw->ptr();
593
+ netsvc::server::buffers* optionalData = nw->optionalData();
594
+ if ((req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
595
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
596
+ FILE_MAP_SIZE, optionalData, dummy);
597
+
598
+ DEBUG_PROFILE_END_OP(1, op)
599
+
600
+ ret = EXECUTE_RESULT_SUCCESS;
601
+
602
+ if (m_tb)
603
+ m_tb->unUse();
604
+ return ret;
540
605
  }
541
606
 
542
- inline short dbExecuter::seekEach(extRequest* ereq)
607
+ inline __int64 intValue(const unsigned char* p, int len)
543
608
  {
544
- short stat = 0;
545
- logicalField* fd = &ereq->field;
546
- for (int i=0;i<ereq->logicalCount;++i)
547
- {
548
- m_tb->setKeyValuesPacked(fd->ptr, fd->len);
549
- m_tb->seekKey(HA_READ_KEY_EXACT);
550
- if (m_tb->stat() == 0)
551
- stat = m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
552
- else
553
- stat = m_readHandler->write(NULL, m_tb->posPtrLen(), errorCodeSht(m_tb->stat()));
554
- if (stat) break;
555
- fd = fd->next();
556
- }
557
- if (stat==0)
558
- stat = STATUS_REACHED_FILTER_COND;
559
- return stat;
609
+ switch (len)
610
+ {
611
+ case 1:
612
+ return *((char*)p);
613
+ case 2:
614
+ return *((short*)p);
615
+ case 3:
616
+ return *((int*)p) & 0xFFFFFF;
617
+ case 4:
618
+ return *((int*)p);
619
+ case 8:
620
+ return *((__int64*)p);
621
+ }
622
+ return 0;
623
+ }
624
+
625
+ inline short dbExecuter::seekEach(extRequestSeeks* ereq, bool noBookmark)
626
+ {
627
+
628
+ short stat = 0;
629
+ seek* fd = &ereq->seekData;
630
+ short seg = m_tb->setKeyValuesPacked(fd->ptr, fd->len);
631
+ key_part_map keyMap = m_tb->keymap();
632
+ if (!noBookmark)
633
+ {
634
+ if (seg != -1)
635
+ {
636
+ keyMap = (1U << seg) - 1;
637
+ seg = 1;
638
+ }
639
+ else
640
+ seg = !m_tb->isUniqueKey();
641
+ }
642
+ else
643
+ seg = 0;
644
+
645
+ for (int i = 0; i < ereq->logicalCount; ++i)
646
+ {
647
+ m_tb->setKeyValuesPacked(fd->ptr, fd->len);
648
+ m_tb->seekKey(HA_READ_KEY_EXACT, keyMap);
649
+ if (m_tb->stat() == 0)
650
+ {
651
+ if (seg)
652
+ stat = m_readHandler->write((uchar*)&i, 4);
653
+ else
654
+ stat =
655
+ m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
656
+ }
657
+ else
658
+ stat = m_readHandler->write(NULL, m_tb->posPtrLen());
659
+ if (stat)
660
+ break;
661
+
662
+ // for hasMany join
663
+ if (seg)
664
+ {
665
+ while (m_tb->stat() == 0)
666
+ {
667
+ m_tb->getNextSame(keyMap);
668
+ if (m_tb->stat() == 0)
669
+ stat = m_readHandler->write(
670
+ (uchar*)&i, 4); // write seek sequential number
671
+ if (stat)
672
+ break;
673
+ }
674
+ if (stat)
675
+ break;
676
+ }
677
+
678
+ fd = fd->next();
679
+ }
680
+ if (stat == 0)
681
+ stat = STATUS_REACHED_FILTER_COND;
682
+ return stat;
560
683
  }
561
684
 
562
685
  inline void dbExecuter::doStepRead(request& req, int op)
563
686
  {
564
- m_tb = getTable(req.pbk->handle);
565
- if (op == TD_POS_FIRST)
566
- m_tb->stepFirst();
567
- else if (op == TD_POS_LAST)
568
- m_tb->stepLast();
569
- else if (op == TD_POS_NEXT)
570
- m_tb->stepNext();
571
- else if (op == TD_POS_PREV)
572
- m_tb->stepPrev();
573
- readAfter(req, m_tb, this);
687
+ m_tb = getTable(req.pbk->handle);
688
+ if (op == TD_POS_FIRST)
689
+ m_tb->stepFirst();
690
+ else if (op == TD_POS_LAST)
691
+ m_tb->stepLast();
692
+ else if (op == TD_POS_NEXT)
693
+ m_tb->stepNext();
694
+ else if (op == TD_POS_PREV)
695
+ m_tb->stepPrev();
696
+ readAfter(req, m_tb, this);
574
697
  }
575
698
 
576
699
  inline void dbExecuter::doInsert(request& req)
577
700
  {
578
- m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
579
- bool ncc = (req.keyNum==-1);
580
- if (!ncc)
581
- {
582
- if (!m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
583
- {
584
- req.result = errorCodeSht(m_tb->stat());
585
- return;
586
- }
587
- }
588
- m_tb->clearBuffer();
589
- m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
590
- smartBulkInsert sbi(m_tb, 1);
591
- __int64 aincValue = m_tb->insert(ncc);
592
- req.result = errorCodeSht(m_tb->stat());
593
- if (aincValue)
594
- {
595
- req.paramMask = P_MASK_INS_AUTOINC;
596
- req.data = m_tb->record();
597
- }
598
- else
599
- req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
701
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
702
+ bool ncc = (req.keyNum == -1);
703
+ if (!ncc)
704
+ {
705
+ if (!m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
706
+ {
707
+ req.result = errorCodeSht(m_tb->stat());
708
+ return;
709
+ }
710
+ }
711
+ m_tb->clearBuffer();
712
+ m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
713
+ req.blobHeader);
714
+ smartBulkInsert sbi(m_tb, 1);
715
+ __int64 aincValue = m_tb->insert(ncc);
716
+ req.result = errorCodeSht(m_tb->stat());
717
+ if (aincValue)
718
+ {
719
+ req.paramMask = P_MASK_INS_AUTOINC;
720
+ req.data = m_tb->record();
721
+ }
722
+ else
723
+ req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
600
724
  }
601
725
 
602
726
  inline void dbExecuter::doUpdateKey(request& req)
603
727
  {
604
- m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
605
- char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
606
- if (m_tb->setKeyNum(keynum))
607
- {
608
- m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
609
- m_tb->seekKey(HA_READ_KEY_EXACT);
610
- if (m_tb->stat() == 0)
611
- {
612
- m_tb->beginUpdate(keynum);
613
- if (m_tb->stat()==0)
614
- {
615
- m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
616
- m_tb->update(true);
617
- }
618
- }
619
- }
620
- req.result = errorCodeSht(m_tb->stat());
621
- req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
622
-
728
+ m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
729
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
730
+ if (m_tb->setKeyNum(keynum))
731
+ {
732
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
733
+ m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
734
+ if (m_tb->stat() == 0)
735
+ {
736
+ m_tb->beginUpdate(keynum);
737
+ if (m_tb->stat() == 0)
738
+ {
739
+ m_tb->setRecordFromPacked((const uchar*)req.data,
740
+ *(req.datalen), req.blobHeader);
741
+ m_tb->update(true);
742
+ }
743
+ }
744
+ }
745
+ req.result = errorCodeSht(m_tb->stat());
746
+ req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
623
747
  }
624
748
 
625
749
  inline void dbExecuter::doUpdate(request& req)
626
750
  {
627
- m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
628
- bool ncc = (req.keyNum==-1);
629
- m_tb->beginUpdate(req.keyNum);
630
- if (m_tb->stat()==0)
631
- {
632
- m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen), req.blobHeader);
633
- m_tb->update(ncc);
634
- }
635
- req.result = errorCodeSht(m_tb->stat());
636
- req.paramMask = P_MASK_POSBLK|P_MASK_KEYBUF;
751
+ m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
752
+ bool ncc = (req.keyNum == -1);
753
+ m_tb->beginUpdate(req.keyNum);
754
+ if (m_tb->stat() == 0)
755
+ {
756
+ m_tb->setRecordFromPacked((const uchar*)req.data, *(req.datalen),
757
+ req.blobHeader);
758
+ m_tb->update(ncc);
759
+ }
760
+ req.result = errorCodeSht(m_tb->stat());
761
+ req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
637
762
  }
638
763
 
639
764
  inline void dbExecuter::doDeleteKey(request& req)
640
765
  {
641
- m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
642
- char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
643
- if (m_tb->setKeyNum(keynum))
644
- {
645
- m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
646
- m_tb->seekKey(HA_READ_KEY_EXACT);
647
- if (m_tb->stat() == 0)
648
- {
649
- m_tb->beginDel();
650
- if (m_tb->stat()==0)
651
- m_tb->del();
652
- }
653
- }
654
- req.result = errorCodeSht(m_tb->stat());
655
- req.paramMask = P_MASK_POSBLK;
766
+ m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
767
+ char keynum = m_tb->keyNumByMakeOrder(req.keyNum);
768
+ if (m_tb->setKeyNum(keynum))
769
+ {
770
+ m_tb->setKeyValuesPacked((const uchar*)req.keybuf, req.keylen);
771
+ m_tb->seekKey(HA_READ_KEY_EXACT, m_tb->keymap());
772
+ if (m_tb->stat() == 0)
773
+ {
774
+ m_tb->beginDel();
775
+ if (m_tb->stat() == 0)
776
+ m_tb->del();
777
+ }
778
+ }
779
+ req.result = errorCodeSht(m_tb->stat());
780
+ req.paramMask = P_MASK_POSBLK;
656
781
  }
657
782
 
658
783
  inline void dbExecuter::doDelete(request& req)
659
784
  {
660
- m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
661
- m_tb->beginDel();
662
- if (m_tb->stat()==0)
663
- m_tb->del();
664
- req.result = errorCodeSht(m_tb->stat());
665
- req.paramMask = P_MASK_POSBLK;
785
+ m_tb = getTable(req.pbk->handle, SQLCOM_DELETE);
786
+ m_tb->beginDel();
787
+ if (m_tb->stat() == 0)
788
+ m_tb->del();
789
+ req.result = errorCodeSht(m_tb->stat());
790
+ req.paramMask = P_MASK_POSBLK;
666
791
  }
667
792
 
668
793
  inline void dbExecuter::doInsertBulk(request& req)
669
794
  {
670
- m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
671
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
672
- {
673
- ushort_td* n = (ushort_td*)req.data;
674
- ushort_td ret = 0;
675
- const uchar* pos = (const uchar*)req.data + sizeof(ushort_td);
676
- int ins_rows = 0;
677
- BUILINSERT_SCOPE
678
- {
679
- smartBulkInsert sbi(m_tb, *n);
680
- for (ushort_td i=0;i<*n;i++)
681
- {
682
- ushort_td len = *((ushort_td*)pos);
683
- if (pos + len > (const uchar*)req.data + *req.datalen)
684
- {
685
- ret = STATUS_BUFFERTOOSMALL;
686
- break;
687
- }
688
- else
689
- {
690
- m_tb->clearBuffer();
691
- m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len, req.blobHeader);
692
-
693
- if (i==*n-1)
694
- m_tb->insert((req.keyNum != -1));
695
- else
696
- m_tb->insert(true);
697
- ret = m_tb->stat();
698
-
699
- }
700
- if (ret==0)
701
- ins_rows++;
702
- DEBUG_INSERT(m_tb, pos + sizeof(ushort_td), len, i, i+1-ins_rows)
703
- pos += len + sizeof(ushort_td);
704
- }
705
- *n = ins_rows;
706
- }
707
- req.result = errorCodeSht(ret);
708
- req.resultLen = 4;
709
- req.paramMask = P_MASK_READ_EXT;
710
- }else
711
- req.result = errorCodeSht(m_tb->stat());
795
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
796
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
797
+ {
798
+ ushort_td* n = (ushort_td*)req.data;
799
+ ushort_td ret = 0;
800
+ const uchar* pos = (const uchar*)req.data + sizeof(ushort_td);
801
+ int ins_rows = 0;
802
+ BUILINSERT_SCOPE
803
+ {
804
+ smartBulkInsert sbi(m_tb, *n);
805
+ for (ushort_td i = 0; i < *n; i++)
806
+ {
807
+ ushort_td len = *((ushort_td*)pos);
808
+ if (pos + len > (const uchar*)req.data + *req.datalen)
809
+ {
810
+ ret = STATUS_BUFFERTOOSMALL;
811
+ break;
812
+ }
813
+ else
814
+ {
815
+ m_tb->clearBuffer();
816
+ m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len,
817
+ req.blobHeader);
818
+
819
+ if (i == *n - 1)
820
+ m_tb->insert((req.keyNum != -1));
821
+ else
822
+ m_tb->insert(true);
823
+ ret = m_tb->stat();
824
+ }
825
+ if (ret == 0)
826
+ ins_rows++;
827
+ DEBUG_INSERT(m_tb, pos + sizeof(ushort_td), len, i,
828
+ i + 1 - ins_rows)
829
+ pos += len + sizeof(ushort_td);
830
+ }
831
+ *n = ins_rows;
832
+ }
833
+ req.result = errorCodeSht(ret);
834
+ req.resultLen = 4;
835
+ req.paramMask = P_MASK_READ_EXT;
836
+ }
837
+ else
838
+ req.result = errorCodeSht(m_tb->stat());
712
839
  }
713
840
 
714
841
  inline void dbExecuter::doStat(request& req)
715
842
  {
716
- m_tb = getTable(req.pbk->handle);
717
- req.paramMask = P_MASK_STAT;
718
- req.resultLen = *req.datalen;
719
- if (req.resultLen >= 6 + sizeof(uint))
720
- {
721
- ushort_td len = (ushort_td)(m_tb->recordLenCl());
722
- if (m_tb->recordFormatType() == RF_FIXED_PLUS_VALIABLE_LEN)
723
- len -= m_tb->lastVarFiled()->pack_length() - m_tb->lastVarLenBytes();
724
-
725
- memcpy((char*)req.data, &len, sizeof(ushort_td));
726
- uint rows = (uint)m_tb->recordCount((req.keyNum!=0));
727
- memcpy((char*)req.data+6, &rows, sizeof(uint));
728
- }else
729
- req.result = STATUS_BUFFERTOOSMALL;
843
+ m_tb = getTable(req.pbk->handle);
844
+ req.paramMask = P_MASK_STAT;
845
+ req.resultLen = *req.datalen;
846
+ if (req.resultLen >= 6 + sizeof(uint))
847
+ {
848
+ ushort_td len = (ushort_td)(m_tb->recordLenCl());
849
+ #ifdef USE_BTRV_VARIABLE_LEN
850
+ if (m_tb->recordFormatType() & RF_FIXED_PLUS_VALIABLE_LEN)
851
+ len -=
852
+ m_tb->lastVarFiled()->pack_length() - m_tb->lastVarLenBytes();
853
+ #endif
854
+ memcpy((char*)req.data, &len, sizeof(ushort_td));
855
+ uint rows = (uint)m_tb->recordCount((req.keyNum != 0));
856
+ memcpy((char*)req.data + 6, &rows, sizeof(uint));
857
+ }
858
+ else
859
+ req.result = STATUS_BUFFERTOOSMALL;
730
860
  }
731
861
 
732
862
  inline short getTrnsactionType(int op)
733
863
  {
734
- if (op > PARALLEL_TRN) //1000
735
- op -= PARALLEL_TRN;
736
- if (op > NOWAIT_WRITE) //500
737
- op -= NOWAIT_WRITE;
738
- if (op >= 300)
739
- return TRN_RECORD_LOCK_MUILTI;
740
- return TRN_RECORD_LOCK_SINGLE;
864
+ if (op > PARALLEL_TRN) // 1000
865
+ op -= PARALLEL_TRN;
866
+ if (op > NOWAIT_WRITE) // 500
867
+ op -= NOWAIT_WRITE;
868
+ if (op >= 300)
869
+ return TRN_RECORD_LOCK_MUILTI;
870
+ return TRN_RECORD_LOCK_SINGLE;
741
871
  }
742
872
 
743
- int dbExecuter::commandExec(request& req, char* resultBuffer, size_t& size, netsvc::server::buffers* optionalData)
873
+ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
744
874
  {
745
- DEBUG_PROFILE_START(1)
746
- m_tb = NULL;
747
- int op = req.op % 100;
748
- int opTrn = req.op;
749
- if (op==99) return 0;
750
-
751
- if ((op>=TD_KEY_EQUAL_KO)&& (op <= TD_KEY_LAST_KO))
752
- op -= 50;
753
-
754
- try
755
- {
756
- posblk* pbk = req.pbk;
757
- posblk tmp;
758
- bool transactionResult = false;
759
- if (pbk==NULL) pbk = &tmp;
760
- req.reset();
761
- switch(op)
762
- {
763
- case TD_GETSERVER_CHARSET:
764
- req.data = (void*) global_system_variables.collation_server->csname;
765
- req.resultLen = (uint_td)strlen( global_system_variables.collation_server->csname);
766
- req.paramMask |= P_MASK_DATA|P_MASK_DATALEN;
767
- break;
768
- case TD_CONNECT:
769
- connect(req);
770
- break;
771
- case TD_RESET_CLIENT:
772
- case TD_STOP_ENGINE: //close all table
773
- releaseDatabase(req, op);
774
- break;
775
- case TD_AUTOMEKE_SCHEMA:
776
- m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
777
- req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
778
- break;
779
- case TD_CREATETABLE:
780
- doCreateTable(req);
781
- break;
782
- case TD_OPENTABLE:
783
- doOpenTable(req);
784
- break;
785
- case TD_CLOSETABLE:
786
- m_tb = getTable(req.pbk->handle);
787
- if (m_tb)
788
- {
789
- m_tb->close();
790
- m_tb=NULL;
791
- }
792
- break;
793
- case TD_KEY_SEEK:
794
- case TD_KEY_AFTER:
795
- case TD_KEY_OR_AFTER:
796
- case TD_KEY_BEFORE:
797
- case TD_KEY_OR_BEFORE:
798
- doSeekKey(req, op);
799
- break;
800
- case TD_KEY_FIRST:
801
- doMoveFirst(req);
802
- break;
803
- case TD_KEY_PREV:
804
- case TD_KEY_LAST:
805
- case TD_KEY_NEXT:
806
- doMoveKey(req, op);
807
- break;
808
- case TD_REC_INSERT:
809
- doInsert(req);
810
- break;
811
- case TD_REC_UPDATEATKEY:
812
- doUpdateKey(req);
813
- break;
814
- case TD_REC_UPDATE:
815
- doUpdate(req);
816
- break;
817
- case TD_REC_DELLETEATKEY:
818
- doDeleteKey(req);
819
- break;
820
- case TD_REC_DELETE:
821
- doDelete(req);
822
- break;
823
- case TD_BEGIN_TRANSACTION:
824
- transactionResult = getDatabaseCid(req.cid)->beginTrn(getTrnsactionType(opTrn));
825
- break;
826
- case TD_END_TRANSACTION:
827
- transactionResult = getDatabaseCid(req.cid)->commitTrn();
828
- break;
829
- case TD_ABORT_TRANSACTION:
830
- transactionResult = getDatabaseCid(req.cid)->abortTrn();
831
- break;
832
- case TD_BEGIN_SHAPSHOT:
833
- transactionResult = getDatabaseCid(req.cid)->beginSnapshot();
834
- break;
835
- case TD_END_SNAPSHOT:
836
- transactionResult = getDatabaseCid(req.cid)->endSnapshot();
837
- break;
838
- case TD_TABLE_INFO: //support recordlen and recordCount only.
839
- doStat(req);
840
- break;
841
- case TD_POS_FIRST:
842
- case TD_POS_LAST:
843
- case TD_POS_NEXT:
844
- case TD_POS_PREV:
845
- doStepRead(req, op);
846
- break;
847
- case TD_BOOKMARK:
848
- m_tb = getTable(req.pbk->handle);
849
- req.paramMask = P_MASK_MOVPOS;
850
- req.data = (void*)m_tb->position();
851
- req.resultLen = m_tb->posPtrLen();
852
- break;
853
- case TD_MOVE_BOOKMARK:
854
- m_tb = getTable(req.pbk->handle);
855
- m_tb->movePos((uchar*)req.data, m_tb->keyNumByMakeOrder(req.keyNum));
856
- readAfter(req, m_tb, this);
857
- break;
858
- case TD_GETDIRECTORY:
859
- {
860
- database* db = getDatabaseCid(req.cid);
861
- if (db->name().size() < 64)
862
- {
863
- req.keylen = (uchar_td)db->name().size()+1;
864
- req.keybuf = (void*)db->name().c_str();
865
- req.paramMask = P_MASK_KEYBUF;
866
-
867
- }else
868
- req.result = STATUS_BUFFERTOOSMALL;
869
- break;
870
- }
871
- case TD_VERSION:
872
- if (*req.datalen >= sizeof(version)*3)
873
- {
874
- version* v = (version*)req.data;
875
- ++v;
876
- v->majorVersion = MYSQL_VERSION_ID/10000;
877
- v->minorVersion = (MYSQL_VERSION_ID/100) % 100;
878
- v->Type = 'M';
879
- ++v;
880
- v->majorVersion = TRANSACTD_VER_MAJOR;
881
- v->minorVersion = TRANSACTD_VER_MINOR;
882
- v->Type = 'T';
883
- req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
884
- req.resultLen = sizeof(version)*3;
885
- }else
886
- req.result = STATUS_BUFFERTOOSMALL;
887
- break;
888
- case TD_CLEAR_OWNERNAME:
889
- req.keybuf = (void_td*)"";
890
- case TD_SET_OWNERNAME:
891
- {
892
- database* db = getDatabaseCid(req.cid);
893
- m_tb = getTable(req.pbk->handle);
894
- int num = (req.keyNum >1) ? req.keyNum -2: req.keyNum;
895
- num += '0';
896
- std::string s("%@%");
897
- s += (const char*)&num;
898
- s += (const char*)req.keybuf;
899
- req.result = ddl_execSql(db->thd(), makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
900
- break;
901
- }
902
- case TD_DROP_INDEX:
903
- { //Key name of multi byte charctord is not supported. Use only ascii.
904
- database* db = getDatabaseCid(req.cid);
905
- m_tb = getTable(req.pbk->handle);
906
- req.result = ddl_execSql(db->thd(), makeSQLDropIndex(db->name(), m_tb->name(), m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
907
- break;
908
- }
909
- case TD_KEY_GE_NEXT_MULTI:
910
- case TD_KEY_LE_PREV_MULTI:
911
- if (doReadMultiWithSeek(req, op, resultBuffer, size, optionalData) == EXECUTE_RESULT_SUCCESS)
912
- return EXECUTE_RESULT_SUCCESS; // Caution Call unUse()
913
- break;
914
- case TD_KEY_SEEK_MULTI:
915
- case TD_KEY_NEXT_MULTI:
916
- case TD_KEY_PREV_MULTI:
917
- case TD_POS_NEXT_MULTI:
918
- case TD_POS_PREV_MULTI:
919
- if (doReadMulti(req, op, resultBuffer, size, optionalData) == EXECUTE_RESULT_SUCCESS)
920
- return EXECUTE_RESULT_SUCCESS; // Caution Call unUse()
921
- break;
922
- case TD_MOVE_PER:
923
- m_tb = getTable(req.pbk->handle);
924
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
925
- m_tb->getByPercentage(*((ushort_td*)req.data));
926
- readAfter(req, m_tb, this);
927
- break;
928
- case TD_GET_PER:
929
- m_tb = getTable(req.pbk->handle);
930
- m_tb->calcPercentage();
931
- req.result = errorCodeSht(m_tb->stat());
932
- if (m_tb->stat()==0)
933
- {
934
- req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
935
- req.data = m_tb->percentResult();
936
- req.resultLen = sizeof(int);
937
- }
938
- break;
939
- case TD_INSERT_BULK:
940
- doInsertBulk(req);
941
- break;
942
- }
943
- if (m_tb)m_tb->unUse();
944
-
945
- DEBUG_WRITELOG2(op, req)
946
- size = req.serialize(m_tb, resultBuffer);
947
- if ((req.result==0) && (req.paramMask & P_MASK_BLOBBODY) && m_blobBuffer->fieldCount())
948
- size = req.serializeBlobBody(m_blobBuffer, resultBuffer, FILE_MAP_SIZE, optionalData);
949
-
950
- if (transactionResult)
951
- {
952
- if ((op == TD_BEGIN_TRANSACTION)||(op ==TD_BEGIN_SHAPSHOT))
953
- return EXECUTE_RESULT_FORCSE_SYNC;
954
- return EXECUTE_RESULT_FORCSE_ASYNC;
955
- }
956
- DEBUG_PROFILE_END_OP(1, op)
957
- return EXECUTE_RESULT_SUCCESS;
958
- }
959
-
960
- catch(bzs::rtl::exception &e)
961
- {
962
- clenupNoException();
963
- req.reset();
964
- const int* code = getCode(e);
965
- if(code)
966
- req.result = *code;
967
- else
968
- {
969
- req.result = 20000;
970
- sql_print_error("%s", boost::diagnostic_information(e).c_str());
971
- }
972
- printErrorMessage(code, getMsg(e));
973
- }
974
-
975
- catch(...)
976
- {
977
- clenupNoException();
978
- req.reset();
979
- req.result = 20001;
980
- dumpStdErr(op, req, m_tb);
981
- try
982
- {
983
- if (m_tb)
984
- m_tb->close();
985
- }
986
- catch(...){}
987
- }
988
-
989
- DEBUG_WRITELOG3(op, req, true);
990
- req.paramMask = 0;
991
- size = req.serialize(NULL, resultBuffer);
992
- return EXECUTE_RESULT_SUCCESS;
875
+ DEBUG_PROFILE_START(1)
876
+ m_tb = NULL;
877
+ char* resultBuffer = nw->ptr();
878
+ size_t& size = nw->datalen;
879
+ netsvc::server::buffers* optionalData = nw->optionalData();
880
+
881
+ int op = req.op % 100;
882
+ int opTrn = req.op;
883
+ if (op == 99)
884
+ return 0;
885
+
886
+ if ((op >= TD_KEY_EQUAL_KO) && (op <= TD_KEY_LAST_KO))
887
+ op -= 50;
888
+
889
+ try
890
+ {
891
+ posblk* pbk = req.pbk;
892
+ posblk tmp;
893
+ bool transactionResult = false;
894
+ if (pbk == NULL)
895
+ pbk = &tmp;
896
+ req.reset();
897
+ switch (op)
898
+ {
899
+ case TD_GETSERVER_CHARSET:
900
+ {
901
+ if (*req.datalen == sizeof(trdVersiton))
902
+ {
903
+ trdVersiton* ver = (trdVersiton*)req.data;
904
+ strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
905
+ global_system_variables.collation_server->csname);
906
+ ver->srvMajor = TRANSACTD_VER_MAJOR;
907
+ ver->srvMinor = TRANSACTD_VER_MINOR;
908
+ ver->srvRelease = TRANSACTD_VER_RELEASE;
909
+ req.resultLen = sizeof(trdVersiton);
910
+ // req.data = (void*)
911
+ // global_system_variables.collation_server->csname;
912
+ // req.resultLen = (uint_td)strlen(
913
+ // global_system_variables.collation_server->csname);
914
+ req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
915
+ }
916
+ else
917
+ req.result = SERVER_CLIENT_NOT_COMPATIBLE;
918
+ break;
919
+ }
920
+ case TD_CONNECT:
921
+ connect(req);
922
+ break;
923
+ case TD_RESET_CLIENT:
924
+ case TD_STOP_ENGINE: // close all table
925
+ releaseDatabase(req, op);
926
+ break;
927
+ case TD_AUTOMEKE_SCHEMA:
928
+ m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
929
+ req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
930
+ break;
931
+ case TD_CREATETABLE:
932
+ doCreateTable(req);
933
+ break;
934
+ case TD_OPENTABLE:
935
+ doOpenTable(req);
936
+ break;
937
+ case TD_CLOSETABLE:
938
+ m_tb = getTable(req.pbk->handle);
939
+ if (m_tb)
940
+ {
941
+ m_tb->close();
942
+ m_tb = NULL;
943
+ }
944
+ break;
945
+ case TD_KEY_SEEK:
946
+ case TD_KEY_AFTER:
947
+ case TD_KEY_OR_AFTER:
948
+ case TD_KEY_BEFORE:
949
+ case TD_KEY_OR_BEFORE:
950
+ doSeekKey(req, op);
951
+ break;
952
+ case TD_KEY_FIRST:
953
+ doMoveFirst(req);
954
+ break;
955
+ case TD_KEY_PREV:
956
+ case TD_KEY_LAST:
957
+ case TD_KEY_NEXT:
958
+ doMoveKey(req, op);
959
+ break;
960
+ case TD_REC_INSERT:
961
+ doInsert(req);
962
+ break;
963
+ case TD_REC_UPDATEATKEY:
964
+ doUpdateKey(req);
965
+ break;
966
+ case TD_REC_UPDATE:
967
+ doUpdate(req);
968
+ break;
969
+ case TD_REC_DELLETEATKEY:
970
+ doDeleteKey(req);
971
+ break;
972
+ case TD_REC_DELETE:
973
+ doDelete(req);
974
+ break;
975
+ case TD_BEGIN_TRANSACTION:
976
+ transactionResult =
977
+ getDatabaseCid(req.cid)->beginTrn(getTrnsactionType(opTrn));
978
+ break;
979
+ case TD_END_TRANSACTION:
980
+ transactionResult = getDatabaseCid(req.cid)->commitTrn();
981
+ break;
982
+ case TD_ABORT_TRANSACTION:
983
+ transactionResult = getDatabaseCid(req.cid)->abortTrn();
984
+ break;
985
+ case TD_BEGIN_SHAPSHOT:
986
+ transactionResult = getDatabaseCid(req.cid)->beginSnapshot();
987
+ break;
988
+ case TD_END_SNAPSHOT:
989
+ transactionResult = getDatabaseCid(req.cid)->endSnapshot();
990
+ break;
991
+ case TD_TABLE_INFO: // support recordlen and recordCount only.
992
+ doStat(req);
993
+ break;
994
+ case TD_POS_FIRST:
995
+ case TD_POS_LAST:
996
+ case TD_POS_NEXT:
997
+ case TD_POS_PREV:
998
+ doStepRead(req, op);
999
+ break;
1000
+ case TD_BOOKMARK:
1001
+ m_tb = getTable(req.pbk->handle);
1002
+ req.paramMask = P_MASK_MOVPOS;
1003
+ req.data = (void*)m_tb->position();
1004
+ req.resultLen = m_tb->posPtrLen();
1005
+ break;
1006
+ case TD_MOVE_BOOKMARK:
1007
+ m_tb = getTable(req.pbk->handle);
1008
+ m_tb->movePos((uchar*)req.data,
1009
+ m_tb->keyNumByMakeOrder(req.keyNum));
1010
+ readAfter(req, m_tb, this);
1011
+ break;
1012
+ case TD_GETDIRECTORY:
1013
+ {
1014
+ database* db = getDatabaseCid(req.cid);
1015
+ if (db->name().size() < 64)
1016
+ {
1017
+ req.keylen = (uchar_td)db->name().size() + 1;
1018
+ req.keybuf = (void*)db->name().c_str();
1019
+ req.paramMask = P_MASK_KEYBUF;
1020
+ }
1021
+ else
1022
+ req.result = STATUS_BUFFERTOOSMALL;
1023
+ break;
1024
+ }
1025
+ case TD_VERSION:
1026
+ if (*req.datalen >= sizeof(version) * 3)
1027
+ {
1028
+ version* v = (version*)req.data;
1029
+ ++v;
1030
+ v->majorVersion = MYSQL_VERSION_ID / 10000;
1031
+ v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
1032
+ v->Type = 'M';
1033
+ ++v;
1034
+ v->majorVersion = TRANSACTD_VER_MAJOR;
1035
+ v->minorVersion = TRANSACTD_VER_MINOR;
1036
+ v->Type = 'T';
1037
+ req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1038
+ req.resultLen = sizeof(version) * 3;
1039
+ }
1040
+ else
1041
+ req.result = STATUS_BUFFERTOOSMALL;
1042
+ break;
1043
+ case TD_CLEAR_OWNERNAME:
1044
+ req.keybuf = (void_td*)"";
1045
+ case TD_SET_OWNERNAME:
1046
+ {
1047
+ database* db = getDatabaseCid(req.cid);
1048
+ m_tb = getTable(req.pbk->handle);
1049
+ int num = (req.keyNum > 1) ? req.keyNum - 2 : req.keyNum;
1050
+ num += '0';
1051
+ std::string s("%@%");
1052
+ s += (const char*)&num;
1053
+ s += (const char*)req.keybuf;
1054
+ req.result = ddl_execSql(
1055
+ db->thd(),
1056
+ makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
1057
+ break;
1058
+ }
1059
+ case TD_DROP_INDEX:
1060
+ { // Key name of multi byte charctord is not supported. Use only ascii.
1061
+ database* db = getDatabaseCid(req.cid);
1062
+ m_tb = getTable(req.pbk->handle);
1063
+ req.result = ddl_execSql(
1064
+ db->thd(),
1065
+ makeSQLDropIndex(
1066
+ db->name(), m_tb->name(),
1067
+ m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
1068
+ break;
1069
+ }
1070
+ case TD_KEY_GE_NEXT_MULTI:
1071
+ case TD_KEY_LE_PREV_MULTI:
1072
+ nw->setClientBuffferSize(*(req.datalen));
1073
+ if (doReadMultiWithSeek(req, op, nw) == EXECUTE_RESULT_SUCCESS)
1074
+ return EXECUTE_RESULT_SUCCESS;
1075
+ break;
1076
+ case TD_KEY_SEEK_MULTI:
1077
+ case TD_KEY_NEXT_MULTI:
1078
+ case TD_KEY_PREV_MULTI:
1079
+ case TD_POS_NEXT_MULTI:
1080
+ case TD_POS_PREV_MULTI:
1081
+ nw->setClientBuffferSize(*(req.datalen));
1082
+ if (doReadMulti(req, op, nw) == EXECUTE_RESULT_SUCCESS)
1083
+ return EXECUTE_RESULT_SUCCESS;
1084
+ break;
1085
+ case TD_MOVE_PER:
1086
+ m_tb = getTable(req.pbk->handle);
1087
+ if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
1088
+ m_tb->getByPercentage(*((ushort_td*)req.data));
1089
+ readAfter(req, m_tb, this);
1090
+ break;
1091
+ case TD_GET_PER:
1092
+ m_tb = getTable(req.pbk->handle);
1093
+ m_tb->calcPercentage();
1094
+ req.result = errorCodeSht(m_tb->stat());
1095
+ if (m_tb->stat() == 0)
1096
+ {
1097
+ req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1098
+ req.data = m_tb->percentResult();
1099
+ req.resultLen = sizeof(int);
1100
+ }
1101
+ break;
1102
+ case TD_INSERT_BULK:
1103
+ doInsertBulk(req);
1104
+ break;
1105
+ }
1106
+ if (m_tb)
1107
+ m_tb->unUse();
1108
+
1109
+ DEBUG_WRITELOG2(op, req)
1110
+ size = req.serialize(m_tb, resultBuffer);
1111
+ short dymmy = 0;
1112
+ if ((req.result == 0) && (req.paramMask & P_MASK_BLOBBODY) &&
1113
+ m_blobBuffer->fieldCount())
1114
+ size = req.serializeBlobBody(m_blobBuffer, resultBuffer, size,
1115
+ FILE_MAP_SIZE, optionalData, dymmy);
1116
+
1117
+ if (transactionResult)
1118
+ {
1119
+ if ((op == TD_BEGIN_TRANSACTION) || (op == TD_BEGIN_SHAPSHOT))
1120
+ return EXECUTE_RESULT_FORCSE_SYNC;
1121
+ return EXECUTE_RESULT_FORCSE_ASYNC;
1122
+ }
1123
+ DEBUG_PROFILE_END_OP(1, op)
1124
+ return EXECUTE_RESULT_SUCCESS;
1125
+ }
1126
+
1127
+ catch (bzs::rtl::exception& e)
1128
+ {
1129
+ clenupNoException();
1130
+ req.reset();
1131
+ const int* code = getCode(e);
1132
+ if (code)
1133
+ req.result = *code;
1134
+ else
1135
+ {
1136
+ req.result = 20000;
1137
+ sql_print_error("%s", boost::diagnostic_information(e).c_str());
1138
+ }
1139
+ printErrorMessage(code, getMsg(e));
1140
+ }
1141
+
1142
+ catch (...)
1143
+ {
1144
+ clenupNoException();
1145
+ req.reset();
1146
+ req.result = 20001;
1147
+ dumpStdErr(op, req, m_tb);
1148
+ try
1149
+ {
1150
+ if (m_tb)
1151
+ m_tb->close();
1152
+ }
1153
+ catch (...)
1154
+ {
1155
+ }
1156
+ }
1157
+
1158
+ DEBUG_WRITELOG3(op, req, true);
1159
+ req.paramMask = 0;
1160
+ size = req.serialize(NULL, resultBuffer);
1161
+ return EXECUTE_RESULT_SUCCESS;
993
1162
  }
994
1163
 
995
1164
  // ---------------------------------------------------------------------------
996
1165
  // class connMgrExecuter
997
1166
  // ---------------------------------------------------------------------------
998
1167
  connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
999
- :m_req(req),m_modHandle(parent)
1168
+ : m_req(req), m_modHandle(parent)
1000
1169
  {
1001
-
1002
1170
  }
1003
1171
 
1004
1172
  int connMgrExecuter::read(char* buf, size_t& size)
1005
1173
  {
1006
- connManager st(m_modHandle);
1007
- unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1008
-
1009
- const connManager::records& records = st.getRecords(mod[0], (int)mod[1]);
1010
- m_req.reset();
1011
- m_req.paramMask = P_MASK_DATA|P_MASK_DATALEN;
1012
- if (records.size())
1013
- m_req.data = (void*)&records[0];
1014
- else
1015
- m_req.paramMask = P_MASK_DATALEN;
1016
- m_req.resultLen = (uint_td)(sizeof(record) * records.size());
1017
- size = m_req.serialize(NULL, buf);
1018
- return EXECUTE_RESULT_SUCCESS;
1174
+ connManager st(m_modHandle);
1175
+ unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1176
+
1177
+ const connManager::records& records = st.getRecords(mod[0], (int)mod[1]);
1178
+ m_req.reset();
1179
+ m_req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1180
+ if (records.size())
1181
+ m_req.data = (void*)&records[0];
1182
+ else
1183
+ m_req.paramMask = P_MASK_DATALEN;
1184
+ m_req.resultLen = (uint_td)(sizeof(record) * records.size());
1185
+ size = m_req.serialize(NULL, buf);
1186
+ return EXECUTE_RESULT_SUCCESS;
1019
1187
  }
1020
1188
 
1021
1189
  int connMgrExecuter::disconnectOne(char* buf, size_t& size)
1022
1190
  {
1023
- connManager st(m_modHandle);
1024
- unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1025
- st.disconnect(*mod);
1026
- m_req.reset();
1027
- size = m_req.serialize(NULL, buf);
1028
- return EXECUTE_RESULT_SUCCESS;
1191
+ connManager st(m_modHandle);
1192
+ unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1193
+ st.disconnect(*mod);
1194
+ m_req.reset();
1195
+ size = m_req.serialize(NULL, buf);
1196
+ return EXECUTE_RESULT_SUCCESS;
1029
1197
  }
1030
1198
 
1031
1199
  int connMgrExecuter::disconnectAll(char* buf, size_t& size)
1032
1200
  {
1033
- connManager st(m_modHandle);
1034
-
1035
- st.disconnectAll();
1036
- m_req.reset();
1037
- size = m_req.serialize(NULL, buf);
1038
- return EXECUTE_RESULT_SUCCESS;
1201
+ connManager st(m_modHandle);
1202
+
1203
+ st.disconnectAll();
1204
+ m_req.reset();
1205
+ size = m_req.serialize(NULL, buf);
1206
+ return EXECUTE_RESULT_SUCCESS;
1039
1207
  }
1040
1208
 
1041
- int connMgrExecuter::commandExec(char* buf, size_t& size)
1209
+ int connMgrExecuter::commandExec(netsvc::server::netWriter* nw)
1042
1210
  {
1043
- if (m_req.keyNum == TD_STSTCS_READ)
1044
- return read(buf, size);
1045
- else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
1046
- return disconnectOne( buf, size);
1047
- else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
1048
- return disconnectAll(buf, size);
1049
- return 0;
1211
+ if (m_req.keyNum == TD_STSTCS_READ)
1212
+ return read(nw->ptr(), nw->datalen);
1213
+ else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
1214
+ return disconnectOne(nw->ptr(), nw->datalen);
1215
+ else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
1216
+ return disconnectAll(nw->ptr(), nw->datalen);
1217
+ return 0;
1050
1218
  }
1051
1219
 
1052
-
1053
1220
  // ---------------------------------------------------------------------------
1054
1221
  // class commandExecuter
1055
1222
  // ---------------------------------------------------------------------------
1056
- commandExecuter::commandExecuter(__int64 parent):m_modHandle(parent)
1223
+ commandExecuter::commandExecuter(__int64 parent) : m_modHandle(parent)
1057
1224
  {
1058
- m_dbExec.reset(new dbExecuter());
1225
+ m_dbExec.reset(new dbExecuter());
1059
1226
  }
1060
1227
 
1061
1228
  commandExecuter::~commandExecuter()
1062
1229
  {
1063
- m_dbExec.reset();
1230
+ m_dbExec.reset();
1064
1231
  }
1065
1232
 
1066
- size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered, bool& comp)const
1233
+ size_t commandExecuter::perseRequestEnd(const char* p, size_t transfered,
1234
+ bool& comp) const
1067
1235
  {
1068
- if (transfered < sizeof(unsigned int))
1069
- return 0;
1070
- size_t size = *((unsigned int*)p);
1071
- if (size == transfered)
1072
- comp = true;
1073
- return size;
1236
+ if (transfered < sizeof(unsigned int))
1237
+ return 0;
1238
+ size_t size = *((unsigned int*)p);
1239
+ if (size == transfered)
1240
+ comp = true;
1241
+ return size;
1074
1242
  }
1075
1243
 
1076
1244
  bool commandExecuter::parse(const char* p, size_t size)
1077
1245
  {
1078
- const char* end = p + size;
1079
- memset(&m_req, 0, sizeof(request));
1080
- m_req.parse(p);
1081
-
1082
- return 0;
1246
+ m_req.parse(p);
1247
+ return 0;
1083
1248
  }
1084
1249
 
1085
- }//namespace mysql
1086
- }//namespace tdap
1087
- }//namespace protocol
1088
- }//namespace db
1089
- }//namespace bzs
1250
+ } // namespace mysql
1251
+ } // namespace tdap
1252
+ } // namespace protocol
1253
+ } // namespace db
1254
+ } // namespace bzs