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.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. 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 comapre value
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
- unsigned short len;
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(len) + len;
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(len);
223
+ int n = sizeof(unsigned short);
235
224
  if (isTransactd)
236
- memcpy(p, &len, n);
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
- field fd(buf, fdd, tb->m_fddefs);
353
- fd = value;
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(fdd, buf, part);
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()->maxRecordLen)
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
- void clear() { logic = 0; seeks = 0; select = 0; retRowSize = 0;}
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
- r.len = (ushort_td)m_tb->tableDef()->maxRecordLen;
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 doSsetSeekValues(keydef* kd, int joinKeySize, const T& keyValues, size_t size, uchar_td* dataBuf )
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 doSsetSeekValues(keydef* kd, int joinKeySize, const std::vector<keyValuePtr>& keyValues, size_t size, uchar_td* dataBuf )
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
- to = fd.keyCopy(to, (uchar_td*)v.ptr, v.len);
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
- return false;
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 (!doSsetSeekValues(kd, keySize, keyValues, keyValues.size(), dataBuf))
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()->maxRecordLen;
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 (!doSsetSeekValues(kd, keySize, values, size, dataBuf))
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
- bool supplySeekValue(const uchar_td* ptr[] , int len[], int keySize, int& index)
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()->maxRecordLen;
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
- ushort_td recordLen = 0;
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()->maxRecordLen));
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; }