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.
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)); }