transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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