transactd 2.4.5 → 3.0.0

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