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
@@ -41,21 +41,29 @@ namespace client
41
41
 
42
42
  struct dbimple
43
43
  {
44
+ static int m_compatibleMode;
44
45
  dbdef* dbDef;
45
46
  void* optionalData;
46
47
  _TCHAR rootDir[MAX_PATH];
47
48
  deleteRecordFn m_deleteRecordFn;
48
49
  copyDataFn m_copyDataFn;
49
- bool isOpened;
50
- bool isTableReadOnly;
51
- bool lockReadOnly;
52
-
50
+ uint_td openBuflen;
51
+ btrVersions vers;
52
+ struct
53
+ {
54
+ bool isOpened : 1;
55
+ bool isTableReadOnly : 1;
56
+ bool lockReadOnly : 1;
57
+ bool autoSchemaUseNullkey : 1;
58
+ bool noPreloadSchema : 1;
59
+ };
53
60
  dbimple()
54
61
  : dbDef(NULL), optionalData(NULL), m_deleteRecordFn(NULL),
55
- m_copyDataFn(NULL), isOpened(false), isTableReadOnly(false),
56
- lockReadOnly(false)
62
+ m_copyDataFn(NULL), openBuflen(0), isOpened(false), isTableReadOnly(false),
63
+ lockReadOnly(false), autoSchemaUseNullkey(false), noPreloadSchema(false)
57
64
  {
58
65
  rootDir[0] = 0x00;
66
+ memset(&vers, 0 , sizeof(btrVersions));
59
67
  }
60
68
 
61
69
  dbimple& operator=(const dbimple& rt)
@@ -70,11 +78,20 @@ struct dbimple
70
78
  lockReadOnly = rt.lockReadOnly;
71
79
  m_deleteRecordFn = rt.m_deleteRecordFn;
72
80
  m_copyDataFn = rt.m_copyDataFn;
81
+ autoSchemaUseNullkey = rt.autoSchemaUseNullkey;
82
+ noPreloadSchema = rt.noPreloadSchema;
83
+ vers = rt.vers;
73
84
  }
74
85
  return *this;
75
86
  }
87
+
88
+ const btrVersion& mysqlVer() const { return vers.versions[VER_IDX_DB_SERVER];}
89
+ const btrVersion& pluginVer() const { return vers.versions[VER_IDX_PLUGIN];}
90
+
76
91
  };
77
92
 
93
+ int dbimple::m_compatibleMode = database::CMP_MODE_MYSQL_NULL;
94
+
78
95
  void database::destroy(database* db)
79
96
  {
80
97
  delete db;
@@ -170,12 +187,58 @@ char_td database::mode() const
170
187
  return m_impl->dbDef->mode();
171
188
  }
172
189
 
173
- void database::create(const _TCHAR* fullpath, short type)
190
+ bool database::autoSchemaUseNullkey() const
191
+ {
192
+ return m_impl->autoSchemaUseNullkey;
193
+ }
194
+
195
+ void database::setAutoSchemaUseNullkey(bool v)
196
+ {
197
+ m_impl->autoSchemaUseNullkey = v;
198
+ }
199
+
200
+ void database::create(const _TCHAR* uri, short type)
174
201
  {
175
202
  if (!m_impl->dbDef)
176
203
  m_impl->dbDef = new dbdef(this, type); // Create TabelDef here.
177
- m_impl->dbDef->create(fullpath);
178
- m_stat = m_impl->dbDef->stat();
204
+
205
+ _TCHAR buf[MAX_PATH];
206
+ schemaTable(uri, buf, MAX_PATH);
207
+ if (buf[0])
208
+ {
209
+ m_impl->dbDef->create(uri);
210
+ m_stat = m_impl->dbDef->stat();
211
+ }
212
+ else
213
+ {
214
+ if (isTransactdUri(uri))
215
+ {
216
+ if (setUseTransactd() == false)
217
+ m_stat = ERROR_LOAD_CLIBRARY;
218
+ else
219
+ {
220
+ _TCHAR uri_tmp[MAX_PATH];
221
+ stripParam(uri, buf, MAX_PATH);
222
+ _tcscpy_s(uri_tmp, MAX_PATH, buf);
223
+ _tcscat(uri_tmp, _T("?dbfile="));
224
+ _tcscat(uri_tmp, TRANSACTD_SCHEMANAME);
225
+ passwd(uri, buf, MAX_PATH);
226
+ if (buf[0])
227
+ {
228
+ _tcscat(uri_tmp, _T("&pwd="));
229
+ _tcscat(uri_tmp, buf);
230
+ }
231
+
232
+ _TCHAR posblk[128] = { 0x00 };
233
+ const char* p = toServerUri((char*)buf, MAX_PATH, uri_tmp, true);
234
+ uint_td len = 0;
235
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, NULL, &len,
236
+ (void*)p, (uchar_td)strlen(p), CR_SUBOP_CREATE_DBONLY , clientID());
237
+ }
238
+ }
239
+ else
240
+ m_stat = STATUS_NOSUPPORT_OP;
241
+ }
179
242
  }
180
243
 
181
244
  void database::drop()
@@ -186,39 +249,71 @@ void database::drop()
186
249
  return;
187
250
  }
188
251
  _TCHAR FullPath[MAX_PATH];
189
- std::vector<std::_tstring> fileNames;
252
+ _TCHAR* fileNames[255] = {NULL};
253
+ int count = 0;
190
254
  for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
191
255
  {
192
- if (m_impl->dbDef->tableDefs(i))
256
+ tabledef* td = m_impl->dbDef->tableDefs(i);
257
+ if (td)
193
258
  {
194
259
  _stprintf_s(FullPath, MAX_PATH, _T("%s") PSEPARATOR _T("%s"),
195
- rootDir(), m_impl->dbDef->tableDefs(i)->fileName());
196
- fileNames.push_back(FullPath);
260
+ rootDir(), td->fileName());
261
+ size_t len = _tcslen(FullPath);
262
+ _TCHAR* s(new _TCHAR[len + 1]);
263
+ _tcscpy(s, FullPath);
264
+ fileNames[count++] = s;
197
265
  }
198
266
  }
199
- fileNames.push_back(m_impl->dbDef->uri());
200
- close();
201
- if (m_stat)
202
- return;
267
+ size_t len = _tcslen(m_impl->dbDef->uri());
268
+ if (len)
269
+ {
270
+ _TCHAR* s(new _TCHAR[len + 1]);
271
+ _tcscpy(s, m_impl->dbDef->uri());
272
+
273
+ fileNames[count++] = s;
274
+ BTRCALLID_PTR ptr = m_btrcallid;
275
+ m_btrcallid = NULL;
276
+ close();
277
+ m_btrcallid = ptr;
278
+ for (int i = 0; i < count; i++)
279
+ {
280
+ nsdatabase::dropTable(fileNames[i]);
281
+ if (m_stat && (m_stat == STATUS_TABLE_NOTOPEN))
282
+ break;
283
+ }
203
284
 
204
- for (size_t i = 0; i < fileNames.size(); i++)
285
+ for (int i = 0; i < count; i++)
286
+ delete [] fileNames[i];
287
+ }else
205
288
  {
206
- nsdatabase::dropTable(fileNames[i].c_str());
207
- if (m_stat && (m_stat == STATUS_TABLE_NOTOPEN))
208
- return;
289
+ _TCHAR s[MAX_PATH];
290
+ _tcscpy(s, rootDir());
291
+ _tcscat(s, TRANSACTD_SCHEMANAME);
292
+ nsdatabase::dropTable(s);
209
293
  }
294
+ if (m_stat)
295
+ return;
296
+ nsdatabase::reset();
210
297
  }
211
298
 
212
299
  void database::dropTable(const _TCHAR* TableName)
213
300
  {
301
+ if (m_impl->dbDef == NULL)
302
+ {
303
+ m_stat = STATUS_DB_YET_OPEN;
304
+ return;
305
+ }
214
306
  _TCHAR FullPath[MAX_PATH];
215
307
  _tcscpy(FullPath, rootDir());
216
308
  _tcscat(FullPath, PSEPARATOR);
217
309
  short index = m_impl->dbDef->tableNumByName(TableName);
218
310
  if (index == -1)
311
+ {
219
312
  m_stat = STATUS_TABLENAME_NOTFOUND;
220
- else
221
- _tcscat(FullPath, m_impl->dbDef->tableDefs(index)->fileName());
313
+ return;
314
+ }
315
+ tabledef* td = m_impl->dbDef->tableDefs(index);
316
+ _tcscat(FullPath, td->fileName());
222
317
 
223
318
  int i = 0;
224
319
  while (1)
@@ -229,7 +324,12 @@ void database::dropTable(const _TCHAR* TableName)
229
324
  if (++i == 10)
230
325
  break;
231
326
  Sleep(50);
232
- }
327
+ }
328
+ if (m_stat == 0)
329
+ {
330
+ m_impl->dbDef->setDefaultImage(index, NULL, 0);
331
+ td->m_inUse = 0;
332
+ }
233
333
  }
234
334
 
235
335
  void database::setDir(const _TCHAR* directory)
@@ -243,7 +343,8 @@ database& database::operator=(const database& rt)
243
343
  {
244
344
  nsdatabase::operator=(rt);
245
345
  m_impl->dbimple::operator=(*(rt.m_impl));
246
- rt.m_impl->dbDef->addref();
346
+ if (rt.m_impl->dbDef)
347
+ rt.m_impl->dbDef->addref();
247
348
  addref();
248
349
  }
249
350
  return *this;
@@ -300,6 +401,7 @@ bool database::open(const _TCHAR* _uri, short type, short mode,
300
401
 
301
402
  _TCHAR buf[MAX_PATH+50];
302
403
  m_stat = STATUS_SUCCESS;
404
+ m_impl->noPreloadSchema = false;
303
405
  if (!m_impl->isOpened)
304
406
  {
305
407
  if (setUri(_uri) == false)
@@ -323,30 +425,63 @@ bool database::open(const _TCHAR* _uri, short type, short mode,
323
425
  if (!m_impl->dbDef)
324
426
  m_impl->dbDef = new dbdef(this, type);
325
427
 
326
- doOpen(_uri, type, mode, ownername);
327
- m_impl->isOpened = (m_stat == STATUS_SUCCESS); // important
328
- if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd() &&
329
- _tcsstr(_uri, TRANSACTD_SCHEMANAME))
428
+ if (type == TYPE_SCHEMA_BDF)
429
+ {// BDF
430
+ if (isTransactdUri(_uri))
431
+ {
432
+ _TCHAR scmtable[256];
433
+ schemaTable(_uri, scmtable, 256);
434
+ m_impl->noPreloadSchema = (scmtable[0] == 0x00);
435
+ }
436
+ }
437
+ if (m_impl->noPreloadSchema)
438
+ {
439
+ if ((compatibleMode() & CMP_MODE_MYSQL_NULL) == 0)
440
+ m_stat = STATUS_INVALID_NULLMODE;
441
+ else if (connect(_uri))
442
+ {
443
+ m_impl->dbDef->allocDatabuffer();
444
+ m_stat = m_impl->dbDef->stat();
445
+ if (m_stat == 0)
446
+ {
447
+ m_impl->isOpened = true;
448
+ m_impl->autoSchemaUseNullkey = true;
449
+ getBtrVersion(&m_impl->vers);
450
+ return true;
451
+ }
452
+ }
453
+ }
454
+ else
330
455
  {
331
- // Specified TRANSACTD_SCHEMANAME and no table
332
- // Auto make schema.
333
- create(_uri, TYPE_SCHEMA_BDF);
334
- if (m_stat == STATUS_SUCCESS)
456
+ doOpen(_uri, type, mode, ownername);
457
+ m_impl->isOpened = (m_stat == STATUS_SUCCESS); // important
458
+ if ((m_stat == STATUS_TABLE_NOTOPEN) && isUseTransactd() &&
459
+ _tcsstr(_uri, TRANSACTD_SCHEMANAME))
335
460
  {
336
- //Open mode force normal
337
- doOpen(_uri, type, TD_OPEN_NORMAL, ownername);
461
+ // Specified TRANSACTD_SCHEMANAME and no table
462
+ // Auto make schema.
463
+ create(_uri, TYPE_SCHEMA_BDF);
338
464
  if (m_stat == STATUS_SUCCESS)
339
465
  {
340
- m_impl->dbDef->autoMakeSchema();
341
- m_impl->dbDef->close();
342
- doOpen(_uri, type, mode, ownername);
466
+ //Open mode force normal
467
+ doOpen(_uri, type, TD_OPEN_NORMAL, ownername);
468
+ if (m_stat == STATUS_SUCCESS)
469
+ {
470
+ m_impl->dbDef->autoMakeSchema(autoSchemaUseNullkey());
471
+ m_impl->dbDef->close();
472
+ doOpen(_uri, type, mode, ownername);
473
+ }
343
474
  }
344
475
  }
345
476
  }
346
477
  }
347
478
  if (m_impl->isOpened && onOpenAfter())
348
- return true;
349
-
479
+ {
480
+ if (isUseTransactd())
481
+ getBtrVersion(&m_impl->vers);
482
+ if (m_stat == 0)
483
+ return true;
484
+ }
350
485
  m_impl->isOpened = false;
351
486
  m_impl->dbDef->close();
352
487
  m_impl->dbDef->release();
@@ -414,10 +549,11 @@ short database::continuous(char_td IsEnd, bool inclideRepfile)
414
549
  void database::doClose()
415
550
  {
416
551
  m_stat = STATUS_SUCCESS;
417
-
418
552
  if (m_impl->dbDef)
419
553
  {
420
- m_impl->dbDef->release();
554
+ dbdef* def = m_impl->dbDef;
555
+ m_impl->dbDef = NULL;
556
+ def->release();
421
557
  nsdatabase::reset();
422
558
  }
423
559
  m_impl->dbDef = NULL;
@@ -446,44 +582,26 @@ bool database::doReopenDatabaseSchema()
446
582
  return true;
447
583
  }
448
584
 
449
- _TCHAR* database::getTableUri(_TCHAR* buf, short FileNum)
585
+ _TCHAR* database::getTableUri(_TCHAR* buf, short tableIndex)
450
586
  {
451
587
  m_stat = STATUS_SUCCESS;
452
588
  if ((m_impl->dbDef) && (m_impl->isOpened))
453
589
  {
454
- if (_tcsstr(m_impl->dbDef->tableDefs(FileNum)->fileName(),
455
- PSEPARATOR) == NULL)
456
- _stprintf_s(buf, MAX_PATH, _T("%s") PSEPARATOR _T("%s"),
457
- m_impl->rootDir,
458
- m_impl->dbDef->tableDefs(FileNum)->fileName());
459
- else
460
- _tcscpy(buf, m_impl->dbDef->tableDefs(FileNum)->fileName());
461
- return buf;
590
+ tabledef* td = m_impl->dbDef->tableDefs(tableIndex);
591
+ if (td)
592
+ return getTableUri(buf, td->fileName());
462
593
  }
463
594
  m_stat = STATUS_DB_YET_OPEN;
464
595
  return NULL;
465
596
  }
466
597
 
467
- table* database::openTable(const _TCHAR* TableName, short mode, bool AutoCreate,
468
- const _TCHAR* OrnerName, const _TCHAR* pPath)
598
+ _TCHAR* database::getTableUri(_TCHAR* buf, const _TCHAR* filename)
469
599
  {
470
- short filenum;
471
- m_stat = 0;
472
- if ((m_impl->dbDef) && (m_impl->isOpened))
473
- {
474
- filenum = m_impl->dbDef->tableNumByName(TableName);
475
- if (filenum == -1)
476
- {
477
- m_stat = m_impl->dbDef->m_stat;
478
- if (m_stat == STATUS_SUCCESS)
479
- m_stat = STATUS_TABLENAME_NOTFOUND;
480
-
481
- return NULL;
482
- }
483
- return openTable(filenum, mode, AutoCreate, OrnerName, pPath);
484
- }
485
- m_stat = STATUS_DB_YET_OPEN;
486
- return NULL;
600
+ if (_tcsstr(filename, PSEPARATOR) == NULL)
601
+ _stprintf_s(buf, MAX_PATH, _T("%s") PSEPARATOR _T("%s"), m_impl->rootDir, filename);
602
+ else
603
+ _tcscpy(buf, filename);
604
+ return buf;
487
605
  }
488
606
 
489
607
  table* database::createTableObject()
@@ -491,61 +609,187 @@ table* database::createTableObject()
491
609
  return new table(this);
492
610
  }
493
611
 
494
- table* database::openTable(short FileNum, short mode, bool AutoCreate,
495
- const _TCHAR* OrnerName, const _TCHAR* path)
612
+ void* database::getExtendBufferForOpen(uint_td& size)
496
613
  {
497
- /* Select directory
498
- - Fiest, Specify Direct.
499
- - Second, specified in filename.
500
- - Thard, Smae as schem table.
501
- */
614
+ void* p = m_impl->dbDef->getBufferPtr(size);
615
+ if (!p)
616
+ size = 0;
617
+ else if (m_impl->openBuflen)
618
+ size = m_impl->openBuflen;
619
+ return p;
620
+ }
502
621
 
503
- _TCHAR buf[MAX_PATH];
504
- bool regularDir = false;
505
- bool NewFile = false;
506
- m_stat = 0;
622
+ bool database::defaultImageCopy(const void* data, short& tableIndex)
623
+ {
624
+ struct extraImage
625
+ {
626
+ ushort_td bookmarklen;
627
+ ushort_td recordSize;
628
+ };
629
+ struct schemaImage
630
+ {
631
+ ushort_td schemaSize;
632
+ tabledef td;
633
+ };
507
634
 
508
- if ((!m_impl->dbDef) || (!m_impl->isOpened))
635
+ extraImage* p = (extraImage*)data;
636
+ size_t size = p->recordSize;
637
+ bool ret = false;
638
+ if (size)
509
639
  {
510
- m_stat = STATUS_DB_YET_OPEN;
511
- return NULL;
640
+ if (tableIndex > 0)
641
+ ret = m_impl->dbDef->setDefaultImage(tableIndex, (uchar_td*)(++p), (ushort_td)size);
642
+ else
643
+ {
644
+ schemaImage* si = (schemaImage*)(((uchar_td*)p) + sizeof(ushort_td) * 2 + size);
645
+ if (si->schemaSize == 0) return false;
646
+ ret = m_impl->dbDef->addSchemaImage(&si->td, si->schemaSize, tableIndex);
647
+ if (ret)
648
+ ret = m_impl->dbDef->setDefaultImage(tableIndex, (uchar_td*)++p, (ushort_td)size);
649
+ }
512
650
  }
651
+ return ret;
652
+ }
653
+
654
+ short database::testOpenTable()
655
+ {
656
+ if ((!m_impl->dbDef) || (!m_impl->isOpened))
657
+ return STATUS_DB_YET_OPEN;
513
658
  if (m_impl->rootDir[0] == 0x00)
659
+ return STATUS_DB_YET_OPEN;
660
+
661
+ return 0;
662
+ }
663
+
664
+ struct openTablePrams
665
+ {
666
+ tabledef* td;
667
+ _TCHAR uri[MAX_PATH];
668
+ short mode;
669
+ bool mysqlnull;
670
+ bool regularDir;
671
+ bool autoCreate;
672
+ bool getSchema;
673
+ bool getDefaultImage;
674
+ bool useInMariadb;
675
+ bool isTransactd;
676
+
677
+ openTablePrams(bool autoCreate_p) : autoCreate(autoCreate_p),
678
+ getSchema(false), getDefaultImage(false)
514
679
  {
515
- m_stat = STATUS_DB_YET_OPEN;
516
- return NULL;
680
+ uri[0] = 0x00;
517
681
  }
518
- tabledef* td = m_impl->dbDef->tableDefs(FileNum);
519
- if (!td)
682
+
683
+ short setParam(tabledef* def, short v, bool isTransactd, bool readOnly, bool noPreloadSchema)
520
684
  {
521
- m_stat = STATUS_INVALID_TABLE_IDX;
522
- return NULL;
685
+ this->isTransactd = isTransactd;
686
+ mode = v;
687
+ td = def;
688
+ mysqlnull = false;
689
+ if (isTransactd)
690
+ {
691
+ if (IS_MODE_MYSQL_NULL(mode))
692
+ mysqlnull = true;
693
+ else if (database::compatibleMode() & database::CMP_MODE_MYSQL_NULL)
694
+ {
695
+ mode += TD_OPEN_MASK_MYSQL_NULL;
696
+ mysqlnull = true;
697
+ }
698
+ if (mysqlnull && (!td || td->defaultImage == NULL))
699
+ {
700
+ mode += TD_OPEN_MASK_GETDEFAULTIMAGE;
701
+ getDefaultImage = true;
702
+ }
703
+ if (!td && noPreloadSchema)
704
+ {
705
+ mode += TD_OPEN_MASK_GETSHCHEMA;
706
+ getSchema = true;
707
+ autoCreate = false;
708
+ }
709
+ }
710
+ if (readOnly && !IS_MODE_READONLY(mode))
711
+ mode += TD_OPEN_READONLY;
712
+
713
+ if (td)
714
+ {
715
+ if (td->inUse())
716
+ {
717
+ if ((td->isMysqlNullMode() == true && mysqlnull == false)
718
+ || (td->isMysqlNullMode() == false && mysqlnull))
719
+ return STATUS_INVALID_NULLMODE;
720
+ }else
721
+ td->setMysqlNullMode(mysqlnull);
722
+ }
723
+ return 0;
523
724
  }
524
- table* tb = createTableObject();
525
- dbdef::cacheFieldPos(td);
725
+
726
+ void setPath(const _TCHAR* path, database* db)
727
+ {
728
+ regularDir = false;
729
+ if (td)
730
+ {
731
+ if ((path == NULL) || (path[0] == 0x00))
732
+ {
733
+ if (_tcsstr(td->fileName(), PSEPARATOR) == NULL)
734
+ {
735
+ db->getTableUri(uri, td->id);
736
+ regularDir = true;
737
+ }
738
+ else
739
+ _tcscpy(uri, td->fileName());
740
+ }
741
+ else
742
+ _tcscpy(uri, path);
743
+ }else if (path)
744
+ db->getTableUri(uri, path);
745
+ }
746
+ };
747
+
748
+ table* database::doOpenTable(openTablePrams* pm, const _TCHAR* ownerName)
749
+ {
526
750
 
527
- if ((path == NULL) || (path[0] == 0x00))
751
+ tabledef* td = pm->td;
752
+
753
+ if (pm->isTransactd)
528
754
  {
529
- if (_tcsstr(td->fileName(), PSEPARATOR) == NULL)
755
+ if (m_stat) return NULL;
756
+ if ((database::compatibleMode() & database::CMP_MODE_MYSQL_NULL) &&
757
+ m_impl->pluginVer().majorVersion < 3)
530
758
  {
531
- getTableUri(buf, FileNum);
532
- regularDir = true;
759
+ m_stat = STATUS_INVALID_NULLMODE;
760
+ return NULL;
761
+ }
762
+ if (td && td->inUse() == 0)
763
+ {
764
+ td->m_useInMariadb = m_impl->mysqlVer().isMariaDB();
765
+ td->m_srvMajorVer = (uchar_td)m_impl->mysqlVer().majorVersion;
766
+ td->m_srvMinorVer = (uchar_td)m_impl->mysqlVer().minorVersion;
767
+ td->calcReclordlen();
533
768
  }
534
- else
535
- _tcscpy(buf, td->fileName());
536
769
  }
537
- else
538
- _tcscpy(buf, path);
539
770
 
540
- if (m_impl->isTableReadOnly)
541
- mode = TD_OPEN_READONLY;
542
- tb->open(buf, (char_td)mode, OrnerName);
771
+ short tableIndex = td ? td->id : -1;
772
+
773
+ if (!m_impl->noPreloadSchema && !td)
774
+ {
775
+ m_stat = STATUS_TABLENAME_NOTFOUND;
776
+ return NULL;
777
+ }
778
+ table* tb = createTableObject();
779
+ if (pm->mysqlnull)
780
+ {
781
+ m_impl->openBuflen = 0;
782
+ if (td)
783
+ m_impl->openBuflen = td->recordlenServer() + (sizeof(ushort_td) * 2);
784
+ }
785
+ bool tableCreated = false;
786
+ tb->open(pm->uri, (char_td)pm->mode, ownerName);
543
787
  if ((tb->m_stat == STATUS_TABLE_NOTOPEN) ||
544
788
  (tb->m_stat == ERROR_NOSPECIFY_TABLE))
545
789
  {
546
- if (AutoCreate)
790
+ if (pm->autoCreate)
547
791
  {
548
- createTable(FileNum, buf);
792
+ createTable(tableIndex, pm->uri);
549
793
  if (m_stat != STATUS_SUCCESS)
550
794
  {
551
795
  tb->release();
@@ -553,10 +797,10 @@ table* database::openTable(short FileNum, short mode, bool AutoCreate,
553
797
  }
554
798
  else
555
799
  {
556
- tb->open(buf, (char_td)mode);
557
- if ((OrnerName) && (OrnerName[0]))
558
- tb->setOwnerName(OrnerName);
559
- NewFile = true;
800
+ tb->open(pm->uri, (char_td)pm->mode);
801
+ if ((ownerName) && (ownerName[0]))
802
+ tb->setOwnerName(ownerName);
803
+ tableCreated = true;
560
804
  }
561
805
  }
562
806
  else
@@ -567,35 +811,163 @@ table* database::openTable(short FileNum, short mode, bool AutoCreate,
567
811
  }
568
812
  }
569
813
  if (tb->m_stat == 0)
570
- tb->init(m_impl->dbDef->tableDefPtr(FileNum), FileNum, regularDir);
571
-
814
+ {
815
+ // register tabledef to dbdef
816
+ uint_td size;
817
+ bool ret = true;
818
+ if (pm->getDefaultImage || pm->getSchema)
819
+ ret = defaultImageCopy(m_impl->dbDef->getBufferPtr(size), tableIndex);
820
+ if (ret)
821
+ tb->init(m_impl->dbDef->tableDefPtr(tableIndex), tableIndex, pm->regularDir, pm->mysqlnull);
822
+ else
823
+ m_stat = STATUS_PROGRAM_ERROR;
824
+ }
572
825
  if ((m_stat != 0) || (tb->m_stat != 0) ||
573
- !onTableOpened(tb, FileNum, mode, NewFile))
826
+ !onTableOpened(tb, tableIndex, pm->mode, tableCreated))
574
827
  {
575
828
  m_stat = tb->m_stat;
576
829
  tb->release();
577
830
  return NULL;
578
831
  }
579
- return tb;
832
+ return tb;
833
+ }
834
+
835
+ table* database::openTable(const _TCHAR* tableName, short mode, bool autoCreate,
836
+ const _TCHAR* ownerName, const _TCHAR* path)
837
+ {
838
+ m_stat = testOpenTable();
839
+ if (m_stat) return NULL;
840
+
841
+ openTablePrams pm(autoCreate);
842
+
843
+ short tableIndex = m_impl->dbDef->tableNumByName(tableName);
844
+ tabledef* td = NULL;
845
+ if (tableIndex != -1)
846
+ td = m_impl->dbDef->tableDefs(tableIndex);
847
+ m_stat = pm.setParam(td, mode, isUseTransactd(), m_impl->isTableReadOnly, m_impl->noPreloadSchema);
848
+ if (m_stat == 0)
849
+ {
850
+ if (td)
851
+ pm.setPath(path, this);
852
+ else
853
+ pm.setPath(tableName, this);
854
+ return doOpenTable(&pm, ownerName);
855
+ }
856
+ return NULL;
857
+ }
858
+
859
+ table* database::openTable(short tableIndex, short mode, bool autoCreate,
860
+ const _TCHAR* ownerName, const _TCHAR* path)
861
+ {
862
+ m_stat = testOpenTable();
863
+ if (m_stat) return NULL;
864
+
865
+ openTablePrams pm(autoCreate);
866
+ tabledef* td = m_impl->dbDef->tableDefs(tableIndex);
867
+ if (td)
868
+ {
869
+ if (pm.setParam(td, mode, isUseTransactd(), m_impl->isTableReadOnly, m_impl->noPreloadSchema) == 0)
870
+ {
871
+ pm.setPath(path, this);
872
+ return doOpenTable(&pm, ownerName);
873
+ }
874
+ return NULL;
875
+ }
876
+ m_stat = STATUS_INVALID_TABLE_IDX;
877
+ return NULL;
580
878
  }
581
879
 
582
- bool database::createTable(short FileNum, const _TCHAR* FilePath)
880
+ char* database::getSqlStringForCreateTable(const _TCHAR* tableName, char* retbuf, uint_td* size)
583
881
  {
584
- tabledef* td = m_impl->dbDef->tableDefs(FileNum);
882
+ retbuf[0] = 0x00;
883
+ short tableIndex = m_impl->dbDef->tableNumByName(tableName);
884
+ tabledef* td = NULL;
885
+ if (tableIndex != -1)
886
+ td = m_impl->dbDef->tableDefs(tableIndex);
887
+
888
+ if (!td || td->fieldCount == 0)
889
+ {
890
+ m_stat = STATUS_INVALID_FIELD_OFFSET;
891
+ return retbuf;
892
+ }
893
+ if (td->size() > (int)*size)
894
+ {
895
+ m_stat = STATUS_BUFFERTOOSMALL;
896
+ return retbuf;
897
+ }
898
+
899
+ _TCHAR uri[MAX_PATH];
900
+ getTableUri(uri, td->id);
901
+
902
+ if (!isTransactdUri(uri))
903
+ {
904
+ m_stat = STATUS_NOSUPPORT_OP;
905
+ return retbuf;
906
+ }
907
+
908
+ if (setUseTransactd() == false)
909
+ {
910
+ m_stat = STATUS_NOSUPPORT_OP;
911
+ return retbuf;
912
+ }
913
+ memcpy(retbuf, td, td->size());
914
+ td = (tabledef*)retbuf;
915
+ td->setFielddefsPtr();
916
+ td->setKeydefsPtr();
917
+
918
+ td->calcReclordlen(true);
919
+ char buf2[MAX_PATH] = { 0x00 };
920
+ _TCHAR posblk[128] = { 0x00 };
921
+
922
+ const char* p = toServerUri(buf2, MAX_PATH, uri, isUseTransactd());
923
+
924
+ m_stat = m_btrcallid(
925
+ TD_TABLE_INFO, posblk, td,
926
+ size, (void*)p, (uchar_td)strlen(p),
927
+ ST_SUB_GETSQL_BY_TABLEDEF, clientID());
928
+ return retbuf;
929
+ }
930
+
931
+ bool database::createTable(const char* utf8Sql)
932
+ {
933
+ if (testOpenTable()) return false;
934
+ if (isUseTransactd())
935
+ {
936
+ if (setUseTransactd() == false)
937
+ m_stat = ERROR_LOAD_CLIBRARY;
938
+ else
939
+ {
940
+ char buf2[MAX_PATH] = { 0x00 };
941
+ _TCHAR posblk[128] = { 0x00 };
942
+ const char* p = toServerUri(buf2, MAX_PATH, rootDir(), true);
943
+ uint_td len = (uint_td)strlen(utf8Sql);
944
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)utf8Sql, &len,
945
+ (void*)p, (uchar_td)strlen(p), CR_SUBOP_BY_SQL , clientID());
946
+ }
947
+ }
948
+ else
949
+ m_stat = STATUS_NOSUPPORT_OP;
950
+ return (m_stat == 0);
951
+ }
952
+
953
+ bool database::createTable(short fileNum, const _TCHAR* uri)
954
+ {
955
+ tabledef* td = m_impl->dbDef->tableDefs(fileNum);
585
956
  if (!td || td->fieldCount == 0)
586
957
  {
587
958
  m_stat = STATUS_INVALID_FIELD_OFFSET;
588
959
  return false;
589
960
  }
590
- if (isTransactdUri(FilePath))
961
+ if (uri && isTransactdUri(uri))
591
962
  {
592
963
  if (setUseTransactd() == false)
593
964
  return false;
594
965
 
966
+ td->calcReclordlen(true);
595
967
  char buf2[MAX_PATH] = { 0x00 };
596
968
  _TCHAR posblk[128] = { 0x00 };
597
969
 
598
- const char* p = toServerUri(buf2, MAX_PATH, FilePath, isUseTransactd());
970
+ const char* p = toServerUri(buf2, MAX_PATH, uri, isUseTransactd());
599
971
 
600
972
  m_stat = m_btrcallid(
601
973
  TD_CREATETABLE, posblk, td,
@@ -611,9 +983,9 @@ bool database::createTable(short FileNum, const _TCHAR* FilePath)
611
983
  m_stat = STATUS_CANT_ALLOC_MEMORY;
612
984
  return false;
613
985
  }
614
- m_impl->dbDef->getFileSpec(fs, FileNum);
615
- if (FilePath)
616
- buf = FilePath;
986
+ m_impl->dbDef->getFileSpec(fs, fileNum);
987
+ if (uri)
988
+ buf = uri;
617
989
  else
618
990
  buf = td->fileName();
619
991
  nsdatabase::createTable(fs, 1024, buf, CR_SUBOP_BY_FILESPEC);
@@ -707,7 +1079,7 @@ void makeChangeInfo(const tabledef* ddef, const tabledef* sdef,
707
1079
  }
708
1080
  }
709
1081
 
710
- inline void copyEachFieldData(table* dest, table* src, filedChnageInfo* fci)
1082
+ inline void database::copyEachFieldData(table* dest, table* src, filedChnageInfo* fci)
711
1083
  {
712
1084
  const tabledef* ddef = dest->tableDef();
713
1085
  const tabledef* sdef = src->tableDef();
@@ -720,6 +1092,7 @@ inline void copyEachFieldData(table* dest, table* src, filedChnageInfo* fci)
720
1092
 
721
1093
  if (dindex != -1)
722
1094
  {
1095
+ dest->setFVNull(dindex, src->getFVNull(i));
723
1096
  // src valiable len and last field;
724
1097
  if ((fci[i].changed == false) || (fdd.type == ft_myfixedbinary))
725
1098
  {
@@ -795,7 +1168,7 @@ inline void moveFirstRecord(table* src, short keyNum)
795
1168
  */
796
1169
  #pragma warn -8004
797
1170
 
798
- short database::copyTableData(table* dest, table* src, bool turbo, int offset,
1171
+ short database::copyTableData(table* dest, table* src, bool turbo,
799
1172
  short keyNum, int maxSkip)
800
1173
  {
801
1174
  src->setKeyNum((char_td)keyNum);
@@ -844,12 +1217,10 @@ short database::copyTableData(table* dest, table* src, bool turbo, int offset,
844
1217
  dest->clearBuffer();
845
1218
  if (turbo)
846
1219
  {
847
- if (dest->m_buflen + offset < src->datalen())
1220
+ if (dest->m_buflen < src->datalen())
848
1221
  return STATUS_CANT_ALLOC_MEMORY;
849
- if (offset)
850
- memset(dest->fieldPtr(0), 0, offset);
851
- memcpy((char*)dest->fieldPtr(0) + offset, src->fieldPtr(0),
852
- src->datalen());
1222
+
1223
+ memcpy((char*)dest->m_pdata, src->data(), src->datalen());
853
1224
  }
854
1225
  else
855
1226
  copyEachFieldData(dest, src, fci);
@@ -905,20 +1276,24 @@ void database::doConvertTable(short TableIndex, bool Turbo,
905
1276
  return;
906
1277
  }
907
1278
 
908
- tabledef* TableDef = m_impl->dbDef->tableDefs(TABLE_NUM_TMP);
909
- TableDef->fieldDefs = dbdef::getFieldDef(TableDef);
910
- TableDef->keyDefs = dbdef::getKeyDef(TableDef);
1279
+ tabledef* td = m_impl->dbDef->tableDefs(TABLE_NUM_TMP);
1280
+ td->setFielddefsPtr();
1281
+ td->setKeydefsPtr();
1282
+ short id = td->id;
1283
+ td->id = TABLE_NUM_TMP;
1284
+ short mode = TD_OPEN_EXCLUSIVE +
1285
+ (isUseTransactd() ? TD_OPEN_MASK_MYSQL_NULL: 0);
911
1286
 
912
- src = openTable(TABLE_NUM_TMP, TD_OPEN_EXCLUSIVE, false, OwnerName);
1287
+ src = openTable(TABLE_NUM_TMP, mode, false, OwnerName);
1288
+ td->id = id;
913
1289
  if (!src)
914
1290
  return;
1291
+ td = m_impl->dbDef->tableDefs(TableIndex);
1292
+ short len = td->recordlen();
915
1293
 
916
- TableDef = m_impl->dbDef->tableDefs(TableIndex);
917
- short len = TableDef->maxRecordLen;
918
-
919
- TableDef->preAlloc =
920
- (ushort_td)(src->recordCount() / TableDef->pageSize / len);
921
- TableDef->flags.bit2 = true;
1294
+ td->preAlloc =
1295
+ (ushort_td)(src->recordCount() / td->pageSize / len);
1296
+ td->flags.bit2 = true;
922
1297
 
923
1298
  _tcscpy(szTempPath, getTableUri(buf, TableIndex));
924
1299
  _TCHAR* p = _tcsstr(szTempPath, _T("dbfile="));
@@ -935,7 +1310,7 @@ void database::doConvertTable(short TableIndex, bool Turbo,
935
1310
  _tcscat(szTempPath, _T("_conv_dest_tmp"));
936
1311
 
937
1312
  createTable(TableIndex, szTempPath);
938
- dest = openTable(TableIndex, TD_OPEN_EXCLUSIVE, true, NULL, szTempPath);
1313
+ dest = openTable(TableIndex, mode, true, NULL, szTempPath);
939
1314
  if (!dest)
940
1315
  {
941
1316
  src->release();
@@ -992,10 +1367,14 @@ bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
992
1367
 
993
1368
  if (TableIndex == TABLE_NUM_TMP)
994
1369
  {
995
- m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->fieldDefs =
996
- dbdef::getFieldDef(m_impl->dbDef->tableDefs(TABLE_NUM_TMP));
997
- m_impl->dbDef->tableDefs(TABLE_NUM_TMP)->keyDefs =
998
- dbdef::getKeyDef(m_impl->dbDef->tableDefs(512));
1370
+ tabledef* td = m_impl->dbDef->tableDefs(TABLE_NUM_TMP);
1371
+ if (!td)
1372
+ {
1373
+ m_stat = STATUS_INVALID_TABLE_IDX;
1374
+ return false;
1375
+ }
1376
+ td->setFielddefsPtr();
1377
+ td->setKeydefsPtr();
999
1378
  }
1000
1379
  table* bao = openTable(TableIndex, TD_OPEN_READONLY, false, OwnerName);
1001
1380
  bool ret = false;
@@ -1011,6 +1390,16 @@ bool database::existsTableFile(short TableIndex, const _TCHAR* OwnerName)
1011
1390
  return ret;
1012
1391
  }
1013
1392
 
1393
+ void database::setCompatibleMode(int mode)
1394
+ {
1395
+ dbimple::m_compatibleMode = mode;
1396
+ }
1397
+
1398
+ int database::compatibleMode()
1399
+ {
1400
+ return dbimple::m_compatibleMode;
1401
+ }
1402
+
1014
1403
  } // namespace client
1015
1404
  } // namespace btrv
1016
1405
  } // namespace protocol