transactd 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
  3. data/bin/common/tdclc_64_3_6.dll +0 -0
  4. data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
  5. data/build/swig/tdcl.i +5 -0
  6. data/build/tdclc/tdclc.cbproj +1 -1
  7. data/build/tdclc/tdclc.rc +4 -4
  8. data/build/tdclcpp/tdclcpp.rc +4 -4
  9. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  10. data/build/tdclrb/tdclrb.rc +4 -4
  11. data/source/bzs/db/engine/mysql/database.cpp +210 -184
  12. data/source/bzs/db/engine/mysql/database.h +276 -105
  13. data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
  14. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
  15. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
  16. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  17. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  18. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
  19. data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
  20. data/source/bzs/db/protocol/tdap/client/database.h +6 -1
  21. data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
  22. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
  23. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  24. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
  25. data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
  26. data/source/bzs/db/protocol/tdap/client/field.h +3 -1
  27. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
  28. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
  30. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
  31. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
  32. data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
  33. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
  34. data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
  35. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
  36. data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
  38. data/source/bzs/db/protocol/tdap/client/request.h +46 -38
  39. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
  40. data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
  41. data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
  42. data/source/bzs/db/protocol/tdap/client/table.h +4 -1
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
  44. data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
  45. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
  50. data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
  52. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  53. data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
  54. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
  55. data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
  56. data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
  57. data/source/bzs/example/ormap_c.cpp +2 -2
  58. data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
  59. data/source/bzs/test/tdclatl/test_v3.js +48 -1
  60. data/source/bzs/test/tdclphp/bench.php +89 -76
  61. data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
  62. data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
  63. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
  64. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
  65. data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
  66. data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
  67. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
  68. data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
  69. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
  70. data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
  71. data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
  72. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
  73. data/source/bzs/test/trdclengn/testField.h +522 -1
  74. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
  75. data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
  76. data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
  77. data/source/global/tdclatl/RecordsetQuery.h +1 -1
  78. data/source/global/tdclatl/Table.cpp +17 -0
  79. data/source/global/tdclatl/Table.h +3 -1
  80. data/source/global/tdclatl/tdclatl.idl +7 -2
  81. data/transactd.gemspec +1 -1
  82. metadata +7 -5
  83. data/bin/common/tdclc_64_3_5.dll +0 -0
@@ -152,53 +152,61 @@ public:
152
152
  }
153
153
  if (P_MASK_PB_ERASE_BM & paramMask)
154
154
  pbk->bookmarkLen = 0;
155
-
156
- if (P_MASK_DATALEN & paramMask)
157
- {
158
- uint_td tmp = *((uint_td*)p);
159
- if (*datalen < tmp)
160
- {
161
- result = STATUS_BUFFERTOOSMALL;
162
- return ;
163
- }
164
- else
165
- *datalen = tmp;
166
- p += sizeof(uint_td);
167
- }
168
-
169
- /*if (P_MASK_FINALDATALEN & paramMask)
170
- {
171
- memset(data, 0, *datalen);
172
- if (*datalen < segmentDataLen)
173
- result = STATUS_BUFFERTOOSMALL;
174
- else
175
- *datalen = segmentDataLen;
176
- }*/
177
- #ifdef USE_DATA_COMPRESS
178
- if (P_MASK_USELZSS & paramMask)
155
+
156
+ if (P_MASK_DB_AINC_VAL & paramMask)
179
157
  {
180
- unsigned int compSize;
181
- memcpy(&compSize, p, sizeof(unsigned int));
182
- p += sizeof(unsigned int);
183
- unsigned int decompSize = bzs::rtl::lzssDecode(p, data);
184
- p += compSize;
158
+ autoIncPackInfo* ai = (autoIncPackInfo*)p;
159
+ memcpy(((char*)data) + ai->pos, &ai->value, ai->len);
185
160
  }
186
161
  else
187
- #endif
188
- if (P_MASK_DATA & paramMask)
189
162
  {
190
- if (ex)
163
+ if (P_MASK_DATALEN & paramMask)
191
164
  {
192
- if (pbk->allocFunc && pbk->tb)
193
- data = pbk->allocFunc(pbk->tb, *datalen);
165
+ uint_td tmp = *((uint_td*)p);
166
+ if (*datalen < tmp)
167
+ {
168
+ result = STATUS_BUFFERTOOSMALL;
169
+ return ;
170
+ }
171
+ else
172
+ *datalen = tmp;
173
+ p += sizeof(uint_td);
194
174
  }
195
- memcpy(data, p, *datalen);
196
- p += *datalen;
175
+
197
176
  /*if (P_MASK_FINALDATALEN & paramMask)
198
177
  {
199
- memcpy(data, &rows, 2);
200
- p += sizeof(unsigned int);
178
+ memset(data, 0, *datalen);
179
+ if (*datalen < segmentDataLen)
180
+ result = STATUS_BUFFERTOOSMALL;
181
+ else
182
+ *datalen = segmentDataLen;
201
183
  }*/
184
+ #ifdef USE_DATA_COMPRESS
185
+ if (P_MASK_USELZSS & paramMask)
186
+ {
187
+ unsigned int compSize;
188
+ memcpy(&compSize, p, sizeof(unsigned int));
189
+ p += sizeof(unsigned int);
190
+ unsigned int decompSize = bzs::rtl::lzssDecode(p, data);
191
+ p += compSize;
192
+ }
193
+ else
194
+ #endif
195
+ if (P_MASK_DATA & paramMask)
196
+ {
197
+ if (ex)
198
+ {
199
+ if (pbk->allocFunc && pbk->tb)
200
+ data = pbk->allocFunc(pbk->tb, *datalen);
201
+ }
202
+ memcpy(data, p, *datalen);
203
+ p += *datalen;
204
+ /*if (P_MASK_FINALDATALEN & paramMask)
205
+ {
206
+ memcpy(data, &rows, 2);
207
+ p += sizeof(unsigned int);
208
+ }*/
209
+ }
202
210
  }
203
211
  if (P_MASK_KEYBUF & paramMask)
204
212
  {
@@ -436,9 +436,8 @@ std::string& sqlBuilder::getKey(const tabledef* td, std::vector<std::string>& fd
436
436
  _ltoa_s(key.keyNumber, buf, 20, 10);
437
437
  else
438
438
  _ltoa_s(index, buf, 20, 10);
439
- if ((td->primaryKeyNum == index) &&
440
- (fdl[key.segments[0].fieldNum] == "auto_id_field"))
441
- s += " PRIMARY KEY ";
439
+ if (td->primaryKeyNum == index)
440
+ s += " PRIMARY KEY";
442
441
  else
443
442
  {
444
443
  if (key.segments[0].flags.bit0 == false)
@@ -211,6 +211,11 @@ class stringConverter
211
211
  {
212
212
  unsigned int m_codePage;
213
213
  unsigned int m_exec_codePage;
214
+
215
+ inline bool isNotSameCodePage() const
216
+ {
217
+ return (m_codePage != m_exec_codePage);
218
+ }
214
219
 
215
220
  public:
216
221
  stringConverter(unsigned int src_codPage, unsigned int exec_codePage)
@@ -341,9 +346,17 @@ public:
341
346
  return size;
342
347
  }
343
348
 
344
- inline bool isNeedConvert() const
349
+ template <typename store_type, typename T>
350
+ inline bool isNeedConvert()
345
351
  {
346
- return (m_codePage != m_exec_codePage);
352
+ /* unicode field is no binary*/
353
+ bool forceUnicodeFrom = (typeid(WCHAR) == typeid(store_type) && (typeid(T) == typeid(char)));
354
+ bool notBinaryData = m_codePage != 0;
355
+ bool notSameUnicodeType = (typeid(T) != typeid(store_type));
356
+ bool charButNotSameCodepage = (isNotSameCodePage() && (typeid(T) == typeid(char)));
357
+ return forceUnicodeFrom ||
358
+ (notBinaryData && (notSameUnicodeType || charButNotSameCodepage));
359
+
347
360
  }
348
361
  };
349
362
 
@@ -540,9 +553,7 @@ void store(char* ptr, const T* data, const fielddef& fd, stringConverter* cv)
540
553
  strPtr[0] = 0x00;
541
554
  else
542
555
  {
543
- // convert
544
- if ((typeid(T) != typeid(store_type)) ||
545
- (cv->isNeedConvert() && (typeid(T) == typeid(char))))
556
+ if (cv->isNeedConvert<store_type, T>())
546
557
  len = cv->convert(strPtr, maxlen, data, len);
547
558
  else
548
559
  {
@@ -585,6 +596,8 @@ template <class T> T* trim(T* src, T* end, int padChar)
585
596
  #pragma warn -8008
586
597
  #pragma warn -8066
587
598
 
599
+
600
+
588
601
  template <class _SF, typename store_type, typename T>
589
602
  const T* read(char* ptr, ::bzs::rtl::stringBuffer* strBufs, const fielddef& fd,
590
603
  stringConverter* cv, bool isTrimPadChar = false)
@@ -595,8 +608,7 @@ const T* read(char* ptr, ::bzs::rtl::stringBuffer* strBufs, const fielddef& fd,
595
608
  T* result = (T*)(ptr + offset);
596
609
  // convert
597
610
  size_t len;
598
- if ((typeid(T) != typeid(store_type)) ||
599
- (cv->isNeedConvert() && (typeid(T) == typeid(char))))
611
+ if (cv->isNeedConvert<store_type, T>())
600
612
  {
601
613
  len = dataLen(fd, (const uchar_td*)ptr) / sizeof(store_type);
602
614
  size_t olen =
@@ -637,8 +649,7 @@ char* blobStore(char* ptr, const T* data, const fielddef& fd,
637
649
  : UINT_MAX;
638
650
  if (len != 0)
639
651
  {
640
- if ((typeid(T) != typeid(char)) ||
641
- (cv->isNeedConvert() && (typeid(T) == typeid(char))))
652
+ if (cv->isNeedConvert<char, T>())
642
653
  {
643
654
  maxlen = std::min<size_t>(maxlen, len * 2 * sizeof(T) + 1);
644
655
  p = new char[maxlen];
@@ -655,7 +666,7 @@ char* blobStore(char* ptr, const T* data, const fielddef& fd,
655
666
  memset(ptr, 0, fd.len);
656
667
  memcpy(ptr, &len, offset);
657
668
  if (p)
658
- memcpy(ptr + offset, &(p), sizeof(char*));
669
+ memcpy(ptr + offset, &p, sizeof(char*));
659
670
  return p;
660
671
  }
661
672
  #pragma warn -8004
@@ -671,14 +682,19 @@ const T* readBlob(char* ptr, ::bzs::rtl::stringBuffer* strBufs,
671
682
  char** pc = (char**)(ptr + offset);
672
683
  size_t olen = len * 2 + 1;
673
684
  result = strBufs->getPtr<T>(olen);
674
- if ((typeid(T) != typeid(char)) ||
675
- (cv->isNeedConvert() && (typeid(T) == typeid(char))))
685
+ if (cv->isNeedConvert<char, T>())
686
+ {
676
687
  len = cv->revert(result, olen, *pc, len);
688
+ result[len] = 0x00;
689
+ }
677
690
  else if (((T*)(*pc))[len] != 0x00)
691
+ {
678
692
  memcpy(result, *pc, len);
693
+ result[len] = 0x00;
694
+ }
679
695
  else
680
696
  result = (T*)*pc;
681
- result[len] = 0x00;
697
+
682
698
 
683
699
  }else
684
700
  {
@@ -175,6 +175,7 @@ class recordCache
175
175
  unsigned int m_len;
176
176
  unsigned int m_unpackLen;
177
177
  unsigned int m_rowCount;
178
+ unsigned int m_invalidRows;
178
179
  uchar_td* m_bookmark;
179
180
  uchar_td* m_ptr;
180
181
  uchar_td* m_tmpPtr;
@@ -192,6 +193,7 @@ public:
192
193
  {
193
194
  m_filter = NULL;
194
195
  m_row = 0;
196
+ m_invalidRows = 0;
195
197
  m_rowCount = 0;
196
198
  m_ptr = NULL;
197
199
  m_len = 0;
@@ -218,7 +220,7 @@ public:
218
220
  // blob pointer is allready point to next row
219
221
  if (m_hd)
220
222
  {
221
- while (row - m_hd->curRow)
223
+ while (row - m_invalidRows - m_hd->curRow)
222
224
  {
223
225
  for (int j = 0; j < m_hd->fieldCount; ++j)
224
226
  m_hd->nextField = (blobField*)m_hd->nextField->next();
@@ -400,14 +402,16 @@ public:
400
402
 
401
403
  if ((m_len == 0) && m_filter->isSeeksMode() && fieldCount)
402
404
  {
403
-
405
+ ++m_invalidRows;
404
406
  m_seekMultiStat = STATUS_NOT_FOUND_TI;
407
+ m_tb->fields().setInvalidMemblock(0);
405
408
  memset(m_tmpPtr, 0, td->recordlen());
406
409
  return m_tmpPtr;
407
410
  }
408
411
  else
409
412
  {
410
413
  m_seekMultiStat = 0;
414
+ m_tb->fields().setInvalidMemblock(-1);
411
415
  if (m_filter->fieldSelected())
412
416
  {
413
417
  int selNullbytes = m_filter->selectedNullbytes();
@@ -930,7 +934,7 @@ void table::btrvSeekMulti()
930
934
  int rowOffset = 0;
931
935
  for (int i = 0; i < (int)seeks.size(); ++i)
932
936
  {
933
-
937
+ memset(m_impl->keybuf, 0, MAX_KEYLEN);
934
938
  seeks[i].writeBuffer((uchar_td*)m_impl->keybuf, true, transactd);
935
939
  if (hasManyJoin)
936
940
  {
@@ -1083,6 +1087,7 @@ void table::find(eFindType type)
1083
1087
  {
1084
1088
  type = m_impl->filterPtr->direction();
1085
1089
  op =(type == findForword) ? TD_KEY_NEXT_MULTI : TD_KEY_PREV_MULTI;
1090
+ m_impl->filterPtr->resetReaded();
1086
1091
  m_stat = 0;
1087
1092
  }
1088
1093
  else if (m_impl->filterPtr->isSeeksMode())
@@ -1294,6 +1299,7 @@ void table::setFilter(const _TCHAR* str, ushort_td RejectCount,
1294
1299
  void table::clearBuffer(eNullReset resetType)
1295
1300
  {
1296
1301
  m_impl->rc->reset();
1302
+ m_impl->fields.setInvalidMemblock(-1);
1297
1303
  m_pdata = m_impl->dataBak;
1298
1304
  tabledef* td = (*m_tableDef);
1299
1305
  if (td->isMysqlNullMode() && td->defaultImage)
@@ -1406,12 +1412,19 @@ bool table::onUpdateCheck(eUpdateType type)
1406
1412
  {
1407
1413
  if (isUseTransactd() == false)
1408
1414
  {
1415
+ __int64 v = updateConflictCheck() ? getUpdateStampValue() : 0;
1409
1416
  // backup update data
1410
1417
  smartUpdate();
1411
1418
  seek();
1412
1419
  m_impl->smartUpDateFlag = false;
1413
1420
  if (m_stat)
1414
1421
  return false;
1422
+
1423
+ if (v && v != getUpdateStampValue())
1424
+ {
1425
+ m_stat = STATUS_CHANGE_CONFLICT;
1426
+ return false;
1427
+ }
1415
1428
  memcpy(m_pdata, m_impl->smartUpDate, m_datalen);
1416
1429
  }
1417
1430
  }
@@ -1452,6 +1465,27 @@ bool table::onDeleteCheck(bool inkey)
1452
1465
  return true;
1453
1466
  }
1454
1467
 
1468
+ bool table::getUpdateStampEnable() const
1469
+ {
1470
+ return (tableDef()->m_utimeFieldNum != 0xffff);
1471
+ }
1472
+
1473
+ __int64 table::getUpdateStampValue() const
1474
+ {
1475
+ const tabledef* td = tableDef();
1476
+ if (td->m_utimeFieldNum != 0xffff)
1477
+ {
1478
+ void* p = fieldPtr(td->m_utimeFieldNum);
1479
+ __int64 v = 0;
1480
+ memcpy(&v, p, td->fieldDefs[td->m_utimeFieldNum].len);
1481
+ return v;
1482
+ }else
1483
+ m_stat = STATUS_INVARID_FIELD_IDX;
1484
+ /*else if(isUseTransactd() == false)
1485
+ return getRecordHash();*/
1486
+ return 0;
1487
+ }
1488
+
1455
1489
  ushort_td table::doCommitBulkInsert(bool autoCommit)
1456
1490
  {
1457
1491
  ushort_td ret = nstable::doCommitBulkInsert(autoCommit);
@@ -1519,7 +1553,7 @@ void table::doInit(tabledef** Def, short fnum, bool /*regularDir*/, bool mysqlnu
1519
1553
  tabledef* td = *m_tableDef;
1520
1554
 
1521
1555
  incTabledefRefCount(td, mysqlnull);
1522
- m_fddefs->addAllFileds(td);
1556
+ m_fddefs->addAllFields(td);
1523
1557
  m_fddefs->cv()->setCodePage(mysql::codePage(td->charsetIndex));
1524
1558
  ushort_td len = td->recordlen();
1525
1559
  if (len == 0)
@@ -2028,7 +2062,7 @@ bool table::checkIndex(short index) const
2028
2062
  return true;
2029
2063
  }
2030
2064
 
2031
- unsigned int table::getRecordHash()
2065
+ unsigned int table::getRecordHash() const
2032
2066
  {
2033
2067
  return hash((const char*)fieldPtr(0), datalen());
2034
2068
  }
@@ -2079,12 +2113,13 @@ bool table::setSeekValueField(int row)
2079
2113
  // Check uniqe key
2080
2114
  if (kd->segments[0].flags.bit0)
2081
2115
  return false;
2082
-
2116
+
2083
2117
  const uchar_td* ptr = (const uchar_td*)keyValues[row].data;
2084
2118
  const uchar_td* data;
2085
2119
  ushort_td dataSize;
2086
2120
  if (ptr)
2087
2121
  {
2122
+ fields().setInvalidMemblock(-1);
2088
2123
  for (int j = 0; j < kd->segmentCount; ++j)
2089
2124
  {
2090
2125
  short filedNum = kd->segments[j].fieldNum;
@@ -2100,6 +2135,7 @@ bool table::setSeekValueField(int row)
2100
2135
  else
2101
2136
  setFV(filedNum, _T(""));
2102
2137
  }
2138
+ fields().setInvalidMemblock(0);
2103
2139
  }
2104
2140
  else
2105
2141
  return false;
@@ -2110,17 +2146,24 @@ void table::keyValueDescription(_TCHAR* buf, int bufsize)
2110
2146
  {
2111
2147
 
2112
2148
  std::_tstring s;
2113
- if (stat() == STATUS_NOT_FOUND_TI)
2149
+ short st = stat() ;
2150
+ if (st == STATUS_NOT_FOUND_TI || st == 0)
2114
2151
  {
2115
-
2152
+ bool invalid = fields().isInvalidRecord();
2153
+ fields().setInvalidMemblock(-1);
2116
2154
  for (int i = 0; i < tableDef()->keyDefs[(int)keyNum()].segmentCount; i++)
2117
2155
  {
2118
2156
  short fnum = tableDef()->keyDefs[(int)keyNum()].segments[i].fieldNum;
2119
2157
  s += std::_tstring(tableDef()->fieldDefs[fnum].name()) + _T(" = ") +
2120
2158
  getFVstr(fnum) + _T("\n");
2121
2159
  }
2160
+ if (invalid)
2161
+ {
2162
+ fields().setInvalidMemblock(0);
2163
+ st = STATUS_NOT_FOUND_TI;
2164
+ }
2122
2165
  }
2123
- else if (stat() == STATUS_DUPPLICATE_KEYVALUE)
2166
+ else if (st == STATUS_DUPPLICATE_KEYVALUE)
2124
2167
  {
2125
2168
  _TCHAR tmp[50];
2126
2169
  for (int j = 0; j < tableDef()->keyCount; j++)
@@ -2137,7 +2180,7 @@ void table::keyValueDescription(_TCHAR* buf, int bufsize)
2137
2180
  }
2138
2181
 
2139
2182
  _stprintf_s(buf, bufsize, _T("table:%s\nstat:%d\n%s"),
2140
- tableDef()->tableName(), stat(), s.c_str());
2183
+ tableDef()->tableName(), st, s.c_str());
2141
2184
  }
2142
2185
 
2143
2186
  short table::getCurProcFieldCount() const
@@ -2154,6 +2197,13 @@ short table::getCurProcFieldIndex(short index) const
2154
2197
  return m_impl->filterPtr->selectFieldIndexes()[index];
2155
2198
  }
2156
2199
 
2200
+ void table::setAlias(const _TCHAR* orign, const _TCHAR* alias)
2201
+ {
2202
+ short index = fieldNumByName(orign);
2203
+ if (index != -1)
2204
+ const_cast<fielddefs*>(fields().fieldDefs())->addAliasName(index, alias);
2205
+ }
2206
+
2157
2207
  //-------------------------------------------------------------------
2158
2208
  // class queryBase
2159
2209
  //-------------------------------------------------------------------
@@ -128,6 +128,8 @@ class DLLLIB table : public nstable
128
128
  void* doDdba(uint_td size);
129
129
  bool isReadContinue(ushort_td& op);
130
130
  void incTabledefRefCount(tabledef* td, bool mysqlMullmode);
131
+ __int64 getUpdateStampValue() const;// orverride
132
+ bool getUpdateStampEnable() const;// orverride
131
133
 
132
134
  protected:
133
135
  explicit table(nsdatabase* pbe); // Inheritance is impossible
@@ -199,7 +201,7 @@ public:
199
201
  void moveBookmarks(unsigned int index);
200
202
  bookmark_td bookmarks(unsigned int index) const;
201
203
  void clearBuffer(eNullReset resetType = defaultNull);
202
- unsigned int getRecordHash();
204
+ unsigned int getRecordHash() const;
203
205
  void smartUpdate();
204
206
 
205
207
  void setMra(multiRecordAlocator* p);
@@ -328,6 +330,7 @@ public:
328
330
  void setOnRecordCount(const recordCountFn v);
329
331
  recordCountFn onRecordCount() const;
330
332
  client::fields& fields();
333
+ void setAlias(const _TCHAR* orign, const _TCHAR* alias);
331
334
  };
332
335
 
333
336
  #define KEYVALUE_PTR 0
@@ -81,10 +81,27 @@ public:
81
81
  ,const _TCHAR* userName=NULL, const _TCHAR* passwd=NULL)
82
82
  : m_type(TYPE_SCHEMA_BDF), m_mode(TD_OPEN_READONLY)
83
83
  {
84
+ if (!protocol || !hostOrIp || !dbname) return;
85
+
84
86
  _TCHAR dbf[MAX_PATH]={0x00};
87
+ const _TCHAR* ext = _T(".bdf");
88
+ if (protocol[0] == 'b')
89
+ { // btrv include file extension
90
+ if (_tcscmp(schemaTable, _T("file")) == 0 ||
91
+ _tcscmp(schemaTable, _T("FILE")) == 0)
92
+ {
93
+ ext = _T(".ddf");
94
+ m_type = TYPE_SCHEMA_DDF;
95
+ }
96
+ if (_tcsstr(schemaTable, _T(".ddf")) || _tcsstr(schemaTable, _T(".DDF")))
97
+ {
98
+ m_type = TYPE_SCHEMA_DDF;
99
+ ext = _T("");
100
+ }
101
+ }
85
102
  if (schemaTable && schemaTable[0])
86
103
  {
87
- const _TCHAR* ext = _T(".bdf");
104
+
88
105
  if (_tcscmp(schemaTable, TRANSACTD_SCHEMANAME)==0)
89
106
  ext = _T("");
90
107
  _stprintf_s(dbf, MAX_PATH, _T("dbfile=%s%s"), schemaTable, ext);
@@ -733,6 +733,7 @@ public:
733
733
 
734
734
  #endif
735
735
 
736
+ /* one-to-one relation only */
736
737
  template <class Container>
737
738
  void readEach(Container& mdls, queryBase& q, bool sorted = false,
738
739
  bzs::rtl::exception * e = NULL)
@@ -781,7 +782,8 @@ public:
781
782
  (m_map.compKeyValue(mdlb, mdl, m_tb->keyNum()) == true)))
782
783
  {
783
784
  m_tb->findNext();
784
- if (m_tb->stat() != 0)
785
+ if ((m_tb->stat() != STATUS_SUCCESS) &&
786
+ (m_tb->stat() != STATUS_NOT_FOUND_TI))
785
787
  {
786
788
  _TCHAR buf[8192];
787
789
  m_tb->keyValueDescription(buf, 8192);
@@ -799,6 +801,7 @@ public:
799
801
  }
800
802
  }
801
803
 
804
+ /* one-to-one relation only */
802
805
  template <class BaseContainer, class T2>
803
806
  void readEach(BaseContainer& mdls, T* (T2::*func)() const, queryBase& q)
804
807
  {
@@ -808,6 +811,7 @@ public:
808
811
  readEach(*refList, q, true, NULL);
809
812
  }
810
813
 
814
+ /* one-to-one relation only */
811
815
  template <class BaseContainer, class T2>
812
816
  void readEach(BaseContainer& mdls, T* (T2::*func)() const, queryBase& q,
813
817
  bzs::rtl::exception& e)
@@ -818,7 +822,7 @@ public:
818
822
  readEach(*refList, q, true, &e);
819
823
  }
820
824
 
821
- /* No use field select */
825
+ /* No use field select. one-to-one relation only */
822
826
  template <class Container>
823
827
  void readEach(Container& mdls, bool sorted = false,
824
828
  bzs::rtl::exception * e = NULL)
@@ -838,7 +842,8 @@ public:
838
842
  {
839
843
  m_map.setKeyValues(mdl, fds, m_tb->keyNum());
840
844
  readIndex(m_tb, eSeekEqual);
841
- if (m_tb->stat() != 0)
845
+ if ((m_tb->stat() != STATUS_SUCCESS) &&
846
+ (m_tb->stat() != STATUS_NOT_FOUND_TI))
842
847
  {
843
848
  _TCHAR buf[8192];
844
849
  m_tb->keyValueDescription(buf, 8192);
@@ -856,7 +861,7 @@ public:
856
861
  }
857
862
  }
858
863
 
859
- /* No use field select */
864
+ /* No use field select. one-to-one relation only */
860
865
  template <class BaseContainer, class T2>
861
866
  void readEach(BaseContainer& mdls, T* (T2::*func)() const)
862
867
  {
@@ -866,6 +871,7 @@ public:
866
871
  readEach(*refList, true, NULL);
867
872
  }
868
873
 
874
+ /* one-to-one relation only */
869
875
  template <class BaseContainer, class T2>
870
876
  void readEach(BaseContainer& mdls, T* (T2::*func)() const,
871
877
  bzs::rtl::exception& e)
@@ -927,8 +927,8 @@ inline judgeFunc getJudgeFunc(eCompType log)
927
927
  case eLess:
928
928
  return isMatch3;
929
929
  case eNotEq:
930
- return isMatch4;
931
930
  case eNotBitAnd:
931
+ return isMatch4;
932
932
  case eGreaterEq:
933
933
  return isMatch5;
934
934
  case eLessEq:
@@ -30,6 +30,7 @@
30
30
  #define CHARSET_USC2 23
31
31
  #define CHARSET_UTF8B4 30
32
32
  #define CHARSET_UTF16LE 33
33
+ #define CHARSET_BIN 37
33
34
  #define CHARSET_CP932 38
34
35
  #define CHARSET_EUCJ 40
35
36
 
@@ -43,7 +43,7 @@ namespace tdap
43
43
  namespace mysql
44
44
  {
45
45
 
46
- schemaBuilder::schemaBuilder(void): m_stat(0)
46
+ schemaBuilder::schemaBuilder(unsigned char binFdCharset): m_stat(0), m_binFdCharset(binFdCharset)
47
47
  {
48
48
  }
49
49
 
@@ -175,7 +175,7 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
175
175
  td.keyCount = (uchar_td)src->keys();
176
176
  td.charsetIndex = charsetIndex(src->charset().csname);
177
177
  td.primaryKeyNum =
178
- (src->primarykeyNum() < td.keyCount) ? kc.clientKeynum(src->primarykeyNum()) : -1;
178
+ (src->primarykeyNum() < td.keyCount) ? kc.keyNumByMakeOrder(src->primarykeyNum()) : -1;
179
179
  #ifdef USE_BTRV_VARIABLE_LEN
180
180
  td.flags.bit0 = (src->recordFormatType() & RF_FIXED_PLUS_VALIABLE_LEN);
181
181
  if (src->recordFormatType() & RF_FIXED_PLUS_VALIABLE_LEN)
@@ -232,6 +232,9 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
232
232
  fd.setPadCharSettings(false, true);
233
233
  if (f->has_charset())
234
234
  fd.setCharsetIndex(charsetIndex(f->charset()->csname));
235
+ else if (fd.type == ft_string || fd.type == ft_lstring
236
+ || fd.type == ft_myvarbinary || fd.type == ft_myblob)
237
+ fd.setCharsetIndex(m_binFdCharset);
235
238
 
236
239
  if ((fd.type == ft_mydatetime || fd.type == ft_mytimestamp) && (f->val_real() == 0))
237
240
  {// No constant value
@@ -342,7 +345,7 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id, bool nouse
342
345
 
343
346
  tabledef* td = getTabledef(src, id, nouseNullkey, rec.get(), 65000);
344
347
  mtb->clearBuffer();
345
- mtb->setRecordFromPacked(rec.get(), td->varSize + 4, NULL);
348
+ mtb->setRecordFromPacked(rec.get(), td->varSize + 4, NULL, NULL);
346
349
  mtb->insert(true);
347
350
  return mtb->stat();
348
351
  }
@@ -393,12 +396,15 @@ table* getTable(database* db, const char *name)
393
396
  void schemaBuilder::listTable(database* db, std::vector<std::string>& tables, int type)
394
397
  {
395
398
  char path[FN_REFLEN + 1];
399
+ tables.clear();
396
400
  build_table_filename(path, sizeof(path) - 1, db->name().c_str(), "", "", 0);
397
401
  std::string s = path;
398
402
  fs::path p = s;
403
+ if (exists(p) == false) return;
404
+
399
405
  fs::directory_iterator it(p);
400
406
  fs::directory_iterator end;
401
- tables.clear();
407
+
402
408
 
403
409
  for (fs::directory_iterator it(p); it != end; ++it)
404
410
  {
@@ -456,6 +462,7 @@ short schemaBuilder::execute(database* db, table* mtb, bool nouseNullkey)
456
462
 
457
463
  std::string s = path;
458
464
  fs::path p = s;
465
+ if (exists(p) == false) return STATUS_TABLE_NOTOPEN;
459
466
  fs::directory_iterator it(p);
460
467
  fs::directory_iterator end;
461
468
  int id = 0;
@@ -49,8 +49,9 @@ class schemaBuilder
49
49
  short insertMetaRecord(engine::mysql::table* mtb, engine::mysql::table* src,
50
50
  int id, bool nouseNullkey);
51
51
  short m_stat;
52
+ unsigned char m_binFdCharset;
52
53
  public:
53
- schemaBuilder();
54
+ schemaBuilder(unsigned char binFdCharset);
54
55
  ~schemaBuilder();
55
56
  short stat() const { return m_stat;}
56
57
  tabledef* getTabledef(engine::mysql::table* src, int id, bool nouseNullkey, uchar* rec, size_t size);