transactd 2.2.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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;