transactd 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_2_2.dll +0 -0
  3. data/bin/common/tdclc_64_2_2.dll +0 -0
  4. data/build/swig/ruby/generate.cmd +45 -0
  5. data/build/swig/ruby/generate.sh +40 -0
  6. data/build/swig/ruby/tdclrb_wrap.cpp +406 -969
  7. data/build/swig/tdcl.i +88 -0
  8. data/build/tdclc/CMakeLists.txt +5 -1
  9. data/build/tdclc/tdclc.cbproj +1 -1
  10. data/build/tdclc/tdclc.rc +4 -4
  11. data/build/tdclcpp/tdclcpp.rc +4 -4
  12. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  13. data/build/tdclrb/tdclrb.rc +4 -4
  14. data/source/bzs/db/engine/mysql/database.cpp +165 -74
  15. data/source/bzs/db/engine/mysql/database.h +19 -5
  16. data/source/bzs/db/engine/mysql/dbManager.cpp +33 -11
  17. data/source/bzs/db/engine/mysql/dbManager.h +6 -1
  18. data/source/bzs/db/engine/mysql/mydebuglog.h +12 -0
  19. data/source/bzs/db/engine/mysql/mysqlInternal.h +10 -3
  20. data/source/bzs/db/engine/mysql/mysqlThd.cpp +20 -8
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +12 -7
  22. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -1
  23. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  24. data/source/bzs/db/protocol/tdap/client/client.cpp +17 -15
  25. data/source/bzs/db/protocol/tdap/client/client.h +102 -30
  26. data/source/bzs/db/protocol/tdap/client/connectionPool.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/client/database.cpp +32 -10
  28. data/source/bzs/db/protocol/tdap/client/database.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +0 -2
  30. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -0
  31. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +47 -42
  32. data/source/bzs/db/protocol/tdap/client/fields.h +3 -1
  33. data/source/bzs/db/protocol/tdap/client/filter.h +3 -3
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +18 -2
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +3 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +14 -6
  37. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -12
  38. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -3
  39. data/source/bzs/db/protocol/tdap/client/request.h +1 -0
  40. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +101 -64
  41. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  42. data/source/bzs/db/protocol/tdap/client/stringConverter.h +9 -13
  43. data/source/bzs/db/protocol/tdap/client/table.cpp +73 -56
  44. data/source/bzs/db/protocol/tdap/client/table.h +8 -8
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +52 -100
  46. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +8 -1
  47. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -0
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +349 -189
  49. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +28 -12
  50. data/source/bzs/db/protocol/tdap/tdapRequest.h +5 -4
  51. data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
  52. data/source/bzs/db/protocol/tdap/tdapcapi.h +29 -4
  53. data/source/bzs/db/protocol/tdap/uri.h +297 -0
  54. data/source/bzs/db/transactd/appModule.cpp +41 -16
  55. data/source/bzs/db/transactd/appModule.h +1 -2
  56. data/source/bzs/db/transactd/transactd.cpp +37 -14
  57. data/source/bzs/env/crosscompile.h +1 -3
  58. data/source/bzs/example/queryData.cpp +2 -2
  59. data/source/bzs/netsvc/client/iconnection.h +3 -1
  60. data/source/bzs/netsvc/client/tcpClient.cpp +75 -28
  61. data/source/bzs/netsvc/client/tcpClient.h +94 -62
  62. data/source/bzs/netsvc/server/IAppModule.h +2 -2
  63. data/source/bzs/netsvc/server/serverCpt.cpp +17 -10
  64. data/source/bzs/netsvc/server/serverPipe.cpp +26 -19
  65. data/source/bzs/netsvc/server/serverTpool.cpp +8 -2
  66. data/source/bzs/rtl/debuglog.cpp +21 -5
  67. data/source/bzs/rtl/debuglog.h +1 -1
  68. data/source/bzs/test/tdclphp/transactd_Test.php +183 -37
  69. data/source/bzs/test/tdclphp/transactd_pool_Test.php +1 -2
  70. data/source/bzs/test/tdclrb/transactd_spec.rb +183 -39
  71. data/source/bzs/test/transactdBench/scaling_bench.cpp +3 -3
  72. data/source/bzs/test/trdclengn/test_trdclengn.cpp +172 -57
  73. data/source/global/boost/sha1.hpp +223 -0
  74. data/source/global/tdclatl/ConnectParams.cpp +2 -2
  75. data/source/global/tdclatl/ConnectParams.h +1 -1
  76. data/source/global/tdclatl/Database.cpp +18 -0
  77. data/source/global/tdclatl/Database.h +5 -0
  78. data/source/global/tdclatl/tdclatl.idl +23 -1
  79. data/source/linux/linuxTypes.h +2 -0
  80. metadata +8 -6
  81. data/bin/common/tdclc_32_2_1.dll +0 -0
  82. data/bin/common/tdclc_64_2_1.dll +0 -0
  83. data/source/bzs/db/protocol/tdap/client/memRecordset.cpp +0 -448
  84. data/source/bzs/db/protocol/tdap/client/memRecordset.h +0 -159
@@ -313,7 +313,6 @@ public:
313
313
  moveBlobRow(m_row);
314
314
 
315
315
  m_tb->m_fddefs->strBufs()->clear();
316
- multiRecordAlocator* mra = m_tb->m_impl->mraPtr;
317
316
  const tabledef* td = m_tb->tableDef();
318
317
  ushort_td fieldCount = m_filter->fieldCount();
319
318
 
@@ -432,7 +431,7 @@ multiRecordAlocator* table::mra() const
432
431
 
433
432
  uchar_td table::charset() const
434
433
  {
435
- return m_tableDef->charsetIndex;
434
+ return (*m_tableDef)->charsetIndex;
436
435
  }
437
436
 
438
437
  bool table::trimPadChar() const
@@ -830,12 +829,12 @@ void table::btrvSeekMulti()
830
829
  int rowOffset = 0;
831
830
  for (int i = 0; i < (int)seeks.size(); ++i)
832
831
  {
833
- // 100% need allocate each row
834
- m_impl->mraPtr->init(1, recordLen, type, this);
835
- type = mra_nextrows;
832
+
836
833
  seeks[i].writeBuffer((uchar_td*)m_impl->keybuf, true, transactd);
837
834
  if (hasManyJoin)
838
835
  {
836
+ m_impl->mraPtr->init(1, recordLen, type, this);
837
+ type = mra_nextrows;
839
838
  tdap((ushort_td)(TD_KEY_OR_AFTER));
840
839
  if (!checkStatus(m_stat))
841
840
  return;
@@ -1137,19 +1136,19 @@ void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
1137
1136
  keydef* KeyDef;
1138
1137
  short FieldNum;
1139
1138
  int j;
1140
-
1141
- KeyDef = &m_tableDef->keyDefs[m_keynum];
1139
+ tabledef* td = (*m_tableDef);
1140
+ KeyDef = &td->keyDefs[m_keynum];
1142
1141
  for (j = 0; j < KeyDef->segmentCount; j++)
1143
1142
  {
1144
1143
  FieldNum = KeyDef->segments[j].fieldNum;
1145
- ks[j].keyPos = (ushort_td)(m_tableDef->fieldDefs[FieldNum].pos + 1);
1146
- ks[j].keyLen = m_tableDef->fieldDefs[FieldNum].len;
1144
+ ks[j].keyPos = (ushort_td)(td->fieldDefs[FieldNum].pos + 1);
1145
+ ks[j].keyLen = td->fieldDefs[FieldNum].len;
1147
1146
  ks[j].keyFlag.all = KeyDef->segments[j].flags.all;
1148
1147
  ks[j].keyCount = 0;
1149
- ks[j].keyType = m_tableDef->fieldDefs[FieldNum].type;
1148
+ ks[j].keyType = td->fieldDefs[FieldNum].type;
1150
1149
 
1151
1150
  if (ks[j].keyFlag.bit3 == true)
1152
- ks[j].nullValue = m_tableDef->fieldDefs[FieldNum].nullValue;
1151
+ ks[j].nullValue = td->fieldDefs[FieldNum].nullValue;
1153
1152
  else
1154
1153
  ks[j].nullValue = 0;
1155
1154
  ks[j].reserve2[0] = 0;
@@ -1166,25 +1165,40 @@ void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
1166
1165
 
1167
1166
  void table::doCreateIndex(bool SpecifyKeyNum)
1168
1167
  {
1169
- int segmentCount = m_tableDef->keyDefs[m_keynum].segmentCount;
1170
-
1171
- keySpec* ks = (keySpec*)malloc(sizeof(keySpec) * segmentCount);
1172
- memset(ks, 0, sizeof(keySpec) * segmentCount);
1173
- getKeySpec(ks, SpecifyKeyNum);
1174
- m_pdata = ks;
1175
- m_datalen = sizeof(keySpec) * segmentCount;
1176
- nstable::doCreateIndex(SpecifyKeyNum);
1177
- m_pdata = m_impl->dataBak;
1178
- free(ks);
1168
+ SpecifyKeyNum = false;
1169
+ if (isUseTransactd())
1170
+ {
1171
+ uint_td len = m_datalen;
1172
+ m_pdata = (*m_tableDef);
1173
+ m_datalen = (*m_tableDef)->varSize + 4;
1174
+ // tdclc check datalen, m_pdata is tabledef if bigger than sizeof(keySpec) * 8
1175
+ if (m_datalen <= sizeof(keySpec) * 8)
1176
+ m_datalen = sizeof(keySpec) * 8 + 10;
1177
+ nstable::doCreateIndex(SpecifyKeyNum);
1178
+ m_pdata = m_impl->dataBak;
1179
+ m_datalen = len;
1180
+ }
1181
+ else
1182
+ {
1183
+ int segmentCount = (*m_tableDef)->keyDefs[m_keynum].segmentCount;
1184
+ keySpec* ks = (keySpec*)malloc(sizeof(keySpec) * segmentCount);
1185
+ memset(ks, 0, sizeof(keySpec) * segmentCount);
1186
+ getKeySpec(ks, SpecifyKeyNum);
1187
+ m_pdata = ks;
1188
+ m_datalen = sizeof(keySpec) * segmentCount;//max 16 * 8 =128byte
1189
+ nstable::doCreateIndex(SpecifyKeyNum);
1190
+ m_pdata = m_impl->dataBak;
1191
+ free(ks);
1192
+ }
1179
1193
  }
1180
1194
 
1181
1195
  void table::smartUpdate()
1182
1196
  {
1183
1197
  if (!m_impl->smartUpDate)
1184
- m_impl->smartUpDate = malloc(m_tableDef->maxRecordLen);
1198
+ m_impl->smartUpDate = malloc((*m_tableDef)->maxRecordLen);
1185
1199
  if (m_impl->smartUpDate)
1186
1200
  {
1187
- memcpy(m_impl->smartUpDate, data(), m_tableDef->maxRecordLen);
1201
+ memcpy(m_impl->smartUpDate, data(), (*m_tableDef)->maxRecordLen);
1188
1202
  m_impl->smartUpDateFlag = true;
1189
1203
  }
1190
1204
  else
@@ -1193,9 +1207,9 @@ void table::smartUpdate()
1193
1207
 
1194
1208
  bool table::isUniqeKey(char_td keynum)
1195
1209
  {
1196
- if ((keynum >= 0) && (keynum < m_tableDef->keyCount))
1210
+ if ((keynum >= 0) && (keynum < (*m_tableDef)->keyCount))
1197
1211
  {
1198
- keydef* kd = &m_tableDef->keyDefs[m_keynum];
1212
+ keydef* kd = &(*m_tableDef)->keyDefs[m_keynum];
1199
1213
  return !(kd->segments[0].flags.bit0);
1200
1214
  }
1201
1215
  return false;
@@ -1228,7 +1242,7 @@ bool table::onUpdateCheck(eUpdateType type)
1228
1242
  else if (m_impl->smartUpDateFlag)
1229
1243
  {
1230
1244
  m_stat = 0;
1231
- if (memcmp(m_impl->smartUpDate, data(), m_tableDef->maxRecordLen) == 0)
1245
+ if (memcmp(m_impl->smartUpDate, data(), (*m_tableDef)->maxRecordLen) == 0)
1232
1246
  {
1233
1247
  m_impl->smartUpDateFlag = false;
1234
1248
  return false;
@@ -1291,7 +1305,7 @@ void* table::attachBuffer(void* NewPtr, bool unpack, size_t size)
1291
1305
  m_impl->bfAtcPtr = m_pdata;
1292
1306
  oldptr = m_pdata;
1293
1307
  m_pdata = NewPtr;
1294
- ushort_td len = m_tableDef->maxRecordLen;
1308
+ ushort_td len = (*m_tableDef)->maxRecordLen;
1295
1309
  if (unpack)
1296
1310
  len = unPack((char*)m_pdata, size);
1297
1311
  m_datalen = len;
@@ -1305,27 +1319,28 @@ void table::dettachBuffer()
1305
1319
  m_impl->bfAtcPtr = NULL;
1306
1320
  }
1307
1321
 
1308
- void table::init(tabledef* Def, short fnum, bool regularDir)
1322
+ void table::init(tabledef** Def, short fnum, bool regularDir)
1309
1323
  {
1310
1324
  doInit(Def, fnum, regularDir);
1311
1325
  }
1312
1326
 
1313
- void table::doInit(tabledef* Def, short fnum, bool /*regularDir*/)
1327
+ void table::doInit(tabledef** Def, short fnum, bool /*regularDir*/)
1314
1328
  {
1315
1329
  m_tableDef = Def;
1316
- m_fddefs->addAllFileds(m_tableDef);
1317
- m_fddefs->cv()->setCodePage(mysql::codePage(m_tableDef->charsetIndex));
1318
- ushort_td len = m_tableDef->maxRecordLen;
1330
+ tabledef* td = *m_tableDef;
1331
+ m_fddefs->addAllFileds(td);
1332
+ m_fddefs->cv()->setCodePage(mysql::codePage(td->charsetIndex));
1333
+ ushort_td len = td->maxRecordLen;
1319
1334
  if (len == 0)
1320
1335
  {
1321
1336
  m_stat = STATUS_INVALID_RECLEN;
1322
1337
  return;
1323
1338
  }
1324
1339
 
1325
- for (short i = 0; i < m_tableDef->keyCount; i++)
1340
+ for (short i = 0; i < td->keyCount; i++)
1326
1341
  {
1327
- if (m_tableDef->flags.bitA == true)
1328
- m_impl->keyNumIndex[m_tableDef->keyDefs[i].keyNumber] = (char)i;
1342
+ if (td->flags.bitA == true)
1343
+ m_impl->keyNumIndex[td->keyDefs[i].keyNumber] = (char)i;
1329
1344
  else
1330
1345
  m_impl->keyNumIndex[i] = (char)i;
1331
1346
  }
@@ -1337,10 +1352,10 @@ void table::doInit(tabledef* Def, short fnum, bool /*regularDir*/)
1337
1352
 
1338
1353
  keylen_td table::writeKeyDataTo(uchar_td* to, int keySize)
1339
1354
  {
1340
- if (m_tableDef->keyCount)
1355
+ if ((*m_tableDef)->keyCount)
1341
1356
  {
1342
1357
  keydef& keydef =
1343
- m_tableDef->keyDefs[(short)m_impl->keyNumIndex[m_keynum]];
1358
+ (*m_tableDef)->keyDefs[(short)m_impl->keyNumIndex[m_keynum]];
1344
1359
  uchar_td* start = to;
1345
1360
  if (keySize == 0)
1346
1361
  keySize = keydef.segmentCount;
@@ -1348,7 +1363,7 @@ keylen_td table::writeKeyDataTo(uchar_td* to, int keySize)
1348
1363
  for (int j = 0; j < keySize; j++)
1349
1364
  {
1350
1365
  int fdnum = keydef.segments[j].fieldNum;
1351
- fielddef& fd = m_tableDef->fieldDefs[fdnum];
1366
+ fielddef& fd = (*m_tableDef)->fieldDefs[fdnum];
1352
1367
  uchar_td* from = (uchar_td*)m_pdata + fd.pos;
1353
1368
  to = fd.keyCopy(to, from);
1354
1369
  }
@@ -1367,9 +1382,9 @@ uint_td table::pack(char* ptr, size_t size)
1367
1382
  char* pos = ptr;
1368
1383
  char* end = pos + size;
1369
1384
  int movelen;
1370
- for (int i = 0; i < m_tableDef->fieldCount; i++)
1385
+ for (int i = 0; i < (*m_tableDef)->fieldCount; i++)
1371
1386
  {
1372
- fielddef& fd = m_tableDef->fieldDefs[i];
1387
+ fielddef& fd = (*m_tableDef)->fieldDefs[i];
1373
1388
  if (fd.type == ft_myfixedbinary)
1374
1389
  {
1375
1390
  memmove(pos + 2, pos, fd.len - 2); // move as size pace in the field
@@ -1398,15 +1413,16 @@ uint_td table::pack(char* ptr, size_t size)
1398
1413
 
1399
1414
  uint_td table::doGetWriteImageLen()
1400
1415
  {
1416
+ tabledef* td = (*m_tableDef);
1401
1417
  if (!blobFieldUsed() && !valiableFormatType() &&
1402
- (m_tableDef->flags.bit0 == false))
1403
- return m_tableDef->maxRecordLen;
1418
+ (td->flags.bit0 == false))
1419
+ return td->maxRecordLen;
1404
1420
  // Make blob pointer list
1405
1421
  if (blobFieldUsed())
1406
1422
  {
1407
- for (ushort_td i = 0; i < m_tableDef->fieldCount; i++)
1423
+ for (ushort_td i = 0; i < td->fieldCount; i++)
1408
1424
  {
1409
- fielddef& fd = m_tableDef->fieldDefs[i];
1425
+ fielddef& fd = td->fieldDefs[i];
1410
1426
  uint_td bytes = fd.blobLenBytes();
1411
1427
  if (bytes)
1412
1428
  {
@@ -1421,21 +1437,21 @@ uint_td table::doGetWriteImageLen()
1421
1437
  addSendBlob(NULL);
1422
1438
 
1423
1439
  if (valiableFormatType())
1424
- return pack((char*)m_pdata, m_tableDef->maxRecordLen);
1440
+ return pack((char*)m_pdata, td->maxRecordLen);
1425
1441
  else
1426
1442
  {
1427
- fielddef* fd = &m_tableDef->fieldDefs[m_tableDef->fieldCount - 1];
1443
+ fielddef* fd = &td->fieldDefs[td->fieldCount - 1];
1428
1444
  size_t len = 0;
1429
1445
  short* pos;
1430
1446
 
1431
1447
  if (fd->type == ft_note)
1432
- len = strlen((char*)fieldPtr((short)(m_tableDef->fieldCount - 1))) +
1448
+ len = strlen((char*)fieldPtr((short)(td->fieldCount - 1))) +
1433
1449
  1;
1434
1450
  else if (fd->type == ft_lvar)
1435
1451
  {
1436
1452
  // xx................xx.............00
1437
1453
  // ln--data----------ln-----data----00
1438
- pos = (short*)fieldPtr((short)(m_tableDef->fieldCount - 1));
1454
+ pos = (short*)fieldPtr((short)(td->fieldCount - 1));
1439
1455
  while (*pos)
1440
1456
  {
1441
1457
  len += 2; // size
@@ -1457,11 +1473,12 @@ uint_td table::unPack(char* ptr, size_t size)
1457
1473
  {
1458
1474
  char* pos = ptr;
1459
1475
  const char* end = pos + size;
1460
- const char* max = pos + m_tableDef->maxRecordLen;
1476
+ tabledef* td = *m_tableDef;
1477
+ const char* max = pos + td->maxRecordLen;
1461
1478
  int movelen;
1462
- for (int i = 0; i < m_tableDef->fieldCount; i++)
1479
+ for (int i = 0; i < td->fieldCount; i++)
1463
1480
  {
1464
- fielddef& fd = m_tableDef->fieldDefs[i];
1481
+ fielddef& fd = td->fieldDefs[i];
1465
1482
  if (fd.type == ft_myfixedbinary)
1466
1483
  {
1467
1484
  int dl = *((unsigned short*)(pos));
@@ -1547,7 +1564,7 @@ void table::setBlobFieldPointer(char* ptr, const blobHeader* hd)
1547
1564
  const blobField* f = hd->nextField;
1548
1565
  for (int i = 0; i < hd->fieldCount; i++)
1549
1566
  {
1550
- fielddef& fd = m_tableDef->fieldDefs[f->fieldNum];
1567
+ fielddef& fd = (*m_tableDef)->fieldDefs[f->fieldNum];
1551
1568
  char* fdptr = ptr + fd.pos;
1552
1569
  int sizeByte = fd.blobLenBytes();
1553
1570
  memcpy(fdptr, &f->size, sizeByte);
@@ -1574,8 +1591,8 @@ void table::onReadAfter()
1574
1591
  const blobHeader* hd = getBlobHeader();
1575
1592
  setBlobFieldPointer((char*)m_pdata, hd);
1576
1593
  }
1577
- if (m_tableDef->maxRecordLen - m_datalen > 0)
1578
- memset((char*)m_pdata + m_datalen, 0, m_tableDef->maxRecordLen - m_datalen);
1594
+ if ((*m_tableDef)->maxRecordLen - m_datalen > 0)
1595
+ memset((char*)m_pdata + m_datalen, 0, (*m_tableDef)->maxRecordLen - m_datalen);
1579
1596
  }
1580
1597
 
1581
1598
  short table::fieldNumByName(const _TCHAR* name)
@@ -1849,7 +1866,7 @@ void* table::getFVbin(short index, uint_td& size)
1849
1866
 
1850
1867
  bool table::checkIndex(short index) const
1851
1868
  {
1852
- if ((index >= m_tableDef->fieldCount) || (index < 0))
1869
+ if ((index >= (*m_tableDef)->fieldCount) || (index < 0))
1853
1870
  {
1854
1871
  m_stat = STATUS_INVARID_FIELD_IDX;
1855
1872
  return false;
@@ -1881,7 +1898,7 @@ void table::moveBookmarksId(long id)
1881
1898
 
1882
1899
  short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
1883
1900
  {
1884
- return nstable::tdapErr(hWnd, m_stat, m_tableDef->tableName(), retbuf);
1901
+ return nstable::tdapErr(hWnd, m_stat, (*m_tableDef)->tableName(), retbuf);
1885
1902
  }
1886
1903
 
1887
1904
  /* For keyValueDescription */
@@ -87,7 +87,7 @@ class DLLLIB table : public nstable
87
87
 
88
88
  struct tbimpl* m_impl;
89
89
  class fielddefs* m_fddefs;
90
- tabledef* m_tableDef;
90
+ tabledef** m_tableDef;
91
91
 
92
92
  uchar_td charset() const;
93
93
  bool checkIndex(short index) const;
@@ -138,12 +138,12 @@ protected:
138
138
 
139
139
  void onInsertAfter(int beforeResult); // orverride
140
140
  bool isUniqeKey(char_td keynum); // orverride
141
- void init(tabledef* def, short filenum, bool regularDir);
141
+ void init(tabledef** def, short filenum, bool regularDir);
142
142
  void* attachBuffer(void* newPtr, bool unpack = false, size_t size = 0);
143
143
  void dettachBuffer();
144
144
  bool doPrepare();
145
145
 
146
- virtual void doInit(tabledef* def, short filenum, bool regularDir);
146
+ virtual void doInit(tabledef** def, short filenum, bool regularDir);
147
147
 
148
148
  virtual void onRecordCounting(size_t count, bool& complate){};
149
149
 
@@ -152,18 +152,18 @@ protected:
152
152
  public:
153
153
  using nstable::eFindType;
154
154
 
155
- inline const tabledef* tableDef() const { return m_tableDef; };
155
+ inline const tabledef* tableDef() const { return *m_tableDef; };
156
156
  inline const tabledef** tableDefPtr() const
157
157
  {
158
- return const_cast<const tabledef**>(&m_tableDef);
159
- };
158
+ return const_cast<const tabledef**>(m_tableDef);
159
+ }
160
160
 
161
161
  inline bool valiableFormatType() const
162
162
  {
163
- return m_tableDef->optionFlags.bitA;
163
+ return (*m_tableDef)->optionFlags.bitA;
164
164
  }
165
165
 
166
- inline bool blobFieldUsed() const { return m_tableDef->optionFlags.bitB; }
166
+ inline bool blobFieldUsed() const { return (*m_tableDef)->optionFlags.bitB; }
167
167
 
168
168
  bool logicalToString() const;
169
169
  void setLogicalToString(bool v);
@@ -23,6 +23,7 @@
23
23
  #include <boost/noncopyable.hpp>
24
24
  #include <iterator>
25
25
  #include <stdio.h>
26
+ #include <bzs/db/protocol/tdap/uri.h>
26
27
 
27
28
  #if defined(__GNUC__)
28
29
  #if (!defined(__clang__) && \
@@ -74,14 +75,27 @@ class connectParams
74
75
 
75
76
  public:
76
77
  inline connectParams(const _TCHAR* protocol, const _TCHAR* hostOrIp,
77
- const _TCHAR* dbname, const _TCHAR* schemaTable)
78
+ const _TCHAR* dbname, const _TCHAR* schemaTable
79
+ ,const _TCHAR* userName=NULL, const _TCHAR* passwd=NULL)
78
80
  : m_type(TYPE_SCHEMA_BDF), m_mode(TD_OPEN_READONLY)
79
81
  {
80
- const _TCHAR* ext = _T(".bdf");
81
- if (_tcscmp(schemaTable, TRANSACTD_SCHEMANAME)==0)
82
- ext = _T("");
83
- _stprintf_s(m_buf, MAX_PATH, _T("%s://%s/%s?dbfile=%s%s"), protocol,
84
- hostOrIp, dbname, schemaTable, ext);
82
+ _TCHAR dbf[MAX_PATH]={0x00};
83
+ if (schemaTable && schemaTable[0])
84
+ {
85
+ const _TCHAR* ext = _T(".bdf");
86
+ if (_tcscmp(schemaTable, TRANSACTD_SCHEMANAME)==0)
87
+ ext = _T("");
88
+ _stprintf_s(dbf, MAX_PATH, _T("dbfile=%s%s"), schemaTable, ext);
89
+ }
90
+ if (userName == NULL || (userName[0] == 0x00))
91
+ _stprintf_s(m_buf, MAX_PATH, _T("%s://%s/%s?%s"), protocol,
92
+ hostOrIp, dbname, dbf);
93
+ else
94
+ {
95
+ if (!passwd) passwd = _T("");
96
+ _stprintf_s(m_buf, MAX_PATH, _T("%s://%s@%s/%s?%s&pwd=%s"),
97
+ protocol, userName, hostOrIp, dbname, dbf, passwd);
98
+ }
85
99
  }
86
100
  inline explicit connectParams(const _TCHAR* uri)
87
101
  : m_type(TYPE_SCHEMA_BDF), m_mode(TD_OPEN_READONLY)
@@ -106,65 +120,16 @@ public:
106
120
  m_type = v;
107
121
  }
108
122
 
109
- inline const _TCHAR* uri() const { return m_buf; }
123
+ inline const _TCHAR* uri(bool noPasswd=false) const
124
+ {
125
+ return m_buf;
126
+ }
110
127
 
111
128
  inline char_td mode() const { return m_mode; };
112
129
 
113
130
  inline short type() const { return m_type; };
114
131
  };
115
132
 
116
- inline const _TCHAR* host(const _TCHAR* uri, _TCHAR* buf, size_t size)
117
- {
118
- buf[0] = 0x00;
119
- const _TCHAR* st = _tcsstr(uri, _T("://"));
120
- if (st)
121
- {
122
- const _TCHAR* en = _tcsstr(st + 3, _T("/"));
123
- if (en)
124
- {
125
- _tcsncpy_s(buf, size, st + 3, en - (st + 3));
126
- buf[en - (st + 3)] = 0x00;
127
- }
128
- }
129
- return buf;
130
- }
131
-
132
- inline const _TCHAR* dbname(const _TCHAR* uri, _TCHAR* buf, size_t size)
133
- {
134
- buf[0] = 0x00;
135
- const _TCHAR* st = _tcsstr(uri, _T("://"));
136
- if (st)
137
- {
138
- st = _tcsstr(st + 3, _T("/"));
139
- if (st)
140
- {
141
- const _TCHAR* en = _tcsstr(st + 1, _T("?"));
142
- if (en)
143
- {
144
- _tcsncpy_s(buf, size, st + 1, en - (st + 1));
145
- buf[en - (st + 1)] = 0x00;
146
- }
147
- }
148
- }
149
- return buf;
150
- }
151
-
152
- inline const _TCHAR* schemaTable(const _TCHAR* uri, _TCHAR* buf, size_t size)
153
- {
154
- buf[0] = 0x00;
155
- const _TCHAR* st = _tcsrchr(uri, _T('='));
156
- if (st)
157
- {
158
- const _TCHAR* en = _tcsrchr(uri, _T('.'));
159
- if (en)
160
- {
161
- _tcsncpy_s(buf, size, st + 1, en - (st + 1));
162
- buf[en - (st + 1)] = 0x00;
163
- }
164
- }
165
- return buf;
166
- }
167
-
168
133
  /* databaseManager interface
169
134
  If use some databases, implemnt a this interface and set the activeTable
170
135
  constructor
@@ -206,7 +171,7 @@ class tableIterator
206
171
  ushort_td m_lockBias;
207
172
 
208
173
  public:
209
- inline tableIterator(table& tb, ushort_td lockBias = 0) : m_tb(tb), m_fds(tb),m_lockBias(lockBias)
174
+ inline tableIterator(table& tb, ushort_td lockBias = LOCK_BIAS_DEFAULT) : m_tb(tb), m_fds(tb),m_lockBias(lockBias)
210
175
  {
211
176
  readStatusCheck(tb, _T("tableIterator"));
212
177
  }
@@ -312,7 +277,7 @@ typedef filterdIterator<indexRvIterator> filterdIndexRvIterator;
312
277
  typedef filterdIterator<stepRvIterator> filterdStepRvIterator;
313
278
  typedef filterdIterator<findRvIterator> filterdFindRvIterator;
314
279
 
315
- inline indexIterator readIndex(table_ptr tb, eIndexOpType op, ushort_td lockBias = 0)
280
+ inline indexIterator readIndex(table_ptr tb, eIndexOpType op, ushort_td lockBias = LOCK_BIAS_DEFAULT)
316
281
  {
317
282
 
318
283
  switch (op)
@@ -336,7 +301,7 @@ inline indexIterator readIndex(table_ptr tb, eIndexOpType op, ushort_td lockBias
336
301
  return indexIterator(*tb, lockBias);
337
302
  }
338
303
 
339
- inline indexRvIterator readIndexRv(table_ptr tb, eIndexOpType op, ushort_td lockBias = 0)
304
+ inline indexRvIterator readIndexRv(table_ptr tb, eIndexOpType op, ushort_td lockBias = LOCK_BIAS_DEFAULT)
340
305
  {
341
306
 
342
307
  switch (op)
@@ -362,7 +327,7 @@ inline indexRvIterator readIndexRv(table_ptr tb, eIndexOpType op, ushort_td lock
362
327
 
363
328
  template <class T>
364
329
  inline indexIterator readIndex(table_ptr tb, eIndexOpType op, char_td keynum,
365
- T func, ushort_td lockBias = 0)
330
+ T func, ushort_td lockBias = LOCK_BIAS_DEFAULT)
366
331
  {
367
332
  tb->setKeyNum(keynum);
368
333
  if (&func)
@@ -375,7 +340,7 @@ inline indexIterator readIndex(table_ptr tb, eIndexOpType op, char_td keynum,
375
340
 
376
341
  template <class T>
377
342
  inline indexRvIterator readIndexRv(table_ptr tb, eIndexOpType op,
378
- char_td keynum, T func, ushort_td lockBias = 0)
343
+ char_td keynum, T func, ushort_td lockBias = LOCK_BIAS_DEFAULT)
379
344
  {
380
345
  tb->setKeyNum(keynum);
381
346
  if (&func)
@@ -550,13 +515,13 @@ inline indexRvIterator readIndexRv_v(table_ptr tb, eIndexOpType op,
550
515
  }
551
516
  /** @endcond */
552
517
 
553
- inline stepIterator readStep(table_ptr tb, ushort_td lockBias = 0)
518
+ inline stepIterator readStep(table_ptr tb, ushort_td lockBias = LOCK_BIAS_DEFAULT)
554
519
  {
555
520
  tb->stepFirst(lockBias);
556
521
  return stepIterator(*tb, lockBias);
557
522
  }
558
523
 
559
- inline stepRvIterator readStepRv(table_ptr tb, ushort_td lockBias = 0)
524
+ inline stepRvIterator readStepRv(table_ptr tb, ushort_td lockBias = LOCK_BIAS_DEFAULT)
560
525
  {
561
526
  tb->stepLast(lockBias);
562
527
  return stepRvIterator(*tb, lockBias);
@@ -826,28 +791,6 @@ inline database_ptr createDatabaseObject()
826
791
  return p;
827
792
  }
828
793
 
829
- template <class Database_Ptr, class ConnectParam_type>
830
- inline void connect(Database_Ptr db, const ConnectParam_type& connPrams,
831
- bool newConnection)
832
- {
833
- db->connect(connPrams.uri(), newConnection);
834
- if (db->stat())
835
- nstable::throwError(
836
- (std::_tstring(_T("Connect database ")) + connPrams.uri()).c_str(),
837
- db->stat());
838
- }
839
-
840
- /*template <>
841
- inline void connect(idatabaseManager* db, const connectParams& connPrams, bool
842
- newConnection)
843
- {
844
- db->connect(connPrams, newConnection);
845
- if (db->stat())
846
- nstable::throwError((std::_tstring(_T("Connect database ")) +
847
- connPrams.uri()).c_str(), db->stat());
848
-
849
- }*/
850
-
851
794
  template <class Database_Ptr>
852
795
  inline void disconnect(Database_Ptr db, const connectParams& connPrams)
853
796
  {
@@ -865,14 +808,29 @@ template <class Database_Ptr> inline void disconnect(Database_Ptr db)
865
808
  nstable::throwError(_T("Disconnect database "), db->stat());
866
809
  }
867
810
 
811
+ template <class Database_Ptr>
812
+ inline void throwDbError(Database_Ptr db, const _TCHAR* caption, const _TCHAR* uri)
813
+ {
814
+ TCHAR tmp[MAX_PATH];
815
+ tdap::stripPasswd(uri, tmp, MAX_PATH);
816
+ nstable::throwError((std::_tstring(caption) + tmp).c_str(), db->stat());
817
+ }
818
+
819
+ template <class Database_Ptr, class ConnectParam_type>
820
+ inline void connect(Database_Ptr db, const ConnectParam_type& connPrams,
821
+ bool newConnection)
822
+ {
823
+ db->connect(connPrams.uri(), newConnection);
824
+ if (db->stat())
825
+ throwDbError(db, _T("Connect database : "), connPrams.uri());
826
+ }
827
+
868
828
  template <class Database_Ptr>
869
829
  inline void createDatabase(Database_Ptr db, const connectParams& connPrams)
870
830
  {
871
831
  db->create(connPrams.uri());
872
832
  if (db->stat())
873
- nstable::throwError(
874
- (std::_tstring(_T("Create database ")) + connPrams.uri()).c_str(),
875
- db->stat());
833
+ throwDbError(db, _T("Create database : "), connPrams.uri());
876
834
  }
877
835
 
878
836
  template <class Database_Ptr>
@@ -880,8 +838,7 @@ inline void createDatabase(Database_Ptr db, const _TCHAR* uri)
880
838
  {
881
839
  db->create(uri);
882
840
  if (db->stat())
883
- nstable::throwError(
884
- (std::_tstring(_T("Create database ")) + uri).c_str(), db->stat());
841
+ throwDbError(db, _T("Create database : "), uri);
885
842
  }
886
843
 
887
844
  template <class Database_Ptr, class ConnectParam_type>
@@ -889,9 +846,7 @@ inline void openDatabase(Database_Ptr db, const ConnectParam_type& connPrams)
889
846
  {
890
847
  db->open(connPrams.uri(), connPrams.type(), connPrams.mode());
891
848
  if (db->stat())
892
- nstable::throwError(
893
- (std::_tstring(_T("Open database ")) + connPrams.uri()).c_str(),
894
- db->stat());
849
+ throwDbError(db, _T("Open database : "), connPrams.uri());
895
850
  }
896
851
 
897
852
  template <class Database_Ptr>
@@ -902,9 +857,7 @@ inline void openDatabase(Database_Ptr db, const _TCHAR* uri,
902
857
  {
903
858
  db->open(uri, schemaType, mode, dir, ownername);
904
859
  if (db->stat())
905
- nstable::throwError(
906
- (std::_tstring(_T("Open database ")) + std::_tstring(uri)).c_str(),
907
- db->stat());
860
+ throwDbError(db, _T("Open database : "), uri);
908
861
  }
909
862
 
910
863
  template <class Database_Ptr>
@@ -1002,7 +955,6 @@ inline void insertTable(dbdef* def, short id, const _TCHAR* name,
1002
955
  inline fielddef* insertField(dbdef* def, short tableid, short fieldNum,
1003
956
  const _TCHAR* name, uchar_td type, ushort_td len)
1004
957
  {
1005
-
1006
958
  fielddef* fd = def->insertField(tableid, fieldNum);
1007
959
  if (def->stat() != 0)
1008
960
  nstable::throwError(
@@ -104,6 +104,10 @@ uchar_td convFieldType(enum enum_field_types type, uint flags, bool binary,
104
104
  if ((flags & UNSIGNED_FLAG) || (type == MYSQL_TYPE_YEAR))
105
105
  return ft_uinteger;
106
106
  return ft_integer;
107
+ case MYSQL_TYPE_ENUM:
108
+ return ft_integer;
109
+ case MYSQL_TYPE_SET:
110
+ return ft_uinteger;
107
111
  case MYSQL_TYPE_FLOAT:
108
112
  case MYSQL_TYPE_DOUBLE:
109
113
  return ft_float;
@@ -187,9 +191,10 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id)
187
191
  fd.setName(src->fieldName(i));
188
192
  fd.len = src->fieldLen(i); // filed->pack_length();
189
193
  fd.pos = pos;
190
- fd.type = convFieldType(src->fieldType(i), src->fieldFlags(i),
194
+ fd.type = convFieldType(src->fieldRealType(i), src->fieldFlags(i),
191
195
  isBinary(src->fieldCharset(i)),
192
196
  isUnicode(src->fieldCharset(i)));
197
+ fd.setCharsetIndex(charsetIndex(src->fieldCharset(i).csname));
193
198
  pos += fd.len;
194
199
  datalen =
195
200
  copyToRecordImage(rec.get(), &fd, sizeof(fielddef), datalen);
@@ -281,6 +286,8 @@ short schemaBuilder::execute(database* db, table* mtb)
281
286
  filename_to_tablename(it->path().stem().string().c_str(), path,
282
287
  FN_REFLEN);
283
288
  table* tb = db->openTable(path, TD_OPEN_READONLY, NULL);
289
+ if (!tb)
290
+ return db->stat();
284
291
  if (!tb->isView())
285
292
  {
286
293
  if ((stat = insertMetaRecord(mtb, tb, ++id)) != 0)
@@ -43,6 +43,9 @@ class request : public bzs::db::protocol::tdap::request
43
43
  {
44
44
  public:
45
45
  ushort_td cid;
46
+ #ifdef DEBUG_LOG_ERR
47
+ const char* m_readBuffer;
48
+ #endif
46
49
  void clear()
47
50
  {
48
51
  bzs::db::protocol::tdap::request::clear();
@@ -131,6 +134,9 @@ public:
131
134
  inline void parse(const char* p)
132
135
  {
133
136
  clear();
137
+ #ifdef DEBUG_LOG_ERR
138
+ m_readBuffer = p;
139
+ #endif
134
140
  p += sizeof(unsigned int);
135
141
  paramMask = *((ushort_td*)p);
136
142
  p += sizeof(ushort_td);