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
 
@@ -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