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