transactd 2.4.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
@@ -18,6 +18,7 @@
18
18
  ================================================================= */
19
19
  #include "dbDef.h"
20
20
  #include "database.h"
21
+ #include <bzs/db/protocol/tdap/uri.h>
21
22
  #include <bzs/rtl/strtrim.h>
22
23
  #include <limits.h>
23
24
  #include <stdio.h>
@@ -39,14 +40,12 @@ namespace tdap
39
40
  namespace client
40
41
  {
41
42
 
42
- #define FORMAT_VERSON_BTRV_DEF 0
43
- #define FORMAT_VERSON_CURRENT 1
44
43
 
45
44
  /* BDFFORMAT_VERSION used in the databaseSchema.cpp listSchemaTable() */
46
45
  static const _TCHAR BDFFORMAT_VERSION[] = _T("2.000.00");
47
46
  static const _TCHAR ow0[11] = { 46, 46, 83, 67, 46, 46, 46, 46, 93, 4, 0 };
48
47
  static const _TCHAR ow1[11] = { 46, 46, 83, 67, 46, 46, 46, 46, 66, 5, 0 };
49
- static const _TCHAR ow2[11] = { 46, 46, 83, 67, 46, 46, 46, 46, -44, 5, 0 };
48
+ static const _TCHAR ow2[11] = { 46, 46, 83, 67, 46, 46, 46, 46, (_TCHAR)-44, 5, 0 };
50
49
  using namespace bzs::rtl;
51
50
 
52
51
  class ownerNameSetter : public nstable
@@ -59,8 +58,8 @@ public:
59
58
  using nstable::open;
60
59
  };
61
60
 
62
- static const int BDFMAXBUFFER = 32384;
63
-
61
+ static const int BDFMAXBUFFER_BTRV = 32384;
62
+ static const int BDFMAXBUFFER = MAX_SCHEMASIZE + 0xFFFF;
64
63
  struct dbdimple
65
64
  {
66
65
  tabledef* tableDefs[TABLE_NUM_TMP + 1];
@@ -72,7 +71,7 @@ struct dbdimple
72
71
  short openMode;
73
72
  short deftype;
74
73
  _TCHAR userName[20];
75
- int bdfLen;
74
+ uint_td bdfLen;
76
75
  _TCHAR version[9];
77
76
  bool noWriteMode;
78
77
 
@@ -83,71 +82,80 @@ struct dbdimple
83
82
  memset(tableDefs, 0, (TABLE_NUM_TMP + 1) * sizeof(tabledef*));
84
83
  _tcscpy(version, (const _TCHAR*)BDFFORMAT_VERSION);
85
84
  }
85
+
86
+ ~dbdimple()
87
+ {
88
+ for (int i = 0; i <= tableCount; i++)
89
+ {
90
+ tabledef* td = tableDefs[i];
91
+ if (td && (td != (tabledef*)-1) && (td != bdf))
92
+ {
93
+ if (td->defaultImage)
94
+ free(td->defaultImage);
95
+ free(td);
96
+ tableDefs[i] = NULL;
97
+ }
98
+ }
99
+ if (bdf)
100
+ free(bdf);
101
+ if (tableDefs[TABLE_NUM_TMP])
102
+ free(tableDefs[TABLE_NUM_TMP]);
103
+ if (relateData)
104
+ free(relateData);
105
+ }
86
106
  };
87
107
 
88
108
  dbdef::dbdef(nsdatabase* pbe, short DefType) : nstable(pbe)
89
109
  {
90
- m_impl = new dbdimple();
91
- m_impl->deftype = DefType;
110
+ m_dimpl = new dbdimple();
111
+ m_dimpl->deftype = DefType;
92
112
  m_keybuflen = 128;
93
- m_keybuf = &m_impl->keybuf[0];
113
+ m_keybuf = &m_dimpl->keybuf[0];
94
114
  setShared();
95
115
  }
96
116
 
97
117
  dbdef::~dbdef()
98
118
  {
99
- if (m_impl->bdf)
100
- free(m_impl->bdf);
101
-
102
- for (int i = 0; i <= m_impl->tableCount; i++)
103
- {
104
- if (m_impl->tableDefs[i] && (m_impl->tableDefs[i] != (tabledef*)-1) &&
105
- (m_impl->tableDefs[i] != m_impl->bdf))
106
- free(m_impl->tableDefs[i]);
107
- }
108
- if (m_impl->tableDefs[TABLE_NUM_TMP])
109
- free(m_impl->tableDefs[TABLE_NUM_TMP]);
110
- if (m_impl->relateData)
111
- free(m_impl->relateData);
112
- delete m_impl;
119
+ delete m_dimpl;
120
+ m_dimpl = NULL;
113
121
  }
114
122
 
115
123
  void dbdef::setDefType(short defType)
116
124
  {
117
- m_impl->deftype = defType;
125
+ m_dimpl->deftype = defType;
118
126
  }
119
127
 
120
128
  short dbdef::tableCount() const
121
129
  {
122
- return m_impl->tableCount;
130
+ return m_dimpl->tableCount;
123
131
  }
124
132
 
125
133
  void* dbdef::relateData() const
126
134
  {
127
- return m_impl->relateData;
135
+ return m_dimpl->relateData;
128
136
  }
129
137
 
130
138
  short dbdef::openMode() const
131
139
  {
132
- return m_impl->openMode;
140
+ return m_dimpl->openMode;
133
141
  }
134
142
 
135
143
  int dbdef::version() const
136
144
  {
137
- return m_impl->version[7] - '0';
145
+ return m_dimpl->version[7] - '0';
138
146
  };
139
147
 
140
148
  void dbdef::setVersion(int v)
141
149
  {
142
- m_impl->version[7] = (char)v;
150
+ m_dimpl->version[7] = (char)v;
143
151
  }
144
152
 
145
153
  void* dbdef::allocRelateData(int size)
146
154
  {
147
- if (m_impl->relateData)
148
- free(m_impl->relateData);
149
- m_impl->relateData = malloc(size);
150
- return m_impl->relateData;
155
+ if (m_dimpl->relateData)
156
+ free(m_dimpl->relateData);
157
+ m_dimpl->relateData = malloc(size);
158
+ return m_dimpl->relateData;
151
159
  }
152
160
  keylen_td dbdef::writeKeyData()
153
161
  {
@@ -157,97 +165,107 @@ void dbdef::moveById(short id)
157
165
  {
158
166
  while (1)
159
167
  {
160
- m_pdata = m_impl->bdf;
161
- m_buflen = m_impl->bdfLen;
168
+ m_pdata = m_dimpl->bdf;
169
+ m_buflen = m_dimpl->bdfLen;
162
170
  memcpy(m_keybuf, &id, 2);
163
171
  seek();
164
172
  if (m_stat == STATUS_BUFFERTOOSMALL)
165
- {
166
- if (!resizeReadBuf())
167
- return;
168
- }
173
+ return;
169
174
  else
170
175
  break;
171
176
  }
172
177
  }
173
178
 
174
- bool dbdef::resizeReadBuf(void)
179
+ void* dbdef::getBufferPtr(uint_td& size)
175
180
  {
176
- m_impl->bdf =
177
- (tabledef*)realloc(m_impl->bdf, m_impl->bdfLen + BDFMAXBUFFER);
178
- if (m_impl->bdf == NULL)
179
- {
180
- m_stat = STATUS_CANT_ALLOC_MEMORY;
181
- return false;
182
- }
183
- m_impl->bdfLen += BDFMAXBUFFER;
184
- return true;
181
+ size = m_dimpl->bdfLen;
182
+ return m_dimpl->bdf;
185
183
  }
186
184
 
187
- keydef* dbdef::getKeyDef(tabledef* p)
185
+ bool dbdef::setDefaultImage(short tableIndex, const uchar_td* p, ushort_td size)
188
186
  {
189
- // keydefPos = size of tabledef �{ size of fielddef x number
190
- return (keydef*)((char*)p + sizeof(tabledef) +
191
- (p->fieldCount * sizeof(fielddef)));
187
+ tabledef* td = m_dimpl->tableDefs[tableIndex];
188
+ if (td)
189
+ {
190
+ if (td->defaultImage)
191
+ {
192
+ free(td->defaultImage);
193
+ td->defaultImage = NULL;
194
+ }
195
+ if (!p || size == 0)
196
+ return true;
197
+
198
+ td->defaultImage = malloc(size);
199
+ if (td->defaultImage)
200
+ {
201
+ memcpy(td->defaultImage, p, size);
202
+ return true;
203
+ }
204
+ }
205
+ return false;
192
206
  }
193
207
 
194
- fielddef* dbdef::getFieldDef(tabledef* p)
208
+ bool dbdef::addSchemaImage(const tabledef* p, ushort_td size, short& tableIndex)
195
209
  {
196
-
197
- return (fielddef*)((char*)p + sizeof(tabledef));
210
+ tableIndex = ++m_dimpl->tableCount;
211
+ initReadAfter(tableIndex, p, size);
212
+ return true;
198
213
  }
199
214
 
200
- void dbdef::setRecordLen(short TableIndex)
215
+ void dbdef::allocDatabuffer()
201
216
  {
202
- tabledef* td = tableDefs(TableIndex);
203
- td->maxRecordLen = getRecordLen(TableIndex);
204
-
205
- // If valible length then specifing fixed length.
206
- if ((td->fixedRecordLen == 0) || (td->flags.bit0 == false))
207
- td->fixedRecordLen = td->maxRecordLen;
217
+ m_stat = 0;
218
+ if (m_dimpl->bdf == NULL)
219
+ {
220
+ if (!nsdb()->isUseTransactd())
221
+ m_dimpl->bdfLen = BDFMAXBUFFER_BTRV;
222
+ m_dimpl->bdf =
223
+ (tabledef*)malloc(m_dimpl->bdfLen);
224
+ if (m_dimpl->bdf == NULL)
225
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
226
+ }
208
227
  }
209
228
 
210
- void dbdef::setCodePage(tabledef* td)
229
+ bool dbdef::testTablePtr(tabledef* td)
211
230
  {
212
- if (td->charsetIndex == 0)
213
- td->charsetIndex = mysql::charsetIndex(GetACP());
214
-
215
- for (short i = 0; i < td->fieldCount; i++)
231
+ if (td == NULL)
216
232
  {
217
- fielddef& fd = td->fieldDefs[i];
218
- if (fd.charsetIndex() == 0)
219
- fd.setCharsetIndex(td->charsetIndex);
220
- fd.setSchemaCodePage(td->schemaCodePage);
233
+ m_stat = STATUS_INVALID_TABLE_IDX;
234
+ return false;
221
235
  }
236
+ return true;
222
237
  }
223
238
 
224
239
  short dbdef::validateTableDef(short TableIndex)
225
240
  {
226
241
  m_stat = STATUS_SUCCESS;
227
242
  tabledef* td = tableDefs(TableIndex);
243
+ if (!testTablePtr(td)) return m_stat;
228
244
 
229
245
  td->optionFlags.bitA = false; // reset valiable type
230
246
  td->optionFlags.bitB = false;
231
247
  for (short i = 0; i < td->fieldCount; ++i)
232
248
  {
233
- short ret = fieldNumByName(TableIndex, td->fieldDefs[i].name());
249
+ const fielddef& fd = td->fieldDefs[i];
250
+ short ret = fieldNumByName(TableIndex, fd.name());
234
251
  if ((ret != -1) && (ret != i))
235
252
  {
236
253
  m_stat = STATUS_DUPLICATE_FIELDNAME;
237
254
  return m_stat;
238
255
  }
239
256
  // Check field length.
240
- uchar_td type = td->fieldDefs[i].type;
257
+ uchar_td type = fd.type;
241
258
 
242
259
  // reset update indicator
243
- td->fieldDefs[i].enableFlags.bitE = false;
260
+ const_cast<fielddef&>(fd).enableFlags.bitE = false;
244
261
 
245
- ret = validLen(type, td->fieldDefs[i].len);
246
- if (!ret)
262
+ ret = validLen(type, fd.len);
263
+ if (!ret || !fd.isValidCharNum())
247
264
  {
248
265
  m_stat = STATUS_INVALID_FIELDLENGTH;
249
266
  return m_stat;
250
267
  }
268
+
251
269
  // Note or Lvar type must be the last of fields.
252
270
  if ((type == ft_note) || (type == ft_lvar))
253
271
  {
@@ -270,8 +288,42 @@ short dbdef::validateTableDef(short TableIndex)
270
288
  (type == ft_myvarbinary) || (type == ft_mywvarbinary) ||
271
289
  (type == ft_myfixedbinary))
272
290
  td->optionFlags.bitA = true;
273
- if ((type == ft_myblob) || (type == ft_mytext))
291
+ if ((type == ft_myblob) || (type == ft_mytext) || (type == ft_mygeometry)
292
+ || (type == ft_myjson))
274
293
  td->optionFlags.bitB = true;
294
+ if (type == ft_myfixedbinary)
295
+ td->optionFlags.bitC = true;
296
+ //force use pad char
297
+ if ((type == ft_mychar) || (type == ft_mywchar))
298
+ td->fieldDefs[i].m_padCharOptions |= USE_PAD_CHAR;
299
+
300
+ if (type == ft_mytimestamp && (fd.decimals != 0))
301
+ {
302
+ int dec = (fd.len - 4) * 2;
303
+ if (fd.decimals > dec || fd.decimals < dec -1)
304
+ {
305
+ m_stat = STATUS_INVALID_FIELDLENGTH;
306
+ return m_stat;
307
+ }
308
+ }
309
+ if (type == ft_mytime && (fd.decimals != 0))
310
+ {
311
+ int dec = (fd.len - 3) * 2;
312
+ if (fd.decimals > dec || fd.decimals < dec -1)
313
+ {
314
+ m_stat = STATUS_INVALID_FIELDLENGTH;
315
+ return m_stat;
316
+ }
317
+ }
318
+ if (type == ft_mydatetime && (fd.decimals != 0))
319
+ {
320
+ int dec = (fd.len - 5) * 2;
321
+ if (fd.decimals > dec || fd.decimals < dec -1)
322
+ {
323
+ m_stat = STATUS_INVALID_FIELDLENGTH;
324
+ return m_stat;
325
+ }
326
+ }
275
327
  }
276
328
 
277
329
  // Check invalid key type
@@ -290,10 +342,11 @@ short dbdef::validateTableDef(short TableIndex)
290
342
  }
291
343
 
292
344
  // Chack duplicate table name.
293
- for (short i = 1; i < m_impl->tableCount; i++)
345
+ for (short i = 1; i < m_dimpl->tableCount; i++)
294
346
  {
295
347
  if ((tableDefs(i)) && (i != TableIndex))
296
348
  {
349
+ m_stat = 0;
297
350
  if (strcmp(tableDefs(i)->tableNameA(), td->tableNameA()) == 0)
298
351
  {
299
352
  m_stat = STATUS_DUPPLICATE_KEYVALUE;
@@ -301,8 +354,8 @@ short dbdef::validateTableDef(short TableIndex)
301
354
  }
302
355
  }
303
356
  }
304
- setCodePage(td);
305
- setRecordLen(TableIndex);
357
+ if (td->inUse() == 0)
358
+ td->calcReclordlen();
306
359
  return m_stat;
307
360
  }
308
361
 
@@ -312,13 +365,14 @@ void dbdef::updateTableDef(short TableIndex, bool forPsqlDdf)
312
365
  return;
313
366
 
314
367
  tabledef* td = tableDefs(TableIndex);
368
+ if (!testTablePtr(td)) return;
315
369
 
316
- if (m_impl->noWriteMode)
370
+ if (m_dimpl->noWriteMode)
317
371
  {
318
372
  m_stat = STATUS_ACCESS_DENIED;
319
373
  return;
320
374
  }
321
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
375
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
322
376
  saveDDF(TableIndex, 3, forPsqlDdf);
323
377
  else
324
378
  {
@@ -326,44 +380,45 @@ void dbdef::updateTableDef(short TableIndex, bool forPsqlDdf)
326
380
  if (m_stat == STATUS_SUCCESS)
327
381
  {
328
382
  m_pdata = td;
329
- m_buflen = totalDefLength(TableIndex);
330
- cacheFieldPos(td);
383
+ m_buflen = td->size();
331
384
  td->formatVersion = FORMAT_VERSON_CURRENT;
332
385
  update();
333
- m_pdata = m_impl->bdf;
334
- m_buflen = m_impl->bdfLen;
386
+ m_pdata = m_dimpl->bdf;
387
+ m_buflen = m_dimpl->bdfLen;
388
+ if (m_stat == STATUS_SUCCESS)
389
+ setDefaultImage(TableIndex, NULL, 0);
335
390
  }
336
391
  }
337
392
  }
338
393
 
339
394
  void dbdef::deleteTable(short TableIndex)
340
395
  {
341
- m_stat = STATUS_SUCCESS;
342
- if (m_impl->noWriteMode)
343
- {
344
- free(tableDefs(TableIndex));
345
- m_impl->tableDefs[TableIndex] = NULL;
346
- return;
347
- }
396
+ tabledef* td = tableDefs(TableIndex);
397
+ if (!testTablePtr(td)) return;
348
398
 
349
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
350
- saveDDF(TableIndex, 4);
351
- else
399
+ m_stat = STATUS_SUCCESS;
400
+ if (m_dimpl->noWriteMode == false)
352
401
  {
353
- moveById(tableDefs(TableIndex)->id);
354
- if (m_stat == STATUS_SUCCESS)
402
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
403
+ saveDDF(TableIndex, 4);
404
+ else
355
405
  {
356
- m_pdata = tableDefs(TableIndex);
357
- m_buflen = totalDefLength(TableIndex);
358
- del();
359
- m_pdata = m_impl->bdf;
360
- m_buflen = m_impl->bdfLen;
406
+ moveById(td->id);
407
+ if (m_stat == STATUS_SUCCESS)
408
+ {
409
+ m_pdata = td;
410
+ m_buflen = td->size();
411
+ del();
412
+ m_pdata = m_dimpl->bdf;
413
+ m_buflen = m_dimpl->bdfLen;
414
+ }
361
415
  }
362
416
  }
363
417
  if (m_stat == STATUS_SUCCESS)
364
418
  {
365
- free(tableDefs(TableIndex));
366
- m_impl->tableDefs[TableIndex] = NULL;
419
+ setDefaultImage(TableIndex, NULL, 0);
420
+ free(td);
421
+ m_dimpl->tableDefs[TableIndex] = NULL;
367
422
  }
368
423
  }
369
424
 
@@ -372,9 +427,12 @@ void dbdef::renumberFieldNum(short TableIndex, short Index, short op)
372
427
  int i, j;
373
428
  keydef* KeyDef;
374
429
 
375
- for (i = 0; i < tableDefs(TableIndex)->keyCount; i++)
430
+ tabledef* td = tableDefs(TableIndex);
431
+ if (!testTablePtr(td)) return;
432
+
433
+ for (i = 0; i < td->keyCount; i++)
376
434
  {
377
- KeyDef = &(tableDefs(TableIndex)->keyDefs[i]);
435
+ KeyDef = &(td->keyDefs[i]);
378
436
 
379
437
  for (j = 0; j < KeyDef->segmentCount; j++)
380
438
  {
@@ -397,10 +455,12 @@ bool dbdef::isUsedField(short TableIndex, short DeleteIndex)
397
455
  {
398
456
  int i, j;
399
457
  keydef* KeyDef;
458
+ tabledef* td = tableDefs(TableIndex);
459
+ if (!testTablePtr(td)) return false;
400
460
 
401
- for (i = 0; i < tableDefs(TableIndex)->keyCount; i++)
461
+ for (i = 0; i < td->keyCount; i++)
402
462
  {
403
- KeyDef = &(tableDefs(TableIndex)->keyDefs[i]);
463
+ KeyDef = &(td->keyDefs[i]);
404
464
  for (j = 0; j < KeyDef->segmentCount; j++)
405
465
  {
406
466
  if (KeyDef->segments[j].fieldNum == DeleteIndex)
@@ -426,11 +486,11 @@ void dbdef::deleteField(short TableIndex, short DeleteIndex)
426
486
  else
427
487
  {
428
488
  memmove(&td->fieldDefs[DeleteIndex], &td->fieldDefs[DeleteIndex + 1],
429
- totalDefLength(TableIndex) + (char*)td -
489
+ td->size() + (char*)td -
430
490
  (char*)&(td->fieldDefs[DeleteIndex + 1]));
431
491
  }
432
492
  td->fieldCount--;
433
- td->keyDefs = getKeyDef(tableDefs(TableIndex));
493
+ td->setKeydefsPtr();
434
494
  updateTableDef(TableIndex);
435
495
  }
436
496
 
@@ -438,10 +498,11 @@ void dbdef::deleteKey(short TableIndex, short DeleteIndex)
438
498
  {
439
499
  m_stat = STATUS_SUCCESS;
440
500
  tabledef* td = tableDefs(TableIndex);
501
+ if (!testTablePtr(td)) return ;
441
502
  if (DeleteIndex != td->keyCount - 1)
442
503
  {
443
504
  memmove(&td->keyDefs[DeleteIndex], &td->keyDefs[DeleteIndex + 1],
444
- totalDefLength(TableIndex) + (char*)td -
505
+ td->size() + (char*)td -
445
506
  (char*)&(td->keyDefs[DeleteIndex + 1]));
446
507
  }
447
508
  td->keyCount--;
@@ -458,76 +519,78 @@ void dbdef::deleteKey(short TableIndex, short DeleteIndex)
458
519
  updateTableDef(TableIndex);
459
520
  }
460
521
 
461
- void dbdef::insertTable(tabledef* TableDef)
522
+ void dbdef::insertTable(tabledef* td)
462
523
  {
463
524
  m_stat = STATUS_SUCCESS;
464
- if (TableDef->id > TABLE_NUM_TMP)
525
+ if (td->id > TABLE_NUM_TMP)
465
526
  {
466
527
  m_stat = STATUS_TOO_MANY_TABLES;
467
528
  return;
468
529
  }
469
- if (tableDefs(TableDef->id) != NULL)
530
+ if (tableDefs(td->id) != NULL)
470
531
  {
471
532
  m_stat = STATUS_DUPPLICATE_KEYVALUE;
472
533
  return;
473
534
  }
474
535
 
475
- if (tableNumByName(TableDef->tableName()) != -1)
536
+ if (tableNumByName(td->tableName()) != -1)
476
537
  {
477
538
  m_stat = STATUS_DUPPLICATE_KEYVALUE;
478
539
  return;
479
540
  }
480
- if (TableDef->fieldCount > 512)
541
+ if (td->fieldCount > 512)
481
542
  {
482
543
  m_stat = STATUS_TOO_MANY_FIELDS;
483
544
  return;
484
545
  }
485
- m_impl->tableDefs[TableDef->id] =
546
+
547
+ m_dimpl->tableDefs[td->id] =
486
548
  (tabledef*)malloc(USHRT_MAX /* sizeof(tabledef) */);
487
- if (m_impl->tableDefs[TableDef->id] == NULL)
549
+ if (m_dimpl->tableDefs[td->id] == NULL)
488
550
  {
489
551
  m_stat = STATUS_CANT_ALLOC_MEMORY;
490
552
  return;
491
553
  }
492
- if ((TableDef->ddfid == 0) && (m_impl->deftype == TYPE_SCHEMA_DDF))
493
- TableDef->ddfid = getDDFNewTableIndex();
494
- memcpy(m_impl->tableDefs[TableDef->id], TableDef, sizeof(tabledef));
495
- if (m_impl->noWriteMode)
554
+ if ((td->ddfid == 0) && (m_dimpl->deftype == TYPE_SCHEMA_DDF))
555
+ td->ddfid = getDDFNewTableIndex();
556
+ memcpy(m_dimpl->tableDefs[td->id], td, sizeof(tabledef));
557
+ if (m_dimpl->noWriteMode)
496
558
  {
497
- if (m_impl->tableCount < TableDef->id)
498
- m_impl->tableCount = TableDef->id;
559
+ if (m_dimpl->tableCount < td->id)
560
+ m_dimpl->tableCount = td->id;
499
561
  return;
500
562
  }
501
- TableDef->formatVersion = FORMAT_VERSON_CURRENT;
502
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
503
- saveDDF(TableDef->id, 2);
563
+ td->formatVersion = FORMAT_VERSON_CURRENT;
564
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
565
+ saveDDF(td->id, 2);
504
566
  else
505
567
  {
506
- memcpy(m_impl->bdf, TableDef, sizeof(tabledef));
507
- m_pdata = m_impl->bdf;
568
+ memcpy(m_dimpl->bdf, td, sizeof(tabledef));
569
+ m_pdata = m_dimpl->bdf;
508
570
 
509
- memcpy(m_keybuf, &TableDef->id, 2);
571
+ memcpy(m_keybuf, &td->id, 2);
510
572
  m_buflen = sizeof(tabledef);
511
- if (isUseTransactd())
512
- m_impl->bdf->varSize = m_buflen - 4;
513
573
  insert();
514
- m_pdata = m_impl->bdf;
515
- m_buflen = m_impl->bdfLen;
574
+ m_pdata = m_dimpl->bdf;
575
+ m_buflen = m_dimpl->bdfLen;
516
576
  }
517
577
  if (m_stat != 0)
518
578
  {
519
- free(m_impl->tableDefs[TableDef->id]);
520
- m_impl->tableDefs[TableDef->id] = NULL;
579
+ free(m_dimpl->tableDefs[td->id]);
580
+ m_dimpl->tableDefs[td->id] = NULL;
521
581
  }
522
582
  else
523
583
  {
524
- if (m_impl->tableCount < TableDef->id)
525
- m_impl->tableCount = TableDef->id;
584
+ if (m_dimpl->tableCount < td->id)
585
+ m_dimpl->tableCount = td->id;
526
586
  }
527
587
  }
528
588
 
529
589
  bool dbdef::resizeAt(short TableIndex, bool key)
530
590
  {
591
+ tabledef* def = m_dimpl->tableDefs[TableIndex];
592
+ if (!key && def->m_inUse != 0) return false;
593
+
531
594
  uint_td addsize;
532
595
 
533
596
  if (key == true)
@@ -535,47 +598,43 @@ bool dbdef::resizeAt(short TableIndex, bool key)
535
598
  else
536
599
  addsize = sizeof(fielddef);
537
600
 
538
- uint_td size = totalDefLength(TableIndex) + addsize;
539
- tabledef* def = m_impl->tableDefs[TableIndex];
601
+ uint_td size = def->size() + addsize;
602
+
540
603
  void* p = malloc(size);
541
604
  if (p)
542
605
  {
543
- memcpy(p, def, totalDefLength(TableIndex));
606
+ memcpy(p, def, def->size());
544
607
  free(def);
545
- m_impl->tableDefs[TableIndex] = def = (tabledef*)p;
546
- }
547
- else
548
- {
549
- m_stat = STATUS_CANT_ALLOC_MEMORY;
550
- return false;
608
+ m_dimpl->tableDefs[TableIndex] = def = (tabledef*)p;
609
+ // init for memcpy
610
+ def->setFielddefsPtr();
611
+ def->setKeydefsPtr();
612
+ return true;
551
613
  }
552
- // init for resize
553
- def->fieldDefs = getFieldDef(def);
554
- def->keyDefs = getKeyDef(def);
555
- return true;
614
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
615
+ return false;
556
616
  }
557
617
 
558
618
  keydef* dbdef::insertKey(short TableIndex, short InsertIndex)
559
619
  {
560
-
561
620
  if (resizeAt(TableIndex, true) == false)
562
621
  return NULL;
563
622
 
623
+ tabledef* td = m_dimpl->tableDefs[TableIndex];
564
624
  if (InsertIndex < tableDefs(TableIndex)->keyCount)
565
625
  {
566
- memmove(&tableDefs(TableIndex)->keyDefs[InsertIndex + 1],
567
- &tableDefs(TableIndex)->keyDefs[InsertIndex],
568
- totalDefLength(TableIndex) + (char*)tableDefs(TableIndex) -
569
- (char*)&(tableDefs(TableIndex)->keyDefs[InsertIndex]));
626
+ memmove(&td->keyDefs[InsertIndex + 1],
627
+ &td->keyDefs[InsertIndex],
628
+ td->size() + (char*)td - (char*)&(td->keyDefs[InsertIndex]));
570
629
  }
571
- tableDefs(TableIndex)->keyCount++;
572
- memset(&(tableDefs(TableIndex)->keyDefs[InsertIndex]), 0, sizeof(keydef));
630
+ td->keyCount++;
631
+ memset(&(td->keyDefs[InsertIndex]), 0, sizeof(keydef));
573
632
 
574
- if ((!m_impl->noWriteMode) && (m_impl->deftype != TYPE_SCHEMA_DDF))
633
+ if ((!m_dimpl->noWriteMode) && (m_dimpl->deftype != TYPE_SCHEMA_DDF))
575
634
  updateTableDef(TableIndex);
576
635
  else
577
- setRecordLen(TableIndex);
578
- return &(tableDefs(TableIndex)->keyDefs[InsertIndex]);
636
+ td->calcReclordlen();
637
+ return &(td->keyDefs[InsertIndex]);
579
638
  }
580
639
 
581
640
  fielddef* dbdef::insertField(short TableIndex, short InsertIndex)
@@ -589,14 +648,13 @@ fielddef* dbdef::insertField(short TableIndex, short InsertIndex)
589
648
 
590
649
  memmove(&(td->fieldDefs[InsertIndex + 1]),
591
650
  &(td->fieldDefs[InsertIndex]),
592
- totalDefLength(TableIndex) + (char*)td -
651
+ td->size() + (char*)td -
593
652
  (char*)&(td->fieldDefs[InsertIndex]));
594
653
  }
595
654
  td->fieldCount++;
596
- td->keyDefs = getKeyDef(td);
655
+ td->setKeydefsPtr();
597
656
  renumberFieldNum(TableIndex, InsertIndex, 2);
598
657
  memset(&(td->fieldDefs[InsertIndex]), 0, sizeof(fielddef));
599
- setRecordLen(TableIndex);
600
658
  fielddef* fd = &(td->fieldDefs[InsertIndex]);
601
659
  fd->setCharsetIndex(td->charsetIndex);
602
660
  fd->setSchemaCodePage(td->schemaCodePage);
@@ -604,16 +662,6 @@ fielddef* dbdef::insertField(short TableIndex, short InsertIndex)
604
662
  return fd;
605
663
  }
606
664
 
607
- int dbdef::totalDefLength(short TableIndex)
608
- {
609
- tabledef* td = tableDefs(TableIndex);
610
- int len = (int)(sizeof(tabledef) + (sizeof(fielddef) * td->fieldCount) +
611
- (sizeof(keydef) * td->keyCount));
612
- if (isUseTransactd())
613
- td->varSize = len - 4;
614
- return len;
615
- }
616
-
617
665
  inline fielddef_t_my& dbdef::convert(fielddef_t_my& fd_my,
618
666
  const fielddef_t_pv& fd_pv)
619
667
  {
@@ -626,11 +674,11 @@ inline fielddef_t_my& dbdef::convert(fielddef_t_my& fd_my,
626
674
  return fd_my;
627
675
  }
628
676
 
629
- inline int fixVariableLenBug(bool isUseTransactd, tabledef* src, size_t size)
677
+ inline int fixVariableLenBug(bool isUseTransactd, const tabledef* src, size_t size)
630
678
  {
631
679
  if (isUseTransactd)
632
680
  { // A Transactd server format changed to nosupport FIXED_PLUS_VARIABLELEN
633
- if (src->pageSize + 4 == (int)size)
681
+ if (src->varSize + 4 == (int)size)
634
682
  { // This is a chagned server
635
683
  if (src->preAlloc &&
636
684
  ((src->preAlloc % 512 == 0) || (src->fieldCount > 255) ||
@@ -645,22 +693,21 @@ inline int fixVariableLenBug(bool isUseTransactd, tabledef* src, size_t size)
645
693
  return (int)size;
646
694
  }
647
695
 
648
- size_t getNewVersionSize(tabledef* src)
696
+ size_t getNewVersionSize(const tabledef* src)
649
697
  {
650
698
  return src->fieldCount * sizeof(fielddef) + sizeof(tabledef) +
651
699
  src->keyCount * sizeof(keydef) + 1;
652
700
  }
653
701
 
654
- void dbdef::tableDefCopy(tabledef* dest, tabledef* src, size_t size)
702
+ void dbdef::tableDefCopy(tabledef* dest, const tabledef* src, size_t size)
655
703
  {
656
-
657
704
  if (src->formatVersion == FORMAT_VERSON_BTRV_DEF)
658
705
  {
659
706
  size_t len = 0;
660
707
  memcpy(dest, src, sizeof(tabledef));
661
708
  len += sizeof(tabledef);
662
- fielddef_t_my* fd = (fielddef_t_my*)dbdef::getFieldDef(dest);
663
- fielddef_t_pv* src_fd = (fielddef_t_pv*)dbdef::getFieldDef(src);
709
+ fielddef_t_my* fd = (fielddef_t_my*)dest->setFielddefsPtr();
710
+ fielddef_t_pv* src_fd = (fielddef_t_pv*)const_cast<tabledef*>(src)->setFielddefsPtr();
664
711
  for (int i = 0; i < dest->fieldCount; ++i)
665
712
  {
666
713
  convert(*fd, *src_fd);
@@ -678,7 +725,31 @@ void dbdef::tableDefCopy(tabledef* dest, tabledef* src, size_t size)
678
725
  tabledef** dbdef::tableDefPtr(int index)
679
726
  {
680
727
  tableDefs(index);
681
- return &m_impl->tableDefs[index];
728
+ return &m_dimpl->tableDefs[index];
729
+ }
730
+
731
+ tabledef* dbdef::initReadAfter(short tableIndex, const tabledef* data, uint_td datalen)
732
+ {
733
+ m_datalen = fixVariableLenBug(isUseTransactd(), data, datalen);
734
+ size_t size = getNewVersionSize(data);
735
+ tabledef* td = (tabledef*)malloc(size + 10);
736
+ if (td == NULL)
737
+ {
738
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
739
+ return NULL;
740
+ }
741
+ m_dimpl->tableDefs[tableIndex] = td;
742
+ tableDefCopy(td, data, min<size_t>(m_datalen, size));
743
+ td->setFielddefsPtr();
744
+ td->setKeydefsPtr();
745
+ td->autoIncExSpace = ((database*)nsdb())->defaultAutoIncSpace();
746
+ //Fix:Bug of maxRecordLen is mistake value saved, recalculate maxRecordLen.
747
+ td->calcReclordlen();
748
+ if (td->fieldDefs[td->fieldCount -1].type == ft_myfixedbinary)
749
+ td->optionFlags.bitC = true;
750
+ td->id = tableIndex;
751
+ td->defaultImage = NULL;
752
+ return td;
682
753
  }
683
754
 
684
755
  #pragma warn -8004
@@ -686,28 +757,25 @@ tabledef* dbdef::tableDefs(int index)
686
757
  {
687
758
  if (index > TABLE_NUM_TMP)
688
759
  return NULL;
689
- tabledef* def = m_impl->tableDefs[index];
760
+ tabledef* td = m_dimpl->tableDefs[index];
690
761
 
691
762
  if (index == TABLE_NUM_TMP)
692
- return def;
693
- if (m_impl->tableCount < index)
763
+ return td;
764
+ if (m_dimpl->tableCount < index)
694
765
  return NULL;
695
- if (def == NULL)
766
+ if (td == NULL)
696
767
  {
697
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
768
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
698
769
  return NULL;
699
770
  while (1)
700
771
  {
701
- m_pdata = m_impl->bdf;
702
- m_buflen = m_impl->bdfLen;
703
- m_impl->bdf->id = (short)index;
704
- memcpy(m_keybuf, &m_impl->bdf->id, 2);
772
+ m_pdata = m_dimpl->bdf;
773
+ m_buflen = m_dimpl->bdfLen;
774
+ m_dimpl->bdf->id = (short)index;
775
+ memcpy(m_keybuf, &m_dimpl->bdf->id, 2);
705
776
  seek();
706
777
  if (m_stat == STATUS_BUFFERTOOSMALL)
707
- {
708
- if (!resizeReadBuf())
709
- return NULL;
710
- }
778
+ return NULL;
711
779
  else
712
780
  break;
713
781
  }
@@ -717,97 +785,78 @@ tabledef* dbdef::tableDefs(int index)
717
785
  }
718
786
  if (m_stat)
719
787
  {
720
- def = (tabledef*)-1;
788
+ td = (tabledef*)-1;
721
789
  m_stat = 0;
722
790
  return NULL;
723
791
  }
724
- m_datalen =
725
- fixVariableLenBug(isUseTransactd(), (tabledef*)m_pdata, m_datalen);
726
- size_t size = getNewVersionSize((tabledef*)m_pdata);
727
- def = (tabledef*)malloc(size);
728
- m_impl->tableDefs[index] = def;
729
- if (def == NULL)
730
- {
731
- m_stat = STATUS_CANT_ALLOC_MEMORY;
732
- return NULL;
733
- }
734
- tableDefCopy(def, (tabledef*)m_pdata, m_datalen);
735
- def->fieldDefs = getFieldDef(def);
736
- def->keyDefs = getKeyDef(def);
737
- def->autoIncExSpace = ((database*)nsdb())->defaultAutoIncSpace();
738
-
739
- setCodePage(def);
740
- //Fix:Bug of maxRecordLen is mistake value saved, recalculate maxRecordLen.
741
- setRecordLen(index);
792
+ td = initReadAfter(index, (tabledef*)m_pdata, m_datalen);
742
793
  }
743
- else if (def == (tabledef*)-1)
794
+ else if (td == (tabledef*)-1)
744
795
  return NULL;
745
796
 
746
- return def;
797
+ return td;
747
798
  }
748
799
  #pragma warn .8004
749
800
 
750
- void dbdef::doOpen(const _TCHAR* FullPath, char_td mode, const _TCHAR* OnerName)
801
+ void dbdef::doOpen(const _TCHAR* uri, char_td mode, const _TCHAR* onerName)
751
802
  {
752
- m_impl->noWriteMode = true;
803
+ m_dimpl->noWriteMode = true;
753
804
 
754
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
805
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
755
806
  {
756
807
 
757
- openDdf(((database*)nsdb())->rootDir(), mode, OnerName); // DDF
808
+ openDdf(((database*)nsdb())->rootDir(), mode, onerName); // DDF
758
809
  if (mode != TD_OPEN_READONLY)
759
- m_impl->noWriteMode = false;
810
+ m_dimpl->noWriteMode = false;
760
811
  return;
761
812
  }
762
813
 
763
814
  // version check
764
- m_impl->version[7] = '0';
765
- nstable::doOpen(FullPath, mode, m_impl->version);
815
+ m_dimpl->version[7] = '0';
816
+ nstable::doOpen(uri, mode, m_dimpl->version);
766
817
  if (m_stat == STATUS_INVALID_OWNERNAME)
767
818
  {
768
819
  while (m_stat == STATUS_INVALID_OWNERNAME)
769
820
  {
770
- m_impl->version[7]++;
771
- nstable::doOpen(FullPath, mode, m_impl->version);
772
- if (m_impl->version[7] > '9')
821
+ m_dimpl->version[7]++;
822
+ nstable::doOpen(uri, mode, m_dimpl->version);
823
+ if (m_dimpl->version[7] > '9')
773
824
  return;
774
825
  }
775
826
  }
776
- if (m_stat)
777
- return;
778
-
779
- if (m_impl->bdf == NULL)
780
- m_impl->bdf = (tabledef*)malloc(m_impl->bdfLen);
781
- m_pdata = m_impl->bdf;
782
- memcpy(m_keybuf, &m_impl->bdf->id, 2);
783
- m_buflen = m_impl->bdfLen;
827
+ if (m_stat) return;
828
+
829
+ if (m_dimpl->bdf == NULL)
830
+ allocDatabuffer();
831
+ if (m_stat) return;
832
+
833
+ m_pdata = m_dimpl->bdf;
834
+ m_buflen = m_dimpl->bdfLen;
784
835
  m_keynum = 0;
785
-
786
836
  seekLast();
787
837
  if (m_stat == STATUS_SUCCESS)
788
- m_impl->tableCount = m_impl->bdf->id;
838
+ m_dimpl->tableCount = m_dimpl->bdf->id;
789
839
  if (m_stat == STATUS_EOF)
790
840
  m_stat = STATUS_SUCCESS;
791
841
  if (mode != TD_OPEN_READONLY)
792
- m_impl->noWriteMode = false;
793
- m_impl->openMode = mode;
842
+ m_dimpl->noWriteMode = false;
843
+ m_dimpl->openMode = mode;
794
844
  }
795
845
 
796
846
  void dbdef::doClose()
797
847
  {
798
848
  nstable::doClose();
799
- if (m_impl->bdf)
849
+ if (m_dimpl->bdf)
800
850
  {
801
- free(m_impl->bdf);
802
- m_impl->bdf = NULL;
851
+ free(m_dimpl->bdf);
852
+ m_dimpl->bdf = NULL;
803
853
  }
804
- m_impl->openMode = 1;
854
+ m_dimpl->openMode = 1;
805
855
  }
806
856
 
807
857
  void dbdef::create(const _TCHAR* fullpath)
808
858
  {
809
-
810
- if (m_impl->deftype == TYPE_SCHEMA_DDF)
859
+ if (m_dimpl->deftype == TYPE_SCHEMA_DDF)
811
860
  {
812
861
  createDDF(fullpath);
813
862
  return;
@@ -845,25 +894,6 @@ void dbdef::drop()
845
894
  m_stat = nsdb()->stat();
846
895
  }
847
896
 
848
- ushort_td dbdef::getRecordLen(short TableIndex)
849
- {
850
- ushort_td ret = 0;
851
- short i;
852
- tabledef* td = tableDefs(TableIndex);
853
- for (i = 0; i < td->fieldCount; i++)
854
- ret += td->fieldDefs[i].len/* + td->fieldDefs[i].varLenBytes()*/;
855
- return ret;
856
- }
857
-
858
- ushort_td dbdef::getFieldPosition(tabledef* TableDef, short FieldNum)
859
- {
860
- short i;
861
- ushort_td pos = 1;
862
- for (i = 0; i < FieldNum; i++)
863
- pos += TableDef->fieldDefs[i].len;
864
- return pos;
865
- }
866
-
867
897
  void dbdef::getFileSpec(fileSpec* fs, short TableIndex)
868
898
  {
869
899
  keySpec* ks;
@@ -887,7 +917,7 @@ void dbdef::getFileSpec(fileSpec* fs, short TableIndex)
887
917
  {
888
918
  FieldNum = KeyDef->segments[j].fieldNum;
889
919
  ks = &(fs->keySpecs[k]);
890
- ks->keyPos = getFieldPosition(TableDef, FieldNum);
920
+ ks->keyPos = TableDef->fieldDefs[FieldNum].pos;
891
921
  ks->keyLen = TableDef->fieldDefs[FieldNum].len;
892
922
  ks->keyFlag.all = KeyDef->segments[j].flags.all;
893
923
  ks->keyCount = 0;
@@ -919,83 +949,72 @@ void dbdef::renumberTable(short OldIndex, short NewIndex)
919
949
  m_stat = STATUS_TOO_MANY_TABLES;
920
950
  return;
921
951
  }
922
- if (m_impl->noWriteMode)
952
+ tabledef* td = tableDefs(OldIndex);
953
+ if (m_dimpl->noWriteMode)
923
954
  {
924
- tableDefs(OldIndex)->id = NewIndex;
925
- m_impl->tableDefs[NewIndex] = tableDefs(OldIndex);
926
- m_impl->tableDefs[OldIndex] = NULL;
927
- if (NewIndex > m_impl->tableCount)
928
- m_impl->tableCount = NewIndex;
955
+ td->id = NewIndex;
956
+ m_dimpl->tableDefs[NewIndex] = td;
957
+ m_dimpl->tableDefs[OldIndex] = NULL;
958
+ if (NewIndex > m_dimpl->tableCount)
959
+ m_dimpl->tableCount = NewIndex;
929
960
  return;
930
961
  }
931
- moveById(tableDefs(OldIndex)->id);
962
+ moveById(td->id);
932
963
  if (m_stat == STATUS_SUCCESS)
933
964
  {
934
- m_pdata = tableDefs(OldIndex);
935
- m_buflen = totalDefLength(OldIndex);
936
- tableDefs(OldIndex)->id = NewIndex;
965
+
966
+ m_pdata = td;
967
+ m_buflen = td->size();
968
+ td->id = NewIndex;
937
969
  update();
938
- m_pdata = m_impl->bdf;
939
- m_buflen = m_impl->bdfLen;
970
+ m_pdata = m_dimpl->bdf;
971
+ m_buflen = m_dimpl->bdfLen;
940
972
 
941
973
  if (m_stat == STATUS_SUCCESS)
942
974
  {
943
- m_impl->tableDefs[NewIndex] = tableDefs(OldIndex);
944
- m_impl->tableDefs[OldIndex] = NULL;
945
- if (NewIndex > m_impl->tableCount)
946
- m_impl->tableCount = NewIndex;
975
+ m_dimpl->tableDefs[NewIndex] = td;
976
+ m_dimpl->tableDefs[OldIndex] = NULL;
977
+ if (NewIndex > m_dimpl->tableCount)
978
+ m_dimpl->tableCount = NewIndex;
947
979
  }
948
980
  else
949
- tableDefs(OldIndex)->id = OldIndex;
981
+ td->id = OldIndex;
950
982
  }
951
983
  }
952
984
 
953
- void dbdef::cacheFieldPos(tabledef* TableDef)
954
- {
955
-
956
- short i;
957
- for (i = 0; i < TableDef->fieldCount; i++)
958
- TableDef->fieldDefs[i].pos =
959
- (ushort_td)(getFieldPosition(TableDef, i) - 1);
960
- }
961
-
962
985
  short dbdef::fieldNumByViewNum(short TableIndex, short index)
963
986
  {
964
- short i;
965
- tabledef* TableDef = tableDefs(TableIndex);
966
- for (i = 0; i < TableDef->fieldCount; i++)
987
+ tabledef* td = tableDefs(TableIndex);
988
+ if (td)
967
989
  {
968
- if ((TableDef->fieldDefs[i].viewNum == index) &&
969
- (TableDef->fieldDefs[i].enableFlags.bit0))
970
- return i;
990
+ for (short i = 0; i < td->fieldCount; i++)
991
+ {
992
+ if ((td->fieldDefs[i].viewNum == index) &&
993
+ (td->fieldDefs[i].enableFlags.bit0))
994
+ return i;
995
+ }
971
996
  }
972
997
  return -1;
973
998
  }
974
999
 
975
1000
  short dbdef::findKeynumByFieldNum(short TableIndex, short index)
976
1001
  {
977
- short i;
978
- tabledef* TableDef = tableDefs(TableIndex);
979
-
980
- for (i = 0; i < TableDef->keyCount; i++)
981
- {
982
- if (TableDef->keyDefs[i].segments[0].fieldNum == index)
983
- return i;
984
- }
1002
+ tabledef* td = tableDefs(TableIndex);
1003
+ if (td)
1004
+ return td->findKeynumByFieldNum(index);
985
1005
  return -1;
986
1006
  }
987
1007
 
988
1008
  short dbdef::tableNumByName(const _TCHAR* tableName)
989
1009
  {
990
- short i;
991
1010
  char buf[74];
992
-
993
- for (i = 1; i <= m_impl->tableCount; i++)
1011
+ for (short i = 1; i <= m_dimpl->tableCount; i++)
994
1012
  {
995
- if (tableDefs(i))
1013
+ tabledef* td = tableDefs(i);
1014
+ if (td)
996
1015
  {
997
- const char* p = tableDefs(i)->toChar(buf, tableName, 74);
998
- if (strcmp(tableDefs(i)->tableNameA(), p) == 0)
1016
+ const char* p = td->toChar(buf, tableName, 74);
1017
+ if (strcmp(td->tableNameA(), p) == 0)
999
1018
  return i;
1000
1019
  }
1001
1020
  }
@@ -1004,14 +1023,9 @@ short dbdef::tableNumByName(const _TCHAR* tableName)
1004
1023
 
1005
1024
  short dbdef::fieldNumByName(short TableIndex, const _TCHAR* name)
1006
1025
  {
1007
- short i;
1008
- char buf[74];
1009
- const char* p = tableDefs(TableIndex)->toChar(buf, name, 74);
1010
- for (i = 0; i < tableDefs(TableIndex)->fieldCount; i++)
1011
- {
1012
- if (strcmp(tableDefs(TableIndex)->fieldDefs[i].nameA(), p) == 0)
1013
- return i;
1014
- }
1026
+ tabledef* td = tableDefs(TableIndex);
1027
+ if (td)
1028
+ return td->fieldNumByName(name);
1015
1029
  return -1;
1016
1030
  }
1017
1031
 
@@ -1046,7 +1060,13 @@ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
1046
1060
  case ft_mytext:
1047
1061
  minlen = 9;
1048
1062
  maxlen = 12;
1049
- defaultlen = 1;
1063
+ defaultlen = 9;
1064
+ break;
1065
+ case ft_mygeometry:
1066
+ case ft_myjson:
1067
+ minlen = 12;
1068
+ maxlen = 12;
1069
+ defaultlen = 12;
1050
1070
  break;
1051
1071
  case ft_mywchar:
1052
1072
  case ft_wstring:
@@ -1070,6 +1090,11 @@ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
1070
1090
  maxlen = 60000;
1071
1091
  defaultlen = 1024;
1072
1092
  break;
1093
+ case ft_myyear:
1094
+ minlen = 1;
1095
+ maxlen = 1;
1096
+ defaultlen = 1;
1097
+ break;
1073
1098
  case ft_mydate:
1074
1099
  minlen = 3;
1075
1100
  maxlen = 3;
@@ -1122,7 +1147,12 @@ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
1122
1147
  if (FieldType == 17)
1123
1148
  minlen = 2;
1124
1149
  break;
1125
-
1150
+ case ft_mydecimal:
1151
+ minlen = 1;
1152
+ maxlen = 32;
1153
+ defaultlen = 5;
1154
+ dec = 0;
1155
+ break;
1126
1156
  case ft_note:
1127
1157
  minlen = 2;
1128
1158
  maxlen = 32761;
@@ -1145,8 +1175,14 @@ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
1145
1175
  defaultlen = 4;
1146
1176
  break;
1147
1177
  case ft_bit:
1178
+ case ft_set:
1148
1179
  minlen = 1;
1149
- maxlen = 1;
1180
+ maxlen = 8;
1181
+ defaultlen = 1;
1182
+ break;
1183
+ case ft_enum:
1184
+ minlen = 1;
1185
+ maxlen = 2;
1150
1186
  defaultlen = 1;
1151
1187
  break;
1152
1188
  case ft_timestamp:
@@ -1165,7 +1201,6 @@ uint_td dbdef::fieldValidLength(eFieldQuery query, uchar_td FieldType)
1165
1201
  maxlen = 8;
1166
1202
  defaultlen = 5;
1167
1203
  break;
1168
-
1169
1204
  case ft_nullindicator:
1170
1205
  minlen = 0;
1171
1206
  maxlen = 0;
@@ -1192,7 +1227,7 @@ bool dbdef::validLen(uchar_td FieldType, uint_td FieldLen)
1192
1227
  {
1193
1228
  if ((FieldType == ft_integer) || (FieldType == ft_uinteger))
1194
1229
  {
1195
- if ((FieldLen == 1) || (FieldLen == 2) || (FieldLen == 4) ||
1230
+ if ((FieldLen == 1) || (FieldLen == 2) || (FieldLen == 3) || (FieldLen == 4) ||
1196
1231
  (FieldLen == 8))
1197
1232
  return true;
1198
1233
  else
@@ -1200,7 +1235,7 @@ bool dbdef::validLen(uchar_td FieldType, uint_td FieldLen)
1200
1235
  }
1201
1236
  else if ((FieldType == ft_autoinc) || (FieldType == ft_autoIncUnsigned))
1202
1237
  {
1203
- if ((FieldLen == 2) || (FieldLen == 4) || (FieldLen == 8))
1238
+ if ((FieldLen == 2) || (FieldLen == 3) || (FieldLen == 4) || (FieldLen == 8))
1204
1239
  return true;
1205
1240
  else
1206
1241
  return false;
@@ -1220,43 +1255,12 @@ bool dbdef::validLen(uchar_td FieldType, uint_td FieldLen)
1220
1255
 
1221
1256
  bool dbdef::isPassKey(uchar_td FieldType)
1222
1257
  {
1223
- if (FieldType == ft_autoIncUnsigned)
1224
- return true;
1225
- if (FieldType == ft_wstring)
1226
- return true;
1227
- if (FieldType == ft_wzstring)
1228
- return true;
1229
- if (FieldType == ft_myvarchar)
1230
- return true;
1231
- if (FieldType == ft_myvarbinary)
1232
- return true;
1233
- if (FieldType == ft_mywvarchar)
1234
- return true;
1235
- if (FieldType == ft_mywvarbinary)
1236
- return true;
1237
- if (FieldType == ft_mychar)
1238
- return true;
1239
- if (FieldType == ft_mywchar)
1240
- return true;
1241
-
1242
- if (FieldType == ft_mytext)
1243
- return true;
1244
- if (FieldType == ft_myblob)
1245
- return true;
1246
-
1247
- if (FieldType == ft_mydate)
1248
- return true;
1249
- if (FieldType == ft_mytime)
1250
- return true;
1251
- if (FieldType == ft_mydatetime)
1252
- return true;
1253
1258
  if (FieldType == ft_myfixedbinary)
1254
1259
  return false;
1255
-
1256
1260
  if (FieldType == ft_bit)
1257
1261
  return false;
1258
- if (FieldType > ft_numericsts)
1259
- return false;
1262
+ //if (FieldType > ft_numericsts)
1263
+ // return false;
1260
1264
  if (FieldType == ft_note)
1261
1265
  return false;
1262
1266
  if (FieldType == ft_lvar)
@@ -1264,8 +1268,9 @@ bool dbdef::isPassKey(uchar_td FieldType)
1264
1268
  return true;
1265
1269
  }
1266
1270
 
1267
- void dbdef::autoMakeSchema()
1271
+ void dbdef::autoMakeSchema(bool nouseNullkey)
1268
1272
  {
1273
+ m_keynum = (int)nouseNullkey;
1269
1274
  tdap(TD_AUTOMEKE_SCHEMA);
1270
1275
  }
1271
1276
 
@@ -1327,11 +1332,11 @@ void dbdef::saveDDF(short TableIndex, short opration, bool forPsqlDdf)
1327
1332
 
1328
1333
  if ((tb) && (fd) && (id))
1329
1334
  {
1330
- if (m_impl->userName[0] != 0x00)
1335
+ if (m_dimpl->userName[0] != 0x00)
1331
1336
  {
1332
- own[0] = (const _TCHAR*)m_impl->userName;
1333
- own[1] = (const _TCHAR*)m_impl->userName;
1334
- own[2] = (const _TCHAR*)m_impl->userName;
1337
+ own[0] = (const _TCHAR*)m_dimpl->userName;
1338
+ own[1] = (const _TCHAR*)m_dimpl->userName;
1339
+ own[2] = (const _TCHAR*)m_dimpl->userName;
1335
1340
  }
1336
1341
  else
1337
1342
  {
@@ -1491,14 +1496,14 @@ void dbdef::openDdf(const _TCHAR* dir, short Mode, const _TCHAR* OwnerName)
1491
1496
  own[0] = OwnerName;
1492
1497
  own[1] = OwnerName;
1493
1498
  own[2] = OwnerName;
1494
- _tcscpy(m_impl->userName, OwnerName);
1499
+ _tcscpy(m_dimpl->userName, OwnerName);
1495
1500
  }
1496
1501
  else
1497
1502
  {
1498
1503
  own[0] = (_TCHAR*)ow0;
1499
1504
  own[1] = (_TCHAR*)ow1;
1500
1505
  own[2] = (_TCHAR*)ow2;
1501
- m_impl->userName[0] = 0x00;
1506
+ m_dimpl->userName[0] = 0x00;
1502
1507
  }
1503
1508
 
1504
1509
  tb->open(dir, (char_td)Mode, own[0]);
@@ -1595,9 +1600,9 @@ void dbdef::openDdf(const _TCHAR* dir, short Mode, const _TCHAR* OwnerName)
1595
1600
  fd->seekNext();
1596
1601
  }
1597
1602
 
1598
- tableDefs(tbid)->maxRecordLen = getRecordLen(tbid);
1603
+ tableDefs(tbid)->calcReclordlen();
1599
1604
 
1600
- tableDefs(tbid)->fixedRecordLen = tableDefs(tbid)->maxRecordLen;
1605
+ tableDefs(tbid)->fixedRecordLen = tableDefs(tbid)->recordlen();
1601
1606
  tableDefs(tbid)->parentKeyNum = -1;
1602
1607
  tableDefs(tbid)->replicaKeyNum = -1;
1603
1608
  tableDefs(tbid)->primaryKeyNum = -1;
@@ -1653,7 +1658,7 @@ ushort_td dbdef::getDDFNewTableIndex()
1653
1658
  {
1654
1659
  int i;
1655
1660
  int max_id = 0;
1656
- for (i = 0; i <= m_impl->tableCount; i++)
1661
+ for (i = 0; i <= m_dimpl->tableCount; i++)
1657
1662
  {
1658
1663
  if (tableDefs(i) != NULL)
1659
1664
  {
@@ -1668,22 +1673,22 @@ ushort_td dbdef::getDDFNewTableIndex()
1668
1673
  ushort_td dbdef::getDDFNewFieldIndex()
1669
1674
  {
1670
1675
  int i, j;
1671
- if (m_impl->maxid == 0)
1676
+ if (m_dimpl->maxid == 0)
1672
1677
  {
1673
- for (i = 0; i <= m_impl->tableCount; i++)
1678
+ for (i = 0; i <= m_dimpl->tableCount; i++)
1674
1679
  {
1675
1680
  if (tableDefs(i) != NULL)
1676
1681
  {
1677
1682
  for (j = 0; j < tableDefs(i)->fieldCount; j++)
1678
1683
  {
1679
- if (tableDefs(i)->fieldDefs[j].ddfid > m_impl->maxid)
1680
- m_impl->maxid = tableDefs(i)->fieldDefs[j].ddfid;
1684
+ if (tableDefs(i)->fieldDefs[j].ddfid > m_dimpl->maxid)
1685
+ m_dimpl->maxid = tableDefs(i)->fieldDefs[j].ddfid;
1681
1686
  }
1682
1687
  }
1683
1688
  }
1684
1689
  }
1685
- m_impl->maxid++;
1686
- return (ushort_td)m_impl->maxid;
1690
+ m_dimpl->maxid++;
1691
+ return (ushort_td)m_dimpl->maxid;
1687
1692
  }
1688
1693
 
1689
1694
  void setFieldsCharsetIndex(tabledef* def)
@@ -1698,68 +1703,76 @@ void setFieldsCharsetIndex(tabledef* def)
1698
1703
  }
1699
1704
  }
1700
1705
 
1701
- void dbdef::pushBackup(short TableIndex)
1706
+ void dbdef::pushBackup(short tableIndex)
1702
1707
  {
1703
1708
  int blen;
1704
-
1705
- blen = totalDefLength(TableIndex);
1709
+ tabledef* td = tableDefs(tableIndex);
1710
+ if (!td)
1711
+ {
1712
+ m_stat = STATUS_INVALID_TABLE_IDX;
1713
+ return;
1714
+ }
1715
+ blen = td->size();
1706
1716
  if (!tableDefs(TABLE_NUM_TMP))
1707
- m_impl->tableDefs[TABLE_NUM_TMP] = (tabledef*)malloc(blen);
1717
+ m_dimpl->tableDefs[TABLE_NUM_TMP] = (tabledef*)malloc(blen);
1708
1718
  else
1709
- m_impl->tableDefs[TABLE_NUM_TMP] =
1719
+ m_dimpl->tableDefs[TABLE_NUM_TMP] =
1710
1720
  (tabledef*)realloc(tableDefs(TABLE_NUM_TMP), blen);
1711
- if (!tableDefs(TABLE_NUM_TMP))
1721
+
1722
+ tabledef* tdt = m_dimpl->tableDefs[TABLE_NUM_TMP];
1723
+ if (!tdt)
1712
1724
  {
1713
1725
  m_stat = STATUS_CANT_ALLOC_MEMORY;
1714
1726
  return;
1715
1727
  }
1716
-
1717
- setFieldsCharsetIndex(tableDefs(TableIndex));
1718
- tabledef* td = m_impl->tableDefs[TABLE_NUM_TMP];
1719
- memcpy(td, tableDefs(TableIndex), blen);
1720
- td->fieldDefs = getFieldDef(td);
1721
- td->keyDefs = getKeyDef(td);
1728
+ setFieldsCharsetIndex(td);
1729
+ memcpy(tdt, td, blen);
1730
+ tdt->m_inUse = 0;
1731
+ tdt->setFielddefsPtr();
1732
+ tdt->setKeydefsPtr();
1722
1733
 
1723
1734
  }
1724
1735
 
1725
- bool dbdef::compAsBackup(short TableIndex)
1736
+ bool dbdef::compAsBackup(short tableIndex)
1726
1737
  {
1727
- if (m_impl->tableCount < TableIndex)
1738
+ if (m_dimpl->tableCount < tableIndex)
1728
1739
  return false;
1729
1740
 
1730
- int len = totalDefLength(TABLE_NUM_TMP);
1731
- int len2 = totalDefLength(TableIndex);
1732
- if (len != len2)
1733
- return true;
1734
- tabledef* tds = tableDefs(TableIndex);
1741
+ tabledef* tds = tableDefs(tableIndex);
1735
1742
  tabledef* tdo = tableDefs(TABLE_NUM_TMP);
1736
1743
 
1737
- if (memcmp(tds, tdo, ((char*)(&(tdo->fieldDefs))) - ((char*)tdo)))
1744
+ if (tds->size() != tdo->size())
1738
1745
  return true;
1739
1746
 
1747
+ //tabledef
1748
+ bool isSame = (*tds == *tdo);
1749
+ if (!isSame) return true;
1750
+
1740
1751
  for (int i = 0; i < tds->fieldCount; i++)
1741
1752
  {
1742
- if (memcmp(&tds->fieldDefs[i], &tdo->fieldDefs[i], sizeof(fielddef)))
1743
- return true;
1753
+ isSame = (tds->fieldDefs[i] == tdo->fieldDefs[i]);
1754
+ if (!isSame) return true;
1744
1755
  }
1745
1756
  for (int i = 0; i < tds->keyCount; i++)
1746
1757
  {
1747
- if (memcmp(&tds->keyDefs[i], &tdo->keyDefs[i], sizeof(keydef)))
1748
- return true;
1758
+ isSame = (tds->keyDefs[i] == tdo->keyDefs[i]);
1759
+ if (!isSame) return true;
1749
1760
  }
1750
1761
  return false;
1751
1762
  }
1752
1763
 
1753
- void dbdef::popBackup(short TableIndex)
1764
+ void dbdef::popBackup(short tableIndex)
1754
1765
  {
1755
- int len = totalDefLength(TABLE_NUM_TMP);
1756
- m_impl->tableDefs[TableIndex] =
1757
- (tabledef*)realloc(tableDefs(TableIndex), len);
1758
- tabledef* td = m_impl->tableDefs[TableIndex];
1759
- memcpy(td, tableDefs(TABLE_NUM_TMP), len);
1760
- td->fieldDefs = getFieldDef(td);
1761
- td->keyDefs = getKeyDef(td);
1762
- updateTableDef(TableIndex);
1766
+ tabledef* tdt = tableDefs(TABLE_NUM_TMP);
1767
+ tabledef* td = m_dimpl->tableDefs[tableIndex];
1768
+ if (tdt && td)
1769
+ {
1770
+ m_dimpl->tableDefs[tableIndex] = td = (tabledef*)realloc(td, tdt->size());
1771
+ memcpy(td, tdt, tdt->size());
1772
+ td->setFielddefsPtr();
1773
+ td->setKeydefsPtr();
1774
+ updateTableDef(tableIndex);
1775
+ }
1763
1776
  }
1764
1777
 
1765
1778
  void dbdef::reopen(char_td mode)
@@ -1768,6 +1781,46 @@ void dbdef::reopen(char_td mode)
1768
1781
  open(uri(), mode, NULL);
1769
1782
  }
1770
1783
 
1784
+ void dbdef::synchronizeSeverSchema(short tableIndex)
1785
+ {
1786
+ if (!isUseTransactd()) return;
1787
+
1788
+ tabledef* tdold = tableDefs(tableIndex);
1789
+ if (!tdold) return;
1790
+
1791
+ void* tmp = m_keybuf;
1792
+
1793
+ _TCHAR dummyUrl[MAX_PATH] = _T("tdap://srv/db?dbfile=");
1794
+ _tcscat(dummyUrl, tdold->fileName());
1795
+
1796
+ char tmpName[MAX_PATH] = { 0x00 };
1797
+ const char* p = nsdatabase::toServerUri(tmpName, MAX_PATH, dummyUrl, true);
1798
+ m_keybuf = (void*)p;
1799
+ m_keylen = (keylen_td)strlen(p) + 1;
1800
+ m_pdata = m_dimpl->bdf;
1801
+ m_buflen = m_datalen = m_dimpl->bdfLen;
1802
+ m_dimpl->bdf->id = tableIndex;
1803
+ tdap((ushort_td)TD_GET_SCHEMA);
1804
+ if (m_stat == STATUS_SUCCESS)
1805
+ {
1806
+ if (m_datalen == 0)
1807
+ {
1808
+ m_stat = STATUS_NOSUPPORT_OP;
1809
+ m_keybuf = tmp;
1810
+ return;
1811
+ }
1812
+ tabledef* td = (tabledef*)m_pdata;
1813
+ td->m_mysqlNullMode = tdold->isMysqlNullMode();
1814
+ td = initReadAfter(tableIndex, td, m_datalen);
1815
+ if (td)
1816
+ {
1817
+ m_stat = td->synchronize(tdold);
1818
+ delete tdold;
1819
+ }
1820
+ }
1821
+ m_keybuf = tmp;
1822
+ }
1823
+
1771
1824
  } // namespace client
1772
1825
  } // namespace tdap
1773
1826
  } // namespace protocol