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