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