transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
@@ -58,12 +58,13 @@ public:
58
58
  netsvc::server::netWriter* nw)
59
59
  {
60
60
  // The result contents is copied or sent allready.
61
-
62
- paramMask = nw->getParamMask(tb->getBlobFieldCount() != 0);
63
61
  unsigned int allreadysent = nw->allreadySent();
64
- nw->writeHeadar(paramMask, result);
65
-
66
- if (paramMask & P_MASK_KEYBUF)
62
+ if (tb)
63
+ {
64
+ paramMask = nw->getParamMask(tb->getBlobFieldCount() != 0);
65
+ nw->writeHeadar(paramMask, result);
66
+ }
67
+ if (paramMask & P_MASK_KEYBUF && tb)
67
68
  {
68
69
  keylen = tb->keyPackCopy((uchar*)nw->curPtr() + sizeof(keylen_td));
69
70
  nw->write((const char*)&keylen, sizeof(keylen_td));
@@ -140,22 +140,25 @@ std::string getTableName(const std::string& src, bool forSql)
140
140
  if (pos != std::string::npos)
141
141
  {
142
142
  pos += strlen(TableNameTitle);
143
- while ((name[pos] == '/') || (name[pos] == '\\'))
143
+ if (name.size() > pos)
144
144
  {
145
- if (++pos == name.size())
146
- return "";
145
+ while ((name[pos] == '/') || (name[pos] == '\\'))
146
+ {
147
+ if (++pos == name.size())
148
+ return "";
149
+ }
150
+ size_t pos2 = name.find(".", pos);
151
+ if (pos2 == std::string::npos)
152
+ pos2 = name.size();
153
+ size_t pos3 = name.find("&", pos);
154
+ if (pos3 != std::string::npos && (pos3 < pos2))
155
+ pos2 = pos3;
156
+
157
+ name = name.substr(pos, pos2 - pos);
158
+ if (g_tableNmaeLower)
159
+ toLowerCaseName(name, forSql);
160
+ return name;
147
161
  }
148
- size_t pos2 = name.find(".", pos);
149
- if (pos2 == std::string::npos)
150
- pos2 = name.size();
151
- size_t pos3 = name.find("&", pos);
152
- if (pos3 != std::string::npos && (pos3 < pos2))
153
- pos2 = pos3;
154
-
155
- name = name.substr(pos, pos2 - pos);
156
- if (g_tableNmaeLower)
157
- toLowerCaseName(name, forSql);
158
- return name;
159
162
  }
160
163
 
161
164
  return "";
@@ -343,7 +346,7 @@ bool dbExecuter::getDatabaseWithAuth(request& req, database** db, bool connect)
343
346
  {
344
347
  *db = NULL;
345
348
  bool created = false;
346
- std::string dbname = getDatabaseName(req);
349
+ std::string dbname = getDatabaseName(req);
347
350
  bool ret = false;
348
351
  if (connect && dbname == "")
349
352
  dbname = "mysql";
@@ -353,11 +356,11 @@ bool dbExecuter::getDatabaseWithAuth(request& req, database** db, bool connect)
353
356
  {
354
357
  *db = getDatabase(dbname.c_str(), req.cid, created);
355
358
  if (*db)
356
- ret = doAuthentication(req, *db);
359
+ ret = doAuthentication(req, *db);
357
360
  if (connect || (created && !ret))
358
361
  {
359
362
  dbManager::releaseDatabase(req.cid);
360
- *db = NULL;
363
+ *db = NULL;
361
364
  }
362
365
  }else
363
366
  req.result = 1;
@@ -373,9 +376,9 @@ bool dbExecuter::connect(request& req)
373
376
  req.paramMask = 0;
374
377
  if (req.keyNum == LG_SUBOP_DISCONNECT)
375
378
  {
376
- dbManager::releaseDatabase(req.cid);
377
- return true;
378
- }
379
+ dbManager::releaseDatabase(req.cid);
380
+ return true;
381
+ }
379
382
  database* db = NULL;
380
383
  bool ret = getDatabaseWithAuth(req, &db, true);
381
384
  if (ret && (req.result == 0) && db)
@@ -401,7 +404,8 @@ inline bool dbExecuter::doCreateTable(request& req)
401
404
  std::string cmd;
402
405
  if (isMetaDb(req))
403
406
  { // for database operation
404
- if ((req.keyNum == 0) && (db->existsDatabase() == false))
407
+ if (((req.keyNum == CR_SUBOP_CREATE_DBONLY) || (req.keyNum == 0)) &&
408
+ (db->existsDatabase() == false))
405
409
  {
406
410
  req.result = ddl_createDataBase(db->thd(), dbSqlname);
407
411
  if (req.result == ER_DB_CREATE_EXISTS + MYSQL_ERROR_OFFSET)
@@ -451,13 +455,13 @@ inline bool dbExecuter::doCreateTable(request& req)
451
455
  dbSqlname, getTableName(reqold, FOR_SQL), /*oldname*/
452
456
  tableSqlName /*newName*/);
453
457
  }
454
- else
458
+ else if (req.keyNum != CR_SUBOP_CREATE_DBONLY)
455
459
  { // create
456
460
  if (req.data == NULL)
457
461
  req.result = 1;
458
462
  else
459
463
  { //-1 is overwrite
460
- if (req.keyNum == CR_SUB_FLAG_EXISTCHECK)
464
+ if (req.keyNum == CR_SUB_FLAG_EXISTCHECK && tableName.size())
461
465
  {
462
466
  req.result = ddl_dropTable(db, tableName, dbSqlname,
463
467
  tableSqlName);
@@ -475,14 +479,20 @@ inline bool dbExecuter::doCreateTable(request& req)
475
479
  return ret;
476
480
  }
477
481
 
478
-
479
482
  // open table and assign handle
480
- inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
483
+ inline bool dbExecuter::doOpenTable(request& req, char* buf, bool reconnect)
481
484
  {
482
485
  database* db;
483
486
  bool ret = getDatabaseWithAuth(req, &db);
484
487
  if (ret && req.result == 0)
485
488
  {
489
+ short mode = req.keyNum;
490
+ bool getschema = IS_MODE_GETSCHEMA(mode);
491
+ if (getschema)
492
+ mode -= TD_OPEN_MASK_GETSHCHEMA;
493
+ bool getDefaultImage = IS_MODE_GETDEFAULTIMAGE(mode);
494
+ if (getDefaultImage)
495
+ mode -= TD_OPEN_MASK_GETDEFAULTIMAGE;
486
496
  table* tb = NULL;
487
497
  {// Lock open table by another thread
488
498
  boost::mutex::scoped_lock lck(g_mutex_opentable);
@@ -495,7 +505,7 @@ inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
495
505
  }
496
506
  }
497
507
  // if error occured that throw no exception
498
- tb = db->openTable(getTableName(req), req.keyNum, getOwnerName(req));
508
+ tb = db->openTable(getTableName(req), mode, getOwnerName(req));
499
509
  if (db->stat())
500
510
  req.result = (short_td)errorCode(db->stat());
501
511
  }
@@ -509,15 +519,56 @@ inline bool dbExecuter::doOpenTable(request& req, bool reconnect)
509
519
  m_tb = getTable(hdl);
510
520
  req.pbk->handle = hdl;
511
521
  if (!reconnect)
512
- {
513
- ushort_td len = m_tb->posPtrLen();
522
+ { //return bookmark size
523
+ req.paramMask = P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN;
524
+ unsigned int len = m_tb->posPtrLen();
525
+ unsigned char* p = (unsigned char*)req.data;
526
+ //no primary key
514
527
  if ((m_tb->tableFlags() & HA_PRIMARY_KEY_REQUIRED_FOR_POSITION) && !m_tb->primaryKey())
515
528
  len = 0xFFFF;
516
- memcpy(req.data, &len , sizeof(ushort_td));
529
+ memcpy(p, &len , sizeof(ushort_td));
517
530
  req.resultLen = sizeof(ushort_td);
518
- req.paramMask = P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN;
519
- }else
520
- req.paramMask = P_MASK_POSBLK;
531
+ //copy default record image
532
+ if (getDefaultImage)
533
+ {
534
+ if (!m_tb->isMysqlNull())
535
+ {
536
+ req.result = STATUS_INVALID_NULLMODE;
537
+ return false;
538
+ }
539
+ p += sizeof(ushort_td);
540
+ len = m_tb->writeDefaultImage(p, *req.datalen - req.resultLen);
541
+ req.resultLen += len;
542
+ if (!getschema && *req.datalen != req.resultLen)
543
+ {
544
+ req.result = STATUS_INVALID_DATASIZE;
545
+ return false;
546
+ }
547
+ }else if(getschema)
548
+ {
549
+ if (*req.datalen < 4)
550
+ {
551
+ req.result = STATUS_BUFFERTOOSMALL;
552
+ return false;
553
+ }
554
+ p += sizeof(ushort_td);
555
+ p[0] = 0x00;
556
+ p[1] = 0x00;
557
+ len = 2;
558
+ req.resultLen += len;
559
+ }
560
+ if (getschema)
561
+ {
562
+ p += len;
563
+ len = m_tb->writeSchemaImage(p , *req.datalen - req.resultLen);
564
+ if (len == sizeof(ushort_td))
565
+ {
566
+ req.result = STATUS_BUFFERTOOSMALL;
567
+ return false;
568
+ }
569
+ req.resultLen += len;
570
+ }
571
+ }
521
572
  }
522
573
  catch (bzs::rtl::exception& e)
523
574
  {
@@ -841,42 +892,45 @@ inline short dbExecuter::seekEach(extRequestSeeks* ereq, bool noBookmark)
841
892
 
842
893
  for (int i = 0; i < ereq->logicalCount; ++i)
843
894
  {
844
- m_tb->setKeyValuesPacked(fd->ptr, fd->len);
845
- m_tb->seekKey(HA_READ_KEY_EXACT, keyMap);
846
- if (m_tb->stat() == 0)
895
+ /* If NULL even any one segment, all be NULL
896
+ The fd->ptr[0] is null Indicator.
897
+ */
898
+ if (fd->null == 0)
847
899
  {
848
- if (seg)
900
+ m_tb->setKeyValuesPacked(fd->ptr, fd->len);
901
+ m_tb->seekKey(HA_READ_KEY_EXACT, keyMap);
902
+ if (m_tb->stat() == 0)
849
903
  {
850
- // If duplicate records , bookmark space is request row number.
851
- stat = m_readHandler->write((uchar*)&i, 4);
904
+ if (seg)
905
+ {
906
+ // If duplicate records , bookmark space is request row number.
907
+ stat = m_readHandler->write((uchar*)&i, 4);
908
+ }
909
+ else if (noBookmark)
910
+ stat = m_readHandler->write((const unsigned char *)_T("dummy"), 0);
911
+ else
912
+ stat = m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
852
913
  }
853
- else if (noBookmark)
854
- stat = m_readHandler->write((const unsigned char *)_T("dummy"), 0);
855
914
  else
856
- stat =
857
- m_readHandler->write(m_tb->position(), m_tb->posPtrLen());
858
- }
859
- else
860
- stat = m_readHandler->write(NULL, 0);
861
- if (stat)
862
- break;
915
+ stat = m_readHandler->write(NULL, 0);
863
916
 
864
- // for hasMany join
865
- if (seg)
866
- {
867
- while (m_tb->stat() == 0)
917
+ if (stat) break;
918
+ // for hasMany join
919
+ if (seg)
868
920
  {
869
- m_tb->getNextSame(keyMap);
870
- if (m_tb->stat() == 0)
871
- stat = m_readHandler->write(
872
- (uchar*)&i, 4); // write seek sequential number
873
- if (stat)
874
- break;
921
+ while (m_tb->stat() == 0)
922
+ {
923
+ m_tb->getNextSame(keyMap);
924
+ if (m_tb->stat() == 0)
925
+ stat = m_readHandler->write(
926
+ (uchar*)&i, 4); // write seek sequential number
927
+ if (stat) break;
928
+ }
929
+ if (stat) break;
875
930
  }
876
- if (stat)
877
- break;
878
- }
879
-
931
+ }else
932
+ stat = m_readHandler->write(NULL, 0);
933
+ if (stat) break;
880
934
  fd = fd->next();
881
935
  }
882
936
  if (stat == 0)
@@ -1078,7 +1132,7 @@ inline void dbExecuter::doStat(request& req)
1078
1132
  memcpy((char*)req.data, &len, sizeof(ushort_td));
1079
1133
  uint rows = (uint)m_tb->recordCount((req.keyNum != 0));
1080
1134
  memcpy((char*)req.data + 6, &rows, sizeof(uint));
1081
- req.result = errorCodeSht(m_tb->stat());
1135
+ req.result = errorCodeSht(m_tb->stat());
1082
1136
  }
1083
1137
  else
1084
1138
  req.result = STATUS_BUFFERTOOSMALL;
@@ -1229,10 +1283,12 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1229
1283
  req.resultLen = m_tb->posPtrLen();
1230
1284
  break;
1231
1285
  case TD_RECONNECT:
1232
-
1233
- if (!doOpenTable(req, true))
1286
+ nw->resize(*req.datalen);
1287
+ resultBuffer = nw->ptr();
1288
+ if (!doOpenTable(req, resultBuffer, true))
1234
1289
  {
1235
- req.result = ERROR_TD_INVALID_CLINETHOST;
1290
+ if (req.result == 0)
1291
+ req.result = ERROR_TD_INVALID_CLINETHOST;
1236
1292
  break;
1237
1293
  }
1238
1294
  {
@@ -1348,13 +1404,16 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1348
1404
  trdVersiton* ver = (trdVersiton*)req.data;
1349
1405
  strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
1350
1406
  global_system_variables.collation_server->csname);
1351
- ver->srvMajor = TRANSACTD_VER_MAJOR;
1352
- ver->srvMinor = TRANSACTD_VER_MINOR;
1353
- ver->srvRelease = TRANSACTD_VER_RELEASE;
1407
+
1408
+ ver->desc.srvMysqlMajor = MYSQL_VERSION_ID / 10000;
1409
+ ver->desc.srvMysqlMinor = (MYSQL_VERSION_ID / 100) % 100;
1410
+ ver->desc.srvMysqlRelease = MYSQL_VERSION_ID % 100;
1411
+ ver->desc.srvMajor = TRANSACTD_VER_MAJOR;
1412
+ ver->desc.srvMinor = TRANSACTD_VER_MINOR;
1413
+ ver->desc.srvRelease = TRANSACTD_VER_RELEASE;
1354
1414
  req.resultLen = sizeof(trdVersiton);
1355
1415
  req.paramMask |= P_MASK_DATA | P_MASK_DATALEN;
1356
- }
1357
- else
1416
+ }else
1358
1417
  req.result = SERVER_CLIENT_NOT_COMPATIBLE;
1359
1418
  break;
1360
1419
  }
@@ -1369,15 +1428,20 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1369
1428
  break;
1370
1429
  case TD_AUTOMEKE_SCHEMA:
1371
1430
  m_tb = getTable(req.pbk->handle, SQLCOM_INSERT);
1372
- req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb);
1431
+ req.result = schemaBuilder().execute(getDatabaseCid(req.cid), m_tb, (req.keyNum==1));
1373
1432
  break;
1374
1433
  case TD_CREATETABLE:
1375
1434
  if (!doCreateTable(req))
1376
1435
  req.result = ERROR_TD_INVALID_CLINETHOST;
1377
1436
  break;
1378
1437
  case TD_OPENTABLE:
1379
- if (!doOpenTable(req))
1380
- req.result = ERROR_TD_INVALID_CLINETHOST;
1438
+ nw->resize(*req.datalen);
1439
+ resultBuffer = nw->ptr();
1440
+ if (!doOpenTable(req, nw->ptr(), false))
1441
+ {
1442
+ if (req.result == 0)
1443
+ req.result = ERROR_TD_INVALID_CLINETHOST;
1444
+ }
1381
1445
  break;
1382
1446
  case TD_CLOSETABLE:
1383
1447
  m_tb = getTable(req.pbk->handle);
@@ -1426,19 +1490,23 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1426
1490
  break;
1427
1491
  }
1428
1492
  case TD_VERSION:
1429
- if (*req.datalen >= sizeof(version) * 3)
1493
+ if (*req.datalen >= sizeof(btrVersion)* 3)
1430
1494
  {
1431
- version* v = (version*)req.data;
1495
+ btrVersion* v = (btrVersion*)req.data;
1432
1496
  ++v;
1433
1497
  v->majorVersion = MYSQL_VERSION_ID / 10000;
1434
1498
  v->minorVersion = (MYSQL_VERSION_ID / 100) % 100;
1435
- v->Type = 'M';
1499
+ #if defined(MARIADB_BASE_VERSION)
1500
+ v->type = MYSQL_TYPE_MARIA;
1501
+ #else
1502
+ v->type = MYSQL_TYPE_MYSQL;
1503
+ #endif
1436
1504
  ++v;
1437
1505
  v->majorVersion = TRANSACTD_VER_MAJOR;
1438
1506
  v->minorVersion = TRANSACTD_VER_MINOR;
1439
- v->Type = 'T';
1507
+ v->type = 'T';
1440
1508
  req.paramMask = P_MASK_DATA | P_MASK_DATALEN;
1441
- req.resultLen = sizeof(version) * 3;
1509
+ req.resultLen = sizeof(btrVersion)* 3;
1442
1510
  }
1443
1511
  else
1444
1512
  req.result = STATUS_BUFFERTOOSMALL;
@@ -1462,6 +1530,64 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
1462
1530
  case TD_ACL_RELOAD:
1463
1531
  req.result = getDatabaseCid(req.cid)->aclReload();
1464
1532
  break;
1533
+ case TD_GET_SCHEMA:
1534
+ {
1535
+ database* db = getDatabaseCid(req.cid);
1536
+ nw->setClientBuffferSize(*(req.datalen));
1537
+ nw->beginExt(false);
1538
+ char* p = nw->curPtr() - sizeof(unsigned short);// orver write row space
1539
+ schemaBuilder sb;
1540
+ protocol::tdap::tabledef* td = sb.getTabledef(db, getTableName(req).c_str(),
1541
+ (unsigned char*)p, *req.datalen);
1542
+ if (td)
1543
+ {
1544
+ nw->asyncWrite(NULL, td->varSize + sizeof(unsigned short), netsvc::server::netWriter::curSeekOnly);
1545
+ nw->writeHeadar(P_MASK_DATA | P_MASK_DATALEN, (short_td)errorCode(db->stat()));
1546
+
1547
+ }
1548
+ else
1549
+ nw->writeHeadar(0, errorCodeSht(sb.stat()));
1550
+ unsigned int* totalLen = (unsigned int*)nw->ptr();
1551
+ nw->datalen = *totalLen = nw->resultLen();
1552
+ return EXECUTE_RESULT_SUCCESS;
1553
+ }
1554
+ case TD_STORE_TEST:
1555
+ {
1556
+ m_tb = getTable(req.pbk->handle, SQLCOM_UPDATE);
1557
+ bool ncc = (req.keyNum == -1);
1558
+ m_tb->beginUpdate(req.keyNum);
1559
+ if (m_tb->stat() == 0)
1560
+ {
1561
+ std::vector<std::string> ss;
1562
+ std::string s((const char*)req.data);
1563
+ split(ss, s, "\t");
1564
+ if ( ss.size() >= 2)
1565
+ {
1566
+ for (int i = 0; i < (int)ss.size() ; i+=2)
1567
+ m_tb->setValue((short)atol(ss[i].c_str()), ss[i + 1], 0);
1568
+ m_tb->update(ncc);
1569
+ req.result = errorCodeSht(m_tb->stat());
1570
+ req.paramMask = P_MASK_POSBLK | P_MASK_KEYBUF;
1571
+ if (!m_tb->cursor())
1572
+ req.paramMask |= P_MASK_PB_ERASE_BM;
1573
+ }else
1574
+ req.result = STATUS_INVALID_FIELDVALUE;
1575
+ }else
1576
+ req.result = errorCodeSht(m_tb->stat());
1577
+
1578
+ break;
1579
+ }
1580
+ case TD_SET_TIMESTAMP_MODE:
1581
+ {
1582
+ m_tb = getTable(req.pbk->handle);
1583
+ bool always = req.keyNum == TIMESTAMP_ALWAYS;
1584
+ m_tb->setTimestampAlways(always);
1585
+ req.result = STATUS_SUCCESS;
1586
+ break;
1587
+ }
1588
+ default:
1589
+ req.result = STATUS_NOSUPPORT_OP;
1590
+ break;
1465
1591
  }
1466
1592
  DEBUG_WRITELOG2(op, req)
1467
1593
  DEBUG_ERROR_MEMDUMP(req.result, "error", req.m_readBuffer, *((unsigned int*)req.m_readBuffer))
@@ -1545,7 +1671,7 @@ void makeRandomKey(unsigned char *buf, unsigned int size)
1545
1671
  size_t dbExecuter::getAcceptMessage(char* message, size_t size)
1546
1672
  {
1547
1673
  // make handshake packet
1548
- m_authChecked = false;
1674
+ m_authChecked = false;
1549
1675
  assert(size >= sizeof(trdVersiton));
1550
1676
 
1551
1677
  handshale_t* hst = (handshale_t*)message;
@@ -1555,9 +1681,18 @@ size_t dbExecuter::getAcceptMessage(char* message, size_t size)
1555
1681
 
1556
1682
  strcpy_s(ver->cherserServer, sizeof(ver->cherserServer),
1557
1683
  global_system_variables.collation_server->csname);
1558
- ver->srvMajor = TRANSACTD_VER_MAJOR;
1559
- ver->srvMinor = TRANSACTD_VER_MINOR;
1560
- ver->srvRelease = TRANSACTD_VER_RELEASE;
1684
+ ver->desc.srvMysqlMajor = MYSQL_VERSION_ID / 10000;
1685
+ ver->desc.srvMysqlMinor = (MYSQL_VERSION_ID / 100) % 100;
1686
+ ver->desc.srvMysqlRelease = MYSQL_VERSION_ID % 100;
1687
+ #if defined(MARIADB_BASE_VERSION)
1688
+ ver->desc.srvMysqlType = MYSQL_TYPE_MARIA;
1689
+ #else
1690
+ ver->desc.srvMysqlType = MYSQL_TYPE_MYSQL;
1691
+ #endif
1692
+ ver->desc.srvMajor = TRANSACTD_VER_MAJOR;
1693
+ ver->desc.srvMinor = TRANSACTD_VER_MINOR;
1694
+ ver->desc.srvRelease = TRANSACTD_VER_RELEASE;
1695
+
1561
1696
  hst->transaction_isolation = (unsigned short)getTransactdIsolation();
1562
1697
  hst->lock_wait_timeout = getTransactdLockWaitTimeout();
1563
1698
  if (strcmp(g_auth_type, AUTH_TYPE_MYSQL_STR) == 0)
@@ -71,7 +71,7 @@ class dbExecuter : public engine::mysql::dbManager
71
71
  std::string makeSQLcreateTable(const request& req);
72
72
  bool connect(request& req);
73
73
  inline bool doCreateTable(request& req);
74
- inline bool doOpenTable(request& req, bool reconnect=false);
74
+ inline bool doOpenTable(request& req, char* buf, bool reconnect=false);
75
75
  inline void doSeekKey(request& req, int op, engine::mysql::rowLockMode* lock);
76
76
  inline void doMoveFirst(request& req, engine::mysql::rowLockMode* lock);
77
77
  inline void doMoveKey(request& req, int op, engine::mysql::rowLockMode* lock);
@@ -20,13 +20,15 @@
20
20
  ================================================================= */
21
21
 
22
22
  #include <bzs/db/protocol/tdap/tdapcapi.h>
23
+ #pragma warning(disable : 4005) //BOOST_ASIO_ERROR_CATEGORY_NOEXCEPT redefine bug
23
24
  #include <bzs/db/blobBuffer.h>
25
+ #include <boost/asio/buffer.hpp>
26
+ #pragma warning(default : 4005)
24
27
  #include <iostream>
25
28
  #include <vector>
26
29
  #include <string.h>
27
- #include <boost/asio/buffer.hpp>
28
- #include <bzs/env/compiler.h>
29
30
 
31
+ #include <bzs/env/compiler.h>
30
32
  namespace bzs
31
33
  {
32
34
  namespace netsvc
@@ -100,13 +102,6 @@ typedef void*(__STDCALL* DDBA_PTR)(client::table* tb, uint_td size);
100
102
  #pragma pack(push, 1)
101
103
  pragma_pack1;
102
104
 
103
- struct version
104
- {
105
- ushort_td majorVersion;
106
- ushort_td minorVersion;
107
- uchar_td Type;
108
- };
109
-
110
105
  struct posblk
111
106
  {
112
107
  posblk() { memset(this, 0, sizeof(posblk)); }