transactd 2.4.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- 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
|
-
|
50
|
-
|
51
|
-
|
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
|
-
|
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
|
-
|
178
|
-
|
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
|
-
|
252
|
+
_TCHAR* fileNames[255] = {NULL};
|
253
|
+
int count = 0;
|
190
254
|
for (int i = 0; i <= m_impl->dbDef->tableCount(); i++)
|
191
255
|
{
|
192
|
-
|
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(),
|
196
|
-
|
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
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
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
|
-
|
285
|
+
for (int i = 0; i < count; i++)
|
286
|
+
delete [] fileNames[i];
|
287
|
+
}else
|
205
288
|
{
|
206
|
-
|
207
|
-
|
208
|
-
|
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
|
-
|
221
|
-
|
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
|
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
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
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
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
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
|
-
//
|
337
|
-
|
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
|
-
|
341
|
-
|
342
|
-
|
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
|
-
|
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
|
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
|
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
|
-
|
455
|
-
|
456
|
-
|
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
|
-
|
468
|
-
const _TCHAR* OrnerName, const _TCHAR* pPath)
|
598
|
+
_TCHAR* database::getTableUri(_TCHAR* buf, const _TCHAR* filename)
|
469
599
|
{
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
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
|
-
|
495
|
-
const _TCHAR* OrnerName, const _TCHAR* path)
|
612
|
+
void* database::getExtendBufferForOpen(uint_td& size)
|
496
613
|
{
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
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
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
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
|
-
|
635
|
+
extraImage* p = (extraImage*)data;
|
636
|
+
size_t size = p->recordSize;
|
637
|
+
bool ret = false;
|
638
|
+
if (size)
|
509
639
|
{
|
510
|
-
|
511
|
-
|
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
|
-
|
516
|
-
return NULL;
|
680
|
+
uri[0] = 0x00;
|
517
681
|
}
|
518
|
-
|
519
|
-
|
682
|
+
|
683
|
+
short setParam(tabledef* def, short v, bool isTransactd, bool readOnly, bool noPreloadSchema)
|
520
684
|
{
|
521
|
-
|
522
|
-
|
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
|
-
|
525
|
-
|
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
|
-
|
751
|
+
tabledef* td = pm->td;
|
752
|
+
|
753
|
+
if (pm->isTransactd)
|
528
754
|
{
|
529
|
-
if (
|
755
|
+
if (m_stat) return NULL;
|
756
|
+
if ((database::compatibleMode() & database::CMP_MODE_MYSQL_NULL) &&
|
757
|
+
m_impl->pluginVer().majorVersion < 3)
|
530
758
|
{
|
531
|
-
|
532
|
-
|
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
|
-
|
541
|
-
|
542
|
-
|
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 (
|
790
|
+
if (pm->autoCreate)
|
547
791
|
{
|
548
|
-
createTable(
|
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(
|
557
|
-
if ((
|
558
|
-
tb->setOwnerName(
|
559
|
-
|
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
|
-
|
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,
|
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
|
-
|
880
|
+
char* database::getSqlStringForCreateTable(const _TCHAR* tableName, char* retbuf, uint_td* size)
|
583
881
|
{
|
584
|
-
|
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(
|
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,
|
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,
|
615
|
-
if (
|
616
|
-
buf =
|
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,
|
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
|
1220
|
+
if (dest->m_buflen < src->datalen())
|
848
1221
|
return STATUS_CANT_ALLOC_MEMORY;
|
849
|
-
|
850
|
-
|
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*
|
909
|
-
|
910
|
-
|
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,
|
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
|
-
|
917
|
-
|
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,
|
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)
|
996
|
-
|
997
|
-
|
998
|
-
|
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
|