transactd 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_3_2.dll +0 -0
  3. data/bin/common/{tdclc_64_3_1.dll → tdclc_64_3_2.dll} +0 -0
  4. data/build/swig/ruby/ruby.swg +3 -0
  5. data/build/swig/ruby/tdclrb_wrap.cpp +2413 -126
  6. data/build/swig/tdcl.i +120 -9
  7. data/build/tdclc/tdclc.cbproj +4 -1
  8. data/build/tdclc/tdclc.rc +4 -4
  9. data/build/tdclcpp/tdclcpp.rc +4 -4
  10. data/build/tdclcpp/tdclcpp_bc.cbproj +8 -1
  11. data/build/tdclrb/tdclrb.rc +4 -4
  12. data/source/bzs/db/engine/mysql/database.cpp +138 -130
  13. data/source/bzs/db/engine/mysql/database.h +43 -48
  14. data/source/bzs/db/engine/mysql/dbManager.cpp +81 -96
  15. data/source/bzs/db/engine/mysql/dbManager.h +13 -22
  16. data/source/bzs/db/engine/mysql/mysqlInternal.h +157 -291
  17. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +425 -0
  18. data/source/bzs/db/engine/mysql/mysqlProtocol.h +72 -0
  19. data/source/bzs/db/engine/mysql/mysqlThd.cpp +8 -6
  20. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +7 -3
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -0
  22. data/source/bzs/db/protocol/tdap/client/client.h +22 -8
  23. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +225 -21
  24. data/source/bzs/db/protocol/tdap/client/connMgr.h +42 -16
  25. data/source/bzs/db/protocol/tdap/client/database.cpp +58 -15
  26. data/source/bzs/db/protocol/tdap/client/database.h +3 -3
  27. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +93 -85
  28. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -2
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +9 -5
  30. data/source/bzs/db/protocol/tdap/client/filter.h +2 -2
  31. data/source/bzs/db/protocol/tdap/client/groupComp.h +2 -2
  32. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +1 -1
  33. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +71 -12
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -1
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +35 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -1
  38. data/source/bzs/db/protocol/tdap/client/recordset.h +15 -0
  39. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +21 -16
  40. data/source/bzs/db/protocol/tdap/client/serializer.cpp +32 -11
  41. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -1
  42. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +3 -2
  43. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  44. data/source/bzs/db/protocol/tdap/client/table.cpp +18 -14
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +8 -3
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +83 -43
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +3 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +7 -7
  50. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +247 -137
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +9 -9
  52. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -4
  53. data/source/bzs/db/protocol/tdap/tdapSchema.h +3 -7
  54. data/source/bzs/db/protocol/tdap/tdapcapi.h +23 -3
  55. data/source/bzs/db/protocol/tdap/uri.h +40 -0
  56. data/source/bzs/db/transactd/appModule.cpp +14 -5
  57. data/source/bzs/db/transactd/appModule.h +10 -1
  58. data/source/bzs/db/transactd/connManager.cpp +93 -48
  59. data/source/bzs/db/transactd/connManager.h +10 -7
  60. data/source/bzs/db/transactd/connectionRecord.h +114 -19
  61. data/source/bzs/env/tstring.h +2 -0
  62. data/source/bzs/example/changeSchema.cpp +1 -1
  63. data/source/bzs/example/changeSchema_c.cpp +1 -1
  64. data/source/bzs/example/insertRecords.cpp +2 -1
  65. data/source/bzs/example/insertRecords_c.cpp +2 -1
  66. data/source/bzs/example/queryData.cpp +5 -2
  67. data/source/bzs/netsvc/server/IAppModule.h +6 -0
  68. data/source/bzs/test/tdclatl/test_v3.js +75 -0
  69. data/source/bzs/test/tdclphp/transactd_v3_Test.php +104 -7
  70. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +84 -0
  71. data/source/bzs/test/trdclengn/testField.h +66 -6
  72. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +10 -1
  73. data/source/bzs/test/trdclengn/test_trdclengn.cpp +85 -0
  74. data/source/bzs/test/trdclengn/testbase.h +1 -1
  75. data/source/global/tdclatl/BinlogPos.cpp +64 -0
  76. data/source/global/tdclatl/BinlogPos.h +84 -0
  77. data/source/global/tdclatl/ConnMgr.cpp +285 -0
  78. data/source/global/tdclatl/ConnMgr.h +83 -0
  79. data/source/global/tdclatl/ConnRecord.cpp +123 -0
  80. data/source/global/tdclatl/ConnRecord.h +69 -0
  81. data/source/global/tdclatl/ConnRecords.cpp +57 -0
  82. data/source/global/tdclatl/ConnRecords.h +55 -0
  83. data/source/global/tdclatl/Database.cpp +36 -0
  84. data/source/global/tdclatl/Database.h +4 -0
  85. data/source/global/tdclatl/Table.cpp +14 -1
  86. data/source/global/tdclatl/Table.h +1 -0
  87. data/source/global/tdclatl/resource.h +0 -0
  88. data/source/global/tdclatl/tdclatl.idl +148 -4
  89. metadata +14 -4
  90. data/bin/common/tdclc_32_3_1.dll +0 -0
@@ -21,6 +21,7 @@
21
21
  #include "recordsetReader.h"
22
22
  #include <bzs/db/blobBuffer.h>
23
23
  #include <bzs/db/engine/mysql/database.h>
24
+ #include <bzs/db/engine/mysql/mysqlProtocol.h>
24
25
  #include <bzs/db/engine/mysql/errorMessage.h>
25
26
  #include <bzs/db/engine/mysql/mydebuglog.h>
26
27
  #include <bzs/netsvc/server/IAppModule.h> //lookup for result value
@@ -211,38 +212,8 @@ void dumpStdErr(int op, request& req, table* tb)
211
212
  }
212
213
  }
213
214
 
214
- //-------------------------------------------------------------
215
- // class dbExecuter
216
- //-------------------------------------------------------------
217
215
  #define MYSQL_ERROR_OFFSET 25000
218
- dbExecuter::dbExecuter(netsvc::server::IAppModule* mod)
219
- : dbManager(), m_readHandler(new ReadRecordsHandler()),
220
- m_blobBuffer(new blobBuffer()), m_mod(mod)
221
- {
222
- m_scramble[0] = 0x00;
223
- }
224
-
225
- dbExecuter::~dbExecuter()
226
- {
227
- delete m_blobBuffer;
228
- delete m_readHandler;
229
- }
230
-
231
- void dbExecuter::releaseDatabase(request& req, int op)
232
- {
233
- req.paramMask = 0;
234
- if ((op == TD_RESET_CLIENT) && (req.keyNum != 0))
235
- req.result = 1;
236
- else
237
- dbManager::releaseDatabase(req.cid);
238
- }
239
-
240
- std::string dbExecuter::makeSQLcreateTable(const request& req)
241
- {
242
- return (const char*)req.data;
243
- }
244
-
245
- int dbExecuter::errorCode(int ha_error)
216
+ int errorCode(int ha_error)
246
217
  { // see mysqld_error.h or my_base.h or dbManager.h share/errmsg.txt
247
218
 
248
219
  if (ha_error < HA_ERR_FIRST)
@@ -276,10 +247,43 @@ int dbExecuter::errorCode(int ha_error)
276
247
  else if(ha_error == ER_NO_SUCH_TABLE)
277
248
  return STATUS_TABLE_NOTOPEN;
278
249
  else if(ha_error == ER_SPECIFIC_ACCESS_DENIED_ERROR)
279
- return STATUS_ACCESS_DENIED;
250
+ return STATUS_ACCESS_DENIED;
251
+ else if(ha_error == ER_TABLEACCESS_DENIED_ERROR)
252
+ return STATUS_ACCESS_DENIED;
280
253
  return MYSQL_ERROR_OFFSET + ha_error;
281
254
  }
282
255
 
256
+ //-------------------------------------------------------------
257
+ // class dbExecuter
258
+ //-------------------------------------------------------------
259
+
260
+ dbExecuter::dbExecuter(netsvc::server::IAppModule* mod)
261
+ : dbManager(mod), m_readHandler(new ReadRecordsHandler()),
262
+ m_blobBuffer(new blobBuffer())
263
+ {
264
+ m_scramble[0] = 0x00;
265
+ }
266
+
267
+ dbExecuter::~dbExecuter()
268
+ {
269
+ delete m_blobBuffer;
270
+ delete m_readHandler;
271
+ }
272
+
273
+ void dbExecuter::releaseDatabase(request& req, int op)
274
+ {
275
+ req.paramMask = 0;
276
+ if ((op == TD_RESET_CLIENT) && (req.keyNum != 0))
277
+ req.result = 1;
278
+ else
279
+ dbManager::releaseDatabase(req.cid);
280
+ }
281
+
282
+ std::string dbExecuter::makeSQLcreateTable(const request& req)
283
+ {
284
+ return (const char*)req.data;
285
+ }
286
+
283
287
  bool isMetaDb(const request& req)
284
288
  {
285
289
  char buf[MAX_PATH];
@@ -321,7 +325,7 @@ inline bool dbExecuter::doAuthentication(request& req, database* db)
321
325
  if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR)==0)
322
326
  {
323
327
  ret = false;
324
- char host[MAX_HOSTNAME];
328
+ char host[MAX_HOSTNAME] = {0x00};
325
329
  char *user = 0x00;
326
330
  char *pwd = 0x00;
327
331
  bool pwdRecieved = getUserPasswd(req, user, pwd);
@@ -336,11 +340,14 @@ inline bool dbExecuter::doAuthentication(request& req, database* db)
336
340
  ret = (FALSE == check_scramble((const unsigned char*)pwd, (const char*)m_scramble, p));
337
341
  if (ret)
338
342
  {
339
- m_user = user;
340
- m_host = host;
343
+ m_mod->setUser(user);
344
+ m_mod->setHost(host);
345
+ if (host[0])
346
+ db->setGrant(host, user, db->name().c_str());
341
347
  }
342
348
  }
343
- }
349
+ }else
350
+ m_mod->skipGrants(true);
344
351
  m_authChecked = ret;
345
352
  return ret;
346
353
  }
@@ -391,9 +398,8 @@ bool dbExecuter::connect(request& req)
391
398
  bool ret = getDatabaseWithAuth(req, &db, true);
392
399
  if (ret && (req.result == 0) && db)
393
400
  {
394
- std::string dbSqlname = getDatabaseName(req, FOR_SQL);
395
- dbSqlname.insert(0, "use ");
396
- req.result = ddl_execSql(db->thd(), dbSqlname);
401
+ if (!db->existsDatabase())
402
+ req.result = ERROR_NO_DATABASE;
397
403
  }
398
404
  if (db && (!ret || req.result))
399
405
  dbManager::releaseDatabase(req.cid);
@@ -415,7 +421,7 @@ inline bool dbExecuter::doCreateTable(request& req)
415
421
  if (((req.keyNum == CR_SUBOP_CREATE_DBONLY) || (req.keyNum == 0)) &&
416
422
  (db->existsDatabase() == false))
417
423
  {
418
- req.result = ddl_createDataBase(db->thd(), dbSqlname);
424
+ req.result = ddl_createDataBase(dbSqlname);
419
425
  if (req.result == ER_DB_CREATE_EXISTS + MYSQL_ERROR_OFFSET)
420
426
  req.result = 0;
421
427
  }
@@ -423,7 +429,9 @@ inline bool dbExecuter::doCreateTable(request& req)
423
429
  {
424
430
  if (req.result == 0)
425
431
  {
426
- req.result = ddl_dropDataBase(db->thd(), db->name(), dbSqlname, req.cid);
432
+ std::string dbname = db->name();
433
+ dbManager::releaseDatabase(req.cid);
434
+ req.result = ddl_dropDataBase(dbname, dbSqlname, req.cid);
427
435
  if (ER_DB_DROP_EXISTS+ MYSQL_ERROR_OFFSET == req.result) req.result = 0;
428
436
  }
429
437
  return ret;
@@ -431,55 +439,51 @@ inline bool dbExecuter::doCreateTable(request& req)
431
439
  }
432
440
  if (req.result == 0)
433
441
  { // table operation
434
- if ((req.result = ddl_useDataBase(db->thd(), dbSqlname)) == 0)
442
+ std::string tableSqlName = getTableName(req, FOR_SQL);
443
+ std::string tableName = getTableName(req);
444
+ if (req.keyNum == CR_SUBOP_DROP) // -128 is delete
435
445
  {
436
- std::string tableSqlName = getTableName(req, FOR_SQL);
437
- std::string tableName = getTableName(req);
438
- if (req.keyNum == CR_SUBOP_DROP) // -128 is delete
439
- {
440
- req.result = ddl_dropTable(db, tableName, dbSqlname,
441
- tableSqlName);
442
- if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
443
- req.result = 0;
444
- }
445
- else if (req.keyNum == CR_SUBOP_RENAME)
446
- { // rename new is keybuf
447
- request reqold;
448
- reqold.keybuf = req.data;
449
- reqold.keylen = *req.datalen;
450
- req.result = ddl_renameTable(
451
- db, getTableName(reqold), /*oldname*/
452
- dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
453
- tableSqlName /*newName*/);
454
- }
455
- else if (req.keyNum == CR_SUBOP_SWAPNAME)
456
- { // swap name name2 = keybuf
457
- request reqold;
458
- reqold.keybuf = req.data;
459
- reqold.keylen = *req.datalen;
460
- req.result = ddl_replaceTable(
461
- db, getTableName(reqold), /*oldname*/
462
- tableName, /*newName*/
463
- dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
464
- tableSqlName /*newName*/);
465
- }
466
- else if (req.keyNum != CR_SUBOP_CREATE_DBONLY)
467
- { // create
468
- if (req.data == NULL)
469
- req.result = 1;
470
- else
471
- { //-1 is overwrite
472
- if (req.keyNum == CR_SUB_FLAG_EXISTCHECK && tableName.size())
473
- {
474
- req.result = ddl_dropTable(db, tableName, dbSqlname,
475
- tableSqlName);
476
- if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
477
- req.result = 0;
478
- }
479
- if (req.result == 0)
480
- req.result =
481
- ddl_execSql(db->thd(), makeSQLcreateTable(req));
446
+ req.result = ddl_dropTable(db, tableName, dbSqlname,
447
+ tableSqlName);
448
+ if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
449
+ req.result = 0;
450
+ }
451
+ else if (req.keyNum == CR_SUBOP_RENAME)
452
+ { // rename new is keybuf
453
+ request reqold;
454
+ reqold.keybuf = req.data;
455
+ reqold.keylen = *req.datalen;
456
+ req.result = ddl_renameTable(
457
+ db, getTableName(reqold), /*oldname*/
458
+ dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
459
+ tableSqlName /*newName*/);
460
+ }
461
+ else if (req.keyNum == CR_SUBOP_SWAPNAME)
462
+ { // swap name name2 = keybuf
463
+ request reqold;
464
+ reqold.keybuf = req.data;
465
+ reqold.keylen = *req.datalen;
466
+ req.result = ddl_replaceTable(
467
+ db, getTableName(reqold), /*oldname*/
468
+ tableName, /*newName*/
469
+ dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
470
+ tableSqlName /*newName*/);
471
+ }
472
+ else if (req.keyNum != CR_SUBOP_CREATE_DBONLY)
473
+ { // create
474
+ if (req.data == NULL)
475
+ req.result = 1;
476
+ else
477
+ { //-1 is overwrite
478
+ if (req.keyNum == CR_SUB_FLAG_EXISTCHECK && tableName.size())
479
+ {
480
+ req.result = ddl_dropTable(db, tableName, dbSqlname,
481
+ tableSqlName);
482
+ if (req.result == ER_BAD_TABLE_ERROR + MYSQL_ERROR_OFFSET)
483
+ req.result = 0;
482
484
  }
485
+ if (req.result == 0)
486
+ req.result = ddl_createTable(db, makeSQLcreateTable(req).c_str());
483
487
  }
484
488
  }
485
489
  }
@@ -513,7 +517,7 @@ inline bool dbExecuter::doOpenTable(request& req, char* buf, bool reconnect)
513
517
  }
514
518
  }
515
519
  // if error occured that throw no exception
516
- tb = db->openTable(getTableName(req), mode, getOwnerName(req));
520
+ tb = db->openTable(getTableName(req), mode, getOwnerName(req), getDatabaseName(req, false));
517
521
  if (db->stat())
518
522
  req.result = (short_td)errorCode(db->stat());
519
523
  }
@@ -1072,7 +1076,7 @@ inline void dbExecuter::doDelete(request& req)
1072
1076
  inline void dbExecuter::doInsertBulk(request& req)
1073
1077
  {
1074
1078
  m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
1075
- if (m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
1079
+ if ((req.keyNum == -1) || m_tb->setKeyNum(m_tb->keyNumByMakeOrder(req.keyNum)))
1076
1080
  {
1077
1081
  ushort_td* n = (ushort_td*)req.data;
1078
1082
  ushort_td ret = 0;
@@ -1094,7 +1098,6 @@ inline void dbExecuter::doInsertBulk(request& req)
1094
1098
  m_tb->clearBuffer();
1095
1099
  m_tb->setRecordFromPacked(pos + sizeof(ushort_td), len,
1096
1100
  req.blobHeader);
1097
-
1098
1101
  if (i == *n - 1)
1099
1102
  m_tb->insert((req.keyNum != -1));
1100
1103
  else
@@ -1119,6 +1122,75 @@ inline void dbExecuter::doInsertBulk(request& req)
1119
1122
  req.paramMask |= P_MASK_PB_ERASE_BM;
1120
1123
  }
1121
1124
 
1125
+ inline void dbExecuter::doGetSchema(request& req, netsvc::server::netWriter* nw)
1126
+ {
1127
+ nw->setClientBuffferSize(*req.datalen);
1128
+ nw->beginExt(false);
1129
+ char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
1130
+ if (req.keyNum == SC_SUBOP_VIEW_BY_SQL)
1131
+ {// Return SQL statement as show create view.
1132
+ TABLE_LIST tables; char key[256];
1133
+ const char* keyPtr = key;
1134
+ database* db = getDatabaseCid(req.cid);
1135
+ std::string dbname = db->name();
1136
+ THD* thd = db->thd();
1137
+ std::string name = getTableName(req);
1138
+ tables.init_one_table(dbname.c_str(), dbname.size(), name.c_str(),
1139
+ name.size(), name.c_str(), TL_READ);
1140
+ uint key_length= cp_get_table_def_key(thd, &tables, &keyPtr);
1141
+ if (!cp_tdc_open_view(thd, &tables, name.c_str(), key, key_length, OPEN_VIEW_NO_PARSE))
1142
+ {
1143
+ unsigned int len = (unsigned int)(tables.view_body_utf8.length + 17 + name.size());
1144
+ if (len <= *req.datalen)
1145
+ {
1146
+ char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
1147
+ sprintf_s(p, *req.datalen, "CREATE VIEW %s as %s", name.c_str(), tables.view_body_utf8.str);
1148
+ p[len] = 0x00;
1149
+ nw->asyncWrite(NULL, len+1, netsvc::server::netWriter::curSeekOnly);
1150
+ nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, 0);
1151
+ }
1152
+ else
1153
+ nw->writeHeadar(0, STATUS_BUFFERTOOSMALL);
1154
+ }else
1155
+ nw->writeHeadar(0, STATUS_TABLE_NOTOPEN);
1156
+ }
1157
+ else if (req.keyNum == SC_SUBOP_BY_SQL)
1158
+ {// Return SQL statement as show create table.
1159
+ String s;
1160
+ m_tb = getTable(req.pbk->handle);
1161
+ m_tb->getCreateSql(&s);
1162
+ unsigned int len = (unsigned int)s.length();
1163
+ if (len+1 <= *req.datalen)
1164
+ {
1165
+ char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
1166
+ memcpy(p, s.ptr(), len);
1167
+ p[len] = 0x00;
1168
+ nw->asyncWrite(NULL, len+1, netsvc::server::netWriter::curSeekOnly);
1169
+ nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, (short_td)errorCode(m_tb->stat()));
1170
+ }
1171
+ else
1172
+ nw->writeHeadar(0, STATUS_BUFFERTOOSMALL);
1173
+ m_tb->unUse();
1174
+ }
1175
+ else
1176
+ {// Return tabledef image binary.
1177
+ database* db = getDatabaseCid(req.cid);
1178
+ std::string name = getTableName(req);
1179
+ schemaBuilder sb;
1180
+ protocol::tdap::tabledef* td = sb.getTabledef(db, name.c_str(),
1181
+ (unsigned char*)p, *req.datalen);
1182
+ if (td)
1183
+ {
1184
+ nw->asyncWrite(NULL, td->varSize + sizeof(unsigned short), netsvc::server::netWriter::curSeekOnly);
1185
+ nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, (short_td)errorCode(db->stat()));
1186
+ }
1187
+ else
1188
+ nw->writeHeadar(0, errorCodeSht(sb.stat()));
1189
+ }
1190
+ unsigned int* totalLen = (unsigned int*)nw->ptr();
1191
+ nw->datalen = *totalLen = nw->resultLen();
1192
+ }
1193
+
1122
1194
  /**
1123
1195
  @result
1124
1196
  2byte recordLength
@@ -1201,7 +1273,6 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1201
1273
 
1202
1274
  if ((op >= TD_KEY_EQUAL_KO) && (op <= TD_KEY_LAST_KO))
1203
1275
  op -= 50;
1204
-
1205
1276
  try
1206
1277
  {
1207
1278
  posblk* pbk = req.pbk;
@@ -1292,8 +1363,16 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1292
1363
  binlogPos bpos;
1293
1364
  memset(&bpos, 0, sizeof(binlogPos));
1294
1365
  database* db = getDatabaseCid(req.cid);
1366
+ THD* thd = NULL;
1367
+ #ifdef NOTUSE_BINLOG_VAR
1368
+ if (withSnapshot)
1369
+ {
1370
+ thd = getThd();
1371
+ db->use();
1372
+ }
1373
+ #endif
1295
1374
  transactionResult = db->beginSnapshot(
1296
- getIsolationLevel(opTrn), withSnapshot ? &bpos : NULL);
1375
+ getIsolationLevel(opTrn), withSnapshot ? &bpos : NULL, thd);
1297
1376
  req.result = errorCodeSht(db->stat());
1298
1377
  if (transactionResult && withSnapshot)
1299
1378
  {
@@ -1518,9 +1597,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1518
1597
  { // Key name of multi byte charctor is not supported. Use only ascii.
1519
1598
  database* db = getDatabaseCid(req.cid);
1520
1599
  m_tb = getTable(req.pbk->handle);
1521
- req.result = ddl_execSql(db->thd(),
1522
- makeSQLDropIndex(db->name(), m_tb->name(),
1523
- m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum))));
1600
+ req.result = ddl_dropIndex(db, m_tb->name(),
1601
+ m_tb->keyName(m_tb->keyNumByMakeOrder(req.keyNum)));
1524
1602
  break;
1525
1603
  }
1526
1604
  case TD_GETDIRECTORY:
@@ -1569,35 +1647,17 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1569
1647
  std::string s("%@%");
1570
1648
  s += (const char*)&num;
1571
1649
  s += (const char*)req.keybuf;
1572
- req.result = ddl_execSql(
1573
- db->thd(),
1574
- makeSQLChangeTableComment(db->name(), m_tb->name(), s.c_str()));
1650
+ req.result = ddl_tableComment(db, m_tb->name(), s.c_str());
1575
1651
  break;
1576
1652
  }
1577
1653
  case TD_ACL_RELOAD:
1578
1654
  req.result = getDatabaseCid(req.cid)->aclReload();
1579
1655
  break;
1580
1656
  case TD_GET_SCHEMA:
1581
- {
1582
- database* db = getDatabaseCid(req.cid);
1583
- nw->setClientBuffferSize(*(req.datalen));
1584
- nw->beginExt(false);
1585
- char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
1586
- schemaBuilder sb;
1587
- protocol::tdap::tabledef* td = sb.getTabledef(db, getTableName(req).c_str(),
1588
- (unsigned char*)p, *req.datalen);
1589
- if (td)
1590
1657
  {
1591
- nw->asyncWrite(NULL, td->varSize + sizeof(unsigned short), netsvc::server::netWriter::curSeekOnly);
1592
- nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, (short_td)errorCode(db->stat()));
1593
-
1658
+ doGetSchema(req, nw);
1659
+ return EXECUTE_RESULT_SUCCESS;
1594
1660
  }
1595
- else
1596
- nw->writeHeadar(0, errorCodeSht(sb.stat()));
1597
- unsigned int* totalLen = (unsigned int*)nw->ptr();
1598
- nw->datalen = *totalLen = nw->resultLen();
1599
- return EXECUTE_RESULT_SUCCESS;
1600
- }
1601
1661
  case TD_STORE_TEST:
1602
1662
  {
1603
1663
  m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
@@ -1763,16 +1823,19 @@ connMgrExecuter::connMgrExecuter(request& req, unsigned __int64 parent)
1763
1823
  {
1764
1824
  }
1765
1825
 
1766
- int serialize(request& req, char* buf, size_t& size, const connManager::records& records, short stat)
1826
+ int serialize(request& req, char* buf, size_t& size, const connection::records& records, short stat)
1767
1827
  {
1768
1828
  req.reset();
1769
- req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1829
+ req.paramMask = P_MASK_DATA | P_MASK_DATALEN | P_MASK_KEYBUF;
1770
1830
  if (records.size())
1771
1831
  req.data = (void*)&records[0];
1772
1832
  else
1773
1833
  req.paramMask = P_MASK_DATALEN;
1774
- req.resultLen = (uint_td)(sizeof(record) * records.size());
1834
+ int len = sizeof(record);
1835
+ req.resultLen = (uint_td)(len * records.size());
1775
1836
  req.result = stat;
1837
+ req.keylen = 4;
1838
+ req.keybuf = &len;
1776
1839
  size = req.serialize(NULL, buf);
1777
1840
  return EXECUTE_RESULT_SUCCESS;
1778
1841
  }
@@ -1781,25 +1844,50 @@ int connMgrExecuter::read(char* buf, size_t& size)
1781
1844
  {
1782
1845
  connManager st(m_modHandle);
1783
1846
  unsigned __int64* mod = (unsigned __int64*)m_req.keybuf;
1784
- return serialize(m_req, buf, size, st.getRecords(mod[0], (int)mod[1]), st.stat());
1847
+ const connection::records& records = st.getRecords(mod[0], (int)mod[1]);
1848
+ return serialize(m_req, buf, size, records, st.stat());
1785
1849
  }
1786
1850
 
1787
- int connMgrExecuter::definedDatabaseList(char* buf, size_t& size)
1851
+ int connMgrExecuter::definedDatabases(char* buf, size_t& size)
1788
1852
  {
1789
1853
  connManager st(m_modHandle);
1790
- return serialize(m_req, buf, size, st.getDefinedDatabaseList(), st.stat());
1854
+ const connection::records& records = st.definedDatabases();
1855
+ return serialize(m_req, buf, size, records, st.stat());
1791
1856
  }
1792
1857
 
1793
1858
  int connMgrExecuter::systemVariables(char* buf, size_t& size)
1794
1859
  {
1795
1860
  connManager st(m_modHandle);
1796
- return serialize(m_req, buf, size, st.systemVariables(), st.stat());
1861
+ const connection::records& records = st.systemVariables();
1862
+ return serialize(m_req, buf, size, records, st.stat());
1863
+ }
1864
+
1865
+ int connMgrExecuter::schemaTables(char* buf, size_t& size)
1866
+ {
1867
+ connManager st(m_modHandle);
1868
+ const connection::records& records = st.schemaTables((const char*)m_req.keybuf);
1869
+ return serialize(m_req, buf, size, records, st.stat());
1870
+ }
1871
+
1872
+ int connMgrExecuter::definedTables(char* buf, size_t& size)
1873
+ {
1874
+ connManager st(m_modHandle);
1875
+ const connection::records& records = st.definedTables((const char*)m_req.keybuf, TABLE_TYPE_NORMAL_TABLE);
1876
+ return serialize(m_req, buf, size, records, st.stat());
1797
1877
  }
1798
1878
 
1799
- int connMgrExecuter::schemaTableList(char* buf, size_t& size)
1879
+ int connMgrExecuter::definedViews(char* buf, size_t& size)
1800
1880
  {
1801
1881
  connManager st(m_modHandle);
1802
- return serialize(m_req, buf, size, st.schemaTableList((const char*)m_req.keybuf), st.stat());
1882
+ const connection::records& records = st.definedTables((const char*)m_req.keybuf, TABLE_TYPE_VIEW);
1883
+ return serialize(m_req, buf, size, records, st.stat());
1884
+ }
1885
+
1886
+ int connMgrExecuter::slaveStatus(char* buf, size_t& size)
1887
+ {
1888
+ connManager st(m_modHandle);
1889
+ const connection::records& records = st.readSlaveStatus();
1890
+ return serialize(m_req, buf, size, records, st.stat());
1803
1891
  }
1804
1892
 
1805
1893
  int connMgrExecuter::disconnectOne(char* buf, size_t& size)
@@ -1823,19 +1911,41 @@ int connMgrExecuter::disconnectAll(char* buf, size_t& size)
1823
1911
 
1824
1912
  int connMgrExecuter::commandExec(netsvc::server::netWriter* nw)
1825
1913
  {
1826
- if (m_req.keyNum == TD_STSTCS_READ)
1827
- return read(nw->ptr(), nw->datalen);
1828
- else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
1914
+ if (m_req.keyNum == TD_STSTCS_DISCONNECT_ONE)
1829
1915
  return disconnectOne(nw->ptr(), nw->datalen);
1830
- else if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
1916
+ if (m_req.keyNum == TD_STSTCS_DISCONNECT_ALL)
1831
1917
  return disconnectAll(nw->ptr(), nw->datalen);
1832
- else if(m_req.keyNum == TD_STSTCS_DATABASE_LIST)
1833
- return definedDatabaseList(nw->ptr(), nw->datalen);
1834
- else if(m_req.keyNum == TD_STSTCS_SYSTEM_VARIABLES)
1835
- return systemVariables(nw->ptr(), nw->datalen);
1836
- else if(m_req.keyNum == TD_STSTCS_SCHEMA_TABLE_LIST)
1837
- return schemaTableList(nw->ptr(), nw->datalen);
1838
- return 0;
1918
+
1919
+ if (*m_req.datalen == (uint_td)63976)
1920
+ {
1921
+ switch (m_req.keyNum)
1922
+ {
1923
+ case TD_STSTCS_READ:
1924
+ return read(nw->ptr(), nw->datalen);
1925
+ case TD_STSTCS_DATABASE_LIST:
1926
+ return definedDatabases(nw->ptr(), nw->datalen);
1927
+ case TD_STSTCS_SYSTEM_VARIABLES:
1928
+ return systemVariables(nw->ptr(), nw->datalen);
1929
+ case TD_STSTCS_SCHEMA_TABLE_LIST:
1930
+ return schemaTables(nw->ptr(), nw->datalen);
1931
+ case TD_STSTCS_TABLE_LIST:
1932
+ return definedTables(nw->ptr(), nw->datalen);
1933
+ case TD_STSTCS_VIEW_LIST:
1934
+ return definedViews(nw->ptr(), nw->datalen);
1935
+ case TD_STSTCS_SLAVE_STATUS:
1936
+ return slaveStatus(nw->ptr(), nw->datalen);
1937
+ default:
1938
+ m_req.reset();
1939
+ m_req.result = STATUS_NOSUPPORT_OP;
1940
+ break;
1941
+ }
1942
+ }else
1943
+ {
1944
+ m_req.reset();
1945
+ m_req.result = SERVER_CLIENT_NOT_COMPATIBLE;
1946
+ }
1947
+ nw->datalen = m_req.serialize(NULL, nw->ptr());
1948
+ return EXECUTE_RESULT_SUCCESS;
1839
1949
  }
1840
1950
 
1841
1951
  // ---------------------------------------------------------------------------
@@ -58,7 +58,7 @@ struct extRequestSeeks;
58
58
 
59
59
  std::string getDatabaseName(const request& req, bool forSql = false);
60
60
  std::string getTableName(const request& req, bool forSql = false);
61
- short_td errorCode(int ha_error);
61
+ int errorCode(int ha_error);
62
62
  bool isMetaDb(const request& req);
63
63
 
64
64
  class dbExecuter : public engine::mysql::dbManager
@@ -66,7 +66,6 @@ class dbExecuter : public engine::mysql::dbManager
66
66
  ReadRecordsHandler* m_readHandler;
67
67
  blobBuffer* m_blobBuffer;
68
68
  unsigned char m_scramble[MYSQL_SCRAMBLE_LENGTH+1];
69
- netsvc::server::IAppModule* m_mod;
70
69
  void releaseDatabase(request& req, int op);
71
70
  std::string makeSQLcreateTable(const request& req);
72
71
  bool connect(request& req);
@@ -86,6 +85,7 @@ class dbExecuter : public engine::mysql::dbManager
86
85
  inline void doDelete(request& req);
87
86
  inline void doDeleteKey(request& req);
88
87
  inline void doInsertBulk(request& req);
88
+ inline void doGetSchema(request& req, netsvc::server::netWriter* nw);
89
89
  inline void doStat(request& req);
90
90
  inline short seekEach(extRequestSeeks* ereq, bool noBookMark);
91
91
  inline short seekBookmarkEach(extRequestSeeks* ereq, bool noBookmark);
@@ -96,11 +96,8 @@ public:
96
96
  ~dbExecuter();
97
97
  int commandExec(request& req, netsvc::server::netWriter* nw);
98
98
  size_t getAcceptMessage(char* message, size_t size);
99
- int errorCode(int ha_error);
100
- inline short_td errorCodeSht(int ha_error)
101
- {
102
- return (short_td)errorCode(ha_error);
103
- }
99
+ inline int errorCode(int ha_error) { return tdap::mysql::errorCode(ha_error);}
100
+ inline short_td errorCodeSht(int ha_error) { return (short_td)tdap::mysql::errorCode(ha_error);}
104
101
  netsvc::server::IAppModule* mod() { return m_mod; };
105
102
  };
106
103
 
@@ -111,8 +108,11 @@ class connMgrExecuter
111
108
  request& m_req;
112
109
  __int64 m_modHandle;
113
110
 
114
- int definedDatabaseList(char* buf, size_t& size);
115
- int schemaTableList(char* buf, size_t& size);
111
+ int definedDatabases(char* buf, size_t& size);
112
+ int schemaTables(char* buf, size_t& size);
113
+ int definedTables(char* buf, size_t& size);
114
+ int definedViews(char* buf, size_t& size);
115
+ int slaveStatus(char* buf, size_t& size);
116
116
  int systemVariables(char* buf, size_t& size);
117
117
  int read(char* buf, size_t& size);
118
118
  int disconnectOne(char* buf, size_t& size);
@@ -784,8 +784,6 @@ bool tabledef::operator==(const tabledef& r) const
784
784
  (keyCount == r.keyCount) &&
785
785
  (version == r.version) &&
786
786
  (charsetIndex == r.charsetIndex) &&
787
- (m_nullfields == r.m_nullfields) &&
788
- (m_nullbytes == r.m_nullbytes) &&
789
787
  (flags.all == r.flags.all) &&
790
788
  (primaryKeyNum == r.primaryKeyNum) &&
791
789
  (parentKeyNum == r.parentKeyNum) &&
@@ -953,8 +951,7 @@ void tabledef::calcReclordlen(bool force)
953
951
  // If valible length then specifing fixed length.
954
952
  if ((fixedRecordLen == 0) || (flags.bit0 == false))
955
953
  fixedRecordLen = m_maxRecordLen;
956
- }else
957
- ;//assert(0);
954
+ }
958
955
  }
959
956
 
960
957
  uint_td tabledef::unPack(char* ptr, size_t size) const
@@ -796,14 +796,14 @@ private:
796
796
  * If datalen!=0xff then From is none field formated (string) type.
797
797
  */
798
798
  inline uchar_td* keyCopy(uchar_td* to, const uchar_td* from, ushort_td datalen,
799
- bool isNull)
799
+ bool isNull, bool transactd)
800
800
  {
801
801
  ushort_td keylen = maxKeylen(); // size of max key segmnet for mysql
802
802
  ushort_td keyVarlen = varLenByteForKey(); // size of var sizeByte for record.
803
803
  ushort_td copylen = std::min<ushort_td>(keylen, datalen);
804
804
 
805
805
  memset(to, 0x00, keylen + 1); //clear plus null byte
806
- if (isNullable())
806
+ if (isNullable() && transactd)
807
807
  {
808
808
  // mysql only
809
809
  if (isNull)
@@ -1166,11 +1166,7 @@ private:
1166
1166
  bool isNullKey(const keydef& key) const;
1167
1167
  uint_td pack(char* ptr, size_t size) const;
1168
1168
  short findKeynumByFieldNum(short fieldNum) const;
1169
- inline ushort_td recordlenServer() const
1170
- {
1171
- if (optionFlags.bitC) return m_maxRecordLen + 2;
1172
- return m_maxRecordLen;
1173
- }
1169
+ inline ushort_td recordlenServer() const {return m_maxRecordLen;}
1174
1170
  bool isNeedNis(const keydef& key) const;
1175
1171
  bool isNULLFieldFirstKeySegField(const keydef& key) const;
1176
1172
  bool isNullValueZeroAll(const keydef& key) const;