transactd 1.0.1

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 (218) hide show
  1. checksums.yaml +7 -0
  2. data/BUILD_UNIX-JA +174 -0
  3. data/BUILD_WIN-JA +256 -0
  4. data/CMakeLists.txt +96 -0
  5. data/COPYING +339 -0
  6. data/README +406 -0
  7. data/README-JA +424 -0
  8. data/bin/common/tdclc_32_1_0.dll +0 -0
  9. data/bin/common/tdclc_64_1_0.dll +0 -0
  10. data/build/common/check_for_link_iconv.cmake +73 -0
  11. data/build/common/copyifgreater.cmd +30 -0
  12. data/build/common/copyifgreater.js +290 -0
  13. data/build/common/get_boost_libs.cmake +106 -0
  14. data/build/common/get_ruby_path.cmake +115 -0
  15. data/build/common/options.cmake +127 -0
  16. data/build/common/smart_install.cmake +263 -0
  17. data/build/common/system.cmake +122 -0
  18. data/build/common/transactd.rc.in +52 -0
  19. data/build/common/transactd_cl_common.cmake +101 -0
  20. data/build/common/transactd_cl_output.cmake +93 -0
  21. data/build/common/transactd_common.cmake +237 -0
  22. data/build/common/transactd_required.cmake +28 -0
  23. data/build/swig/ruby/generate.cmake.in +35 -0
  24. data/build/swig/ruby/generate.cmd.in +19 -0
  25. data/build/swig/ruby/ruby.swg +101 -0
  26. data/build/swig/tdcl.i +188 -0
  27. data/build/tdclc/BUILDNUMBER.txt +1 -0
  28. data/build/tdclc/CMakeLists.txt +170 -0
  29. data/build/tdclc/tdclc_32.cbproj +181 -0
  30. data/build/tdclc/tdclc_64.cbproj +205 -0
  31. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  32. data/build/tdclcpp/CMakeLists.txt +142 -0
  33. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
  34. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
  35. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  36. data/build/tdclrb/CMakeLists.txt +258 -0
  37. data/build/tdclrb/GEM_VERSION +3 -0
  38. data/build/tdclrb/bldgem/extconf.rb +123 -0
  39. data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
  40. data/build/tdclrb/gem/Makefile.win32-VS +65 -0
  41. data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
  42. data/build/tdclrb/gem/detect.rb +31 -0
  43. data/build/tdclrb/gem/helper.rb +113 -0
  44. data/build/tdclrb/gem/transactd.rb +22 -0
  45. data/build/tdclrb/gem_output.cmake +44 -0
  46. data/source/bzs/db/IBlobBuffer.h +51 -0
  47. data/source/bzs/db/blobBuffer.h +177 -0
  48. data/source/bzs/db/blobStructs.h +85 -0
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
  50. data/source/bzs/db/engine/mysql/bookmark.h +195 -0
  51. data/source/bzs/db/engine/mysql/database.cpp +1882 -0
  52. data/source/bzs/db/engine/mysql/database.h +465 -0
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
  54. data/source/bzs/db/engine/mysql/dbManager.h +143 -0
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
  56. data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
  63. data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
  64. data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
  68. data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
  69. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
  70. data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
  71. data/source/bzs/db/protocol/tdap/client/client.h +292 -0
  72. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
  73. data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
  74. data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
  75. data/source/bzs/db/protocol/tdap/client/database.h +118 -0
  76. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
  77. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
  78. data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
  79. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
  80. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
  81. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
  82. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
  83. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
  84. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
  85. data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
  86. data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
  87. data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
  88. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
  89. data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
  90. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
  91. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
  92. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
  93. data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
  94. data/source/bzs/db/protocol/tdap/client/request.h +198 -0
  95. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
  96. data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
  97. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
  98. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
  99. data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
  100. data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
  101. data/source/bzs/db/protocol/tdap/client/table.h +221 -0
  102. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
  103. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
  104. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
  105. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
  106. data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
  107. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
  108. data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
  109. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
  110. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
  111. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
  112. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
  113. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
  114. data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
  115. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
  116. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
  117. data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
  118. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
  119. data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
  120. data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
  121. data/source/bzs/db/transactd/appBuilderImple.h +55 -0
  122. data/source/bzs/db/transactd/appModule.cpp +183 -0
  123. data/source/bzs/db/transactd/appModule.h +80 -0
  124. data/source/bzs/db/transactd/connManager.cpp +201 -0
  125. data/source/bzs/db/transactd/connManager.h +60 -0
  126. data/source/bzs/db/transactd/connectionRecord.h +69 -0
  127. data/source/bzs/db/transactd/transactd.cpp +325 -0
  128. data/source/bzs/env/compiler.h +135 -0
  129. data/source/bzs/env/crosscompile.cpp +130 -0
  130. data/source/bzs/env/crosscompile.h +150 -0
  131. data/source/bzs/env/fileopen.h +36 -0
  132. data/source/bzs/env/mbcswchrLinux.cpp +40 -0
  133. data/source/bzs/env/mbcswchrLinux.h +88 -0
  134. data/source/bzs/env/tstring.h +183 -0
  135. data/source/bzs/example/changeSchema.cpp +117 -0
  136. data/source/bzs/example/changeSchema_c.cpp +78 -0
  137. data/source/bzs/example/connection_pool_c.cpp +171 -0
  138. data/source/bzs/example/createDatabase.cpp +305 -0
  139. data/source/bzs/example/createDatabase_c.cpp +202 -0
  140. data/source/bzs/example/deleteRecords.cpp +87 -0
  141. data/source/bzs/example/deleteRecords_c.cpp +57 -0
  142. data/source/bzs/example/dropDatabase.cpp +59 -0
  143. data/source/bzs/example/dropDatabase_c.cpp +34 -0
  144. data/source/bzs/example/insertRecords.cpp +212 -0
  145. data/source/bzs/example/insertRecords_c.cpp +153 -0
  146. data/source/bzs/example/readRecords.cpp +141 -0
  147. data/source/bzs/example/readRecords_c.cpp +107 -0
  148. data/source/bzs/example/updateRecords.cpp +99 -0
  149. data/source/bzs/example/updateRecords_c.cpp +71 -0
  150. data/source/bzs/example/update_with_transaction.cpp +104 -0
  151. data/source/bzs/example/update_with_transaction_c.cpp +80 -0
  152. data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
  153. data/source/bzs/netsvc/client/tcpClient.h +489 -0
  154. data/source/bzs/netsvc/server/IAppModule.h +94 -0
  155. data/source/bzs/netsvc/server/iserver.h +65 -0
  156. data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
  157. data/source/bzs/netsvc/server/serverCpt.h +88 -0
  158. data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
  159. data/source/bzs/netsvc/server/serverPipe.h +96 -0
  160. data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
  161. data/source/bzs/netsvc/server/serverTpool.h +84 -0
  162. data/source/bzs/rtl/benchmark.cpp +96 -0
  163. data/source/bzs/rtl/benchmark.h +65 -0
  164. data/source/bzs/rtl/datetime.cpp +375 -0
  165. data/source/bzs/rtl/datetime.h +53 -0
  166. data/source/bzs/rtl/debuglog.cpp +106 -0
  167. data/source/bzs/rtl/debuglog.h +97 -0
  168. data/source/bzs/rtl/exception.h +116 -0
  169. data/source/bzs/rtl/stl_uty.cpp +35 -0
  170. data/source/bzs/rtl/stl_uty.h +29 -0
  171. data/source/bzs/rtl/stringBuffers.cpp +101 -0
  172. data/source/bzs/rtl/stringBuffers.h +58 -0
  173. data/source/bzs/rtl/strtrim.cpp +135 -0
  174. data/source/bzs/rtl/strtrim.h +46 -0
  175. data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
  176. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
  177. data/source/bzs/test/tdclrb/prepare.rb +226 -0
  178. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
  179. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
  180. data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
  181. data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
  182. data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
  183. data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
  184. data/source/global/tdclatl/Database.cpp +503 -0
  185. data/source/global/tdclatl/Database.h +139 -0
  186. data/source/global/tdclatl/DbDef.cpp +242 -0
  187. data/source/global/tdclatl/DbDef.h +79 -0
  188. data/source/global/tdclatl/Field.cpp +92 -0
  189. data/source/global/tdclatl/Field.h +59 -0
  190. data/source/global/tdclatl/FieldDef.cpp +238 -0
  191. data/source/global/tdclatl/FieldDef.h +87 -0
  192. data/source/global/tdclatl/Flags.cpp +111 -0
  193. data/source/global/tdclatl/Flags.h +55 -0
  194. data/source/global/tdclatl/KeyDef.cpp +51 -0
  195. data/source/global/tdclatl/KeyDef.h +55 -0
  196. data/source/global/tdclatl/KeySegment.cpp +55 -0
  197. data/source/global/tdclatl/Table.cpp +600 -0
  198. data/source/global/tdclatl/Table.h +144 -0
  199. data/source/global/tdclatl/TableDef.cpp +291 -0
  200. data/source/global/tdclatl/TableDef.h +86 -0
  201. data/source/global/tdclatl/TdVersion.cpp +74 -0
  202. data/source/global/tdclatl/TdVersion.h +54 -0
  203. data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
  204. data/source/global/tdclatl/dllmain.cpp +30 -0
  205. data/source/global/tdclatl/dllmain.h +27 -0
  206. data/source/global/tdclatl/keySegment.h +57 -0
  207. data/source/global/tdclatl/resource.h +0 -0
  208. data/source/global/tdclatl/stdafx.cpp +2 -0
  209. data/source/global/tdclatl/stdafx.h +25 -0
  210. data/source/global/tdclatl/targetver.h +4 -0
  211. data/source/global/tdclatl/tdclatl.cpp +68 -0
  212. data/source/global/tdclatl/tdclatl.def +10 -0
  213. data/source/global/tdclatl/tdclatl.idl +1035 -0
  214. data/source/linux/charsetConvert.h +112 -0
  215. data/source/linux/linuxTypes.h +33 -0
  216. data/source/linux/tchar.h +428 -0
  217. data/transactd.gemspec +97 -0
  218. metadata +267 -0
@@ -0,0 +1,863 @@
1
+ /* =================================================================
2
+ Copyright (C) 2000-2013 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ ================================================================= */
19
+ #include <bzs/env/tstring.h>
20
+ #pragma hdrstop
21
+
22
+ #include "database.h"
23
+
24
+ #include "table.h"
25
+
26
+ #include "dbDef.h"
27
+ #include <limits.h>
28
+ #include <sys/stat.h>
29
+ #include <stdio.h>
30
+ #include <vector>
31
+ #include "stringConverter.h"
32
+
33
+ #pragma package(smart_init)
34
+
35
+ namespace bzs
36
+ {
37
+ namespace db
38
+ {
39
+ namespace protocol
40
+ {
41
+ namespace tdap
42
+ {
43
+ namespace client
44
+ {
45
+
46
+ struct dbimple
47
+ {
48
+
49
+ _TCHAR rootDir[MAX_PATH];
50
+ bool isOpened;
51
+ dbdef* dbDef;
52
+ void* optionalData;
53
+ bool isTableReadOnly;
54
+ bool lockReadOnly;
55
+ deleteRecordFn m_deleteRecordFn;
56
+ copyDataFn m_copyDataFn;
57
+
58
+ dbimple() : dbDef(NULL), isOpened(false), m_deleteRecordFn(NULL),m_copyDataFn(NULL), optionalData(NULL),
59
+ isTableReadOnly(false), lockReadOnly(false)
60
+ {
61
+ rootDir[0] = 0x00;
62
+ }
63
+
64
+ dbimple& operator = (const dbimple & rt)
65
+ {
66
+ if (&rt != this)
67
+ {
68
+ dbDef = rt.dbDef;
69
+ _tcscpy(rootDir, rt.rootDir);
70
+ isOpened = rt.isOpened;
71
+ optionalData = rt.optionalData;
72
+ isTableReadOnly = rt.isTableReadOnly;
73
+ lockReadOnly = rt.lockReadOnly;
74
+ m_deleteRecordFn = rt.m_deleteRecordFn;
75
+ m_copyDataFn = rt.m_copyDataFn;
76
+
77
+ }
78
+ return *this;
79
+
80
+ }
81
+ };
82
+
83
+ void database::destroy(database* db) {delete db;}
84
+
85
+ database::database() : nsdatabase()
86
+ {
87
+ m_impl = new dbimple();
88
+ }
89
+
90
+ database::~database()
91
+ {
92
+ close();
93
+ delete m_impl;
94
+ }
95
+
96
+ void database::release()
97
+ {
98
+ if (m_impl->dbDef)
99
+ {
100
+ m_impl->dbDef->release();
101
+ m_impl->dbDef = NULL;
102
+ }
103
+ nsdatabase::release();
104
+ }
105
+
106
+ dbdef* database::dbDef() const {return m_impl->dbDef;}
107
+
108
+ const _TCHAR* database::rootDir() const {return m_impl->rootDir;}
109
+
110
+ void database::setRootDir(const _TCHAR* directory) {setDir(directory);}
111
+
112
+ void* database::optionalData() const {return m_impl->optionalData;}
113
+
114
+ void database::setOptionalData(void* v) {m_impl->optionalData = v;}
115
+
116
+ bool database::tableReadOnly() const {return m_impl->isTableReadOnly;}
117
+
118
+ const deleteRecordFn database::onDeleteRecord() const {return m_impl->m_deleteRecordFn;}
119
+
120
+ void database::setOnDeleteRecord(const deleteRecordFn v) {m_impl->m_deleteRecordFn = v;}
121
+
122
+ const copyDataFn database::onCopyData() const {return m_impl->m_copyDataFn;}
123
+
124
+ void database::setOnCopyData(const copyDataFn v) {m_impl->m_copyDataFn = v;}
125
+
126
+ void database::setLockReadOnly(bool v) {m_impl->lockReadOnly = v;}
127
+
128
+ bool database::isOpened() const {return m_impl->isOpened;}
129
+
130
+ void database::create(const _TCHAR* fullpath, short type)
131
+ {
132
+ if (!m_impl->dbDef)
133
+ m_impl->dbDef = new dbdef(this, type); // Create TabelDef here.
134
+ m_impl->dbDef->create(fullpath);
135
+ m_stat = m_impl->dbDef->stat();
136
+ }
137
+
138
+ void database::drop()
139
+ {
140
+ if (m_impl->dbDef == NULL)
141
+ m_stat = STATUS_DB_YET_OPEN;
142
+ _TCHAR FullPath[MAX_PATH];
143
+ std::vector<std::_tstring>fileNames;
144
+ for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
145
+ {
146
+ if (m_impl->dbDef->tableDefs(i))
147
+ {
148
+ _stprintf_s(FullPath, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), rootDir(),
149
+ m_impl->dbDef->tableDefs(i)->fileName());
150
+ fileNames.push_back(FullPath);
151
+ }
152
+ }
153
+ fileNames.push_back(m_impl->dbDef->uri());
154
+ close();
155
+ if (m_stat)
156
+ return;
157
+
158
+ for (size_t i = 0; i < fileNames.size(); i++)
159
+ {
160
+ nsdatabase::dropTable(fileNames[i].c_str());
161
+ if (m_stat && (m_stat == STATUS_TABLE_NOTOPEN))
162
+ return;
163
+ }
164
+ }
165
+
166
+ void database::dropTable(const _TCHAR* TableName)
167
+ {
168
+ _TCHAR FullPath[MAX_PATH];
169
+ _tcscpy(FullPath, rootDir());
170
+ _tcscat(FullPath, PSEPARATOR);
171
+ short index = m_impl->dbDef->tableNumByName(TableName);
172
+ if (index == -1)
173
+ m_stat = STATUS_TABLENAME_NOTFOUND;
174
+ else
175
+ _tcscat(FullPath, m_impl->dbDef->tableDefs(index)->fileName());
176
+ nsdatabase::dropTable(FullPath);
177
+ }
178
+
179
+ void database::setDir(const _TCHAR* directory)
180
+ {
181
+ _tcscpy(m_impl->rootDir, directory);
182
+ }
183
+
184
+ database& database:: operator = (const database & rt)
185
+ {
186
+ if (&rt != this)
187
+ {
188
+ nsdatabase::operator=(rt);
189
+ m_impl->dbimple:: operator=(*(rt.m_impl));
190
+ rt.m_impl->dbDef->addref();
191
+ }
192
+ return *this;
193
+ }
194
+
195
+ database* database::clone()
196
+ {
197
+ if (!m_impl->dbDef)
198
+ m_impl->dbDef = new dbdef(this, TYPE_SCHEMA_BDF);
199
+ database* p = new database();
200
+ *p = *this;
201
+ return p;
202
+ }
203
+
204
+ void database::getBtrVersion(btrVersions* versions)
205
+ {
206
+ uchar_td* posblk = NULL;
207
+ if (m_impl->dbDef)
208
+ posblk = const_cast<uchar_td*>(m_impl->dbDef->posblk());
209
+ nsdatabase::getBtrVersion(versions, posblk);
210
+
211
+ }
212
+ void database::onCopyDataInternal(table* tb, int recordCount, int count, bool& cancel)
213
+ {
214
+ if (m_impl->m_copyDataFn)
215
+ m_impl->m_copyDataFn(this, recordCount, count, cancel);
216
+ }
217
+
218
+ void database::setTableReadOnly(bool value)
219
+ {
220
+ if (!m_impl->lockReadOnly)
221
+ m_impl->isTableReadOnly = value;
222
+ }
223
+
224
+ void database::doOpen(const _TCHAR* uri, short type, short mode, const _TCHAR* ownername)
225
+ {
226
+ m_stat = STATUS_SUCCESS;
227
+ m_impl->dbDef->setDefType(type);
228
+ m_impl->dbDef->open(uri, (char_td)mode, ownername);
229
+
230
+ if ((m_stat == STATUS_SUCCESS) &&
231
+ (m_impl->dbDef->m_stat == STATUS_INVALID_OWNERNAME) && (type == 0))
232
+ m_impl->dbDef->m_stat = STATUS_DIFFERENT_DBVERSION;
233
+
234
+ m_stat = m_impl->dbDef->m_stat;
235
+ m_impl->isOpened = (m_stat == STATUS_SUCCESS);//important
236
+ }
237
+
238
+ bool database::open(const _TCHAR* _uri, short type, short mode, const _TCHAR* dir,
239
+ const _TCHAR* ownername)
240
+ {
241
+
242
+ _TCHAR buf[MAX_PATH];
243
+ m_stat = STATUS_SUCCESS;
244
+ if (!m_impl->isOpened)
245
+ {
246
+ if (setUri(_uri) == false)
247
+ {
248
+ m_stat = 11;
249
+ return false;
250
+ }
251
+ if (dir && dir[0])
252
+ {
253
+ setDir(dir);
254
+ if (m_stat)
255
+ return false;
256
+ }
257
+ else
258
+ {
259
+ if (m_impl->rootDir[0] == 0x00)
260
+ {
261
+ nstable::getDirURI(uri(), buf);
262
+ setDir(buf);
263
+ if (m_stat)
264
+ return false;
265
+ }
266
+ }
267
+ if (!m_impl->dbDef)
268
+ m_impl->dbDef = new dbdef(this, type);
269
+
270
+ doOpen(_uri, type, mode, ownername);
271
+ if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd()
272
+ && _tcsstr(_uri, TRANSACTD_SCHEMANAME))
273
+ {
274
+ // Specified TRANSACTD_SCHEMANAME and no table
275
+ // Auto make schema.
276
+ create(_uri, TYPE_SCHEMA_BDF);
277
+ if (m_stat == STATUS_SUCCESS)
278
+ {
279
+ doOpen(_uri, type, mode, ownername);
280
+ if (m_stat == STATUS_SUCCESS)
281
+ {
282
+ m_impl->dbDef->autoMakeSchema();
283
+ m_impl->dbDef->close();
284
+ doOpen(_uri, type, mode, ownername);
285
+ }
286
+ }
287
+ }
288
+
289
+ }
290
+ if (m_impl->isOpened && onOpenAfter())
291
+ return true;
292
+
293
+ m_impl->isOpened = false;
294
+ m_impl->dbDef->close();
295
+ m_impl->dbDef->release();
296
+ m_impl->dbDef = NULL;
297
+ return false;
298
+ }
299
+
300
+ char* database::getContinuousList(int option)
301
+ {
302
+ char* fileList = (char*)malloc(64000);
303
+ memset(fileList, 0, 64000);
304
+ tabledef* TableDef;
305
+ _TCHAR buf[MAX_PATH];
306
+ char tmp[MAX_PATH];
307
+ char* tmpPtr;
308
+ for (short i = 0; i < m_impl->dbDef->tableCount(); i++)
309
+ {
310
+ TableDef = m_impl->dbDef->tableDefs(i);
311
+ if (TableDef)
312
+ {
313
+ getTableUri(buf, TableDef->id);
314
+ tmpPtr = (char*)toChar(tmp, buf, MAX_PATH);
315
+ char* p = strstr(tmpPtr, PSEPARATOR_A PSEPARATOR_A);
316
+ if (p)
317
+ p = strstr(p + 2, PSEPARATOR_A);
318
+ if (p == NULL)
319
+ p = tmpPtr;
320
+ strcat(fileList, p);
321
+ strcat(fileList, ",");
322
+ }
323
+ }
324
+ tmpPtr = (char*)toChar(tmp, uri(), MAX_PATH);
325
+ strcat(fileList, tmpPtr); // add schema table too.
326
+ return fileList;
327
+ }
328
+
329
+ short database::continuous(char_td IsEnd, bool inclideRepfile)
330
+ { // Local databse only.Cnat not use remote database.
331
+ if (!m_impl->isOpened)
332
+ return STATUS_DB_YET_OPEN;
333
+ char tmp[128] = {0x00};
334
+ char* buf = getContinuousList(inclideRepfile);
335
+ uint_td buflen = (uint_td)strlen(buf) + 1;
336
+ m_stat = m_btrcallid(TD_BACKUPMODE, tmp, buf, &buflen, 0, 0, IsEnd, clientID());
337
+ free(buf);
338
+ return m_stat;
339
+ }
340
+
341
+ void database::doClose()
342
+ {
343
+ m_stat = STATUS_SUCCESS;
344
+
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;
353
+ }
354
+
355
+ void database::close() {doClose();}
356
+
357
+ _TCHAR* database::getTableUri(_TCHAR* buf, short FileNum)
358
+ {
359
+ m_stat = STATUS_SUCCESS;
360
+ if ((m_impl->dbDef) && (m_impl->isOpened))
361
+ {
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());
365
+ else
366
+ _tcscpy(buf, m_impl->dbDef->tableDefs(FileNum)->fileName());
367
+ return buf;
368
+ }
369
+ m_stat = STATUS_DB_YET_OPEN;
370
+ return NULL;
371
+ }
372
+
373
+ table* database::openTable(const _TCHAR* TableName, short mode, bool AutoCreate,
374
+ const _TCHAR* OrnerName, const _TCHAR* pPath)
375
+ {
376
+ short filenum;
377
+ m_stat = 0;
378
+ if ((m_impl->dbDef) && (m_impl->isOpened))
379
+ {
380
+ filenum = m_impl->dbDef->tableNumByName(TableName);
381
+ if (filenum == -1)
382
+ {
383
+ m_stat = m_impl->dbDef->m_stat;
384
+ if (m_stat == STATUS_SUCCESS)
385
+ m_stat = STATUS_TABLENAME_NOTFOUND;
386
+
387
+ return NULL;
388
+ }
389
+ return openTable(filenum, mode, AutoCreate, OrnerName, pPath);
390
+ }
391
+ m_stat = STATUS_DB_YET_OPEN;
392
+ return NULL;
393
+ }
394
+
395
+ table* database::createTableObject()
396
+ {
397
+ return new table(this);
398
+ }
399
+
400
+ table* database::openTable(short FileNum, short mode, bool AutoCreate, const _TCHAR* OrnerName,
401
+ const _TCHAR* path)
402
+ {
403
+ /* Select directory
404
+ - Fiest, Specify Direct.
405
+ - Second, specified in filename.
406
+ - Thard, Smae as schem table.
407
+ */
408
+
409
+ _TCHAR buf[MAX_PATH];
410
+ bool regularDir = false;
411
+ bool NewFile = false;
412
+ m_stat = 0;
413
+
414
+ if ((!m_impl->dbDef) || (!m_impl->isOpened)) {
415
+ m_stat = STATUS_DB_YET_OPEN;
416
+ return NULL;
417
+ }
418
+ if (m_impl->rootDir[0] == 0x00)
419
+ {
420
+ m_stat = STATUS_DB_YET_OPEN;
421
+ return NULL;
422
+ }
423
+ tabledef* td = m_impl->dbDef->tableDefs(FileNum);
424
+ if (!td)
425
+ {
426
+ m_stat = STATUS_INVALID_TABLE_IDX;
427
+ return NULL;
428
+ }
429
+ table* tb = createTableObject();
430
+ dbdef::cacheFieldPos(td);
431
+
432
+ if ((path == NULL) || (path[0]==0x00))
433
+ {
434
+ if (_tcsstr(td->fileName(), PSEPARATOR) == NULL)
435
+ {
436
+ getTableUri(buf, FileNum);
437
+ regularDir = true;
438
+ }
439
+ else
440
+ _tcscpy(buf, td->fileName());
441
+ }
442
+ else
443
+ _tcscpy(buf, path);
444
+
445
+ if (m_impl->isTableReadOnly)
446
+ mode = TD_OPEN_READONLY;
447
+ tb->open(buf, (char_td)mode, OrnerName);
448
+ if ((tb->m_stat == STATUS_TABLE_NOTOPEN) || (tb->m_stat == ERROR_NOSPECIFY_TABLE))
449
+ {
450
+ if (AutoCreate)
451
+ {
452
+ createTable(FileNum, buf);
453
+ if (m_stat != STATUS_SUCCESS)
454
+ {
455
+ m_stat = tb->m_stat;
456
+ tb->release();
457
+ return NULL;
458
+ }
459
+ else
460
+ {
461
+ tb->open(buf, (char_td)mode);
462
+ if ((OrnerName) && (OrnerName[0]))
463
+ tb->setOwnerName(OrnerName);
464
+ NewFile = true;
465
+ }
466
+ }else
467
+ {
468
+ m_stat = tb->m_stat;
469
+ tb->release();
470
+ return NULL;
471
+ }
472
+ }
473
+ tb->init(td, FileNum, regularDir);
474
+
475
+ if ((m_stat != 0) || (tb->m_stat != 0) || !onTableOpened(tb, FileNum, mode, NewFile))
476
+ {
477
+ m_stat = tb->m_stat;
478
+ tb->release();
479
+ return NULL;
480
+ }
481
+ return tb;
482
+ }
483
+
484
+ bool database::createTable(short FileNum, const _TCHAR* FilePath)
485
+ {
486
+ if (isTransactdUri(FilePath))
487
+ {
488
+ if (setUseTransactd() == false)
489
+ return false;
490
+
491
+ char buf2[MAX_PATH]={0x00};
492
+ _TCHAR posblk[128] = {0x00};
493
+
494
+ const char* p = toServerUri(buf2, MAX_PATH, FilePath, isUseTransactd());
495
+
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());
499
+ }
500
+ else
501
+ {
502
+ const _TCHAR* buf;
503
+ fileSpec* fs = (fileSpec*) malloc(1024);
504
+ if (fs == NULL)
505
+ {
506
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
507
+ return false;
508
+ }
509
+ m_impl->dbDef->getFileSpec(fs, FileNum);
510
+ if (FilePath)
511
+ buf = FilePath;
512
+ else
513
+ buf = m_impl->dbDef->tableDefs(FileNum)->fileName();
514
+ nsdatabase::createTable(fs, 1024, buf, CR_SUBOP_BY_FILESPEC);
515
+ free(fs);
516
+ }
517
+ return (m_stat == 0);
518
+ }
519
+
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
+ short database::assignSchemaData(dbdef* src)
540
+ {
541
+ beginTrn();
542
+ int Count;
543
+
544
+ Count = 1;
545
+
546
+ dbdef* defDest = dbDef();
547
+ int recordCount = src->tableCount();
548
+
549
+ for (int i=0;i<=src->tableCount();i++)
550
+ {
551
+ tabledef* td = src->tableDefs(i);
552
+ if (td)
553
+ {
554
+ tabledef tdtmp = *td;
555
+ tdtmp.fieldCount = 0;
556
+ tdtmp.keyCount = 0;
557
+ defDest->insertTable(&tdtmp);
558
+ for (int j=0;j<td->fieldCount;++j)
559
+ {
560
+ fielddef& fd = td->fieldDefs[j];
561
+ *defDest->insertField(td->id, j) = fd;
562
+ }
563
+ for (int j=0;j<td->keyCount;++j)
564
+ {
565
+ keydef& kd = td->keyDefs[j];
566
+ *defDest->insertKey(td->id, j) = kd;
567
+ }
568
+ defDest->updateTableDef(td->id);
569
+ if (defDest->stat() != 0) break;
570
+ }
571
+ bool Cancel = false;
572
+ onCopyDataInternal(NULL, recordCount, Count, Cancel);
573
+ if (Cancel)
574
+ return -1;
575
+ Count++;
576
+ }
577
+
578
+
579
+ if ((nstable::tdapErr((HWND)NULL, src->stat()) == 0) && (defDest->stat() == 0))
580
+ {
581
+ endTrn();
582
+ return 0;
583
+ }
584
+ abortTrn();
585
+ if (nstable::tdapErr((HWND)NULL, src->stat()))
586
+ return src->stat();
587
+
588
+ return defDest->stat();
589
+ }
590
+
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)
598
+ {
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++)
611
+ {
612
+ for (j = 0; j < dest->tableDef()->fieldCount; j++)
613
+ {
614
+ if (strcmp(dest->tableDef()->fieldDefs[j].nameA(),
615
+ src->tableDef()->fieldDefs[i].nameA()) == 0)
616
+ {
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;
628
+ break;
629
+ }
630
+ else
631
+ NewFieldNum[i] = -1;
632
+
633
+ }
634
+ }
635
+ src->setKeyNum((char_td)keyNum);
636
+ if (keyNum == -1)
637
+ src->stepFirst();
638
+ else
639
+ src->seekFirst();
640
+ Count = 1;
641
+
642
+ int len;
643
+ while (1)
644
+ {
645
+ if (src->stat())
646
+ {
647
+ while (src->stat() != STATUS_EOF)
648
+ {
649
+ if (maxSkip != -1)
650
+ break;
651
+ if (recordCount < SkipCount + Count)
652
+ {
653
+ if (src->stat() == STATUS_IO_ERROR)
654
+ {
655
+ int n = moveVaileRecord(src);
656
+ if (n)
657
+ SkipCount = recordCount - n - Count;
658
+ else
659
+ break;
660
+ }
661
+ else
662
+ break;
663
+ }
664
+ if (keyNum == -1)
665
+ src->stepNext();
666
+ else
667
+ src->seekNext();
668
+
669
+ SkipCount++;
670
+ if (src->stat() == STATUS_SUCCESS)
671
+ break;
672
+
673
+ }
674
+ if (src->stat())
675
+ break;
676
+ }
677
+ dest->clearBuffer();
678
+ if (turbo)
679
+ {
680
+ if (dest->m_buflen + offset < src->datalen())
681
+ return STATUS_CANT_ALLOC_MEMORY;
682
+ if (offset)
683
+ memset(dest->fieldPtr(0), 0, offset);
684
+ memcpy((char*)dest->fieldPtr(0) + offset, src->fieldPtr(0), src->datalen());
685
+ }
686
+ 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++;
711
+
712
+ if (repData)
713
+ {
714
+
715
+ dest->m_datalen = src->m_datalen;
716
+ dest->tdap(TD_REC_INSERT);
717
+ }
718
+ else
719
+ ins_rows += dest->insert();
720
+ if (dest->stat() == STATUS_INVALID_VALLEN)
721
+ SkipCount++;
722
+ else if (dest->stat() == STATUS_DUPPLICATE_KEYVALUE)
723
+ SkipCount++;
724
+ else if (dest->stat() != STATUS_SUCCESS)
725
+ return dest->stat();
726
+ if (keyNum == -1)
727
+ src->stepNext();
728
+ else
729
+ src->seekNext();
730
+ }
731
+ if ((SkipCount) && (maxSkip == -1))
732
+ {
733
+ bool Cancel = false;
734
+ onCopyDataInternal(dest, recordCount, Count, Cancel);
735
+ if (Cancel)
736
+ return -1;
737
+ }
738
+
739
+ if (src->stat() == 9)
740
+ return 0;
741
+ return src->stat();
742
+ }
743
+ #pragma warn .8004
744
+
745
+ void database::doConvertTable(short TableIndex, bool Turbo, const _TCHAR* OwnerName)
746
+ {
747
+ table* src;
748
+ table* dest;
749
+ _TCHAR szTempPath[MAX_PATH];
750
+ _TCHAR buf[MAX_PATH];
751
+
752
+ short ret;
753
+ if (m_impl->dbDef->tableDefs(TABLE_NUM_TMP) == NULL)
754
+ {
755
+ m_stat = STATUS_NODEF_FOR_CONVERT;
756
+ return;
757
+ }
758
+
759
+ tabledef* TableDef = m_impl->dbDef->tableDefs(TABLE_NUM_TMP);
760
+ TableDef->fieldDefs = dbdef::getFieldDef(TableDef);
761
+ TableDef->keyDefs = dbdef::getKeyDef(TableDef);
762
+
763
+ src = openTable(TABLE_NUM_TMP, TD_OPEN_EXCLUSIVE, false, OwnerName);
764
+ if (!src)
765
+ return;
766
+
767
+ TableDef = m_impl->dbDef->tableDefs(TableIndex);
768
+ short len = TableDef->maxRecordLen;
769
+
770
+ TableDef->preAlloc = (ushort_td)(src->recordCount() / TableDef->pageSize / len);
771
+ TableDef->flags.bit2 = true;
772
+
773
+ _tcscpy(szTempPath, getTableUri(buf, TableIndex));
774
+
775
+ _TCHAR* pireod = _tcsrchr(szTempPath, '.');
776
+ if (pireod)
777
+ * pireod = 0x00;
778
+ _tcscat(szTempPath, _T("_conv_dest.tmp"));
779
+
780
+ createTable(TableIndex, szTempPath);
781
+ dest = openTable(TableIndex, TD_OPEN_EXCLUSIVE, true, NULL, szTempPath);
782
+ if (!dest)
783
+ {
784
+ src->release();
785
+ return;
786
+ }
787
+ beginTrn();
788
+ ret = 0;
789
+ dest->setNoUpdateTimeStamp(true);
790
+ if (src->recordCount(false)) // estimate
791
+ ret = copyTableData(dest, src, Turbo);
792
+ if (ret == 0)
793
+ endTrn();
794
+ else
795
+ abortTrn();
796
+ dest->release();
797
+ src->release();
798
+
799
+
800
+ if (ret == 0)
801
+ {
802
+ _TCHAR tmp[MAX_PATH];
803
+ _tcscpy(tmp, getTableUri(buf, TableIndex));
804
+ if (isUseTransactd())
805
+ swapTablename(szTempPath, tmp);
806
+ else
807
+ {
808
+
809
+ _TCHAR* pireod = _tcsrchr(tmp, '.');
810
+ if (pireod)
811
+ * pireod = 0x00;
812
+ _tcscat(tmp, _T("_conv_src.tmp"));
813
+ rename(getTableUri(buf, TableIndex), tmp);
814
+ if (m_stat)
815
+ return;
816
+ rename(szTempPath, getTableUri(buf, TableIndex));
817
+ if (m_stat)
818
+ {
819
+ rename(tmp, getTableUri(buf, TableIndex));
820
+ return;
821
+ }
822
+ nsdatabase::dropTable(tmp);
823
+ }
824
+ }
825
+ else
826
+ m_stat = ret;
827
+
828
+ }
829
+
830
+ void database::convertTable(short tableIndex, bool turbo, const _TCHAR* ownername)
831
+ {
832
+ doConvertTable(tableIndex, turbo, ownername);
833
+ }
834
+
835
+ bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
836
+ {
837
+
838
+ if (TableIndex == TABLE_NUM_TMP)
839
+ {
840
+ m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->fieldDefs =
841
+ 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));
843
+ }
844
+ table* bao = openTable(TableIndex, TD_OPEN_READONLY, false, OwnerName);
845
+ bool ret = false;
846
+ if (m_stat == STATUS_TABLE_NOTOPEN)
847
+ ret = false;
848
+ else if (m_stat == STATUS_INVALID_OWNERNAME)
849
+ ret = true;
850
+ else if (m_stat == STATUS_SUCCESS)
851
+ ret = true;
852
+ if (bao)
853
+ bao->release();
854
+ m_stat = 0;
855
+ return ret;
856
+ }
857
+
858
+
859
+ }// namespace client
860
+ }// namespace btrv
861
+ }// namespace protocol
862
+ }// namespace db
863
+ }// namespace bzs