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
@@ -16,13 +16,8 @@
16
16
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
17
  02111-1307, USA.
18
18
  ================================================================= */
19
- #include <bzs/env/tstring.h>
20
- #pragma hdrstop
21
-
22
19
  #include "database.h"
23
-
24
20
  #include "table.h"
25
-
26
21
  #include "dbDef.h"
27
22
  #include <limits.h>
28
23
  #include <sys/stat.h>
@@ -45,23 +40,24 @@ namespace client
45
40
 
46
41
  struct dbimple
47
42
  {
48
-
49
- _TCHAR rootDir[MAX_PATH];
50
- bool isOpened;
51
43
  dbdef* dbDef;
52
44
  void* optionalData;
53
- bool isTableReadOnly;
54
- bool lockReadOnly;
45
+ _TCHAR rootDir[MAX_PATH];
55
46
  deleteRecordFn m_deleteRecordFn;
56
47
  copyDataFn m_copyDataFn;
48
+ bool isOpened;
49
+ bool isTableReadOnly;
50
+ bool lockReadOnly;
57
51
 
58
- dbimple() : dbDef(NULL), isOpened(false), m_deleteRecordFn(NULL),m_copyDataFn(NULL), optionalData(NULL),
59
- isTableReadOnly(false), lockReadOnly(false)
52
+ dbimple()
53
+ : dbDef(NULL), optionalData(NULL), m_deleteRecordFn(NULL),
54
+ m_copyDataFn(NULL), isOpened(false), isTableReadOnly(false),
55
+ lockReadOnly(false)
60
56
  {
61
57
  rootDir[0] = 0x00;
62
58
  }
63
59
 
64
- dbimple& operator = (const dbimple & rt)
60
+ dbimple& operator=(const dbimple& rt)
65
61
  {
66
62
  if (&rt != this)
67
63
  {
@@ -73,59 +69,105 @@ struct dbimple
73
69
  lockReadOnly = rt.lockReadOnly;
74
70
  m_deleteRecordFn = rt.m_deleteRecordFn;
75
71
  m_copyDataFn = rt.m_copyDataFn;
76
-
77
72
  }
78
73
  return *this;
79
-
80
74
  }
81
75
  };
82
76
 
83
- void database::destroy(database* db) {delete db;}
77
+ void database::destroy(database* db)
78
+ {
79
+ delete db;
80
+ }
84
81
 
85
- database::database() : nsdatabase()
82
+ database::database() : nsdatabase()
86
83
  {
87
- m_impl = new dbimple();
84
+ m_impl = new dbimple();
88
85
  }
89
86
 
90
87
  database::~database()
91
88
  {
92
- close();
89
+ doClose();
93
90
  delete m_impl;
94
91
  }
95
92
 
96
93
  void database::release()
97
94
  {
98
- if (m_impl->dbDef)
99
- {
100
- m_impl->dbDef->release();
101
- m_impl->dbDef = NULL;
102
- }
103
- nsdatabase::release();
95
+ if (refCount() == 1)
96
+ nsdatabase::release();
97
+ else
98
+ {
99
+ nsdatabase::release();
100
+ if ((refCount() == 1) && m_impl->dbDef &&
101
+ (m_impl->dbDef->nsdb() == this))
102
+ nsdatabase::release();
103
+ }
104
104
  }
105
105
 
106
- dbdef* database::dbDef() const {return m_impl->dbDef;}
106
+ dbdef* database::dbDef() const
107
+ {
108
+ return m_impl->dbDef;
109
+ }
107
110
 
108
- const _TCHAR* database::rootDir() const {return m_impl->rootDir;}
111
+ const _TCHAR* database::rootDir() const
112
+ {
113
+ return m_impl->rootDir;
114
+ }
109
115
 
110
- void database::setRootDir(const _TCHAR* directory) {setDir(directory);}
116
+ void database::setRootDir(const _TCHAR* directory)
117
+ {
118
+ setDir(directory);
119
+ }
111
120
 
112
- void* database::optionalData() const {return m_impl->optionalData;}
121
+ void* database::optionalData() const
122
+ {
123
+ return m_impl->optionalData;
124
+ }
113
125
 
114
- void database::setOptionalData(void* v) {m_impl->optionalData = v;}
126
+ void database::setOptionalData(void* v)
127
+ {
128
+ m_impl->optionalData = v;
129
+ }
115
130
 
116
- bool database::tableReadOnly() const {return m_impl->isTableReadOnly;}
131
+ bool database::tableReadOnly() const
132
+ {
133
+ return m_impl->isTableReadOnly;
134
+ }
117
135
 
118
- const deleteRecordFn database::onDeleteRecord() const {return m_impl->m_deleteRecordFn;}
136
+ const deleteRecordFn database::onDeleteRecord() const
137
+ {
138
+ return m_impl->m_deleteRecordFn;
139
+ }
119
140
 
120
- void database::setOnDeleteRecord(const deleteRecordFn v) {m_impl->m_deleteRecordFn = v;}
141
+ void database::setOnDeleteRecord(const deleteRecordFn v)
142
+ {
143
+ m_impl->m_deleteRecordFn = v;
144
+ }
121
145
 
122
- const copyDataFn database::onCopyData() const {return m_impl->m_copyDataFn;}
146
+ const copyDataFn database::onCopyData() const
147
+ {
148
+ return m_impl->m_copyDataFn;
149
+ }
123
150
 
124
- void database::setOnCopyData(const copyDataFn v) {m_impl->m_copyDataFn = v;}
151
+ void database::setOnCopyData(const copyDataFn v)
152
+ {
153
+ m_impl->m_copyDataFn = v;
154
+ }
125
155
 
126
- void database::setLockReadOnly(bool v) {m_impl->lockReadOnly = v;}
156
+ void database::setLockReadOnly(bool v)
157
+ {
158
+ m_impl->lockReadOnly = v;
159
+ }
127
160
 
128
- bool database::isOpened() const {return m_impl->isOpened;}
161
+ bool database::isOpened() const
162
+ {
163
+ return m_impl->isOpened;
164
+ }
165
+
166
+ char_td database::mode() const
167
+ {
168
+ assert(m_impl->dbDef);
169
+ return m_impl->dbDef->mode();
170
+ }
129
171
 
130
172
  void database::create(const _TCHAR* fullpath, short type)
131
173
  {
@@ -140,13 +182,13 @@ void database::drop()
140
182
  if (m_impl->dbDef == NULL)
141
183
  m_stat = STATUS_DB_YET_OPEN;
142
184
  _TCHAR FullPath[MAX_PATH];
143
- std::vector<std::_tstring>fileNames;
185
+ std::vector<std::_tstring> fileNames;
144
186
  for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
145
187
  {
146
188
  if (m_impl->dbDef->tableDefs(i))
147
189
  {
148
- _stprintf_s(FullPath, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), rootDir(),
149
- m_impl->dbDef->tableDefs(i)->fileName());
190
+ _stprintf_s(FullPath, MAX_PATH, _T("%s") PSEPARATOR _T("%s"),
191
+ rootDir(), m_impl->dbDef->tableDefs(i)->fileName());
150
192
  fileNames.push_back(FullPath);
151
193
  }
152
194
  }
@@ -178,16 +220,17 @@ void database::dropTable(const _TCHAR* TableName)
178
220
 
179
221
  void database::setDir(const _TCHAR* directory)
180
222
  {
181
- _tcscpy(m_impl->rootDir, directory);
223
+ _tcscpy(m_impl->rootDir, directory);
182
224
  }
183
225
 
184
- database& database:: operator = (const database & rt)
226
+ database& database::operator=(const database& rt)
185
227
  {
186
228
  if (&rt != this)
187
229
  {
188
230
  nsdatabase::operator=(rt);
189
- m_impl->dbimple:: operator=(*(rt.m_impl));
231
+ m_impl->dbimple::operator=(*(rt.m_impl));
190
232
  rt.m_impl->dbDef->addref();
233
+ addref();
191
234
  }
192
235
  return *this;
193
236
  }
@@ -207,9 +250,10 @@ void database::getBtrVersion(btrVersions* versions)
207
250
  if (m_impl->dbDef)
208
251
  posblk = const_cast<uchar_td*>(m_impl->dbDef->posblk());
209
252
  nsdatabase::getBtrVersion(versions, posblk);
210
-
211
253
  }
212
- void database::onCopyDataInternal(table* tb, int recordCount, int count, bool& cancel)
254
+
255
+ void database::onCopyDataInternal(table* tb, int recordCount, int count,
256
+ bool& cancel)
213
257
  {
214
258
  if (m_impl->m_copyDataFn)
215
259
  m_impl->m_copyDataFn(this, recordCount, count, cancel);
@@ -221,22 +265,23 @@ void database::setTableReadOnly(bool value)
221
265
  m_impl->isTableReadOnly = value;
222
266
  }
223
267
 
224
- void database::doOpen(const _TCHAR* uri, short type, short mode, const _TCHAR* ownername)
268
+ void database::doOpen(const _TCHAR* uri, short type, short mode,
269
+ const _TCHAR* ownername)
225
270
  {
226
271
  m_stat = STATUS_SUCCESS;
227
272
  m_impl->dbDef->setDefType(type);
228
273
  m_impl->dbDef->open(uri, (char_td)mode, ownername);
229
274
 
230
275
  if ((m_stat == STATUS_SUCCESS) &&
231
- (m_impl->dbDef->m_stat == STATUS_INVALID_OWNERNAME) && (type == 0))
276
+ (m_impl->dbDef->m_stat == STATUS_INVALID_OWNERNAME) && (type == 0))
232
277
  m_impl->dbDef->m_stat = STATUS_DIFFERENT_DBVERSION;
233
278
 
234
279
  m_stat = m_impl->dbDef->m_stat;
235
- m_impl->isOpened = (m_stat == STATUS_SUCCESS);//important
280
+ m_impl->isOpened = (m_stat == STATUS_SUCCESS); // important
236
281
  }
237
282
 
238
- bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* dir,
239
- const _TCHAR* ownername)
283
+ bool database::open(const _TCHAR* _uri, short type, short mode,
284
+ const _TCHAR* dir, const _TCHAR* ownername)
240
285
  {
241
286
 
242
287
  _TCHAR buf[MAX_PATH];
@@ -268,8 +313,9 @@ bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* di
268
313
  m_impl->dbDef = new dbdef(this, type);
269
314
 
270
315
  doOpen(_uri, type, mode, ownername);
271
- if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd()
272
- && _tcsstr(_uri, TRANSACTD_SCHEMANAME))
316
+ m_impl->isOpened = (m_stat == STATUS_SUCCESS); // important
317
+ if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd() &&
318
+ _tcsstr(_uri, TRANSACTD_SCHEMANAME))
273
319
  {
274
320
  // Specified TRANSACTD_SCHEMANAME and no table
275
321
  // Auto make schema.
@@ -285,7 +331,6 @@ bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* di
285
331
  }
286
332
  }
287
333
  }
288
-
289
334
  }
290
335
  if (m_impl->isOpened && onOpenAfter())
291
336
  return true;
@@ -293,6 +338,7 @@ bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* di
293
338
  m_impl->isOpened = false;
294
339
  m_impl->dbDef->close();
295
340
  m_impl->dbDef->release();
341
+ nsdatabase::release();
296
342
  m_impl->dbDef = NULL;
297
343
  return false;
298
344
  }
@@ -330,10 +376,11 @@ short database::continuous(char_td IsEnd, bool inclideRepfile)
330
376
  { // Local databse only.Cnat not use remote database.
331
377
  if (!m_impl->isOpened)
332
378
  return STATUS_DB_YET_OPEN;
333
- char tmp[128] = {0x00};
379
+ char tmp[128] = { 0x00 };
334
380
  char* buf = getContinuousList(inclideRepfile);
335
381
  uint_td buflen = (uint_td)strlen(buf) + 1;
336
- m_stat = m_btrcallid(TD_BACKUPMODE, tmp, buf, &buflen, 0, 0, IsEnd, clientID());
382
+ m_stat =
383
+ m_btrcallid(TD_BACKUPMODE, tmp, buf, &buflen, 0, 0, IsEnd, clientID());
337
384
  free(buf);
338
385
  return m_stat;
339
386
  }
@@ -342,26 +389,35 @@ void database::doClose()
342
389
  {
343
390
  m_stat = STATUS_SUCCESS;
344
391
 
345
- if (m_impl->dbDef)
346
- m_impl->dbDef->release();
347
- m_impl->dbDef = NULL;
348
-
349
- nsdatabase::reset();
350
- m_impl->isOpened = false;
351
- m_impl->rootDir[0] = 0x00;
352
- m_impl->lockReadOnly = false;
392
+ if (m_impl->dbDef)
393
+ {
394
+ m_impl->dbDef->release();
395
+ nsdatabase::reset();
396
+ }
397
+ m_impl->dbDef = NULL;
398
+ m_impl->isOpened = false;
399
+ m_impl->rootDir[0] = 0x00;
400
+ m_impl->lockReadOnly = false;
353
401
  }
354
402
 
355
- void database::close() {doClose();}
403
+ void database::close()
404
+ {
405
+ bool flag = (m_impl->dbDef != NULL);
406
+ doClose();
407
+ if (flag)
408
+ nsdatabase::release();
409
+ }
356
410
 
357
411
  _TCHAR* database::getTableUri(_TCHAR* buf, short FileNum)
358
412
  {
359
413
  m_stat = STATUS_SUCCESS;
360
414
  if ((m_impl->dbDef) && (m_impl->isOpened))
361
415
  {
362
- if (_tcsstr(m_impl->dbDef->tableDefs(FileNum)->fileName(), PSEPARATOR) == NULL)
363
- _stprintf_s(buf, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), m_impl->rootDir,
364
- m_impl->dbDef->tableDefs(FileNum)->fileName());
416
+ if (_tcsstr(m_impl->dbDef->tableDefs(FileNum)->fileName(),
417
+ PSEPARATOR) == NULL)
418
+ _stprintf_s(buf, MAX_PATH, _T("%s") PSEPARATOR _T("%s"),
419
+ m_impl->rootDir,
420
+ m_impl->dbDef->tableDefs(FileNum)->fileName());
365
421
  else
366
422
  _tcscpy(buf, m_impl->dbDef->tableDefs(FileNum)->fileName());
367
423
  return buf;
@@ -371,7 +427,7 @@ _TCHAR* database::getTableUri(_TCHAR* buf, short FileNum)
371
427
  }
372
428
 
373
429
  table* database::openTable(const _TCHAR* TableName, short mode, bool AutoCreate,
374
- const _TCHAR* OrnerName, const _TCHAR* pPath)
430
+ const _TCHAR* OrnerName, const _TCHAR* pPath)
375
431
  {
376
432
  short filenum;
377
433
  m_stat = 0;
@@ -397,21 +453,22 @@ table* database::createTableObject()
397
453
  return new table(this);
398
454
  }
399
455
 
400
- table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TCHAR* OrnerName,
401
- const _TCHAR* path)
456
+ table* database::openTable(short FileNum, short mode, bool AutoCreate,
457
+ const _TCHAR* OrnerName, const _TCHAR* path)
402
458
  {
403
459
  /* Select directory
404
- - Fiest, Specify Direct.
405
- - Second, specified in filename.
406
- - Thard, Smae as schem table.
407
- */
460
+ - Fiest, Specify Direct.
461
+ - Second, specified in filename.
462
+ - Thard, Smae as schem table.
463
+ */
408
464
 
409
465
  _TCHAR buf[MAX_PATH];
410
466
  bool regularDir = false;
411
467
  bool NewFile = false;
412
468
  m_stat = 0;
413
469
 
414
- if ((!m_impl->dbDef) || (!m_impl->isOpened)) {
470
+ if ((!m_impl->dbDef) || (!m_impl->isOpened))
471
+ {
415
472
  m_stat = STATUS_DB_YET_OPEN;
416
473
  return NULL;
417
474
  }
@@ -429,7 +486,7 @@ table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TC
429
486
  table* tb = createTableObject();
430
487
  dbdef::cacheFieldPos(td);
431
488
 
432
- if ((path == NULL) || (path[0]==0x00))
489
+ if ((path == NULL) || (path[0] == 0x00))
433
490
  {
434
491
  if (_tcsstr(td->fileName(), PSEPARATOR) == NULL)
435
492
  {
@@ -445,14 +502,14 @@ table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TC
445
502
  if (m_impl->isTableReadOnly)
446
503
  mode = TD_OPEN_READONLY;
447
504
  tb->open(buf, (char_td)mode, OrnerName);
448
- if ((tb->m_stat == STATUS_TABLE_NOTOPEN) || (tb->m_stat == ERROR_NOSPECIFY_TABLE))
505
+ if ((tb->m_stat == STATUS_TABLE_NOTOPEN) ||
506
+ (tb->m_stat == ERROR_NOSPECIFY_TABLE))
449
507
  {
450
508
  if (AutoCreate)
451
509
  {
452
510
  createTable(FileNum, buf);
453
511
  if (m_stat != STATUS_SUCCESS)
454
512
  {
455
- m_stat = tb->m_stat;
456
513
  tb->release();
457
514
  return NULL;
458
515
  }
@@ -463,16 +520,19 @@ table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TC
463
520
  tb->setOwnerName(OrnerName);
464
521
  NewFile = true;
465
522
  }
466
- }else
523
+ }
524
+ else
467
525
  {
468
526
  m_stat = tb->m_stat;
469
527
  tb->release();
470
528
  return NULL;
471
529
  }
472
530
  }
473
- tb->init(td, FileNum, regularDir);
531
+ if (tb->m_stat == 0)
532
+ tb->init(td, FileNum, regularDir);
474
533
 
475
- if ((m_stat != 0) || (tb->m_stat != 0) || !onTableOpened(tb, FileNum, mode, NewFile))
534
+ if ((m_stat != 0) || (tb->m_stat != 0) ||
535
+ !onTableOpened(tb, FileNum, mode, NewFile))
476
536
  {
477
537
  m_stat = tb->m_stat;
478
538
  tb->release();
@@ -488,19 +548,20 @@ bool database::createTable(short FileNum, const _TCHAR* FilePath)
488
548
  if (setUseTransactd() == false)
489
549
  return false;
490
550
 
491
- char buf2[MAX_PATH]={0x00};
492
- _TCHAR posblk[128] = {0x00};
551
+ char buf2[MAX_PATH] = { 0x00 };
552
+ _TCHAR posblk[128] = { 0x00 };
493
553
 
494
554
  const char* p = toServerUri(buf2, MAX_PATH, FilePath, isUseTransactd());
495
555
 
496
- m_stat = m_btrcallid(TD_CREATETABLE, posblk, m_impl->dbDef->tableDefs(FileNum),
497
- &m_impl->dbDef->m_datalen, (void*)p, (uchar_td)strlen(p), CR_SUBOP_BY_TABLEDEF /* exists check */ ,
498
- clientID());
556
+ m_stat = m_btrcallid(
557
+ TD_CREATETABLE, posblk, m_impl->dbDef->tableDefs(FileNum),
558
+ &m_impl->dbDef->m_datalen, (void*)p, (uchar_td)strlen(p),
559
+ CR_SUBOP_BY_TABLEDEF /* exists check */, clientID());
499
560
  }
500
561
  else
501
562
  {
502
563
  const _TCHAR* buf;
503
- fileSpec* fs = (fileSpec*) malloc(1024);
564
+ fileSpec* fs = (fileSpec*)malloc(1024);
504
565
  if (fs == NULL)
505
566
  {
506
567
  m_stat = STATUS_CANT_ALLOC_MEMORY;
@@ -517,36 +578,15 @@ bool database::createTable(short FileNum, const _TCHAR* FilePath)
517
578
  return (m_stat == 0);
518
579
  }
519
580
 
520
- int moveVaileRecord(table* src)
521
- {
522
- int count = 0;
523
- bookmark_td bm = 0;
524
- src->stepLast();
525
- while (src->stat() == STATUS_SUCCESS)
526
- {
527
- bm = src->bookmark();
528
- ++count;
529
- src->stepPrev();
530
- }
531
- if (count)
532
- {
533
- src->seekByBookmark(bm);
534
- return count;
535
- }
536
- return 0;
537
- }
538
-
539
581
  short database::assignSchemaData(dbdef* src)
540
582
  {
541
583
  beginTrn();
542
- int Count;
543
-
544
- Count = 1;
584
+ int Count = 1;
545
585
 
546
586
  dbdef* defDest = dbDef();
547
587
  int recordCount = src->tableCount();
548
588
 
549
- for (int i=0;i<=src->tableCount();i++)
589
+ for (int i = 0; i <= src->tableCount(); i++)
550
590
  {
551
591
  tabledef* td = src->tableDefs(i);
552
592
  if (td)
@@ -555,18 +595,21 @@ short database::assignSchemaData(dbdef* src)
555
595
  tdtmp.fieldCount = 0;
556
596
  tdtmp.keyCount = 0;
557
597
  defDest->insertTable(&tdtmp);
558
- for (int j=0;j<td->fieldCount;++j)
598
+ if (defDest->stat())
599
+ break;
600
+ for (int j = 0; j < td->fieldCount; ++j)
559
601
  {
560
602
  fielddef& fd = td->fieldDefs[j];
561
603
  *defDest->insertField(td->id, j) = fd;
562
604
  }
563
- for (int j=0;j<td->keyCount;++j)
605
+ for (int j = 0; j < td->keyCount; ++j)
564
606
  {
565
607
  keydef& kd = td->keyDefs[j];
566
608
  *defDest->insertKey(td->id, j) = kd;
567
609
  }
568
610
  defDest->updateTableDef(td->id);
569
- if (defDest->stat() != 0) break;
611
+ if (defDest->stat())
612
+ break;
570
613
  }
571
614
  bool Cancel = false;
572
615
  onCopyDataInternal(NULL, recordCount, Count, Cancel);
@@ -574,9 +617,9 @@ short database::assignSchemaData(dbdef* src)
574
617
  return -1;
575
618
  Count++;
576
619
  }
577
-
578
620
 
579
- if ((nstable::tdapErr((HWND)NULL, src->stat()) == 0) && (defDest->stat() == 0))
621
+ if ((nstable::tdapErr((HWND)NULL, src->stat()) == 0) &&
622
+ (defDest->stat() == 0))
580
623
  {
581
624
  endTrn();
582
625
  return 0;
@@ -588,58 +631,139 @@ short database::assignSchemaData(dbdef* src)
588
631
  return defDest->stat();
589
632
  }
590
633
 
591
- /* Copy from src to dest table.
592
- * Copy as same field name.
593
- * If turbo then copy use memcpy and offset dest of first address.
594
- */
595
- #pragma warn -8004
596
- short database::copyTableData(table* dest, table* src, bool turbo, int offset, short keyNum,
597
- int maxSkip)
634
+ struct filedChnageInfo
598
635
  {
599
- ushort_td ins_rows = 0;
600
- bool repData = false;
601
- if (_tcsstr(dest->tableDef()->fileName(), _T("rep.dat")))
602
- repData = true;
603
-
604
- int SkipCount = 0;
605
- short NewFieldNum[256] = {-1};
606
- int cpytype[256] = {0}; // 0 mem 1 str
607
- short i, j;
608
- int Count;
609
- int recordCount = src->recordCount();
610
- for (i = 0; i < src->tableDef()->fieldCount; i++)
636
+ filedChnageInfo() : fieldnum(-1), changed(0) {}
637
+
638
+ short fieldnum;
639
+ bool changed;
640
+ };
641
+
642
+ void makeChangeInfo(const tabledef* ddef, const tabledef* sdef,
643
+ filedChnageInfo* fci)
644
+ {
645
+ for (short i = 0; i < sdef->fieldCount; i++)
611
646
  {
612
- for (j = 0; j < dest->tableDef()->fieldCount; j++)
647
+ fielddef& fds = sdef->fieldDefs[i];
648
+ for (short j = 0; j < ddef->fieldCount; j++)
613
649
  {
614
- if (strcmp(dest->tableDef()->fieldDefs[j].nameA(),
615
- src->tableDef()->fieldDefs[i].nameA()) == 0)
650
+ fielddef& fdd = ddef->fieldDefs[j];
651
+ if (strcmp(fdd.nameA(), fds.nameA()) == 0)
616
652
  {
617
- NewFieldNum[i] = j;
618
- if (src->tableDef()->fieldDefs[i].type == ft_lvar)
619
- cpytype[i] = 0;
620
- else if (src->tableDef()->fieldDefs[i].type != dest->tableDef()
621
- ->fieldDefs[NewFieldNum[i]].type)
622
- cpytype[i] = 1; //diffrent type
623
- else if (src->tableDef()->fieldDefs[i].len != dest->tableDef()
624
- ->fieldDefs[NewFieldNum[i]].len)
625
- cpytype[i] = 1; //different size
626
- else
627
- cpytype[i] = 0;
653
+ fci[i].fieldnum = j;
654
+ if (fds.type != fdd.type)
655
+ fci[i].changed = true; // diffrent type
656
+ else if (fds.len != fdd.len)
657
+ fci[i].changed = true; // different size
628
658
  break;
629
659
  }
630
660
  else
631
- NewFieldNum[i] = -1;
661
+ fci[i].fieldnum = -1;
662
+ }
663
+ }
664
+ }
665
+
666
+ inline void copyEachFieldData(table* dest, table* src, filedChnageInfo* fci)
667
+ {
668
+ const tabledef* ddef = dest->tableDef();
669
+ const tabledef* sdef = src->tableDef();
670
+
671
+ for (int i = 0; i < sdef->fieldCount; i++)
672
+ {
673
+ int dindex = fci[i].fieldnum;
674
+ fielddef& fds = sdef->fieldDefs[i];
675
+ fielddef& fdd = ddef->fieldDefs[dindex];
632
676
 
677
+ if (dindex != -1)
678
+ {
679
+ // src valiable len and last field;
680
+ if ((fci[i].changed == false) || (fdd.type == ft_myfixedbinary))
681
+ {
682
+ int len = fds.len;
683
+ if (fds.len > fdd.len)
684
+ len = fdd.len;
685
+ memcpy(dest->fieldPtr(dindex), src->fieldPtr(i), len);
686
+ }
687
+ else
688
+ {
689
+ if (fdd.maxVarDatalen() && fds.maxVarDatalen())
690
+ {
691
+ uint_td size;
692
+ uint_td maxlen = fdd.maxVarDatalen();
693
+ const void* data = src->getFVbin(i, size);
694
+ if (maxlen < size)
695
+ size = maxlen;
696
+ dest->setFV(dindex, data, size);
697
+ }
698
+ else
699
+ {
700
+ // If diffrent field type then convert to string then copy.
701
+ dest->setFV(dindex, src->getFVstr(i));
702
+ }
703
+ }
633
704
  }
634
705
  }
635
- src->setKeyNum((char_td)keyNum);
706
+ }
707
+
708
+ inline int moveVaileRecord(table* src)
709
+ {
710
+ int count = 0;
711
+ bookmark_td bm = 0;
712
+ src->stepLast();
713
+ while (src->stat() == STATUS_SUCCESS)
714
+ {
715
+ bm = src->bookmark();
716
+ ++count;
717
+ src->stepPrev();
718
+ }
719
+ if (count)
720
+ {
721
+ src->seekByBookmark(bm);
722
+ return count;
723
+ }
724
+ return 0;
725
+ }
726
+
727
+ inline void moveNextRecord(table* src, short keyNum)
728
+ {
729
+ if (keyNum == -1)
730
+ src->stepNext();
731
+ else
732
+ src->seekNext();
733
+ }
734
+
735
+ inline void moveFirstRecord(table* src, short keyNum)
736
+ {
636
737
  if (keyNum == -1)
637
738
  src->stepFirst();
638
739
  else
639
740
  src->seekFirst();
640
- Count = 1;
741
+ }
742
+
743
+ /* Copy from src to dest table.
744
+ * Copy as same field name.
745
+ * If turbo then copy use memcpy and offset dest of first address.
746
+ * if a src field is variable size binary, that dest field needs to be variable
747
+ *size binary.
748
+ * if src and dest fields are different type ,then a text copy is used.
749
+ */
750
+ #pragma warn -8004
751
+
752
+ short database::copyTableData(table* dest, table* src, bool turbo, int offset,
753
+ short keyNum, int maxSkip)
754
+ {
755
+ src->setKeyNum((char_td)keyNum);
756
+ const tabledef* ddef = dest->tableDef();
757
+ const tabledef* sdef = src->tableDef();
758
+ ushort_td ins_rows = 0;
759
+ bool repData = (_tcsstr(ddef->fileName(), _T("rep.dat"))) ? true : false;
760
+ int skipCount = 0, count = 1;
761
+ int recordCount = src->recordCount();
762
+ filedChnageInfo fci[256];
763
+
764
+ makeChangeInfo(ddef, sdef, fci);
765
+ moveFirstRecord(src, keyNum);
641
766
 
642
- int len;
643
767
  while (1)
644
768
  {
645
769
  if (src->stat())
@@ -648,28 +772,24 @@ short database::copyTableData(table* dest, table* src, bool turbo, int offset, s
648
772
  {
649
773
  if (maxSkip != -1)
650
774
  break;
651
- if (recordCount < SkipCount + Count)
775
+ if (recordCount < skipCount + count)
652
776
  {
653
777
  if (src->stat() == STATUS_IO_ERROR)
654
778
  {
655
- int n = moveVaileRecord(src);
656
- if (n)
657
- SkipCount = recordCount - n - Count;
658
- else
659
- break;
779
+ int n = moveVaileRecord(src);
780
+ if (n)
781
+ skipCount = recordCount - n - count;
782
+ else
783
+ break;
660
784
  }
661
785
  else
662
- break;
786
+ break;
663
787
  }
664
- if (keyNum == -1)
665
- src->stepNext();
666
- else
667
- src->seekNext();
788
+ moveNextRecord(src, keyNum);
668
789
 
669
- SkipCount++;
790
+ skipCount++;
670
791
  if (src->stat() == STATUS_SUCCESS)
671
792
  break;
672
-
673
793
  }
674
794
  if (src->stat())
675
795
  break;
@@ -681,58 +801,39 @@ short database::copyTableData(table* dest, table* src, bool turbo, int offset, s
681
801
  return STATUS_CANT_ALLOC_MEMORY;
682
802
  if (offset)
683
803
  memset(dest->fieldPtr(0), 0, offset);
684
- memcpy((char*)dest->fieldPtr(0) + offset, src->fieldPtr(0), src->datalen());
804
+ memcpy((char*)dest->fieldPtr(0) + offset, src->fieldPtr(0),
805
+ src->datalen());
685
806
  }
686
807
  else
687
- {
688
- for (i = 0; i < src->tableDef()->fieldCount; i++)
689
- {
690
- if (NewFieldNum[i] != -1)
691
- {
692
- // If diffrent field type then convert to string then copy.
693
- if (cpytype[i] != 0)
694
- dest->setFV(NewFieldNum[i], src->getFVstr(i));
695
- else
696
- {
697
- len = src->tableDef()->fieldDefs[i].len;
698
- if (src->tableDef()->fieldDefs[i].len >
699
- dest->tableDef()->fieldDefs[NewFieldNum[i]].len)
700
- len = dest->tableDef()->fieldDefs[NewFieldNum[i]].len;
701
- memcpy(dest->fieldPtr(NewFieldNum[i]), src->fieldPtr(i), len);
702
- }
703
- }
704
- }
705
- }
706
- bool Cancel = false;
707
- onCopyDataInternal(dest, recordCount, Count, Cancel);
708
- if (Cancel)
709
- return -1;
710
- Count++;
808
+ copyEachFieldData(dest, src, fci);
711
809
 
712
810
  if (repData)
713
811
  {
714
-
715
812
  dest->m_datalen = src->m_datalen;
716
813
  dest->tdap(TD_REC_INSERT);
717
814
  }
718
815
  else
719
816
  ins_rows += dest->insert();
720
817
  if (dest->stat() == STATUS_INVALID_VALLEN)
721
- SkipCount++;
818
+ skipCount++;
722
819
  else if (dest->stat() == STATUS_DUPPLICATE_KEYVALUE)
723
- SkipCount++;
820
+ skipCount++;
724
821
  else if (dest->stat() != STATUS_SUCCESS)
725
822
  return dest->stat();
726
- if (keyNum == -1)
727
- src->stepNext();
728
823
  else
729
- src->seekNext();
824
+ count++;
825
+ bool cancel = false;
826
+ onCopyDataInternal(dest, recordCount, count, cancel);
827
+ if (cancel)
828
+ return -1;
829
+
830
+ moveNextRecord(src, keyNum);
730
831
  }
731
- if ((SkipCount) && (maxSkip == -1))
832
+ if ((skipCount) && (maxSkip == -1))
732
833
  {
733
- bool Cancel = false;
734
- onCopyDataInternal(dest, recordCount, Count, Cancel);
735
- if (Cancel)
834
+ bool cancel = false;
835
+ onCopyDataInternal(dest, -1, count, cancel);
836
+ if (cancel)
736
837
  return -1;
737
838
  }
738
839
 
@@ -742,7 +843,8 @@ short database::copyTableData(table* dest, table* src, bool turbo, int offset, s
742
843
  }
743
844
  #pragma warn .8004
744
845
 
745
- void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerName)
846
+ void database::doConvertTable(short TableIndex, bool Turbo,
847
+ const _TCHAR* OwnerName)
746
848
  {
747
849
  table* src;
748
850
  table* dest;
@@ -767,15 +869,23 @@ void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerN
767
869
  TableDef = m_impl->dbDef->tableDefs(TableIndex);
768
870
  short len = TableDef->maxRecordLen;
769
871
 
770
- TableDef->preAlloc = (ushort_td)(src->recordCount() / TableDef->pageSize / len);
872
+ TableDef->preAlloc =
873
+ (ushort_td)(src->recordCount() / TableDef->pageSize / len);
771
874
  TableDef->flags.bit2 = true;
772
875
 
773
876
  _tcscpy(szTempPath, getTableUri(buf, TableIndex));
877
+ _TCHAR* p = _tcsstr(szTempPath, _T("dbfile="));
878
+ if (p == 0)
879
+ p = szTempPath;
880
+ else
881
+ p += 7;
882
+
883
+ _TCHAR* p2 = _tcschr(p, _T('.'));
884
+ if (p2 == 0)
885
+ p2 = p + _tcslen(p);
886
+ *p2 = 0x00;
774
887
 
775
- _TCHAR* pireod = _tcsrchr(szTempPath, '.');
776
- if (pireod)
777
- * pireod = 0x00;
778
- _tcscat(szTempPath, _T("_conv_dest.tmp"));
888
+ _tcscat(szTempPath, _T("_conv_dest_tmp"));
779
889
 
780
890
  createTable(TableIndex, szTempPath);
781
891
  dest = openTable(TableIndex, TD_OPEN_EXCLUSIVE, true, NULL, szTempPath);
@@ -796,7 +906,6 @@ void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerN
796
906
  dest->release();
797
907
  src->release();
798
908
 
799
-
800
909
  if (ret == 0)
801
910
  {
802
911
  _TCHAR tmp[MAX_PATH];
@@ -805,10 +914,9 @@ void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerN
805
914
  swapTablename(szTempPath, tmp);
806
915
  else
807
916
  {
808
-
809
917
  _TCHAR* pireod = _tcsrchr(tmp, '.');
810
918
  if (pireod)
811
- * pireod = 0x00;
919
+ *pireod = 0x00;
812
920
  _tcscat(tmp, _T("_conv_src.tmp"));
813
921
  rename(getTableUri(buf, TableIndex), tmp);
814
922
  if (m_stat)
@@ -824,10 +932,10 @@ void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerN
824
932
  }
825
933
  else
826
934
  m_stat = ret;
827
-
828
935
  }
829
936
 
830
- void database::convertTable(short tableIndex, bool turbo, const _TCHAR* ownername)
937
+ void database::convertTable(short tableIndex, bool turbo,
938
+ const _TCHAR* ownername)
831
939
  {
832
940
  doConvertTable(tableIndex, turbo, ownername);
833
941
  }
@@ -839,14 +947,15 @@ bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
839
947
  {
840
948
  m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->fieldDefs =
841
949
  dbdef::getFieldDef(m_impl->dbDef->tableDefs(TABLE_NUM_TMP));
842
- m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->keyDefs = dbdef::getKeyDef(m_impl->dbDef->tableDefs(512));
950
+ m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->keyDefs =
951
+ dbdef::getKeyDef(m_impl->dbDef->tableDefs(512));
843
952
  }
844
953
  table* bao = openTable(TableIndex, TD_OPEN_READONLY, false, OwnerName);
845
954
  bool ret = false;
846
955
  if (m_stat == STATUS_TABLE_NOTOPEN)
847
956
  ret = false;
848
957
  else if (m_stat == STATUS_INVALID_OWNERNAME)
849
- ret = true;
958
+ ret = true;
850
959
  else if (m_stat == STATUS_SUCCESS)
851
960
  ret = true;
852
961
  if (bao)
@@ -855,9 +964,8 @@ bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
855
964
  return ret;
856
965
  }
857
966
 
858
-
859
- }// namespace client
860
- }// namespace btrv
861
- }// namespace protocol
862
- }// namespace db
863
- }// namespace bzs
967
+ } // namespace client
968
+ } // namespace btrv
969
+ } // namespace protocol
970
+ } // namespace db
971
+ } // namespace bzs