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.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- 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),
|
|
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
|
-
|
|
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
|
-
|
|
459
|
-
|
|
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
|
-
|
|
467
|
-
|
|
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
|
-
|
|
581
|
-
|
|
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
|
-
|
|
589
|
-
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(),
|
|
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(
|
|
1515
|
-
memcpy(
|
|
1516
|
-
memcpy(
|
|
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(
|
|
1524
|
-
memcpy(
|
|
1525
|
-
memcpy(
|
|
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(
|
|
1533
|
-
memcpy(
|
|
1534
|
-
memcpy(
|
|
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(
|
|
1540
|
-
memcpy(
|
|
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,
|
|
1563
|
-
return (void*)(
|
|
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,
|
|
1598
|
+
memcpy(&size, p, sizeByte);
|
|
1571
1599
|
if (size)
|
|
1572
1600
|
{
|
|
1573
|
-
char** ptr = (char**)(
|
|
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,
|
|
1583
|
-
return (void*)(
|
|
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(),
|
|
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(),
|
|
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(),
|
|
1862
|
+
return _strnicmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
|
|
1832
1863
|
}
|
|
1833
1864
|
|
|
1834
|
-
|
|
1865
|
+
int compWString(const field& l, const field& r, char logType)
|
|
1835
1866
|
{
|
|
1836
|
-
return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(),
|
|
1867
|
+
return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), r.len());
|
|
1837
1868
|
}
|
|
1838
1869
|
|
|
1839
|
-
|
|
1870
|
+
int compiWString(const field& l, const field& r, char logType)
|
|
1840
1871
|
{
|
|
1841
|
-
return wcsnicmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(),
|
|
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
|
|
2008
|
+
if (n)
|
|
1972
2009
|
{
|
|
1973
|
-
p[n - 1]
|
|
1974
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|