transactd 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
- data/CMakeLists.txt +20 -15
- data/{README-JA → README-JA.md} +23 -23
- data/{README → README.md} +22 -24
- data/RELEASE_NOTE +120 -0
- data/RELEASE_NOTE-JA +110 -0
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
- data/build/swig/tdcl.i +22 -2
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
- data/build/tdclrb/CMakeLists.txt +6 -1
- data/build/tdclrb/bldgem/extconf.rb +5 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +44 -40
- data/source/bzs/db/engine/mysql/database.h +28 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
- data/source/bzs/db/engine/mysql/dbManager.h +2 -7
- data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
- data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
- data/source/bzs/db/protocol/tdap/client/client.h +41 -11
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
- data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
- data/source/bzs/db/protocol/tdap/client/database.h +3 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
- data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
- data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
- data/source/bzs/db/protocol/tdap/client/request.h +28 -11
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
- data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
- data/source/bzs/db/protocol/tdap/client/table.h +20 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
- data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
- data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
- data/source/bzs/db/protocol/tdap/uri.h +41 -6
- data/source/bzs/db/transactd/appModule.cpp +0 -1
- data/source/bzs/db/transactd/appModule.h +0 -2
- data/source/bzs/db/transactd/connManager.cpp +202 -33
- data/source/bzs/db/transactd/connManager.h +11 -4
- data/source/bzs/db/transactd/connectionRecord.h +19 -5
- data/source/bzs/db/transactd/transactd.cpp +39 -8
- data/source/bzs/env/crosscompile.cpp +1 -1
- data/source/bzs/example/queryData.cpp +1 -1
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
- data/source/bzs/netsvc/client/tcpClient.h +171 -106
- data/source/bzs/netsvc/server/IAppModule.h +0 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
- data/source/bzs/netsvc/server/serverPipe.h +2 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
- data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
- data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
- data/source/global/tdclatl/Bookmark.cpp +28 -0
- data/source/global/tdclatl/Bookmark.h +65 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -3
- data/source/global/tdclatl/DbDef.cpp +6 -0
- data/source/global/tdclatl/DbDef.h +1 -0
- data/source/global/tdclatl/QueryBase.cpp +29 -0
- data/source/global/tdclatl/QueryBase.h +4 -0
- data/source/global/tdclatl/Record.cpp +14 -2
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Table.cpp +80 -16
- data/source/global/tdclatl/Table.h +23 -8
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
- data/source/global/tdclatl/activeTable.cpp +2 -2
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +64 -14
- metadata +12 -12
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
- /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
- /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
@@ -878,9 +878,13 @@ template <class Database_Ptr> inline void dropDatabase(Database_Ptr db)
|
|
878
878
|
}
|
879
879
|
|
880
880
|
template <class Database_Ptr>
|
881
|
-
inline table_ptr openTable(Database_Ptr db, const _TCHAR* name,
|
881
|
+
inline table_ptr openTable(Database_Ptr db, const _TCHAR* name,
|
882
|
+
short mode = TD_OPEN_NORMAL,
|
883
|
+
bool autoCreate = true, const _TCHAR* ownerName = NULL,
|
884
|
+
const _TCHAR* uri = NULL)
|
882
885
|
{
|
883
|
-
table_ptr p(db->openTable(name, mode
|
886
|
+
table_ptr p(db->openTable(name, mode, autoCreate, ownerName, uri),
|
887
|
+
releaseTable);
|
884
888
|
if (db->stat())
|
885
889
|
nstable::throwError((std::_tstring(_T("Open table ")) + name).c_str(),
|
886
890
|
db->stat());
|
@@ -888,9 +892,14 @@ inline table_ptr openTable(Database_Ptr db, const _TCHAR* name, short mode = TD_
|
|
888
892
|
}
|
889
893
|
|
890
894
|
template <class Database_Ptr>
|
891
|
-
inline table_ptr openTable(Database_Ptr db, short tableid,
|
895
|
+
inline table_ptr openTable(Database_Ptr db, short tableid,
|
896
|
+
short mode = TD_OPEN_NORMAL,
|
897
|
+
bool autoCreate = true, const _TCHAR* ownerName = NULL,
|
898
|
+
const _TCHAR* uri = NULL)
|
892
899
|
{
|
893
|
-
table_ptr p(db->openTable(tableid, mode
|
900
|
+
table_ptr p(db->openTable(tableid, mode, autoCreate, ownerName, uri),
|
901
|
+
releaseTable);
|
902
|
+
|
894
903
|
if (db->stat())
|
895
904
|
{
|
896
905
|
_TCHAR buf[50];
|
@@ -952,6 +961,23 @@ inline void insertTable(dbdef* def, short id, const _TCHAR* name,
|
|
952
961
|
def->stat());
|
953
962
|
}
|
954
963
|
|
964
|
+
inline void deleteTable(dbdef* def, short id)
|
965
|
+
{
|
966
|
+
def->deleteTable(id);
|
967
|
+
if (def->stat() != 0)
|
968
|
+
nstable::throwError(_T("Delete tabledef "), def->stat());
|
969
|
+
|
970
|
+
}
|
971
|
+
|
972
|
+
|
973
|
+
inline void renumberTable(dbdef* def, short id, short newid)
|
974
|
+
{
|
975
|
+
def->renumberTable(id, newid);
|
976
|
+
if (def->stat() != 0)
|
977
|
+
nstable::throwError(_T("Renumber table id "), def->stat());
|
978
|
+
|
979
|
+
}
|
980
|
+
|
955
981
|
inline fielddef* insertField(dbdef* def, short tableid, short fieldNum,
|
956
982
|
const _TCHAR* name, uchar_td type, ushort_td len)
|
957
983
|
{
|
@@ -967,6 +993,13 @@ inline fielddef* insertField(dbdef* def, short tableid, short fieldNum,
|
|
967
993
|
return fd;
|
968
994
|
}
|
969
995
|
|
996
|
+
inline void deleteField(dbdef* def, short tableid, short fieldNum)
|
997
|
+
{
|
998
|
+
def->deleteField(tableid, fieldNum);
|
999
|
+
if (def->stat() != 0)
|
1000
|
+
nstable::throwError(_T("Delete fielddef "), def->stat());
|
1001
|
+
}
|
1002
|
+
|
970
1003
|
inline keydef* insertKey(dbdef* def, short tableid, short insertIndex)
|
971
1004
|
{
|
972
1005
|
keydef* kd = def->insertKey(tableid, insertIndex);
|
@@ -976,6 +1009,26 @@ inline keydef* insertKey(dbdef* def, short tableid, short insertIndex)
|
|
976
1009
|
return kd;
|
977
1010
|
}
|
978
1011
|
|
1012
|
+
inline void deleteKey(dbdef* def, short tableid, short keynum)
|
1013
|
+
{
|
1014
|
+
def->deleteKey(tableid, keynum);
|
1015
|
+
if (def->stat() != 0)
|
1016
|
+
nstable::throwError(_T("Delete keydef "), def->stat());
|
1017
|
+
}
|
1018
|
+
|
1019
|
+
inline void validateTableDef(dbdef* def, short tableid)
|
1020
|
+
{
|
1021
|
+
def->validateTableDef(tableid);
|
1022
|
+
if (def->stat() != 0)
|
1023
|
+
{
|
1024
|
+
std::_tstring s;
|
1025
|
+
if (def->tableDefs(tableid))
|
1026
|
+
s = def->tableDefs(tableid)->tableName();
|
1027
|
+
nstable::throwError((std::_tstring(_T("Validate tabledef ")) + s).c_str(),
|
1028
|
+
def->stat());
|
1029
|
+
}
|
1030
|
+
}
|
1031
|
+
|
979
1032
|
inline void updateTableDef(dbdef* def, short tableid)
|
980
1033
|
{
|
981
1034
|
def->updateTableDef(tableid);
|
@@ -323,13 +323,31 @@ class activeObject : boost::noncopyable
|
|
323
323
|
m_tb = mgr->table(name);
|
324
324
|
}
|
325
325
|
|
326
|
-
void init(database_ptr& db, const _TCHAR* name)
|
326
|
+
void init(database_ptr& db, const _TCHAR* name, short mode)
|
327
327
|
{
|
328
|
-
m_tb = openTable(db, name);
|
328
|
+
m_tb = openTable(db, name, mode);
|
329
|
+
}
|
330
|
+
|
331
|
+
void init(database* db, const _TCHAR* name, short mode)
|
332
|
+
{
|
333
|
+
m_tb = openTable(db, name, mode);
|
334
|
+
}
|
335
|
+
|
336
|
+
/*void init(idatabaseManager* mgr, short tableindex)
|
337
|
+
{
|
338
|
+
m_tb = mgr->table(tableindex);
|
339
|
+
}*/
|
340
|
+
|
341
|
+
void init(database_ptr& db, short tableindex, short mode)
|
342
|
+
{
|
343
|
+
m_tb = openTable(db, tableindex, mode);
|
344
|
+
}
|
345
|
+
|
346
|
+
void init(database* db, short tableindex, short mode)
|
347
|
+
{
|
348
|
+
m_tb = openTable(db, tableindex, mode);
|
329
349
|
}
|
330
350
|
|
331
|
-
void init(database* db, const _TCHAR* name) { m_tb = openTable(db, name); }
|
332
|
-
|
333
351
|
void prepare(const pq_handle& q)
|
334
352
|
{
|
335
353
|
m_tb->setPrepare(q);
|
@@ -353,10 +371,10 @@ public:
|
|
353
371
|
initFdi(m_fdi, m_tb.get());
|
354
372
|
}
|
355
373
|
|
356
|
-
explicit activeObject(database_ptr& db)
|
374
|
+
explicit activeObject(database_ptr& db, short mode = TD_OPEN_NORMAL)
|
357
375
|
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
358
376
|
{
|
359
|
-
init(db, m_map.getTableName());
|
377
|
+
init(db, m_map.getTableName(), mode);
|
360
378
|
if (table() && m_fdi)
|
361
379
|
initFdi(m_fdi, m_tb.get());
|
362
380
|
}
|
@@ -369,29 +387,46 @@ public:
|
|
369
387
|
initFdi(m_fdi, m_tb.get());
|
370
388
|
}
|
371
389
|
|
372
|
-
/*explicit activeObject(
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
390
|
+
/*explicit activeObject(idatabaseManager* mgr, short tableIndex)
|
391
|
+
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
392
|
+
{
|
393
|
+
init(mgr, tableIndex);
|
394
|
+
if (table() && m_fdi)
|
395
|
+
initFdi(m_fdi, m_tb.get());
|
396
|
+
}*/
|
397
|
+
|
398
|
+
explicit activeObject(database_ptr& db, const _TCHAR* tableName,
|
399
|
+
short mode = TD_OPEN_NORMAL)
|
400
|
+
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
401
|
+
{
|
402
|
+
init(db, tableName, mode);
|
403
|
+
if (table() && m_fdi)
|
404
|
+
initFdi(m_fdi, m_tb.get());
|
405
|
+
}
|
406
|
+
|
407
|
+
explicit activeObject(database* db, const _TCHAR* tableName,
|
408
|
+
short mode = TD_OPEN_NORMAL)
|
409
|
+
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
410
|
+
{
|
411
|
+
init(db, tableName, mode);
|
412
|
+
if (table() && m_fdi)
|
413
|
+
initFdi(m_fdi, m_tb.get());
|
414
|
+
}
|
382
415
|
|
383
|
-
explicit activeObject(database_ptr& db,
|
416
|
+
explicit activeObject(database_ptr& db, short tableIndex,
|
417
|
+
short mode = TD_OPEN_NORMAL)
|
384
418
|
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
385
419
|
{
|
386
|
-
init(db,
|
420
|
+
init(db, tableIndex, mode);
|
387
421
|
if (table() && m_fdi)
|
388
422
|
initFdi(m_fdi, m_tb.get());
|
389
423
|
}
|
390
424
|
|
391
|
-
explicit activeObject(database* db,
|
425
|
+
explicit activeObject(database* db, short tableIndex,
|
426
|
+
short mode = TD_OPEN_NORMAL)
|
392
427
|
: m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
|
393
428
|
{
|
394
|
-
init(db,
|
429
|
+
init(db, tableIndex, mode);
|
395
430
|
if (table() && m_fdi)
|
396
431
|
initFdi(m_fdi, m_tb.get());
|
397
432
|
}
|
@@ -66,26 +66,6 @@ uint_td copyToRecordImage(uchar* rec, void* p, uint_td size, uint_td offset)
|
|
66
66
|
return offset + size;
|
67
67
|
}
|
68
68
|
|
69
|
-
bool isStringType(char type)
|
70
|
-
{
|
71
|
-
switch (type)
|
72
|
-
{
|
73
|
-
case ft_zstring:
|
74
|
-
case ft_string:
|
75
|
-
case ft_mychar:
|
76
|
-
case ft_myvarchar:
|
77
|
-
case ft_myvarbinary:
|
78
|
-
case ft_wzstring:
|
79
|
-
case ft_wstring:
|
80
|
-
case ft_mywchar:
|
81
|
-
case ft_mywvarchar:
|
82
|
-
case ft_mywvarbinary:
|
83
|
-
return true;
|
84
|
-
default:
|
85
|
-
return false;
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
69
|
uchar_td convFieldType(enum enum_field_types type, uint flags, bool binary,
|
90
70
|
bool unicode)
|
91
71
|
{
|
@@ -226,7 +206,7 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id)
|
|
226
206
|
sg.flags.bit4 = (j != kd.segmentCount - 1); // segment
|
227
207
|
sg.flags.bit8 = 1; // extend key type
|
228
208
|
sg.flags.bit9 = ks.null_bit ? 1 : 0; // null key
|
229
|
-
if (
|
209
|
+
if (isStringTypeForIndex(convFieldType(
|
230
210
|
src->fieldType(sg.fieldNum),
|
231
211
|
src->fieldFlags(sg.fieldNum),
|
232
212
|
isBinary(src->fieldCharset(i)),
|
@@ -252,10 +232,10 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id)
|
|
252
232
|
return mtb->stat();
|
253
233
|
}
|
254
234
|
|
255
|
-
bool isFrmFile(const std::string& name)
|
235
|
+
bool isFrmFile(const std::string& name, bool notschema=true)
|
256
236
|
{
|
257
237
|
size_t pos = name.find(TRANSACTD_SCHEMANAME);
|
258
|
-
if (pos != std::string::npos)
|
238
|
+
if (pos != std::string::npos && notschema)
|
259
239
|
return false;
|
260
240
|
// First of name is '#' that is alter table temp file.
|
261
241
|
if (name.size() && name[0] == '#')
|
@@ -266,6 +246,48 @@ bool isFrmFile(const std::string& name)
|
|
266
246
|
return false;
|
267
247
|
}
|
268
248
|
|
249
|
+
void schemaBuilder::listSchemaTable(database* db, std::vector<std::string>& shcemaNames)
|
250
|
+
{
|
251
|
+
char path[FN_REFLEN + 1];
|
252
|
+
build_table_filename(path, sizeof(path) - 1, db->name().c_str(), "", "", 0);
|
253
|
+
std::string s = path;
|
254
|
+
fs::path p = s;
|
255
|
+
fs::directory_iterator it(p);
|
256
|
+
fs::directory_iterator end;
|
257
|
+
shcemaNames.clear();
|
258
|
+
|
259
|
+
for (fs::directory_iterator it(p); it != end; ++it)
|
260
|
+
{
|
261
|
+
if (!is_directory(*it))
|
262
|
+
{
|
263
|
+
std::string s = it->path().filename().string();
|
264
|
+
if (isFrmFile(s, false))
|
265
|
+
{
|
266
|
+
filename_to_tablename(it->path().stem().string().c_str(), path,
|
267
|
+
FN_REFLEN);
|
268
|
+
table* tb = NULL;
|
269
|
+
try
|
270
|
+
{
|
271
|
+
tb = db->openTable(path, TD_OPEN_READONLY, NULL);
|
272
|
+
}
|
273
|
+
catch(...){}
|
274
|
+
if (!tb) break;
|
275
|
+
if (!tb->isView())
|
276
|
+
{
|
277
|
+
LEX_STRING& comment = tb->internalTable()->s->comment;
|
278
|
+
const char* p = comment.str;
|
279
|
+
if ((comment.length > 8) && strstr(p,"%@%02.000") &&
|
280
|
+
(tb->fields() == 2) && (tb->keys() == 1))
|
281
|
+
{
|
282
|
+
shcemaNames.push_back(tb->name());
|
283
|
+
}
|
284
|
+
}
|
285
|
+
db->closeTable(tb);
|
286
|
+
}
|
287
|
+
}
|
288
|
+
}
|
289
|
+
}
|
290
|
+
|
269
291
|
short schemaBuilder::execute(database* db, table* mtb)
|
270
292
|
{
|
271
293
|
char path[FN_REFLEN + 1];
|
@@ -277,7 +299,8 @@ short schemaBuilder::execute(database* db, table* mtb)
|
|
277
299
|
fs::directory_iterator end;
|
278
300
|
int id = 0;
|
279
301
|
short stat = 0;
|
280
|
-
|
302
|
+
std::vector<table*> tables;
|
303
|
+
|
281
304
|
for (fs::directory_iterator it(p); it != end; ++it)
|
282
305
|
{
|
283
306
|
if (!is_directory(*it))
|
@@ -288,17 +311,28 @@ short schemaBuilder::execute(database* db, table* mtb)
|
|
288
311
|
filename_to_tablename(it->path().stem().string().c_str(), path,
|
289
312
|
FN_REFLEN);
|
290
313
|
table* tb = db->openTable(path, TD_OPEN_READONLY, NULL);
|
291
|
-
if (!tb)
|
292
|
-
return db->stat();
|
314
|
+
if (!tb) break;
|
293
315
|
if (!tb->isView())
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
}
|
316
|
+
tables.push_back(tb);
|
317
|
+
else
|
318
|
+
db->closeTable(tb);
|
298
319
|
}
|
299
320
|
}
|
300
321
|
}
|
301
|
-
|
322
|
+
if (db->stat()) return db->stat();
|
323
|
+
|
324
|
+
{
|
325
|
+
smartTransction trn(db);
|
326
|
+
for (size_t i = 0; i < tables.size(); ++i)
|
327
|
+
{
|
328
|
+
if ((stat = insertMetaRecord(mtb, tables[i], ++id)) != 0)
|
329
|
+
break;
|
330
|
+
}
|
331
|
+
if (stat == 0) trn.end();
|
332
|
+
|
333
|
+
}
|
334
|
+
for (size_t i = 0; i < tables.size(); ++i)
|
335
|
+
db->closeTable(tables[i]);
|
302
336
|
return stat;
|
303
337
|
}
|
304
338
|
|
@@ -21,6 +21,7 @@
|
|
21
21
|
|
22
22
|
#include <bzs/db/protocol/tdap/tdapSchema.h>
|
23
23
|
#include <string>
|
24
|
+
#include <vector>
|
24
25
|
|
25
26
|
namespace bzs
|
26
27
|
{
|
@@ -52,6 +53,7 @@ public:
|
|
52
53
|
schemaBuilder();
|
53
54
|
~schemaBuilder();
|
54
55
|
short execute(engine::mysql::database* db, engine::mysql::table* mtb);
|
56
|
+
static void listSchemaTable(engine::mysql::database* db, std::vector<std::string>& shcemaNames);
|
55
57
|
};
|
56
58
|
|
57
59
|
} // namespace mysql
|
@@ -691,9 +691,10 @@ public:
|
|
691
691
|
bool valid = !(forword ? gt : le);
|
692
692
|
|
693
693
|
// case in-sencitive, Index judge need clinet and server are same option.
|
694
|
-
bool
|
695
|
-
bool
|
696
|
-
|
694
|
+
bool is_cl_casein = ((fd->logType & CMPLOGICAL_CASEINSENSITIVE) != 0);
|
695
|
+
bool is_srv_casein = ((key->key_part[segmentIndex].field->flags & BINARY_FLAG) == 0) &&
|
696
|
+
isStringType(fd->type);
|
697
|
+
if (valid && (is_cl_casein == is_srv_casein))
|
697
698
|
{
|
698
699
|
m_keySeg = (unsigned char)segmentIndex + 1;
|
699
700
|
m_judgeType = (comp == eEqual) ? 2 : 1;
|
@@ -950,7 +951,7 @@ class resultWriter
|
|
950
951
|
const extResultDef* m_def;
|
951
952
|
bool m_noBookmark;
|
952
953
|
|
953
|
-
short doWrite(position* pos, unsigned int
|
954
|
+
short doWrite(position* pos, const unsigned char* bookmark, int bmlen)
|
954
955
|
{
|
955
956
|
// write recLength space;
|
956
957
|
unsigned short recLen = 0;
|
@@ -959,7 +960,7 @@ class resultWriter
|
|
959
960
|
|
960
961
|
// write bookmark
|
961
962
|
if (!m_noBookmark)
|
962
|
-
m_nw->asyncWrite((const char*)
|
963
|
+
m_nw->asyncWrite((const char*)bookmark, bmlen);
|
963
964
|
|
964
965
|
// if pos ==NULL , that is not found record in a TD_KEY_SEEK_MULTI
|
965
966
|
// operation
|
@@ -1010,6 +1011,7 @@ class resultWriter
|
|
1010
1011
|
}
|
1011
1012
|
|
1012
1013
|
public:
|
1014
|
+
resultWriter() : m_nw(NULL), m_def(NULL){}
|
1013
1015
|
|
1014
1016
|
void init(netsvc::server::netWriter* nw, const extResultDef* def,
|
1015
1017
|
bool noBookmark)
|
@@ -1019,15 +1021,19 @@ public:
|
|
1019
1021
|
m_noBookmark = noBookmark;
|
1020
1022
|
}
|
1021
1023
|
|
1022
|
-
short write(position* pos, unsigned int
|
1024
|
+
short write(position* pos, const unsigned char* bookmark, int len)
|
1023
1025
|
{
|
1024
|
-
return doWrite(pos, bookmark);
|
1026
|
+
return doWrite(pos, bookmark, len);
|
1025
1027
|
}
|
1026
1028
|
|
1027
1029
|
inline unsigned int end()
|
1028
1030
|
{
|
1029
|
-
m_nw
|
1030
|
-
|
1031
|
+
if (m_nw)
|
1032
|
+
{
|
1033
|
+
m_nw->asyncWrite(NULL, 0, netsvc::server::netWriter::writeEnd);
|
1034
|
+
return m_nw->resultLen();
|
1035
|
+
}
|
1036
|
+
return 0;
|
1031
1037
|
}
|
1032
1038
|
|
1033
1039
|
const char* resultBuffer() { return m_nw->ptr(); }
|
@@ -1073,7 +1079,7 @@ public:
|
|
1073
1079
|
if(p->readMapSize)
|
1074
1080
|
{
|
1075
1081
|
bm.setTable(tb);
|
1076
|
-
if (m_seeksMode)
|
1082
|
+
if (m_seeksMode && !(req->itype & FILTER_TYPE_SEEKS_BOOKMARKS))
|
1077
1083
|
addKeysegFieldMap(tb);
|
1078
1084
|
if (p->readMapSize)
|
1079
1085
|
p->copyBitmapTo(bm.getReadBitmap());
|
@@ -1126,7 +1132,8 @@ public:
|
|
1126
1132
|
if ((rd->fieldCount > 1) ||
|
1127
1133
|
((rd->fieldCount == 1) &&
|
1128
1134
|
(rd->field[0].len < m_position.recordLenCl())))
|
1129
|
-
ret = convResultPosToFieldNum(tb, noBookmark, rd, m_seeksMode
|
1135
|
+
ret = convResultPosToFieldNum(tb, noBookmark, rd, m_seeksMode,
|
1136
|
+
(req->itype & FILTER_TYPE_SEEKS_BOOKMARKS) != 0);
|
1130
1137
|
|
1131
1138
|
nw->beginExt(tb->blobFields() != 0);
|
1132
1139
|
m_writer.init(nw, rd, noBookmark);
|
@@ -1154,7 +1161,7 @@ public:
|
|
1154
1161
|
|
1155
1162
|
// TODO This convert is move to client. but legacy app is need this
|
1156
1163
|
short convResultPosToFieldNum(engine::mysql::table* tb, bool noBookmark,
|
1157
|
-
const extResultDef* rd, bool seeksMode)
|
1164
|
+
const extResultDef* rd, bool seeksMode, bool seekBookmark)
|
1158
1165
|
{
|
1159
1166
|
int blobs = 0;
|
1160
1167
|
bm.setTable(tb);
|
@@ -1179,7 +1186,7 @@ public:
|
|
1179
1186
|
fd = fd->next();
|
1180
1187
|
}
|
1181
1188
|
}
|
1182
|
-
else
|
1189
|
+
else if (!seekBookmark)
|
1183
1190
|
addKeysegFieldMap(tb);
|
1184
1191
|
|
1185
1192
|
// if need bookmark , add primary key fields
|
@@ -1220,39 +1227,20 @@ public:
|
|
1220
1227
|
return REC_MACTH;
|
1221
1228
|
}
|
1222
1229
|
|
1223
|
-
short write(const unsigned char*
|
1230
|
+
short write(const unsigned char* bookmarkPtr,
|
1224
1231
|
unsigned int bmlen /*, short stat=0*/)
|
1225
1232
|
{
|
1226
1233
|
unsigned int bookmark = 0;
|
1227
1234
|
// if bmPtr ==NULL , that is not found record in a TD_KEY_SEEK_MULTI
|
1228
1235
|
// operation
|
1229
1236
|
// and set error code to bookmark also STATUS_NOT_FOUND_TI
|
1230
|
-
if (
|
1237
|
+
if (bookmarkPtr == NULL)
|
1231
1238
|
{
|
1232
1239
|
// bookmark = stat;
|
1233
|
-
return m_writer.write(NULL, bookmark);
|
1240
|
+
return m_writer.write(NULL, (const unsigned char*)&bookmark, sizeof(bookmark));
|
1234
1241
|
}
|
1235
1242
|
else
|
1236
|
-
|
1237
|
-
switch (bmlen)
|
1238
|
-
{
|
1239
|
-
case 4:
|
1240
|
-
bookmark = *((unsigned int*)bmPtr);
|
1241
|
-
break;
|
1242
|
-
case 2:
|
1243
|
-
bookmark = *((unsigned short*)bmPtr);
|
1244
|
-
break;
|
1245
|
-
case 3:
|
1246
|
-
bookmark = *((unsigned int*)bmPtr) & 0x0FFFFFF;
|
1247
|
-
break;
|
1248
|
-
case 1:
|
1249
|
-
bookmark = *((unsigned short*)bmPtr) & 0x0FF;
|
1250
|
-
break;
|
1251
|
-
default:
|
1252
|
-
break;
|
1253
|
-
}
|
1254
|
-
return m_writer.write(&m_position, bookmark);
|
1255
|
-
}
|
1243
|
+
return m_writer.write(&m_position, bookmarkPtr, bmlen);
|
1256
1244
|
}
|
1257
1245
|
unsigned short rejectCount() const { return m_req->rejectCount; };
|
1258
1246
|
unsigned short maxRows() const { return m_maxRows; };
|