transactd 2.4.5 → 3.0.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/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
|
@@ -39,26 +39,6 @@ namespace client
|
|
|
39
39
|
|
|
40
40
|
#define DATASIZE_BYTE 2
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
/** Length of compare
|
|
44
|
-
* if part of string or zstring then return strlen * sizeof(char or wchar).
|
|
45
|
-
*/
|
|
46
|
-
inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
|
|
47
|
-
{
|
|
48
|
-
uint_td length = fd.keyDataLen(ptr);
|
|
49
|
-
if (part)
|
|
50
|
-
{
|
|
51
|
-
if ((fd.type == ft_string) || (fd.type == ft_zstring) ||
|
|
52
|
-
(fd.type == ft_note) || (fd.type == ft_mychar))
|
|
53
|
-
length = (uint_td)strlen((const char*)ptr);
|
|
54
|
-
else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring) ||
|
|
55
|
-
(fd.type == ft_mywchar))
|
|
56
|
-
length = (uint_td)strlen16((char16_t*)ptr)*sizeof(char16_t);
|
|
57
|
-
}
|
|
58
|
-
return length;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
42
|
inline bool verType(uchar_td type)
|
|
63
43
|
{
|
|
64
44
|
if (((type >= ft_myvarchar) && (type <= ft_mywvarbinary)) ||
|
|
@@ -106,7 +86,7 @@ filter
|
|
|
106
86
|
1 and
|
|
107
87
|
2 or
|
|
108
88
|
+32 prepare placeholder (Only transactd)
|
|
109
|
-
data 2 or n field position (if compare type +64) or
|
|
89
|
+
data 2 or n field position (if compare type +64) or compare value
|
|
110
90
|
--- end repeat ---
|
|
111
91
|
-----------------------------------
|
|
112
92
|
result
|
|
@@ -210,14 +190,23 @@ struct resultDef
|
|
|
210
190
|
struct seek
|
|
211
191
|
{
|
|
212
192
|
unsigned char* data;
|
|
213
|
-
|
|
193
|
+
union
|
|
194
|
+
{
|
|
195
|
+
unsigned short len_ptr;
|
|
196
|
+
struct
|
|
197
|
+
{
|
|
198
|
+
unsigned short len : 15;
|
|
199
|
+
unsigned short null : 1;
|
|
200
|
+
};
|
|
201
|
+
};
|
|
214
202
|
|
|
215
203
|
public:
|
|
216
204
|
// setParam from keyValue
|
|
217
|
-
bool setParam(uchar_td* buf, ushort_td keylen)
|
|
205
|
+
bool setParam(uchar_td* buf, ushort_td keylen, bool isNull)
|
|
218
206
|
{
|
|
219
207
|
len = keylen;
|
|
220
208
|
data = buf;
|
|
209
|
+
null = isNull ? 1 : 0;
|
|
221
210
|
return true;
|
|
222
211
|
}
|
|
223
212
|
|
|
@@ -225,15 +214,15 @@ public:
|
|
|
225
214
|
{
|
|
226
215
|
if (!isTransactd)
|
|
227
216
|
return len;
|
|
228
|
-
return sizeof(
|
|
217
|
+
return sizeof(unsigned short) + len;
|
|
229
218
|
}
|
|
230
219
|
|
|
231
220
|
unsigned char* writeBuffer(unsigned char* p, bool end,
|
|
232
221
|
bool isTransactd) const
|
|
233
222
|
{
|
|
234
|
-
int n = sizeof(
|
|
223
|
+
int n = sizeof(unsigned short);
|
|
235
224
|
if (isTransactd)
|
|
236
|
-
memcpy(p, &
|
|
225
|
+
memcpy(p, &len_ptr, n);
|
|
237
226
|
else
|
|
238
227
|
n = 0;
|
|
239
228
|
memcpy(p + n, data, len);
|
|
@@ -348,12 +337,17 @@ public:
|
|
|
348
337
|
return;
|
|
349
338
|
fielddef fdd = tb->tableDef()->fieldDefs[fieldNum];
|
|
350
339
|
fdd.pos = 0;
|
|
340
|
+
fdd.m_nullbytes = 0;
|
|
341
|
+
fdd.m_nullbit = 0;
|
|
351
342
|
uchar_td* buf = allocBuffer(fdd.len);
|
|
352
|
-
|
|
353
|
-
|
|
343
|
+
|
|
344
|
+
// Compare value don't use NULL
|
|
345
|
+
// If logType is eIsNull or eIsNotNull, ingored this value
|
|
346
|
+
field fd(buf, fdd, tb->m_fddefs/*, NULL, 0*/);
|
|
347
|
+
fd = value; // operator=()
|
|
354
348
|
bool part = fd.isCompPartAndMakeValue();
|
|
355
349
|
int varlen = fdd.varLenByteForKey();
|
|
356
|
-
int copylen = compDataLen(
|
|
350
|
+
int copylen = fdd.compDataLen(buf, part);
|
|
357
351
|
len = varlen + copylen;
|
|
358
352
|
if (fdd.blobLenBytes())
|
|
359
353
|
{
|
|
@@ -546,7 +540,7 @@ class autoBackup
|
|
|
546
540
|
int m_len;
|
|
547
541
|
public:
|
|
548
542
|
autoBackup(table* tb, std::vector<char>& b):m_tb(tb),
|
|
549
|
-
m_len(m_tb->tableDef()->
|
|
543
|
+
m_len(m_tb->tableDef()->recordlen())
|
|
550
544
|
{
|
|
551
545
|
b.resize(m_len);
|
|
552
546
|
m_buf = &b[0];
|
|
@@ -602,12 +596,19 @@ class filter
|
|
|
602
596
|
|
|
603
597
|
struct bufSize
|
|
604
598
|
{
|
|
605
|
-
bufSize():logic(0), seeks(0), select(0),retRowSize(0)
|
|
606
|
-
|
|
599
|
+
bufSize():logic(0), seeks(0), select(0),retRowSize(0),
|
|
600
|
+
nullfields(0), nullbytes(0) {}
|
|
601
|
+
void clear()
|
|
602
|
+
{
|
|
603
|
+
logic = 0; seeks = 0; select = 0; retRowSize = 0;
|
|
604
|
+
nullfields = 0; nullbytes = 0;
|
|
605
|
+
}
|
|
607
606
|
int logic;
|
|
608
607
|
int seeks;
|
|
609
608
|
int select;
|
|
610
609
|
int retRowSize;
|
|
610
|
+
short nullfields;
|
|
611
|
+
short nullbytes;
|
|
611
612
|
}bsize;
|
|
612
613
|
|
|
613
614
|
inline int maxDataBuffer()
|
|
@@ -620,10 +621,13 @@ class filter
|
|
|
620
621
|
{
|
|
621
622
|
m_fields.resize(1);
|
|
622
623
|
resultField& r = m_fields[0];
|
|
623
|
-
|
|
624
|
+
const tabledef* td = m_tb->tableDef();
|
|
625
|
+
r.len = (ushort_td)td->recordlenServer();
|
|
624
626
|
r.pos = 0;
|
|
625
627
|
bsize.select = r.size();
|
|
626
628
|
bsize.retRowSize = r.len;
|
|
629
|
+
bsize.nullbytes = (short)td->nullbytes();
|
|
630
|
+
bsize.nullfields = (short)td->nullfields();
|
|
627
631
|
}
|
|
628
632
|
|
|
629
633
|
bool addSelect(resultField& r, const _TCHAR* name)
|
|
@@ -634,6 +638,12 @@ class filter
|
|
|
634
638
|
m_selectFieldIndexes.push_back(fieldNum);
|
|
635
639
|
bsize.select += r.size();
|
|
636
640
|
bsize.retRowSize += r.len;
|
|
641
|
+
|
|
642
|
+
if (m_tb->tableDef()->fieldDefs[fieldNum].isNullable())
|
|
643
|
+
{
|
|
644
|
+
++bsize.nullfields;
|
|
645
|
+
bsize.nullbytes = (bsize.nullfields + 7) / 8;
|
|
646
|
+
}
|
|
637
647
|
return true;
|
|
638
648
|
}
|
|
639
649
|
return false;
|
|
@@ -708,7 +718,7 @@ class filter
|
|
|
708
718
|
|
|
709
719
|
// Need covert data types
|
|
710
720
|
template <class T>
|
|
711
|
-
bool
|
|
721
|
+
bool doSetSeekValues(keydef* kd, int joinKeySize, const T& keyValues, size_t size, uchar_td* dataBuf )
|
|
712
722
|
{
|
|
713
723
|
autoBackup recb(m_tb, m_recordBackup);
|
|
714
724
|
int index = 0;
|
|
@@ -719,7 +729,7 @@ class filter
|
|
|
719
729
|
m_tb->setFV(kd->segments[j].fieldNum, c_str_v(keyValues[i + j]));
|
|
720
730
|
seek& l = m_seeks[index];
|
|
721
731
|
ushort_td len = m_tb->writeKeyDataTo(dataBuf, joinKeySize);
|
|
722
|
-
if (!l.setParam(dataBuf, len))
|
|
732
|
+
if (!l.setParam(dataBuf, len, false))
|
|
723
733
|
return false;
|
|
724
734
|
bsize.seeks += l.size(m_isTransactd);
|
|
725
735
|
dataBuf += len;
|
|
@@ -729,7 +739,7 @@ class filter
|
|
|
729
739
|
}
|
|
730
740
|
|
|
731
741
|
// no need covert data types
|
|
732
|
-
bool
|
|
742
|
+
bool doSetSeekValues(keydef* kd, int joinKeySize, const std::vector<keyValuePtr>& keyValues, size_t size, uchar_td* dataBuf )
|
|
733
743
|
{
|
|
734
744
|
int index = 0;
|
|
735
745
|
bsize.seeks = 0;
|
|
@@ -738,6 +748,8 @@ class filter
|
|
|
738
748
|
{
|
|
739
749
|
seek& l = m_seeks[index];
|
|
740
750
|
uchar_td* to = dataBuf;
|
|
751
|
+
/* If NULL even any one segment, all be NULL */
|
|
752
|
+
bool has_null = false;
|
|
741
753
|
if (m_seekByBookmarks)
|
|
742
754
|
{
|
|
743
755
|
const keyValuePtr& v = keyValues[i];
|
|
@@ -750,10 +762,11 @@ class filter
|
|
|
750
762
|
{
|
|
751
763
|
const keyValuePtr& v = keyValues[i + j];
|
|
752
764
|
fielddef& fd = fds[kd->segments[j].fieldNum];
|
|
753
|
-
|
|
765
|
+
has_null |= (v.ptr == NULL);
|
|
766
|
+
to = fd.keyCopy(to, (uchar_td*)v.ptr, v.len, (v.ptr == NULL));
|
|
754
767
|
}
|
|
755
768
|
}
|
|
756
|
-
if (!l.setParam(dataBuf, (ushort_td)(to - dataBuf)))
|
|
769
|
+
if (!l.setParam(dataBuf, (ushort_td)(to - dataBuf), has_null))
|
|
757
770
|
return false;
|
|
758
771
|
bsize.seeks += l.size(m_isTransactd);
|
|
759
772
|
dataBuf = to;
|
|
@@ -778,16 +791,13 @@ class filter
|
|
|
778
791
|
if (keySize == 0)
|
|
779
792
|
keySize = kd->segmentCount;
|
|
780
793
|
else if (kd->segmentCount < keySize)
|
|
781
|
-
|
|
794
|
+
return false;
|
|
782
795
|
if (size % keySize)
|
|
783
796
|
return false;
|
|
784
797
|
|
|
785
798
|
m_hasManyJoin = (kd->segmentCount != keySize) || kd->segments[0].flags.bit0;
|
|
786
799
|
if (m_hasManyJoin)
|
|
787
800
|
m_withBookmark = true;
|
|
788
|
-
if (q && m_hasManyJoin &&
|
|
789
|
-
!(q->getOptimize() & queryBase::joinHasOneOrHasMany))
|
|
790
|
-
return false;
|
|
791
801
|
m_seeks.resize(size / keySize);
|
|
792
802
|
for (int j = 0; j < keySize; ++j)
|
|
793
803
|
maxKeylen +=
|
|
@@ -811,7 +821,7 @@ class filter
|
|
|
811
821
|
if (!prebuiltSeeks(kd, keyValues.size(), q, keySize, &dataBuf))
|
|
812
822
|
return false;
|
|
813
823
|
|
|
814
|
-
if (!
|
|
824
|
+
if (!doSetSeekValues(kd, keySize, keyValues, keyValues.size(), dataBuf))
|
|
815
825
|
return false;
|
|
816
826
|
|
|
817
827
|
return true;
|
|
@@ -857,7 +867,7 @@ class filter
|
|
|
857
867
|
{
|
|
858
868
|
int recordLen = bookmarkSize() + DATASIZE_BYTE;
|
|
859
869
|
if (!ignoreFields)
|
|
860
|
-
recordLen += bsize.retRowSize;
|
|
870
|
+
recordLen += (bsize.retRowSize + bsize.nullbytes);
|
|
861
871
|
return recordLen;
|
|
862
872
|
}
|
|
863
873
|
|
|
@@ -959,7 +969,7 @@ class filter
|
|
|
959
969
|
// m_hd.len = len;//lost 2byte data at transactd
|
|
960
970
|
m_extendBuflen = (int)resultBufferNeedSize();
|
|
961
971
|
if (fieldSelected() || m_tb->valiableFormatType())
|
|
962
|
-
m_extendBuflen += m_tb->tableDef()->
|
|
972
|
+
m_extendBuflen += m_tb->tableDef()->recordlen();
|
|
963
973
|
m_tb->reallocDataBuffer(m_ddba ? len : m_extendBuflen);
|
|
964
974
|
return true;
|
|
965
975
|
}
|
|
@@ -1103,7 +1113,7 @@ public:
|
|
|
1103
1113
|
if (!prebuiltSeeks(kd, size, NULL, keySize, &dataBuf))
|
|
1104
1114
|
return false;
|
|
1105
1115
|
|
|
1106
|
-
if (!
|
|
1116
|
+
if (!doSetSeekValues(kd, keySize, values, size, dataBuf))
|
|
1107
1117
|
return false;
|
|
1108
1118
|
|
|
1109
1119
|
m_seeksMode = true;
|
|
@@ -1123,7 +1133,9 @@ public:
|
|
|
1123
1133
|
return true;
|
|
1124
1134
|
}
|
|
1125
1135
|
|
|
1126
|
-
|
|
1136
|
+
/* Used by activeTbale join. Must be support NULL pointer */
|
|
1137
|
+
bool supplySeekValue(const uchar_td* ptr[] , int len[],
|
|
1138
|
+
int keySize, int& index)
|
|
1127
1139
|
{
|
|
1128
1140
|
const tabledef* td = m_tb->tableDef();
|
|
1129
1141
|
keydef* kd = &td->keyDefs[(int)m_tb->keyNum()];
|
|
@@ -1131,12 +1143,15 @@ public:
|
|
|
1131
1143
|
|
|
1132
1144
|
seek& l = m_seeks[index];
|
|
1133
1145
|
uchar_td* to = m_buftmp;
|
|
1146
|
+
/* If NULL even any one segment, all be NULL */
|
|
1147
|
+
bool has_null = false;
|
|
1134
1148
|
for (int j = 0; j < keySize; ++j)
|
|
1135
1149
|
{
|
|
1136
1150
|
fielddef& fd = fds[kd->segments[j].fieldNum];
|
|
1137
|
-
to = fd.keyCopy(to, (uchar_td*)ptr[j], len[j]);
|
|
1151
|
+
to = fd.keyCopy(to, (uchar_td*)ptr[j], len[j], (ptr[j]==NULL));
|
|
1152
|
+
has_null |= (ptr[j] == NULL);
|
|
1138
1153
|
}
|
|
1139
|
-
if (!l.setParam(m_buftmp, (ushort_td)(to - m_buftmp)))
|
|
1154
|
+
if (!l.setParam(m_buftmp, (ushort_td)(to - m_buftmp), has_null))
|
|
1140
1155
|
return false;
|
|
1141
1156
|
bsize.seeks += l.size(m_isTransactd);
|
|
1142
1157
|
m_buftmp = to;
|
|
@@ -1196,7 +1211,7 @@ public:
|
|
|
1196
1211
|
uint_td exDataBufLen() const
|
|
1197
1212
|
{
|
|
1198
1213
|
if (fieldSelected() || m_tb->valiableFormatType())
|
|
1199
|
-
return m_extendBuflen - m_tb->tableDef()->
|
|
1214
|
+
return m_extendBuflen - m_tb->tableDef()->recordlen();
|
|
1200
1215
|
return m_extendBuflen;
|
|
1201
1216
|
}
|
|
1202
1217
|
|
|
@@ -1217,10 +1232,7 @@ public:
|
|
|
1217
1232
|
|
|
1218
1233
|
ushort_td totalSelectFieldLen() const
|
|
1219
1234
|
{
|
|
1220
|
-
|
|
1221
|
-
for (size_t i = 0; i < m_fields.size(); ++i)
|
|
1222
|
-
recordLen += m_fields[i].len;
|
|
1223
|
-
return recordLen;
|
|
1235
|
+
return bsize.nullbytes + bsize.retRowSize;
|
|
1224
1236
|
}
|
|
1225
1237
|
|
|
1226
1238
|
inline ushort_td fieldOffset(int index) const
|
|
@@ -1254,7 +1266,7 @@ public:
|
|
|
1254
1266
|
{
|
|
1255
1267
|
return !((m_fields.size() == 1) && (m_fields[0].pos == 0) &&
|
|
1256
1268
|
(m_fields[0].len ==
|
|
1257
|
-
(ushort_td)m_tb->tableDef()->
|
|
1269
|
+
(ushort_td)m_tb->tableDef()->recordlenServer()));
|
|
1258
1270
|
}
|
|
1259
1271
|
|
|
1260
1272
|
inline bool ignoreFields() const { return m_ignoreFields; }
|
|
@@ -1269,6 +1281,7 @@ public:
|
|
|
1269
1281
|
/* The Ignore fields option don't use with multi seek operation.
|
|
1270
1282
|
because if a server are not found a record then a server return
|
|
1271
1283
|
error code in a bookmark field.
|
|
1284
|
+
This is used in recordCount().
|
|
1272
1285
|
*/
|
|
1273
1286
|
inline void setIgnoreFields(bool v) { m_ignoreFields = v; }
|
|
1274
1287
|
inline bool isSeeksMode() const { return m_seeksMode; }
|
|
@@ -1284,6 +1297,7 @@ public:
|
|
|
1284
1297
|
{
|
|
1285
1298
|
return m_selectFieldIndexes;
|
|
1286
1299
|
}
|
|
1300
|
+
inline int selectedNullbytes() const { return bsize.nullbytes; };
|
|
1287
1301
|
inline const std::vector<seek>& seeks() const { return m_seeks; }
|
|
1288
1302
|
inline short stat() const { return m_stat; };
|
|
1289
1303
|
inline void setStat(short v) { m_stat = v; }
|