transactd 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,1640 @@
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 "dbDef.h"
23
+ #include "database.h"
24
+ #include <bzs/rtl/strtrim.h>
25
+ #include <limits.h>
26
+ #include <stdio.h>
27
+
28
+ #include "fileDDF.h"
29
+ #include "fieldDDF.h"
30
+ #include "indexDDF.h"
31
+
32
+ #pragma package(smart_init)
33
+
34
+ namespace bzs
35
+ {
36
+ namespace db
37
+ {
38
+ namespace protocol
39
+ {
40
+ namespace tdap
41
+ {
42
+ namespace client
43
+ {
44
+
45
+ static const _TUCHAR BDFFORMAT_VERSION[] = _T("2.000.00");
46
+ static const _TUCHAR ow0[11] = {46, 46, 83, 67, 46, 46, 46, 46, 93, 4, 0};
47
+ static const _TUCHAR ow1[11] = {46, 46, 83, 67, 46, 46, 46, 46, 66, 5, 0};
48
+ static const _TUCHAR ow2[11] = {46, 46, 83, 67, 46, 46, 46, 46, 212, 5, 0};
49
+ using namespace bzs::rtl;
50
+
51
+ class ownerNameSetter : public nstable
52
+ {
53
+ void onReadAfter(){};
54
+ void writeRecordData(){};
55
+ public:
56
+ ownerNameSetter(nsdatabase *pbe):nstable(pbe){};
57
+ using nstable::open;
58
+ };
59
+
60
+ static const int BDFMAXBUFFER = 32384;
61
+
62
+ struct dbdimple
63
+ {
64
+ char keybuf[128];
65
+ tabledef* bdf;
66
+ int bdfLen;
67
+ bool noWriteMode;
68
+ short deftype;
69
+ _TCHAR userName[20];
70
+ tabledef* tableDefs[TABLE_NUM_TMP+1];
71
+ _TCHAR version[9];
72
+ ushort_td maxid;
73
+ short tableCount;
74
+ void* relateData;
75
+ short openMode;
76
+
77
+ dbdimple() : bdf(NULL), bdfLen(BDFMAXBUFFER), noWriteMode(false), tableCount(0),
78
+ relateData(NULL), openMode(1), maxid(0)
79
+ {
80
+ memset(tableDefs, 0, (TABLE_NUM_TMP+1)*sizeof(tabledef*));
81
+ _tcscpy(version, (const _TCHAR*)BDFFORMAT_VERSION);
82
+ }
83
+ };
84
+
85
+ dbdef::dbdef(nsdatabase *pbe, short DefType) : nstable(pbe)
86
+ {
87
+ m_impl = new dbdimple();
88
+ m_impl->deftype = DefType;
89
+ m_keybuflen = 128;
90
+ m_keybuf = &m_impl->keybuf[0];
91
+ setShared();
92
+
93
+ }
94
+
95
+ dbdef::~dbdef()
96
+ {
97
+ if (m_impl->bdf)
98
+ free(m_impl->bdf);
99
+
100
+ for (int i = 0; i <= m_impl->tableCount; i++)
101
+ {
102
+ if (m_impl->tableDefs[i] && (m_impl->tableDefs[i] != (tabledef*)-1) &&
103
+ (m_impl->tableDefs[i] != m_impl->bdf))
104
+ free(m_impl->tableDefs[i]);
105
+ }
106
+ if (m_impl->tableDefs[TABLE_NUM_TMP])
107
+ free(m_impl->tableDefs[TABLE_NUM_TMP]);
108
+ if (m_impl->relateData)
109
+ free(m_impl->relateData);
110
+ delete m_impl;
111
+ }
112
+
113
+ void dbdef::setDefType(short defType) {m_impl->deftype = defType;}
114
+
115
+ short dbdef::tableCount() const {return m_impl->tableCount;}
116
+
117
+ void* dbdef::relateData() const {return m_impl->relateData;}
118
+
119
+ short dbdef::openMode() const {return m_impl->openMode;}
120
+
121
+ int dbdef::version() const {return m_impl->version[7] - '0';};
122
+
123
+ void dbdef::setVersion(int v) {m_impl->version[7] = (char)v;}
124
+
125
+ void* dbdef::allocRelateData(int size)
126
+ {
127
+ if (m_impl->relateData)
128
+ free(m_impl->relateData);
129
+ m_impl->relateData = malloc(size);
130
+ return m_impl->relateData;
131
+ }
132
+ keylen_td dbdef::writeKeyData()
133
+ {
134
+ return 2;
135
+ }
136
+ void dbdef::moveById(short id)
137
+ {
138
+ while (1)
139
+ {
140
+ m_pdata = m_impl->bdf;
141
+ m_buflen = m_impl->bdfLen;
142
+ memcpy(m_keybuf, &id, 2);
143
+ seek();
144
+ if (m_stat == STATUS_BUFFERTOOSMALL)
145
+ {
146
+ if (!resizeReadBuf())
147
+ return;
148
+ }
149
+ else
150
+ break;
151
+ }
152
+
153
+ }
154
+
155
+ bool dbdef::resizeReadBuf(void)
156
+ {
157
+ m_impl->bdf = (tabledef*) realloc(m_impl->bdf, m_impl->bdfLen + BDFMAXBUFFER);
158
+ if (m_impl->bdf == NULL)
159
+ {
160
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
161
+ return false;
162
+ }
163
+ m_impl->bdfLen += BDFMAXBUFFER;
164
+ return true;
165
+ }
166
+
167
+ keydef* dbdef::getKeyDef(tabledef* p)
168
+ {
169
+ // keydefPos = size of tabledef �{ size of fielddef x number
170
+ return (keydef*)((char*) p +sizeof(tabledef) + (p->fieldCount*sizeof(fielddef)));
171
+ }
172
+
173
+ fielddef* dbdef::getFieldDef(tabledef* p)
174
+ {
175
+
176
+ return (fielddef*)((char*) p +sizeof(tabledef));
177
+ }
178
+
179
+ void dbdef::setRecordLen(short TableIndex)
180
+ {
181
+ tableDefs(TableIndex)->maxRecordLen = getRecordLen(TableIndex);
182
+
183
+ // If valible length then specifing fixed length.
184
+ if ((tableDefs(TableIndex)->fixedRecordLen == 0) ||
185
+ (tableDefs(TableIndex)->flags.bit0 == false))
186
+ tableDefs(TableIndex)->fixedRecordLen = tableDefs(TableIndex)->maxRecordLen;
187
+
188
+ }
189
+
190
+ void dbdef::setCodePage(tabledef* td)
191
+ {
192
+ if (td->charsetIndex == 0)
193
+ td->charsetIndex = mysql::charsetIndex(GetACP());
194
+
195
+ for (short i = 0; i < td->fieldCount; i++)
196
+ {
197
+ fielddef& fd = td->fieldDefs[i];
198
+ if (fd.charsetIndex() == 0)
199
+ fd.setCharsetIndex(td->charsetIndex);
200
+ fd.setSchemaCodePage(td->schemaCodePage);
201
+ }
202
+ }
203
+
204
+ void dbdef::updateTableDef(short TableIndex)
205
+ {
206
+ m_stat = STATUS_SUCCESS;
207
+ tabledef* td = tableDefs(TableIndex);
208
+ short i = (short)(td->fieldCount - 1);
209
+ short j;
210
+ short ret;
211
+ short Fnum;
212
+ uchar_td type;
213
+
214
+ td->optionFlags.bitA = false; // reset valiable type
215
+
216
+
217
+ for (; i >= 0; --i)
218
+ {
219
+ ret = fieldNumByName(TableIndex, td->fieldDefs[i].name());
220
+ if ((ret != -1) && (ret != i))
221
+ {
222
+ m_stat = STATUS_DUPLICATE_FIELDNAME;
223
+ return;
224
+ }
225
+ // Check field length.
226
+ type = td->fieldDefs[i].type;
227
+ ret = validLen(type, td->fieldDefs[i].len);
228
+ if (!ret)
229
+ {
230
+ m_stat = STATUS_INVALID_FIELDLENGTH;
231
+ return;
232
+ }
233
+ // Note or Lvar type must be the last of fields.
234
+ if ((type == ft_note) || (type == ft_lvar))
235
+ {
236
+ if (i != td->fieldCount - 1) {
237
+ m_stat = STATUS_LVAR_NOTE_NOT_LAST;
238
+ return;
239
+ }
240
+ }
241
+
242
+ // Check valiable type
243
+ if (!td->flags.bit0 && ((type == ft_myvarchar) || (type == ft_myvarbinary) ||
244
+ (type == ft_mywvarchar) || (type == ft_mywvarbinary)))
245
+ td->optionFlags.bitA = true;
246
+ if ((type == ft_myblob) || (type == ft_mytext))
247
+ td->optionFlags.bitB = true;
248
+
249
+ // If valiable length then cannot use blob.
250
+ if (td->flags.bit0 && td->optionFlags.bitB)
251
+ {
252
+ m_stat = STATUS_LVAR_NOTE_NOT_LAST;
253
+ return;
254
+ }
255
+
256
+ }
257
+
258
+ // Check invalid key type
259
+ for (i = 0; i < td->keyCount; i++)
260
+ {
261
+ for (j = 0; j < td->keyDefs[i].segmentCount; j++)
262
+ {
263
+ Fnum = td->keyDefs[i].segments[j].fieldNum;
264
+ ret = isPassKey(td->fieldDefs[Fnum].type);
265
+ if (!ret)
266
+ {
267
+ m_stat = STATUS_INVALID_KEYTYPE;
268
+ return;
269
+ }
270
+ }
271
+ }
272
+
273
+ // Chack duplicate table name.
274
+ for (i = 1; i < m_impl->tableCount; i++)
275
+ {
276
+ if ((tableDefs(i)) && (i != TableIndex))
277
+ {
278
+ if (strcmp(tableDefs(i)->tableNameA(), td->tableNameA()) == 0)
279
+ {
280
+ m_stat = STATUS_DUPPLICATE_KEYVALUE;
281
+ return;
282
+ }
283
+ }
284
+ }
285
+ setCodePage(td);
286
+
287
+ setRecordLen(TableIndex);
288
+ td = tableDefs(TableIndex);
289
+ if (m_impl->noWriteMode)
290
+ {
291
+ m_stat = STATUS_ACCESS_DENIED;
292
+ return;
293
+ }
294
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
295
+ saveDDF(TableIndex, 3);
296
+ else
297
+ {
298
+ moveById(td->id);
299
+ if (m_stat == STATUS_SUCCESS)
300
+ {
301
+ m_pdata = td;
302
+ m_buflen = totalDefLength(TableIndex);
303
+ cacheFieldPos(td);
304
+ td->formatVersion = 1;
305
+ update();
306
+ m_pdata = m_impl->bdf;
307
+ m_buflen = m_impl->bdfLen;
308
+ }
309
+ }
310
+
311
+ }
312
+
313
+ void dbdef::deleteTable(short TableIndex)
314
+ {
315
+ m_stat = STATUS_SUCCESS;
316
+ if (m_impl->noWriteMode)
317
+ {
318
+ free(tableDefs(TableIndex));
319
+ m_impl->tableDefs[TableIndex] = NULL;
320
+ return;
321
+ }
322
+
323
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
324
+ saveDDF(TableIndex, 4);
325
+ else
326
+ {
327
+ moveById(tableDefs(TableIndex)->id);
328
+ if (m_stat == STATUS_SUCCESS)
329
+ {
330
+ m_pdata = tableDefs(TableIndex);
331
+ m_buflen = totalDefLength(TableIndex);
332
+ del();
333
+ m_pdata = m_impl->bdf;
334
+ m_buflen = m_impl->bdfLen;
335
+
336
+ }
337
+ }
338
+ if (m_stat == STATUS_SUCCESS)
339
+ {
340
+ free(tableDefs(TableIndex));
341
+ m_impl->tableDefs[TableIndex] = NULL;
342
+ }
343
+
344
+ }
345
+
346
+ void dbdef::renumberFieldNum(short TableIndex, short Index, short op)
347
+ {
348
+ int i, j;
349
+ keydef* KeyDef;
350
+
351
+ for (i = 0; i < tableDefs(TableIndex)->keyCount; i++)
352
+ {
353
+ KeyDef = &(tableDefs(TableIndex)->keyDefs[i]);
354
+
355
+ for (j = 0; j < KeyDef->segmentCount; j++)
356
+ {
357
+ switch (op)
358
+ {
359
+ case 2:
360
+ if (KeyDef->segments[j].fieldNum >= Index)
361
+ KeyDef->segments[j].fieldNum++;
362
+ break;
363
+ case 4:
364
+ if (KeyDef->segments[j].fieldNum > Index)
365
+ KeyDef->segments[j].fieldNum--;
366
+ break;
367
+ }
368
+ }
369
+ }
370
+ }
371
+
372
+ bool dbdef::isUsedField(short TableIndex, short DeleteIndex)
373
+ {
374
+ int i, j;
375
+ keydef* KeyDef;
376
+
377
+ for (i = 0; i < tableDefs(TableIndex)->keyCount; i++)
378
+ {
379
+ KeyDef = &(tableDefs(TableIndex)->keyDefs[i]);
380
+ for (j = 0; j < KeyDef->segmentCount; j++)
381
+ {
382
+ if (KeyDef->segments[j].fieldNum == DeleteIndex)
383
+ return true;
384
+ }
385
+ }
386
+ return false;
387
+ }
388
+
389
+ void dbdef::deleteField(short TableIndex, short DeleteIndex)
390
+ {
391
+ m_stat = STATUS_SUCCESS;
392
+ if (isUsedField(TableIndex, DeleteIndex) == true) {
393
+ m_stat = STATUS_USE_KEYFIELD;
394
+ return;
395
+ }
396
+ renumberFieldNum(TableIndex, DeleteIndex, 4);
397
+ tabledef* td = tableDefs(TableIndex);
398
+ if ((DeleteIndex == td->fieldCount - 1) && (td->keyCount == 0))
399
+ {
400
+ }
401
+ else
402
+ {
403
+ memmove(&td->fieldDefs[DeleteIndex], &td->fieldDefs[DeleteIndex + 1],
404
+ totalDefLength(TableIndex) + (char*)td - (char*)&(td->fieldDefs[DeleteIndex + 1]));
405
+ }
406
+ td->fieldCount--;
407
+ td->keyDefs = getKeyDef(tableDefs(TableIndex));
408
+ updateTableDef(TableIndex);
409
+
410
+ }
411
+
412
+ void dbdef::deleteKey(short TableIndex, short DeleteIndex)
413
+ {
414
+ m_stat = STATUS_SUCCESS;
415
+ tabledef* td = tableDefs(TableIndex);
416
+ if (DeleteIndex != td->keyCount - 1)
417
+ {
418
+ memmove(&td->keyDefs[DeleteIndex], &td->keyDefs[DeleteIndex + 1],
419
+ totalDefLength(TableIndex) + (char*)td - (char*)&(td->keyDefs[DeleteIndex + 1]));
420
+ }
421
+ td->keyCount--;
422
+ if ((td->primaryKeyNum == DeleteIndex) || (td->primaryKeyNum > td->keyCount - 1))
423
+ td->primaryKeyNum = -1;
424
+ if ((td->parentKeyNum == DeleteIndex) || (td->parentKeyNum > td->keyCount - 1))
425
+ td->parentKeyNum = -1;
426
+ if ((td->replicaKeyNum == DeleteIndex) || (td->replicaKeyNum > td->keyCount - 1))
427
+ td->replicaKeyNum = -1;
428
+
429
+ updateTableDef(TableIndex);
430
+ }
431
+
432
+ void dbdef::insertTable(tabledef* TableDef)
433
+ {
434
+ m_stat = STATUS_SUCCESS;
435
+ if (TableDef->id > TABLE_NUM_TMP)
436
+ {
437
+ m_stat = STATUS_TOO_MANY_TABLES;
438
+ return;
439
+ }
440
+ if (tableDefs(TableDef->id) != NULL)
441
+ {
442
+ m_stat = STATUS_DUPPLICATE_KEYVALUE;
443
+ return;
444
+ }
445
+
446
+ if (tableNumByName(TableDef->tableName()) != -1)
447
+ {
448
+ m_stat = STATUS_DUPPLICATE_KEYVALUE;
449
+ return;
450
+ }
451
+ if (TableDef->fieldCount > 512)
452
+ {
453
+ m_stat = STATUS_TOO_MANY_FIELDS;
454
+ return;
455
+ }
456
+ m_impl->tableDefs[TableDef->id] = (tabledef*)malloc(USHRT_MAX /* sizeof(tabledef) */);
457
+ if (m_impl->tableDefs[TableDef->id] == NULL)
458
+ {
459
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
460
+ return;
461
+ }
462
+ if ((TableDef->ddfid == 0) && (m_impl->deftype == TYPE_SCHEMA_DDF))
463
+ TableDef->ddfid = getDDFNewTableIndex();
464
+ memcpy(m_impl->tableDefs[TableDef->id], TableDef, sizeof(tabledef));
465
+ if (m_impl->noWriteMode)
466
+ {
467
+ if (m_impl->tableCount < TableDef->id)
468
+ m_impl->tableCount = TableDef->id;
469
+ return;
470
+ }
471
+ TableDef->formatVersion = 1;
472
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
473
+ saveDDF(TableDef->id, 2);
474
+ else
475
+ {
476
+ memcpy(m_impl->bdf, TableDef, sizeof(tabledef));
477
+ m_pdata = m_impl->bdf;
478
+
479
+ memcpy(m_keybuf, &TableDef->id, 2);
480
+ m_buflen = sizeof(tabledef);
481
+ insert();
482
+ m_pdata = m_impl->bdf;
483
+ m_buflen = m_impl->bdfLen;
484
+ }
485
+ if (m_stat != 0)
486
+ {
487
+ free(m_impl->tableDefs[TableDef->id]);
488
+ m_impl->tableDefs[TableDef->id] = NULL;
489
+ }
490
+ else
491
+ {
492
+ if (m_impl->tableCount < TableDef->id)
493
+ m_impl->tableCount = TableDef->id;
494
+ }
495
+ }
496
+
497
+ bool dbdef::resizeAt(short TableIndex, bool key)
498
+ {
499
+ uint_td addsize;
500
+
501
+ if (key == true)
502
+ addsize = sizeof(keydef);
503
+ else
504
+ addsize = sizeof(fielddef);
505
+
506
+ uint_td size = totalDefLength(TableIndex) + addsize;
507
+ tabledef* def = m_impl->tableDefs[TableIndex];
508
+ void* p = malloc(size);
509
+ if (p)
510
+ {
511
+ memcpy(p, def, totalDefLength(TableIndex));
512
+ free(def);
513
+ m_impl->tableDefs[TableIndex] = def = (tabledef*)p;
514
+
515
+ }
516
+ else
517
+ {
518
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
519
+ return false;
520
+ }
521
+ // init for resize
522
+ def->fieldDefs = getFieldDef(def);
523
+ def->keyDefs = getKeyDef(def);
524
+ return true;
525
+ }
526
+
527
+ keydef* dbdef::insertKey(short TableIndex, short InsertIndex)
528
+ {
529
+
530
+ if (resizeAt(TableIndex, true) == false)
531
+ return NULL;
532
+
533
+
534
+ if (InsertIndex < tableDefs(TableIndex)->keyCount)
535
+ {
536
+ memmove(&tableDefs(TableIndex)->keyDefs[InsertIndex + 1],
537
+ &tableDefs(TableIndex)->keyDefs[InsertIndex],
538
+ totalDefLength(TableIndex) + (char*)tableDefs(TableIndex) -
539
+ (char*)&(tableDefs(TableIndex)->keyDefs[InsertIndex]));
540
+ }
541
+ tableDefs(TableIndex)->keyCount++;
542
+ memset(&(tableDefs(TableIndex)->keyDefs[InsertIndex]), 0, sizeof(keydef));
543
+
544
+ if ((!m_impl->noWriteMode) && (m_impl->deftype != TYPE_SCHEMA_DDF))
545
+ updateTableDef(TableIndex);
546
+ else
547
+ setRecordLen(TableIndex);
548
+ return &(tableDefs(TableIndex)->keyDefs[InsertIndex]);
549
+ }
550
+
551
+ fielddef* dbdef::insertField(short TableIndex, short InsertIndex)
552
+ {
553
+ if (resizeAt(TableIndex, false) == false)
554
+ return NULL;
555
+
556
+ tabledef* td = tableDefs(TableIndex);
557
+ if ((InsertIndex < td->fieldCount) || (td->keyCount > 0))
558
+ {
559
+
560
+ memmove(&(td->fieldDefs[InsertIndex + 1]), &(td->fieldDefs[InsertIndex]),
561
+ totalDefLength(TableIndex) + (char*)td - (char*)&(td->fieldDefs[InsertIndex]));
562
+ }
563
+ td->fieldCount++;
564
+ td->keyDefs = getKeyDef(td);
565
+ renumberFieldNum(TableIndex, InsertIndex, 2);
566
+ memset(&(td->fieldDefs[InsertIndex]), 0, sizeof(fielddef));
567
+ setRecordLen(TableIndex);
568
+ fielddef* fd = &(td->fieldDefs[InsertIndex]);
569
+ fd->setCharsetIndex(td->charsetIndex);
570
+ return fd;
571
+ }
572
+
573
+ int dbdef::totalDefLength(short TableIndex)
574
+ {
575
+ return (int)(sizeof(tabledef) + (sizeof(fielddef) * tableDefs(TableIndex)->fieldCount) +
576
+ (sizeof(keydef) * tableDefs(TableIndex)->keyCount));
577
+ }
578
+
579
+ inline fielddef_t_my& dbdef::convert(fielddef_t_my& fd_my, const fielddef_t_pv& fd_pv)
580
+ {
581
+ memset(&fd_my, 0, sizeof(fd_my));
582
+ strcpy(fd_my.m_name, fd_pv.m_name);
583
+ void* dest = (char*)&fd_my + sizeof(fd_my.m_name);
584
+ const void* src = (char*)&fd_pv + sizeof(fd_pv.m_name);
585
+ size_t size = sizeof(fd_my) - sizeof(fd_my.m_name);
586
+ memcpy(dest, src, size);
587
+ return fd_my;
588
+ }
589
+
590
+ size_t getNewVersionSize(tabledef* src)
591
+ {
592
+ return src->fieldCount * sizeof(fielddef) + sizeof(tabledef)
593
+ + src->keyCount * sizeof(keydef)+1;
594
+
595
+ }
596
+
597
+ void dbdef::tableDefCopy(tabledef* dest, tabledef* src, size_t size)
598
+ {
599
+ if (src->formatVersion == 0)
600
+ {
601
+ size_t len = 0;
602
+ memcpy(dest, src, sizeof(tabledef));
603
+ len += sizeof(tabledef);
604
+ fielddef_t_my* fd = (fielddef_t_my*)dbdef::getFieldDef(dest);
605
+ fielddef_t_pv* src_fd = (fielddef_t_pv*)dbdef::getFieldDef(src);
606
+ for (int i=0;i<dest->fieldCount;++i)
607
+ {
608
+ convert(*fd , *src_fd);
609
+ len += sizeof(fielddef_t_pv);
610
+ ++fd;
611
+ ++src_fd;
612
+ }
613
+ memcpy(fd, src_fd, size - len);
614
+ dest->formatVersion = 1;
615
+ }
616
+ else
617
+ memcpy(dest, src, size);
618
+
619
+ }
620
+
621
+ tabledef** dbdef::tableDefPtr(int index)
622
+ {
623
+ tableDefs(index);
624
+ return &m_impl->tableDefs[index];
625
+ }
626
+
627
+ #pragma warn -8004
628
+ tabledef* dbdef::tableDefs(int index)
629
+ {
630
+ if (index > TABLE_NUM_TMP)
631
+ return NULL;
632
+ tabledef* def = m_impl->tableDefs[index];
633
+
634
+ if (index == TABLE_NUM_TMP)
635
+ return def;
636
+ if (m_impl->tableCount < index)
637
+ return NULL;
638
+ if (def == NULL)
639
+ {
640
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
641
+ return NULL;
642
+ while (1)
643
+ {
644
+ m_pdata = m_impl->bdf;
645
+ m_buflen = m_impl->bdfLen;
646
+ m_impl->bdf->id = (short)index;
647
+ memcpy(m_keybuf, &m_impl->bdf->id, 2);
648
+ seek();
649
+ if (m_stat == STATUS_BUFFERTOOSMALL)
650
+ {
651
+ if (!resizeReadBuf())
652
+ return NULL;
653
+ }
654
+ else
655
+ break;
656
+ }
657
+ if (m_stat && (m_stat != STATUS_NOT_FOUND_TI))
658
+ {
659
+ return NULL;
660
+ }
661
+ if (m_stat)
662
+ {
663
+ def = (tabledef*)-1;
664
+ m_stat = 0;
665
+ return NULL;
666
+ }
667
+
668
+ m_impl->tableDefs[index] = def = (tabledef*)malloc(getNewVersionSize((tabledef*)m_pdata));
669
+
670
+ if (def == NULL)
671
+ {
672
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
673
+ return NULL;
674
+ }
675
+ tableDefCopy(def, (tabledef*)m_pdata, m_datalen);
676
+ def->fieldDefs = getFieldDef(def);
677
+ def->keyDefs = getKeyDef(def);
678
+ def->autoIncExSpace = ((database*)nsdb())->defaultAutoIncSpace();
679
+
680
+ setCodePage(def);
681
+
682
+
683
+ }
684
+ else if (def == (tabledef*)-1)
685
+ return NULL;
686
+
687
+ return def;
688
+ }
689
+ #pragma warn .8004
690
+
691
+ void dbdef::doOpen(const _TCHAR* FullPath, char_td mode, const _TCHAR* OnerName)
692
+ {
693
+ m_impl->noWriteMode = true;
694
+
695
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
696
+ {
697
+
698
+ openDdf(((database*)nsdb())->rootDir(), mode, OnerName); // DDF
699
+ if (mode != TD_OPEN_READONLY)
700
+ m_impl->noWriteMode = false;
701
+ return;
702
+ }
703
+
704
+ //version check
705
+ m_impl->version[7] = '0';
706
+ nstable::doOpen(FullPath, mode, m_impl->version);
707
+ if (m_stat == STATUS_INVALID_OWNERNAME)
708
+ {
709
+ while (m_stat == STATUS_INVALID_OWNERNAME)
710
+ {
711
+ m_impl->version[7]++;
712
+ nstable::doOpen(FullPath, mode, m_impl->version);
713
+ if (m_impl->version[7] > '9')
714
+ return;
715
+ }
716
+ }
717
+ if (m_stat)
718
+ return;
719
+
720
+ if (m_impl->bdf == NULL)
721
+ m_impl->bdf = (tabledef*)malloc(m_impl->bdfLen);
722
+ m_pdata = m_impl->bdf;
723
+ memcpy(m_keybuf, &m_impl->bdf->id, 2);
724
+ m_buflen = m_impl->bdfLen;
725
+ m_keynum = 0;
726
+
727
+ seekLast();
728
+ if (m_stat == STATUS_SUCCESS)
729
+ m_impl->tableCount = m_impl->bdf->id;
730
+ if (m_stat == STATUS_EOF)
731
+ m_stat = STATUS_SUCCESS;
732
+ if (mode != TD_OPEN_READONLY)
733
+ m_impl->noWriteMode = false;
734
+ m_impl->openMode = mode;
735
+ }
736
+
737
+ void dbdef::doClose()
738
+ {
739
+ nstable::doClose();
740
+ if (m_impl->bdf)
741
+ {
742
+ free(m_impl->bdf);
743
+ m_impl->bdf = NULL;
744
+ }
745
+ m_impl->openMode = 1;
746
+ }
747
+
748
+ void dbdef::create(const _TCHAR* fullpath)
749
+ {
750
+
751
+ if (m_impl->deftype == TYPE_SCHEMA_DDF)
752
+ {
753
+ createDDF(fullpath);
754
+ return;
755
+ }
756
+ fileSpec *fs;
757
+
758
+ fs = (fileSpec*)malloc(512);
759
+ memset(fs, 512, 0x00);
760
+ fs->recLen = sizeof(tabledef);
761
+ fs->pageSize = 4096;
762
+ fs->indexCount = 1;
763
+ fs->fileFlag.all = 1; // valiable length
764
+ fs->preAlloc = 10;
765
+ fs->keySpecs[0].keyPos = 1; // id
766
+ fs->keySpecs[0].keyLen = 2; // short
767
+ fs->keySpecs[0].keyFlag.all = 258; // changeable and extended key type
768
+ fs->keySpecs[0].keyType = 1; // Integer
769
+ nsdb()->createTable(fs, 412, fullpath, 0);
770
+ free(fs);
771
+ if (nsdb()->stat() == 0)
772
+ { // set owner name
773
+ ownerNameSetter* bao = new ownerNameSetter(nsdb());
774
+ bao->open(fullpath);
775
+ bao->setOwnerName((const _TCHAR*) BDFFORMAT_VERSION);
776
+ bao->release();
777
+ }
778
+ m_stat = nsdb()->stat();
779
+ }
780
+
781
+ void dbdef::drop()
782
+ {
783
+ nsdb()->dropTable(uri());
784
+ m_stat = nsdb()->stat();
785
+ }
786
+
787
+ ushort_td dbdef::getRecordLen(short TableIndex)
788
+ {
789
+ ushort_td ret = 0;
790
+ short i;
791
+ for (i = 0; i < tableDefs(TableIndex)->fieldCount; i++)
792
+ ret += tableDefs(TableIndex)->fieldDefs[i].len + tableDefs(TableIndex)
793
+ ->fieldDefs[i].varLenBytes();
794
+ return ret;
795
+ }
796
+
797
+ ushort_td dbdef::getFieldPosition(tabledef *TableDef, short FieldNum)
798
+ {
799
+ short i;
800
+ ushort_td pos = 1;
801
+ for (i = 0; i < FieldNum; i++)
802
+ pos += TableDef->fieldDefs[i].len;
803
+ return pos;
804
+ }
805
+
806
+ void dbdef::getFileSpec(fileSpec* fs, short TableIndex)
807
+ {
808
+ keySpec* ks;
809
+ keydef* KeyDef;
810
+ short i, j, k = 0;
811
+ short FieldNum;
812
+ tabledef *TableDef = tableDefs(TableIndex);
813
+ fs->recLen = TableDef->fixedRecordLen;
814
+ fs->pageSize = TableDef->pageSize;
815
+ fs->indexCount = TableDef->keyCount;
816
+ fs->recCount = 0;
817
+ fs->fileFlag.all = TableDef->flags.all;
818
+ fs->reserve1[0] = 0;
819
+ fs->reserve1[1] = 0;
820
+ fs->preAlloc = TableDef->preAlloc;
821
+
822
+ for (i = 0; i < TableDef->keyCount; i++)
823
+ {
824
+ KeyDef = &(TableDef->keyDefs[i]);
825
+ for (j = 0; j < KeyDef->segmentCount; j++)
826
+ {
827
+ FieldNum = KeyDef->segments[j].fieldNum;
828
+ ks = &(fs->keySpecs[k]);
829
+ ks->keyPos = getFieldPosition(TableDef, FieldNum);
830
+ ks->keyLen = TableDef->fieldDefs[FieldNum].len;
831
+ ks->keyFlag.all = KeyDef->segments[j].flags.all;
832
+ ks->keyCount = 0;
833
+ ks->keyType = TableDef->fieldDefs[FieldNum].type;
834
+ if ((ks->keyType == ft_autoinc) && (KeyDef->segmentCount > 1))
835
+ ks->keyType = 1;
836
+ if (ks->keyFlag.bit3 == true)
837
+ ks->nullValue = TableDef->fieldDefs[FieldNum].nullValue;
838
+ else
839
+ ks->nullValue = 0;
840
+ ks->reserve2[0] = 0;
841
+ ks->reserve2[1] = 0;
842
+ if (fs->fileFlag.bitA == true)
843
+ ks->keyNo = KeyDef->keyNumber;
844
+ else
845
+ ks->keyNo = 0; ;
846
+ ks->acsNo = 0;
847
+ k++;
848
+ }
849
+ }
850
+ }
851
+
852
+ void dbdef::renumberTable(short OldIndex, short NewIndex)
853
+ {
854
+ if (NewIndex > TABLE_NUM_TMP)
855
+ {
856
+ m_stat = STATUS_TOO_MANY_TABLES;
857
+ return;
858
+ }
859
+ if (m_impl->noWriteMode)
860
+ {
861
+ tableDefs(OldIndex)->id = NewIndex;
862
+ m_impl->tableDefs[NewIndex] = tableDefs(OldIndex);
863
+ m_impl->tableDefs[OldIndex] = NULL;
864
+ if (NewIndex > m_impl->tableCount)
865
+ m_impl->tableCount = NewIndex;
866
+ return;
867
+ }
868
+ moveById(tableDefs(OldIndex)->id);
869
+ if (m_stat == STATUS_SUCCESS)
870
+ {
871
+ m_pdata = tableDefs(OldIndex);
872
+ m_buflen = totalDefLength(OldIndex);
873
+ tableDefs(OldIndex)->id = NewIndex;
874
+ update();
875
+ m_pdata = m_impl->bdf;
876
+ m_buflen = m_impl->bdfLen;
877
+
878
+ if (m_stat == STATUS_SUCCESS)
879
+ {
880
+ m_impl->tableDefs[NewIndex] = tableDefs(OldIndex);
881
+ m_impl->tableDefs[OldIndex] = NULL;
882
+ if (NewIndex > m_impl->tableCount)
883
+ m_impl->tableCount = NewIndex;
884
+ }
885
+ else
886
+ tableDefs(OldIndex)->id = OldIndex;
887
+ }
888
+ }
889
+
890
+ void dbdef::cacheFieldPos(tabledef *TableDef)
891
+ {
892
+
893
+ short i;
894
+ for (i = 0; i < TableDef->fieldCount; i++)
895
+ TableDef->fieldDefs[i].pos = (ushort_td)(getFieldPosition(TableDef, i) - 1);
896
+ }
897
+
898
+ short dbdef::fieldNumByViewNum(short TableIndex, short index)
899
+ {
900
+ short i;
901
+ tabledef *TableDef = tableDefs(TableIndex);
902
+ for (i = 0; i < TableDef->fieldCount; i++)
903
+ {
904
+ if ((TableDef->fieldDefs[i].viewNum == index) && (TableDef->fieldDefs[i].enableFlags.bit0))
905
+ return i;
906
+ }
907
+ return -1;
908
+ }
909
+
910
+ short dbdef::findKeynumByFieldNum(short TableIndex, short index)
911
+ {
912
+ short i;
913
+ tabledef *TableDef = tableDefs(TableIndex);
914
+
915
+ for (i = 0; i < TableDef->keyCount; i++)
916
+ {
917
+ if (TableDef->keyDefs[i].segments[0].fieldNum == index)
918
+ return i;
919
+ }
920
+ return -1;
921
+ }
922
+
923
+ short dbdef::tableNumByName(const _TCHAR* tableName)
924
+ {
925
+ short i;
926
+ char buf[74];
927
+
928
+ for (i = 1; i <= m_impl->tableCount; i++)
929
+ {
930
+ if (tableDefs(i))
931
+ {
932
+ const char* p = tableDefs(i)->toChar(buf, tableName, 74);
933
+ if (strcmp(tableDefs(i)->tableNameA(), p) == 0)
934
+ return i;
935
+ }
936
+ }
937
+ return -1;
938
+ }
939
+
940
+ short dbdef::fieldNumByName(short TableIndex, const _TCHAR* name)
941
+ {
942
+ short i;
943
+ char buf[74];
944
+ const char* p = tableDefs(TableIndex)->toChar(buf, name, 74);
945
+ for (i = 0; i < tableDefs(TableIndex)->fieldCount; i++)
946
+ {
947
+ if (strcmp(tableDefs(TableIndex)->fieldDefs[i].nameA(), p) == 0)
948
+ return i;
949
+ }
950
+ return -1;
951
+ }
952
+
953
+ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
954
+ { // return MaxLen or MinLen or DefaultLen or Dec of field type
955
+
956
+ uint_td maxlen;
957
+ uint_td minlen;
958
+ uint_td defaultlen;
959
+ int dec = -1;
960
+ switch (FieldType)
961
+ {
962
+ case ft_string:
963
+ case ft_mychar: minlen = 1;
964
+ maxlen = 255;
965
+ defaultlen = 1;
966
+ break;
967
+ case ft_lstring:
968
+ case ft_zstring: minlen = 2;
969
+ maxlen = 255;
970
+ defaultlen = 2;
971
+ break;
972
+ case ft_myvarchar:
973
+ case ft_myvarbinary: minlen = 1;
974
+ maxlen = 60000;
975
+ defaultlen = 2;
976
+ break;
977
+ case ft_myblob:
978
+ case ft_mytext: minlen = 9;
979
+ maxlen = 12;
980
+ defaultlen = 1;
981
+ break;
982
+ case ft_mywchar:
983
+ case ft_wstring: minlen = 2;
984
+ maxlen = 255;
985
+ defaultlen = 2;
986
+ break;
987
+ case ft_wzstring: minlen = 3;
988
+ maxlen = 255;
989
+ defaultlen = 2;
990
+ break;
991
+ case ft_mywvarchar:
992
+ case ft_mywvarbinary: minlen = 1;
993
+ maxlen = 60000;
994
+ defaultlen = 3;
995
+ break;
996
+
997
+ case ft_mydate: minlen = 3;
998
+ maxlen = 3;
999
+ defaultlen = 3;
1000
+ break;
1001
+ case ft_integer: minlen = 1;
1002
+ maxlen = 8;
1003
+ defaultlen = 2;
1004
+ break;
1005
+ case ft_bfloat:
1006
+ case ft_float: minlen = 4;
1007
+ maxlen = 8;
1008
+ defaultlen = 4;
1009
+ break;
1010
+ case ft_date:
1011
+ case ft_time: minlen = 4;
1012
+ maxlen = 4;
1013
+ defaultlen = 4;
1014
+ break;
1015
+ case ft_mytime: minlen = 3;
1016
+ maxlen = 6;
1017
+ defaultlen = 4;
1018
+ break;
1019
+ case ft_money:
1020
+ case ft_decimal: minlen = 1;
1021
+ maxlen = 10;
1022
+ defaultlen = 6;
1023
+ if (FieldType == 5)
1024
+ dec = 0;
1025
+ else
1026
+ dec = 2;
1027
+ break;
1028
+ case ft_logical: minlen = 1;
1029
+ maxlen = 2;
1030
+ defaultlen = 2;
1031
+ break;
1032
+ case ft_numericsts:
1033
+ case ft_numericsa:
1034
+ case ft_numeric: minlen = 1;
1035
+ maxlen = 15;
1036
+ defaultlen = 6;
1037
+ dec = 0;
1038
+ if (FieldType == 17)
1039
+ minlen = 2;
1040
+ break;
1041
+
1042
+ case ft_note: minlen = 2;
1043
+ maxlen = 32761;
1044
+ defaultlen = 2;
1045
+ break;
1046
+ case ft_lvar: minlen = 5;
1047
+ maxlen = 32761;
1048
+ defaultlen = 5;
1049
+ break;
1050
+ case ft_uinteger: minlen = 1;
1051
+ maxlen = 8;
1052
+ defaultlen = 2;
1053
+ break;
1054
+ case ft_autoinc: minlen = 2;
1055
+ maxlen = 4;
1056
+ defaultlen = 2;
1057
+ break;
1058
+ case ft_bit: minlen = 1;
1059
+ maxlen = 1;
1060
+ defaultlen = 1;
1061
+ break;
1062
+ case ft_timestamp:
1063
+ case ft_currency: minlen = 8;
1064
+ maxlen = 8;
1065
+ defaultlen = 8;
1066
+ break;
1067
+ case ft_mytimestamp: minlen = 4;
1068
+ maxlen = 7;
1069
+ defaultlen = 7;
1070
+ break;
1071
+ case ft_mydatetime: minlen = 5;
1072
+ maxlen = 8;
1073
+ defaultlen = 5;
1074
+ break;
1075
+
1076
+ case ft_nullindicator: minlen = 0;
1077
+ maxlen = 0;
1078
+ defaultlen = 0;
1079
+ }
1080
+ switch (query)
1081
+ {
1082
+ case eMinlen: return minlen;
1083
+ case eMaxlen: return maxlen;
1084
+ case eDefaultlen: return defaultlen;
1085
+ case eDecimals: return dec;
1086
+ }
1087
+ return 0;
1088
+
1089
+ }
1090
+
1091
+ bool dbdef::validLen(uchar_td FieldType, uint_td FieldLen)
1092
+ { // return valid length of field by field type.
1093
+ if ((FieldLen >= fieldValidLength(eMinlen, FieldType)) && (FieldLen <= fieldValidLength(eMaxlen,
1094
+ FieldType)))
1095
+ {
1096
+ if ((FieldType == ft_integer) || (FieldType == ft_uinteger))
1097
+ {
1098
+ if ((FieldLen == 1) || (FieldLen == 2) || (FieldLen == 4) || (FieldLen == 8))
1099
+ return true;
1100
+ else
1101
+ return false;
1102
+
1103
+ }
1104
+ else if (FieldType == ft_autoinc)
1105
+ {
1106
+ if ((FieldLen == 2) || (FieldLen == 4))
1107
+ return true;
1108
+ else
1109
+ return false;
1110
+ }
1111
+ else if ((FieldType == ft_float) || (FieldType == ft_bfloat))
1112
+ {
1113
+ if ((FieldLen == 4) || (FieldLen == 8))
1114
+ return true;
1115
+ else
1116
+ return false;
1117
+ }
1118
+ else
1119
+ return true;
1120
+ }
1121
+ return false;
1122
+ }
1123
+
1124
+ bool dbdef::isPassKey(uchar_td FieldType)
1125
+ {
1126
+ if (FieldType == ft_bit)
1127
+ return false;
1128
+ if (FieldType == ft_wstring)
1129
+ return true;
1130
+ if (FieldType == ft_wzstring)
1131
+ return true;
1132
+ if (FieldType == ft_myvarchar)
1133
+ return true;
1134
+ if (FieldType == ft_myvarbinary)
1135
+ return true;
1136
+ if (FieldType == ft_mywvarchar)
1137
+ return true;
1138
+ if (FieldType == ft_mywvarbinary)
1139
+ return true;
1140
+ if (FieldType == ft_mychar)
1141
+ return true;
1142
+ if (FieldType == ft_mywchar)
1143
+ return true;
1144
+
1145
+ if (FieldType == ft_mytext)
1146
+ return true;
1147
+ if (FieldType == ft_myblob)
1148
+ return true;
1149
+
1150
+ if (FieldType == ft_mydate)
1151
+ return true;
1152
+ if (FieldType == ft_mytime)
1153
+ return true;
1154
+ if (FieldType == ft_mydatetime)
1155
+ return true;
1156
+
1157
+ if (FieldType > ft_numericsts)
1158
+ return false;
1159
+ if (FieldType == ft_note)
1160
+ return false;
1161
+ if (FieldType == ft_lvar)
1162
+ return false;
1163
+ return true;
1164
+ }
1165
+
1166
+ void dbdef::autoMakeSchema() {tdap(TD_AUTOMEKE_SCHEMA);}
1167
+
1168
+ void dbdef::createDDF(const _TCHAR* fullpath)
1169
+ {
1170
+ _TCHAR dir[MAX_PATH];
1171
+ _TCHAR Path[MAX_PATH];
1172
+ short chOpen = 0;
1173
+
1174
+ getDirURI(fullpath, dir);
1175
+ fileDDF* tb = new fileDDF(nsdb());
1176
+ fieldDDF* fd = new fieldDDF(nsdb());
1177
+ indexDDF* id = new indexDDF(nsdb());
1178
+ if ((tb) && (fd) && (id))
1179
+ {
1180
+ _tcscpy(Path, dir);
1181
+ _tcscat(Path, PSEPARATOR _T("FILE.DDF"));
1182
+ tb->createTable(Path);
1183
+ chOpen += tb->stat();
1184
+
1185
+ _tcscpy(Path, dir);
1186
+ _tcscat(Path, PSEPARATOR _T("FIELD.DDF"));
1187
+ fd->createTable(Path);
1188
+ chOpen += fd->stat();
1189
+
1190
+ _tcscpy(Path, dir);
1191
+ _tcscat(Path, PSEPARATOR _T("INDEX.DDF"));
1192
+ id->createTable(Path);
1193
+ chOpen += id->stat();
1194
+ m_stat = chOpen;
1195
+ }
1196
+ if (tb)
1197
+ tb->release();
1198
+ if (fd)
1199
+ fd->release();
1200
+ if (id)
1201
+ id->release();
1202
+
1203
+ }
1204
+
1205
+ void dbdef::saveDDF(short TableIndex, short opration)
1206
+ {
1207
+ ushort_td chOpen = 0;
1208
+ short Mode = 0;
1209
+ ushort_td tbid = TableIndex;
1210
+ ushort_td fdid;
1211
+ ushort_td keyid;
1212
+ ushort_td segid;
1213
+ ushort_td pos;
1214
+ const _TUCHAR* own[3];
1215
+
1216
+ m_stat = STATUS_SUCCESS;
1217
+ tabledef* TableDef;
1218
+ fielddef* FieldDef;
1219
+ keydef* KeyDef;
1220
+
1221
+ fileDDF* tb = new fileDDF(nsdb());
1222
+ fieldDDF* fd = new fieldDDF(nsdb());
1223
+ indexDDF* id = new indexDDF(nsdb());
1224
+
1225
+ if ((tb) && (fd) && (id))
1226
+ {
1227
+ if (m_impl->userName[0] != 0x00)
1228
+ {
1229
+ own[0] = (const _TUCHAR*)m_impl->userName;
1230
+ own[1] = (const _TUCHAR*)m_impl->userName;
1231
+ own[2] = (const _TUCHAR*)m_impl->userName;
1232
+ }
1233
+ else
1234
+ {
1235
+ own[0] = ow0;
1236
+ own[1] = ow1;
1237
+ own[2] = ow2;
1238
+ }
1239
+ tb->open(((database*)nsdb())->rootDir(), (char_td)Mode, (const _TCHAR*) own[0]);
1240
+ chOpen += tb->stat();
1241
+ fd->open(((database*)nsdb())->rootDir(), (char_td)Mode, (const _TCHAR*)own[1]);
1242
+ chOpen += fd->stat();
1243
+ id->open(((database*)nsdb())->rootDir(), (char_td)Mode, (const _TCHAR*)own[2]);
1244
+ chOpen += id->stat();
1245
+ if (chOpen)
1246
+ {
1247
+ tb->release();
1248
+ fd->release();
1249
+ id->release();
1250
+ m_stat = STATUS_INVALID_OWNERNAME;
1251
+ return;
1252
+ }
1253
+
1254
+ //erase all records
1255
+ nsdb()->beginTrn(200);
1256
+ tb->setKeyNum(0);
1257
+
1258
+
1259
+ tb->setStat(0);
1260
+ fd->setStat(0);
1261
+ id->setStat(0);
1262
+ tb->setKeyNum(0);
1263
+ fd->setKeyNum(1);
1264
+ id->setKeyNum(0);
1265
+ if (tableDefs(tbid))
1266
+ {
1267
+ TableDef = tableDefs(tbid);
1268
+ tb->id = TableDef->ddfid;
1269
+ tb->seek();
1270
+ strcpy(tb->tablename, TableDef->tableNameA());
1271
+ strcpy(tb->filename, TableDef->fileNameA());
1272
+ tb->flag = TableDef->flags.all;
1273
+ if (tb->stat() == STATUS_SUCCESS)
1274
+ {
1275
+ if (opration == 4)
1276
+ tb->del();
1277
+ else
1278
+ tb->update();
1279
+ }
1280
+ else if (tb->stat() == STATUS_NOT_FOUND_TI)
1281
+ tb->insert();
1282
+
1283
+ if (tb->stat())
1284
+ goto JmpErr;
1285
+
1286
+ while (fd->stat() == STATUS_SUCCESS)
1287
+ {
1288
+ fd->fileid = tb->id;
1289
+ fd->seek();
1290
+ if (fd->stat() == STATUS_SUCCESS)
1291
+ fd->del();
1292
+ }
1293
+ fd->setStat(0);
1294
+ if (opration != 4)
1295
+ {
1296
+ pos = 1;
1297
+ for (fdid = 0; fdid < TableDef->fieldCount; fdid++)
1298
+ {
1299
+ FieldDef = &TableDef->fieldDefs[fdid];
1300
+ if (FieldDef->ddfid == 0)
1301
+ FieldDef->ddfid = getDDFNewFieldIndex();
1302
+ fd->fieldid = FieldDef->ddfid;
1303
+ fd->fileid = tb->id;
1304
+ strcpy(fd->name, FieldDef->nameA());
1305
+ fd->type = FieldDef->type;
1306
+ fd->pos = (ushort_td)(pos - 1);
1307
+ fd->len = FieldDef->len;
1308
+ pos += FieldDef->len;
1309
+ fd->dec = FieldDef->decimals;
1310
+ fd->flag = 0;
1311
+ fd->insert();
1312
+ if (fd->stat())
1313
+ goto JmpErr;
1314
+ }
1315
+ }
1316
+ // delete keys.
1317
+ while (id->stat() == STATUS_SUCCESS)
1318
+ {
1319
+ id->fileid = tb->id;
1320
+ id->seek();
1321
+ if (id->stat() == STATUS_SUCCESS)
1322
+ id->del();
1323
+ }
1324
+ id->setStat(0);
1325
+ if (opration != 4)
1326
+ {
1327
+ for (keyid = 0; keyid < TableDef->keyCount; keyid++)
1328
+ {
1329
+ KeyDef = &TableDef->keyDefs[keyid];
1330
+ id->fileid = tb->id;
1331
+ id->keyid = keyid;
1332
+ for (segid = 0; segid < KeyDef->segmentCount; segid++)
1333
+ {
1334
+ id->fieldid = TableDef->fieldDefs[KeyDef->segments[segid].fieldNum].ddfid;
1335
+ id->segmentnum = segid;
1336
+ id->flag = KeyDef->segments[segid].flags.all;
1337
+ id->insert();
1338
+ if (id->stat())
1339
+ goto JmpErr;
1340
+ }
1341
+ }
1342
+ }
1343
+ }
1344
+
1345
+ JmpErr:
1346
+ if ((tb->stat()) || (fd->stat()) || (id->stat()))
1347
+ nsdb()->abortTrn();
1348
+ else
1349
+ nsdb()->endTrn();
1350
+ }
1351
+ m_stat = (short)(tb->stat() + fd->stat() + id->stat());
1352
+
1353
+ if (tb)
1354
+ tb->release();
1355
+ if (fd)
1356
+ fd->release();
1357
+ if (id)
1358
+ id->release();
1359
+
1360
+ }
1361
+
1362
+ void dbdef::openDdf(const _TCHAR* dir, short Mode, const _TCHAR* OwnerName)
1363
+ {
1364
+ tabledef TableDef;
1365
+ fielddef* FieldDef;
1366
+ keydef* KeyDef;
1367
+ short tbid = 1;
1368
+ short FieldIndex;
1369
+ const _TCHAR* own[3];
1370
+ m_stat = 0;
1371
+ fileDDF* tb = new fileDDF(nsdb());
1372
+ fieldDDF* fd = new fieldDDF(nsdb());
1373
+ indexDDF* id = new indexDDF(nsdb());
1374
+ if ((tb) && (fd) && (id))
1375
+ {
1376
+ // set owner name
1377
+ if ((OwnerName != NULL) && (OwnerName[0] != 0x00))
1378
+ {
1379
+ own[0] = OwnerName;
1380
+ own[1] = OwnerName;
1381
+ own[2] = OwnerName;
1382
+ _tcscpy(m_impl->userName, OwnerName);
1383
+ }
1384
+ else
1385
+ {
1386
+ own[0] = (_TCHAR*)ow0;
1387
+ own[1] = (_TCHAR*)ow1;
1388
+ own[2] = (_TCHAR*)ow2;
1389
+ m_impl->userName[0] = 0x00;
1390
+ }
1391
+
1392
+ tb->open(dir, (char_td)Mode, own[0]);
1393
+ if (!tb->stat())
1394
+ {
1395
+ fd->open(dir, (char_td)Mode, own[1]);
1396
+ if (!fd->stat())
1397
+ {
1398
+ id->open(dir, (char_td)Mode, own[2]);
1399
+ m_stat = id->stat();
1400
+ }
1401
+ else
1402
+ m_stat = fd->stat();
1403
+ }
1404
+ else
1405
+ m_stat = tb->stat();
1406
+
1407
+ if (m_stat)
1408
+ {
1409
+ tb->release();
1410
+ fd->release();
1411
+ id->release();
1412
+ return;
1413
+ }
1414
+
1415
+ tb->setKeyNum(1);
1416
+ tb->seekFirst();
1417
+ while (tb->stat() == 0)
1418
+ { // Inser table
1419
+ memset(&TableDef, 0, sizeof(TableDef));
1420
+ TableDef.setTableNameA(strtrimA(tb->tablename));
1421
+ TableDef.setFileNameA(strtrimA(tb->filename));
1422
+
1423
+ TableDef.ddfid = tb->id;
1424
+ TableDef.id = tbid;
1425
+ TableDef.keyCount = 0;
1426
+ TableDef.fieldCount = 0;
1427
+ TableDef.flags.all = tb->flag;
1428
+ TableDef.primaryKeyNum = -1;
1429
+ TableDef.parentKeyNum = -1;
1430
+ TableDef.replicaKeyNum = -1;
1431
+ insertTable(&TableDef);
1432
+ if (m_stat != 0)
1433
+ break;
1434
+
1435
+
1436
+ fd->setKeyNum(1);
1437
+ fd->fileid = tb->id;
1438
+ fd->seekGreater(true);
1439
+ while (fd->fileid == tb->id)
1440
+ {
1441
+ if (fd->stat() != 0)
1442
+ break;
1443
+
1444
+ if (fd->type != ft_nullindicator)
1445
+ {
1446
+ for (FieldIndex = 0; FieldIndex < tableDefs(tbid)->fieldCount; FieldIndex++)
1447
+ {
1448
+ if (tableDefs(tbid)->fieldDefs[FieldIndex].pos > fd->pos)
1449
+ break;
1450
+ }
1451
+ FieldDef = insertField(tbid, FieldIndex);
1452
+ FieldDef->setNameA(strtrimA(fd->name));
1453
+ FieldDef->type = fd->type;
1454
+ FieldDef->len = fd->len;
1455
+ FieldDef->decimals = fd->dec;
1456
+ FieldDef->pos = fd->pos;
1457
+ FieldDef->ddfid = fd->fieldid;
1458
+ id->setKeyNum(1);
1459
+ id->fieldid = fd->fieldid;
1460
+ id->seek();
1461
+ while (id->fieldid == fd->fieldid)
1462
+ {
1463
+ if (id->stat() != 0)
1464
+ break;
1465
+
1466
+ while (id->keyid >= tableDefs(tbid)->keyCount)
1467
+ insertKey(tbid, tableDefs(tbid)->keyCount);
1468
+
1469
+ KeyDef = &(tableDefs(tbid)->keyDefs[id->keyid]);
1470
+ if (KeyDef->segmentCount < id->segmentnum + 1)
1471
+ KeyDef->segmentCount = (uchar_td)(id->segmentnum + 1);
1472
+ KeyDef->segments[id->segmentnum].fieldNum = (uchar_td)FieldIndex;
1473
+ KeyDef->segments[id->segmentnum].flags.all = id->flag;
1474
+ id->seekNext();
1475
+ }
1476
+ }
1477
+ /*else
1478
+ {
1479
+ }*/
1480
+ fd->seekNext();
1481
+ }
1482
+
1483
+ tableDefs(tbid)->maxRecordLen = getRecordLen(tbid);
1484
+
1485
+ tableDefs(tbid)->fixedRecordLen = tableDefs(tbid)->maxRecordLen;
1486
+ tableDefs(tbid)->parentKeyNum = -1;
1487
+ tableDefs(tbid)->replicaKeyNum = -1;
1488
+ tableDefs(tbid)->primaryKeyNum = -1;
1489
+
1490
+ for (short i = tableDefs(tbid)->fieldCount - 1; i >= 0; i--)
1491
+ {
1492
+ if (tableDefs(tbid)->fieldDefs[i].type >= 227)
1493
+ {
1494
+ FieldDef = insertField(tbid, tableDefs(tbid)->fieldCount);
1495
+ *FieldDef = tableDefs(tbid)->fieldDefs[i];
1496
+ deleteField(tbid, i);
1497
+ }
1498
+ }
1499
+
1500
+
1501
+ for (short i = tableDefs(tbid)->fieldCount - 1; i >= 0; i--)
1502
+ {
1503
+ short pos = tableDefs(tbid)->fieldDefs[i].pos;
1504
+ short startPos = 0;
1505
+ if (i > 0)
1506
+ startPos = tableDefs(tbid)->fieldDefs[i - 1].pos +
1507
+ tableDefs(tbid)->fieldDefs[i - 1].len;
1508
+ if (tableDefs(tbid)->fieldDefs[i].len && (startPos != pos))
1509
+ {
1510
+ FieldDef = insertField(tbid, i);
1511
+ sprintf_s((char*)FieldDef->nameA(), FIELD_NAME_SIZE, "NIS%d", i + 1);
1512
+
1513
+ FieldDef->type = ft_nullindicator;
1514
+ FieldDef->len = 1;
1515
+ FieldDef->decimals = 0;
1516
+ FieldDef->pos = pos - 1;
1517
+ FieldDef->ddfid = 0;
1518
+ }
1519
+ }
1520
+
1521
+ tbid++;
1522
+ tb->seekNext();
1523
+ }
1524
+ m_stat = STATUS_SUCCESS;
1525
+ }
1526
+ else
1527
+ m_stat = STATUS_INVALID_OWNERNAME;
1528
+
1529
+ if (tb)
1530
+ tb->release();
1531
+ if (fd)
1532
+ fd->release();
1533
+ if (id)
1534
+ id->release();
1535
+ }
1536
+
1537
+ ushort_td dbdef::getDDFNewTableIndex()
1538
+ {
1539
+ int i;
1540
+ int max_id = 0;
1541
+ for (i = 0; i <= m_impl->tableCount; i++)
1542
+ {
1543
+ if (tableDefs(i) != NULL)
1544
+ {
1545
+ if (tableDefs(i)->ddfid > max_id)
1546
+ max_id = tableDefs(i)->ddfid;
1547
+ }
1548
+ }
1549
+ max_id++;
1550
+ return (ushort_td)max_id;
1551
+ }
1552
+
1553
+ ushort_td dbdef::getDDFNewFieldIndex()
1554
+ {
1555
+ int i, j;
1556
+ if (m_impl->maxid == 0)
1557
+ {
1558
+ for (i = 0; i <= m_impl->tableCount; i++)
1559
+ {
1560
+ if (tableDefs(i) != NULL)
1561
+ {
1562
+ for (j = 0; j < tableDefs(i)->fieldCount; j++)
1563
+ {
1564
+ if (tableDefs(i)->fieldDefs[j].ddfid > m_impl->maxid)
1565
+ m_impl->maxid = tableDefs(i)->fieldDefs[j].ddfid;
1566
+ }
1567
+ }
1568
+ }
1569
+ }
1570
+ m_impl->maxid++;
1571
+ return (ushort_td)m_impl->maxid;
1572
+ }
1573
+
1574
+ void setFieldsCharsetIndex(tabledef* def)
1575
+ {
1576
+ if (def->charsetIndex == 0)
1577
+ def->charsetIndex = mysql::charsetIndex(GetACP());
1578
+ for (short i = 0; i < def->fieldCount; i++)
1579
+ {
1580
+ fielddef& fd = def->fieldDefs[i];
1581
+ if (fd.charsetIndex() == 0)
1582
+ fd.setCharsetIndex(def->charsetIndex);
1583
+ }
1584
+ }
1585
+
1586
+ void dbdef::pushBackup(short TableIndex)
1587
+ {
1588
+ int blen;
1589
+
1590
+ blen = totalDefLength(TableIndex);
1591
+ if (!tableDefs(TABLE_NUM_TMP))
1592
+ m_impl->tableDefs[TABLE_NUM_TMP] = (tabledef*) malloc(blen);
1593
+ else
1594
+ m_impl->tableDefs[TABLE_NUM_TMP] = (tabledef*)realloc(tableDefs(TABLE_NUM_TMP), blen);
1595
+ if (!tableDefs(TABLE_NUM_TMP))
1596
+ {
1597
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
1598
+ return;
1599
+ }
1600
+
1601
+ setFieldsCharsetIndex(tableDefs(TableIndex));
1602
+ memcpy(m_impl->tableDefs[TABLE_NUM_TMP], tableDefs(TableIndex), blen);
1603
+ }
1604
+
1605
+ bool dbdef::compAsBackup(short TableIndex)
1606
+ {
1607
+ if (m_impl->tableCount < TableIndex)
1608
+ return false;
1609
+
1610
+ int len = totalDefLength(TABLE_NUM_TMP);
1611
+ int len2 = totalDefLength(TableIndex);
1612
+ if (len != len2)
1613
+ return true;
1614
+ else if (memcmp(tableDefs(TABLE_NUM_TMP), tableDefs(TableIndex), len) != 0)
1615
+ return true;
1616
+ return false;
1617
+ }
1618
+
1619
+ void dbdef::popBackup(short TableIndex)
1620
+ {
1621
+ int len = totalDefLength(TABLE_NUM_TMP);
1622
+ m_impl->tableDefs[TableIndex] = (tabledef*)realloc(tableDefs(TableIndex), len);
1623
+ memcpy(tableDefs(TableIndex), tableDefs(TABLE_NUM_TMP), len);
1624
+ tableDefs(TableIndex)->fieldDefs = getFieldDef(tableDefs(TableIndex));
1625
+ tableDefs(TableIndex)->keyDefs = getKeyDef(tableDefs(TableIndex));
1626
+
1627
+ updateTableDef(TableIndex);
1628
+ }
1629
+ void dbdef::reopen(char_td mode)
1630
+ {
1631
+ close();
1632
+ open(uri(), mode, NULL);
1633
+ }
1634
+
1635
+
1636
+ }// namespace client
1637
+ }// namespace tdap
1638
+ }// namespace protocol
1639
+ }// namespace db
1640
+ }// namespace bzs