transactd 2.2.0 → 2.3.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 (114) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA +6 -6
  3. data/README +20 -18
  4. data/README-JA +19 -17
  5. data/RELEASE_NOTE +144 -0
  6. data/RELEASE_NOTE-JA +153 -0
  7. data/bin/common/tdclc_32_2_3.dll +0 -0
  8. data/bin/common/tdclc_64_2_3.dll +0 -0
  9. data/build/common/get_ruby_path.cmake +1 -1
  10. data/build/swig/ruby/ruby.swg +10 -9
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
  12. data/build/swig/tdcl.i +30 -3
  13. data/build/tdclc/tdclc.cbproj +1 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  16. data/build/tdclcpp/tdclcpp.rc +4 -4
  17. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  18. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +85 -41
  21. data/source/bzs/db/engine/mysql/database.h +35 -5
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
  23. data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
  24. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
  25. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
  27. data/source/bzs/db/protocol/tdap/client/client.h +30 -1
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
  30. data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
  31. data/source/bzs/db/protocol/tdap/client/field.h +7 -7
  32. data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
  33. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
  34. data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
  35. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
  36. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  37. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
  38. data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
  39. data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
  40. data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
  41. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
  42. data/source/bzs/db/protocol/tdap/client/request.h +11 -1
  43. data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
  44. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
  45. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
  46. data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
  47. data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
  48. data/source/bzs/db/protocol/tdap/client/table.h +8 -7
  49. data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
  50. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  51. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
  52. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
  53. data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
  54. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
  55. data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
  56. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
  57. data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
  58. data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
  59. data/source/bzs/db/protocol/tdap/uri.h +4 -4
  60. data/source/bzs/db/transactd/transactd.cpp +6 -5
  61. data/source/bzs/env/crosscompile.cpp +17 -0
  62. data/source/bzs/env/crosscompile.h +4 -1
  63. data/source/bzs/env/mbcswchrLinux.cpp +3 -0
  64. data/source/bzs/example/deleteRecords.cpp +13 -0
  65. data/source/bzs/example/deleteRecords_c.cpp +8 -1
  66. data/source/bzs/example/insertRecords.cpp +14 -0
  67. data/source/bzs/example/insertRecords_c.cpp +8 -1
  68. data/source/bzs/example/ormap_c.cpp +8 -1
  69. data/source/bzs/example/queryData.cpp +92 -2
  70. data/source/bzs/example/queryData.h +3 -1
  71. data/source/bzs/example/readRecords.cpp +13 -0
  72. data/source/bzs/example/readRecords_c.cpp +8 -1
  73. data/source/bzs/example/updateRecords.cpp +13 -0
  74. data/source/bzs/example/updateRecords_c.cpp +8 -1
  75. data/source/bzs/example/update_with_transaction.cpp +13 -0
  76. data/source/bzs/example/update_with_transaction_c.cpp +8 -1
  77. data/source/bzs/example/useORMRecord.cpp +9 -3
  78. data/source/bzs/netsvc/client/iconnection.h +8 -0
  79. data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
  80. data/source/bzs/netsvc/client/tcpClient.h +430 -214
  81. data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
  82. data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
  83. data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
  84. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
  85. data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
  86. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
  87. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
  88. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
  89. data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
  90. data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
  91. data/source/bzs/test/transactdBench/workerBase.h +2 -2
  92. data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
  93. data/source/global/tdclatl/Database.cpp +12 -0
  94. data/source/global/tdclatl/Database.h +4 -0
  95. data/source/global/tdclatl/FieldDef.cpp +19 -0
  96. data/source/global/tdclatl/FieldDef.h +4 -0
  97. data/source/global/tdclatl/FieldDefs.cpp +14 -16
  98. data/source/global/tdclatl/GroupQuery.cpp +21 -16
  99. data/source/global/tdclatl/GroupQuery.h +1 -1
  100. data/source/global/tdclatl/QueryBase.cpp +14 -0
  101. data/source/global/tdclatl/QueryBase.h +2 -0
  102. data/source/global/tdclatl/Record.cpp +41 -10
  103. data/source/global/tdclatl/Record.h +1 -1
  104. data/source/global/tdclatl/Recordset.cpp +117 -31
  105. data/source/global/tdclatl/Recordset.h +6 -5
  106. data/source/global/tdclatl/Table.cpp +24 -28
  107. data/source/global/tdclatl/Table.h +3 -4
  108. data/source/global/tdclatl/activeTable.cpp +149 -103
  109. data/source/global/tdclatl/activeTable.h +1 -1
  110. data/source/global/tdclatl/tdclatl.idl +38 -18
  111. data/transactd.gemspec +1 -1
  112. metadata +8 -4
  113. data/bin/common/tdclc_32_2_2.dll +0 -0
  114. data/bin/common/tdclc_64_2_2.dll +0 -0
@@ -65,8 +65,7 @@ struct Imple
65
65
  };
66
66
 
67
67
  fieldShare::fieldShare()
68
- : m_imple(new Imple()), myDateTimeValueByBtrv(true), trimPadChar(true),
69
- usePadChar(true), logicalToString(false)
68
+ : m_imple(new Imple()), myDateTimeValueByBtrv(true), logicalToString(false)
70
69
  {
71
70
  }
72
71
 
@@ -75,12 +74,12 @@ fieldShare::~fieldShare()
75
74
  delete m_imple;
76
75
  }
77
76
 
78
- stringConverter* fieldShare::cv()
77
+ stringConverter* fieldShare::cv() const
79
78
  {
80
79
  return m_imple->cv;
81
80
  }
82
81
 
83
- bzs::rtl::stringBuffer* fieldShare::strBufs()
82
+ bzs::rtl::stringBuffer* fieldShare::strBufs() const
84
83
  {
85
84
  return &m_imple->strBufs;
86
85
  }
@@ -160,7 +159,11 @@ void fielddefs::addAllFileds(tabledef* def)
160
159
  {
161
160
  m_imple->fields.clear();
162
161
  for (int i = 0; i < def->fieldCount; ++i)
163
- push_back(&def->fieldDefs[i]);
162
+ {
163
+ fielddef* fd = &def->fieldDefs[i];
164
+ fd->setPadCharDefaultSettings();
165
+ push_back(fd);
166
+ }
164
167
  }
165
168
 
166
169
  void fielddefs::push_back(const fielddef* p, bool rePosition)
@@ -357,7 +360,6 @@ inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
357
360
  case ft_uinteger:
358
361
  case ft_logical:
359
362
  case ft_bit:
360
- case ft_currency:
361
363
  case ft_date:
362
364
  case ft_time:
363
365
  case ft_timestamp:
@@ -386,6 +388,24 @@ inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
386
388
  ret = *((__int64*)(ptr + fd.pos));
387
389
  break;
388
390
  }
391
+ break;
392
+ case ft_currency:
393
+ ret = (*((__int64*)((char*)ptr + fd.pos)) / 10000);
394
+ break;
395
+ case ft_bfloat:
396
+ case ft_float:
397
+ switch (fd.len)
398
+ {
399
+ case 4:
400
+ ret = (__int64)*((float*)((char*)ptr + fd.pos));
401
+ break;
402
+ case 8:
403
+ ret = (__int64)*((double*)((char*)ptr + fd.pos));
404
+ case 10: // long double
405
+ ret = (__int64)*((long double*)((char*)ptr + fd.pos));
406
+ break;
407
+ }
408
+ break;
389
409
  }
390
410
  }
391
411
  return ret;
@@ -455,16 +475,18 @@ void field::setFVA(const char* data)
455
475
  switch (m_fd->type)
456
476
  {
457
477
  case ft_string:
458
- return store<stringStore, char, char>(p, data, *m_fd, m_fds->cv(),
459
- m_fds->usePadChar);
478
+ if (m_fd->usePadChar())
479
+ return store<stringStore, char, char>(p, data, *m_fd, m_fds->cv());
480
+ return store<binaryStore, char, char>(p, data, *m_fd, m_fds->cv());
460
481
  case ft_note:
461
482
  case ft_zstring:
462
483
  return store<zstringStore, char, char>(p, data, *m_fd, m_fds->cv());
463
484
  case ft_wzstring:
464
485
  return store<wzstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
465
486
  case ft_wstring:
466
- return store<wstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv(),
467
- m_fds->usePadChar);
487
+ if (m_fd->usePadChar())
488
+ return store<wstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
489
+ return store<wbinaryStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
468
490
  case ft_mychar:
469
491
  return store<myCharStore, char, char>(p, data, *m_fd, m_fds->cv());
470
492
  case ft_myvarchar:
@@ -483,7 +505,7 @@ void field::setFVA(const char* data)
483
505
  case ft_mytext:
484
506
  {
485
507
  char* tmp = blobStore<char>(p, data, *m_fd, m_fds->cv());
486
- m_fds->blobPushBack(tmp);
508
+ const_cast<fielddefs*>(m_fds)->blobPushBack(tmp);
487
509
  return;
488
510
  }
489
511
  case ft_decimal:
@@ -577,16 +599,18 @@ void field::setFVW(const wchar_t* data)
577
599
  switch (m_fd->type)
578
600
  {
579
601
  case ft_string:
580
- return store<stringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv(),
581
- m_fds->usePadChar);
602
+ if (m_fd->usePadChar())
603
+ return store<stringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
604
+ return store<binaryStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
582
605
  case ft_note:
583
606
  case ft_zstring:
584
607
  return store<zstringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
585
608
  case ft_wzstring:
586
609
  return store<wzstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
587
610
  case ft_wstring:
588
- return store<wstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv(),
589
- m_fds->usePadChar);
611
+ if (m_fd->usePadChar())
612
+ return store<wstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
613
+ return store<wbinaryStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
590
614
  case ft_mychar:
591
615
  return store<myCharStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
592
616
  case ft_myvarchar:
@@ -607,7 +631,7 @@ void field::setFVW(const wchar_t* data)
607
631
  case ft_mytext:
608
632
  {
609
633
  char* tmp = blobStore<WCHAR>(p, data, *m_fd, m_fds->cv());
610
- m_fds->blobPushBack(tmp);
634
+ const_cast<fielddefs*>(m_fds)->blobPushBack(tmp);
611
635
  return;
612
636
  }
613
637
 
@@ -1110,7 +1134,7 @@ const wchar_t* field::getFVWstr() const
1110
1134
  {
1111
1135
  case ft_string:
1112
1136
  return read<stringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
1113
- m_fds->cv(), m_fds->trimPadChar);
1137
+ m_fds->cv(), m_fd->trimPadChar());
1114
1138
  case ft_note:
1115
1139
  case ft_zstring:
1116
1140
  return read<zstringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
@@ -1120,10 +1144,10 @@ const wchar_t* field::getFVWstr() const
1120
1144
  m_fds->cv());
1121
1145
  case ft_wstring:
1122
1146
  return read<wstringStore, WCHAR, WCHAR>(
1123
- data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fds->trimPadChar);
1147
+ data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->trimPadChar());
1124
1148
  case ft_mychar:
1125
1149
  return read<myCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
1126
- m_fds->cv(), m_fds->trimPadChar);
1150
+ m_fds->cv(), m_fd->trimPadChar());
1127
1151
  case ft_myvarchar:
1128
1152
  return read<myVarCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
1129
1153
  m_fds->cv());
@@ -1133,7 +1157,7 @@ const wchar_t* field::getFVWstr() const
1133
1157
  *m_fd, m_fds->cv());
1134
1158
  case ft_mywchar:
1135
1159
  return read<myWcharStore, WCHAR, WCHAR>(
1136
- data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fds->trimPadChar);
1160
+ data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->trimPadChar());
1137
1161
  case ft_mywvarchar:
1138
1162
  return read<myWvarCharStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
1139
1163
  *m_fd, m_fds->cv());
@@ -1257,7 +1281,7 @@ const char* field::getFVAstr() const
1257
1281
 
1258
1282
  case ft_string:
1259
1283
  return read<stringStore, char, char>(data, m_fds->strBufs(), *m_fd,
1260
- m_fds->cv(), m_fds->trimPadChar);
1284
+ m_fds->cv(), m_fd->trimPadChar());
1261
1285
  case ft_note:
1262
1286
  case ft_zstring:
1263
1287
  return read<zstringStore, char, char>(data, m_fds->strBufs(), *m_fd,
@@ -1267,10 +1291,10 @@ const char* field::getFVAstr() const
1267
1291
  m_fds->cv());
1268
1292
  case ft_wstring:
1269
1293
  return read<wstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
1270
- m_fds->cv(), m_fds->trimPadChar);
1294
+ m_fds->cv(), m_fd->trimPadChar());
1271
1295
  case ft_mychar:
1272
1296
  return read<myCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
1273
- m_fds->cv(), m_fds->trimPadChar);
1297
+ m_fds->cv(), m_fd->trimPadChar());
1274
1298
  case ft_myvarchar:
1275
1299
  return read<myVarCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
1276
1300
  m_fds->cv());
@@ -1280,7 +1304,7 @@ const char* field::getFVAstr() const
1280
1304
  m_fds->cv());
1281
1305
  case ft_mywchar:
1282
1306
  return read<myWcharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
1283
- m_fds->cv(), m_fds->trimPadChar);
1307
+ m_fds->cv(), m_fd->trimPadChar());
1284
1308
  case ft_mywvarchar:
1285
1309
  return read<myWvarCharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
1286
1310
  m_fds->cv());
@@ -1410,6 +1434,8 @@ __int64 field::getFV64() const
1410
1434
  case ft_mydatetime:
1411
1435
  case ft_mytimestamp:
1412
1436
  return (__int64) * ((__int64*)((char*)m_ptr + m_fd->pos));
1437
+ case ft_float:
1438
+ return (__int64) *((double*)((char*)m_ptr + m_fd->pos));
1413
1439
  }
1414
1440
  return 0;
1415
1441
  case 7:
@@ -1501,6 +1527,7 @@ void field::setFV(const void* data, uint_td size)
1501
1527
  {
1502
1528
  if (!m_ptr)
1503
1529
  return;
1530
+ char* p = (char*)m_ptr + m_fd->pos;
1504
1531
  switch (m_fd->type)
1505
1532
  {
1506
1533
  case ft_myvarbinary:
@@ -1511,33 +1538,33 @@ void field::setFV(const void* data, uint_td size)
1511
1538
  {
1512
1539
  int sizeByte = m_fd->varLenBytes();
1513
1540
  size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
1514
- memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
1515
- memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
1516
- memcpy((char*)m_ptr + m_fd->pos + sizeByte, data, size);
1541
+ memset(p, 0, m_fd->len);
1542
+ memcpy(p, &size, sizeByte);
1543
+ memcpy(p + sizeByte, data, size);
1517
1544
  break;
1518
1545
  }
1519
1546
  case ft_myblob:
1520
1547
  case ft_mytext:
1521
1548
  {
1522
1549
  int sizeByte = m_fd->len - 8;
1523
- memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
1524
- memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
1525
- memcpy((char*)m_ptr + m_fd->pos + sizeByte, &data, sizeof(char*));
1550
+ memset(p, 0, m_fd->len);
1551
+ memcpy(p, &size, sizeByte);
1552
+ memcpy(p + sizeByte, &data, sizeof(char*));
1526
1553
  break;
1527
1554
  }
1528
1555
  case ft_lvar:
1529
1556
  {
1530
1557
  int sizeByte = 2;
1531
1558
  size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
1532
- memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
1533
- memcpy((char*)m_ptr + m_fd->pos, &size, sizeByte);
1534
- memcpy((char*)m_ptr + m_fd->pos + sizeByte, data, size);
1559
+ memset(p, 0, m_fd->len);
1560
+ memcpy(p, &size, sizeByte);
1561
+ memcpy(p + sizeByte, data, size);
1535
1562
  break;
1536
1563
  }
1537
1564
  default:
1538
1565
  size = std::min<uint_td>((uint_td)m_fd->len, size);
1539
- memset((char*)m_ptr + m_fd->pos, 0, m_fd->len);
1540
- memcpy((char*)m_ptr + m_fd->pos, data, size);
1566
+ memset(p, 0, m_fd->len);
1567
+ memcpy(p, data, size);
1541
1568
  }
1542
1569
  }
1543
1570
 
@@ -1549,6 +1576,7 @@ void* field::getFVbin(uint_td& size) const
1549
1576
  if (!m_ptr)
1550
1577
  return 0;
1551
1578
 
1579
+ char* p = (char*)m_ptr + m_fd->pos;
1552
1580
  switch (m_fd->type)
1553
1581
  {
1554
1582
  case ft_myvarbinary:
@@ -1559,18 +1587,18 @@ void* field::getFVbin(uint_td& size) const
1559
1587
  {
1560
1588
  int sizeByte = m_fd->varLenBytes();
1561
1589
  size = 0;
1562
- memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
1563
- return (void*)((char*)m_ptr + m_fd->pos + sizeByte);
1590
+ memcpy(&size, p, sizeByte);
1591
+ return (void*)(p + sizeByte);
1564
1592
  }
1565
1593
  case ft_myblob:
1566
1594
  case ft_mytext:
1567
1595
  {
1568
1596
  int sizeByte = m_fd->len - 8;
1569
1597
  size = 0;
1570
- memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
1598
+ memcpy(&size, p, sizeByte);
1571
1599
  if (size)
1572
1600
  {
1573
- char** ptr = (char**)((char*)m_ptr + m_fd->pos + sizeByte);
1601
+ char** ptr = (char**)(p + sizeByte);
1574
1602
  return (void*)*ptr;
1575
1603
  }
1576
1604
  return NULL;
@@ -1579,9 +1607,12 @@ void* field::getFVbin(uint_td& size) const
1579
1607
  {
1580
1608
  int sizeByte = 2;
1581
1609
  size = 0;
1582
- memcpy(&size, (char*)m_ptr + m_fd->pos, sizeByte);
1583
- return (void*)((char*)m_ptr + m_fd->pos + sizeByte);
1610
+ memcpy(&size, p, sizeByte);
1611
+ return (void*)(p + sizeByte);
1584
1612
  }
1613
+ default:
1614
+ size = m_fd->len;
1615
+ return (void*)(p);
1585
1616
  }
1586
1617
  return NULL;
1587
1618
  }
@@ -1818,27 +1849,27 @@ inline int compNumberU24(const field& l, const field& r, char logType)
1818
1849
 
1819
1850
  inline int compMem(const field& l, const field& r, char logType)
1820
1851
  {
1821
- return memcmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
1852
+ return memcmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
1822
1853
  }
1823
1854
 
1824
1855
  inline int compString(const field& l, const field& r, char logType)
1825
1856
  {
1826
- return strncmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
1857
+ return strncmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
1827
1858
  }
1828
1859
 
1829
1860
  inline int compiString(const field& l, const field& r, char logType)
1830
1861
  {
1831
- return _strnicmp((const char*)l.ptr(), (const char*)r.ptr(), l.len());
1862
+ return _strnicmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
1832
1863
  }
1833
1864
 
1834
- inline int compWString(const field& l, const field& r, char logType)
1865
+ int compWString(const field& l, const field& r, char logType)
1835
1866
  {
1836
- return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), l.len());
1867
+ return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), r.len());
1837
1868
  }
1838
1869
 
1839
- inline int compiWString(const field& l, const field& r, char logType)
1870
+ int compiWString(const field& l, const field& r, char logType)
1840
1871
  {
1841
- return wcsnicmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), l.len());
1872
+ return wcsnicmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), r.len());
1842
1873
  }
1843
1874
 
1844
1875
  template <class T>
@@ -1964,18 +1995,36 @@ bool field::isCompPartAndMakeValue()
1964
1995
  bool ret = false;
1965
1996
  if (m_fd->isStringType())
1966
1997
  {
1998
+ m_fd->setPadCharSettings(false, true);
1999
+ /*bool trim = m_fd->trimPadChar();
2000
+ bool use = m_fd->usePadChar();
2001
+ bool sp = (!trim || use);
2002
+ if (sp)
2003
+ m_fd->setPadCharSettings(false, true);*/
1967
2004
  _TCHAR* p = (_TCHAR*)getFVstr();
1968
2005
  if (p)
1969
2006
  {
1970
2007
  size_t n = _tcslen(p);
1971
- if (n && ((ret = (p[n - 1] == _T('*'))) != 0))
2008
+ if (n)
1972
2009
  {
1973
- p[n - 1] = 0x00;
1974
- setFV(p);
2010
+ if (p[n - 1] == _T('*'))
2011
+ {
2012
+ p[n - 1] = 0x00;
2013
+ if (m_fd->type == ft_mychar)
2014
+ m_fd->type = ft_string;
2015
+ else if (m_fd->type == ft_mywchar)
2016
+ m_fd->type = ft_wstring;
2017
+ m_fd->setPadCharSettings(false, true);
2018
+ setFV(p);
2019
+
2020
+ ret = true;
2021
+ }
1975
2022
  }
1976
2023
  }
1977
2024
  else
1978
2025
  setFV(_T(""));
2026
+ /*if (sp)
2027
+ m_fd->setPadCharSettings(use, trim); */
1979
2028
  }
1980
2029
  return ret;
1981
2030
  }
@@ -53,8 +53,6 @@ private:
53
53
  struct
54
54
  {
55
55
  unsigned char myDateTimeValueByBtrv : 1;
56
- unsigned char trimPadChar : 1;
57
- unsigned char usePadChar : 1;
58
56
  unsigned char logicalToString : 1;
59
57
  };
60
58
  fieldShare(const fieldShare&); // no implememt
@@ -64,8 +62,8 @@ protected:
64
62
  fieldShare();
65
63
 
66
64
  virtual ~fieldShare();
67
- stringConverter* cv();
68
- bzs::rtl::stringBuffer* strBufs();
65
+ stringConverter* cv() const;
66
+ bzs::rtl::stringBuffer* strBufs() const;
69
67
  void blobPushBack(char* p);
70
68
  void blobClear();
71
69
  };
@@ -115,6 +113,8 @@ public:
115
113
 
116
114
  typedef int (*compFieldFunc)(const class field& l, const class field& r,
117
115
  char logType);
116
+ extern int compWString(const field& l, const field& r, char logType);
117
+ extern int compiWString(const field& l, const field& r, char logType);
118
118
 
119
119
  /** @endcond */
120
120
 
@@ -128,9 +128,8 @@ class DLLLIB field
128
128
  /** @endcond */
129
129
  fielddef* m_fd;
130
130
  unsigned char* m_ptr;
131
- class fielddefs* m_fds;
131
+ const class fielddefs* m_fds;
132
132
 
133
- compFieldFunc getCompFunc(char logType) const;
134
133
  int blobLenBytes() const { return m_fd->blobLenBytes(); }
135
134
 
136
135
  private:
@@ -180,7 +179,7 @@ public:
180
179
 
181
180
  public:
182
181
  /** @cond INTERNAL */
183
- inline field(unsigned char* ptr, const fielddef& fd, fielddefs* fds)
182
+ inline field(unsigned char* ptr, const fielddef& fd, const fielddefs* fds)
184
183
  : m_fd((fielddef*)&fd), m_ptr(ptr), m_fds(fds){};
185
184
  /** @endcond */
186
185
 
@@ -314,6 +313,7 @@ public:
314
313
  /** @cond INTERNAL */
315
314
  bool isCompPartAndMakeValue();
316
315
  void offsetBlobPtr(size_t offset);
316
+ compFieldFunc getCompFunc(char logType) const;
317
317
  /** @endcond */
318
318
  };
319
319
 
@@ -42,7 +42,7 @@ namespace client
42
42
 
43
43
 
44
44
  /** Length of compare
45
- * if part of string or zstring then return strlen.
45
+ * if part of string or zstring then return strlen * sizeof(char or wchar).
46
46
  */
47
47
  inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
48
48
  {
@@ -50,14 +50,16 @@ inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
50
50
  if (part)
51
51
  {
52
52
  if ((fd.type == ft_string) || (fd.type == ft_zstring) ||
53
- (fd.type == ft_note))
53
+ (fd.type == ft_note) || (fd.type == ft_mychar))
54
54
  length = (uint_td)strlen((const char*)ptr);
55
- else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring))
56
- length = (uint_td)wcslen((const wchar_t*)ptr);
55
+ else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring) ||
56
+ (fd.type == ft_mywchar))
57
+ length = (uint_td)strlen16((char16_t*)ptr)*sizeof(char16_t);
57
58
  }
58
59
  return length;
59
60
  }
60
61
 
62
+
61
63
  inline bool verType(uchar_td type)
62
64
  {
63
65
  if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
@@ -362,9 +364,11 @@ public:
362
364
  memcpy(data + varlen, fdd.keyData(buf), copylen);
363
365
  delete [] buf;
364
366
  }
365
-
367
+
366
368
  if (!part && (fdd.varLenBytes() || fdd.blobLenBytes()))
367
369
  logType |= CMPLOGICAL_VAR_COMP_ALL; // match complate
370
+ else
371
+ logType &= ~CMPLOGICAL_VAR_COMP_ALL;
368
372
  }
369
373
 
370
374
  bool setParam(table* tb, const _TCHAR* name, const _TCHAR* type,
@@ -592,6 +596,12 @@ class filter
592
596
 
593
597
  };
594
598
 
599
+ struct
600
+ {
601
+ bool m_stopAtLimit : 1;
602
+
603
+ };
604
+
595
605
  struct bufSize
596
606
  {
597
607
  bufSize():logic(0), seeks(0), select(0),retRowSize(0) {}
@@ -801,6 +811,8 @@ class filter
801
811
  queryBase::combineCondition);
802
812
  m_withBookmark = q->isBookmarkAlso();
803
813
  m_cachedOptimize = q->getOptimize();
814
+ m_stopAtLimit = q->isStopAtLimit();
815
+
804
816
 
805
817
  if (q->isAll())
806
818
  addAllFields();
@@ -981,7 +993,7 @@ class filter
981
993
  : m_tb(tb), m_seeksWritedCount(0), m_extendBuflen(0), m_stat(0),
982
994
  m_preparedId(0),m_ignoreFields(false), m_seeksMode(false),
983
995
  m_useOptimize(true),m_withBookmark(true), m_hasManyJoin(false),
984
- m_preparingMode(false),m_ddba(false)
996
+ m_preparingMode(false),m_ddba(false),m_stopAtLimit(false)
985
997
  {
986
998
  m_isTransactd = m_tb->isUseTransactd();
987
999
  m_ddba = m_isTransactd;
@@ -1272,6 +1284,8 @@ public:
1272
1284
  return false;
1273
1285
  }
1274
1286
 
1287
+ inline bool isStopAtLimit() const {return m_stopAtLimit; }
1288
+
1275
1289
  bool checkFindDirection(ushort_td op)
1276
1290
  {
1277
1291
  bool ret;