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