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
@@ -72,12 +72,6 @@ protected:
72
72
 
73
73
  class DLLLIB fielddefs : public fieldShare
74
74
  {
75
- struct infoImple* m_imple;
76
- void aliasing(fielddef* p) const;
77
- fielddefs();
78
- ~fielddefs();
79
- fielddefs(const fielddefs& r);
80
- fielddefs& operator=(const fielddefs& r);
81
75
  friend class table;
82
76
  friend class recordsetImple;
83
77
  friend class writableRecord;
@@ -85,21 +79,26 @@ class DLLLIB fielddefs : public fieldShare
85
79
  friend class recordsetQuery;
86
80
  friend struct recordsetQueryImple;
87
81
  friend class fieldsBase;
88
- public:
89
- void addAllFileds(tabledef* def);
90
- protected:
91
- void copyFrom(const class table* tb);
82
+ friend class fields;
83
+ friend class field;
84
+
85
+ struct infoImple* m_imple;
86
+ void aliasing(fielddef* p) const;
87
+ fielddefs();
88
+ ~fielddefs();
89
+ fielddefs(const fielddefs& r);
90
+ fielddefs& operator=(const fielddefs& r);
91
+ bool mysqlnullEnable() const;
92
92
  bool canUnion(const fielddefs& r) const;
93
93
  size_t totalFieldLen() const;
94
94
  void resetUpdateIndicator();
95
95
  void setAliases(const aliasMap_type* p);
96
- void push_back(const fielddef* p, bool rePosition = false);
96
+ void push_back(const fielddef* p);
97
+ void calcFieldPos(int startIndex, bool mysqlNull);
97
98
  void remove(int index);
98
99
  void reserve(size_t size);
99
100
  public:
100
101
  void clear();
101
-
102
- public:
103
102
  fielddefs* clone() const;
104
103
  int indexByName(const std::_tstring& name) const;
105
104
  const fielddef& operator[](int index) const;
@@ -107,70 +106,91 @@ public:
107
106
  const fielddef& operator[](const std::_tstring& name) const;
108
107
  bool checkIndex(int index) const;
109
108
  size_t size() const;
109
+ void addAllFileds(const tabledef* def);
110
+ void addSelectedFields(const class table* tb);
110
111
  void release();
111
112
  static fielddefs* create();
112
113
  };
113
114
 
114
- /** @cond INTERNAL */
115
-
116
- typedef int (*compFieldFunc)(const class field& l, const class field& r,
117
- char logType);
118
- extern int compWString(const field& l, const field& r, char logType);
119
- extern int compiWString(const field& l, const field& r, char logType);
120
-
121
- /** @endcond */
122
-
123
115
  class DLLLIB field
124
116
  {
125
117
  friend class table;
126
118
  friend class fieldsBase;
127
- friend class CField; // atl interface
119
+ friend class CField; // atl interface
120
+ friend class memoryRecord; // nullPtr()
121
+ friend class recordsetQuery; //nullcomp
122
+ friend class recordsetImple; //offsetBlobPtr
123
+ friend struct logic; //isCompPartAndMakeValue
128
124
  /** @cond INTERNAL */
129
125
  friend int compBlob(const field& l, const field& r, char logType);
130
126
  /** @endcond */
131
127
  fielddef* m_fd;
132
128
  unsigned char* m_ptr;
133
129
  const class fielddefs* m_fds;
134
-
130
+ mutable unsigned char* m_cachedNullPtr;
131
+ mutable unsigned char m_nullbit;
132
+ unsigned char m_nullSign;
133
+
134
+ void nullPtrCache() const;
135
135
  int blobLenBytes() const { return m_fd->blobLenBytes(); }
136
+ __int64 readValue64() const;
137
+ void storeValue64(__int64 value);
138
+ double readValueDbl() const;
139
+ void storeValueDbl(double value);
140
+ void storeValueStrA(const char* data);
141
+ const char* readValueStrA() const;
142
+ #ifdef _WIN32
143
+ void storeValueStrW(const WCHAR* data);
144
+ const WCHAR* readValueStrW() const;
145
+ #endif
146
+ void storeValueNumeric(double data);
147
+ double readValueNumeric() const;
148
+ void storeValueDecimal(double data);
149
+ double readValueDecimal() const;
150
+ void* nullPtr() const;
151
+ int nullComp(const field& r, char log) const;
152
+ int nullComp(char log) const;
153
+ bool isCompPartAndMakeValue();
154
+ void offsetBlobPtr(size_t offset);
136
155
 
137
- private:
138
156
  // ---- bigin regacy interfaces ---- //
139
- unsigned char getFVbyt() const;
140
- short getFVsht() const;
141
- int getFVint() const;
142
- int getFVlng() const;
157
+ const char* getFVAstr() const;
158
+ #ifdef _WIN32
159
+ const wchar_t* getFVWstr() const;
160
+ #endif
143
161
  __int64 getFV64() const;
144
- float getFVflt() const;
145
162
  double getFVdbl() const;
146
163
  void* getFVbin(uint_td& size) const;
147
- const char* getFVAstr() const;
164
+ inline unsigned char getFVbyt() const { return (unsigned char)getFV64();}
165
+ inline short getFVsht() const { return (short)getFV64();}
166
+ inline int getFVint() const { return (int)getFV64();}
167
+ inline int getFVlng() const { return (int)getFV64();}
168
+ inline float getFVflt() const { return (float)getFVdbl();}
169
+
148
170
  #ifdef _WIN32
149
- const wchar_t* getFVWstr() const;
150
171
  void setFVW(const wchar_t* data);
151
172
  #endif
152
- void setFV(float data);
153
173
  void setFV(double data);
154
- void setFV(unsigned char data);
155
- void setFV(short data);
156
- void setFV(int data);
157
174
  void setFV(__int64 data);
158
175
  void setFVA(const char* data);
159
176
  void setFV(const void* data, uint_td size);
160
177
  #ifdef _UNICODE
161
178
  inline const wchar_t* getFVstr() const { return getFVWstr(); };
162
179
  inline void setFV(const wchar_t* data) { setFVW(data); };
180
+ inline void setFV(const std::wstring& p) { setFVW(p.c_str()); }
163
181
  #else
164
182
  inline const char* getFVstr() const { return getFVAstr(); };
165
- inline void setFV(const char* data) { setFVA(data); };
166
183
  #endif
167
- double getFVnumeric() const;
168
- double getFVDecimal() const;
169
- void setFVDecimal(double data);
170
- void setFVNumeric(double data);
184
+ inline void setFV(const char* data) { setFVA(data); };
185
+ inline void setFV(float data){ setFV((double)data); }
186
+ inline void setFV(unsigned char data) { setFV((__int64)data); }
187
+ inline void setFV(short data) { setFV((__int64)data); }
188
+ inline void setFV(int data) { setFV((__int64)data); }
189
+ inline void setFV(const std::string& p) { setFVA(p.c_str()); };
190
+ inline void setFV(const bitset& v) { setFV(v.internalValue()); };
191
+
171
192
  // ---- end regacy interfaces ---- //
172
193
 
173
-
174
194
  /** @cond INTERNAL */
175
195
  #if defined(SWIG) || \
176
196
  defined(SWIG_BUILDING) // SWIG Wrapper need public constructor
@@ -181,13 +201,26 @@ public:
181
201
 
182
202
  public:
183
203
  /** @cond INTERNAL */
184
- inline field(unsigned char* ptr, const fielddef& fd, const fielddefs* fds)
185
- : m_fd((fielddef*)&fd), m_ptr(ptr), m_fds(fds){};
204
+ // nullPtr and nullbit is all field same.
205
+ inline field(unsigned char* ptr, const fielddef& fd, const fielddefs* fds,
206
+ bool nullField = false)
207
+ : m_fd((fielddef*)&fd), m_ptr(ptr), m_fds(fds), m_cachedNullPtr(NULL), m_nullbit(0)
208
+ {
209
+ if (nullField)
210
+ {
211
+ m_cachedNullPtr = (unsigned char*)&m_nullSign;
212
+ m_nullSign = 0xff;
213
+ m_nullbit = 1;
214
+ }
215
+ }
186
216
  /** @endcond */
187
217
 
188
- // To inline
189
- inline field(const field& r) : m_fd(r.m_fd), m_ptr(r.m_ptr), m_fds(r.m_fds)
218
+ /* swig using copy constructor */
219
+ inline field(const field& r) : m_fd(r.m_fd), m_ptr(r.m_ptr), m_fds(r.m_fds),
220
+ m_cachedNullPtr(NULL),m_nullbit(r.m_nullbit), m_nullSign(r.m_nullSign)
190
221
  {
222
+ if (r.m_cachedNullPtr == (unsigned char*)&r.m_nullSign)
223
+ m_cachedNullPtr = (unsigned char*)&m_nullSign;
191
224
  }
192
225
 
193
226
  inline field& operator=(const field& r)
@@ -195,6 +228,12 @@ public:
195
228
  m_fd = r.m_fd;
196
229
  m_ptr = r.m_ptr;
197
230
  m_fds = r.m_fds;
231
+ m_nullSign = r.m_nullSign;
232
+ m_nullbit = r.m_nullbit;
233
+ if (r.m_cachedNullPtr == (unsigned char*)&r.m_nullSign)
234
+ m_cachedNullPtr = (unsigned char*)&m_nullSign;
235
+ else
236
+ m_cachedNullPtr = NULL;
198
237
  return *this;
199
238
  }
200
239
 
@@ -220,106 +259,55 @@ public:
220
259
 
221
260
  inline double d() const { return getFVdbl(); }
222
261
 
223
- inline field& operator=(const _TCHAR* p)
224
- {
225
- setFV(p);
226
- m_fd->enableFlags.bitE = true;
227
- return *this;
228
- }
229
-
230
- inline field& operator=(const std::_tstring& p)
231
- {
232
- setFV(p.c_str());
233
- m_fd->enableFlags.bitE = true;
234
- return *this;
235
- }
236
-
237
- #ifdef _UNICODE
238
- inline field& operator=(const char* p)
239
- {
240
- setFVA(p);
241
- m_fd->enableFlags.bitE = true;
242
- return *this;
243
- }
262
+ bool isNull() const;
244
263
 
245
- inline field& operator=(const std::string& p)
264
+ void setNull(bool v);
265
+
266
+ template <class T>
267
+ inline field& operator=(const T c)
246
268
  {
247
- setFVA(p.c_str());
269
+ setFV(c);
248
270
  m_fd->enableFlags.bitE = true;
249
271
  return *this;
250
272
  }
251
273
 
252
- #endif
274
+ inline bool operator!=(const _TCHAR* p) const { return !operator==(p); }
253
275
 
254
- inline field& operator=(int v)
276
+ inline bool operator==(const _TCHAR* p) const
255
277
  {
256
- setFV(v);
257
- m_fd->enableFlags.bitE = true;
258
- return *this;
278
+ return (isNull() == false) && (_tcscmp(p, c_str()) == 0);
259
279
  }
260
280
 
261
- inline field& operator=(__int64 v)
262
- {
263
- setFV(v);
264
- m_fd->enableFlags.bitE = true;
265
- return *this;
266
- }
281
+ inline bool operator!=(int v) const { return !operator==(v); }
282
+ inline bool operator==(int v) const { return (isNull() == false) && (v == i()); }
267
283
 
268
- inline field& operator=(float v)
269
- {
270
- setFV(v);
271
- m_fd->enableFlags.bitE = true;
272
- return *this;
273
- }
284
+ inline bool operator!=(short v) const { return !operator==(v); }
285
+ inline bool operator==(short v) const { return (isNull() == false) && (v == i16()); }
274
286
 
275
- inline field& operator=(double v)
276
- {
277
- setFV(v);
278
- m_fd->enableFlags.bitE = true;
279
- return *this;
280
- }
281
-
282
- inline bool operator!=(const _TCHAR* p)
283
- {
284
- return (_tcscmp(p, c_str()) != 0);
285
- };
286
- inline bool operator==(const _TCHAR* p)
287
- {
288
- return (_tcscmp(p, c_str()) == 0);
289
- };
287
+ inline bool operator!=(__int64 v) const { return !operator==(v); }
288
+ inline bool operator==(__int64 v) const { return (isNull() == false) && (v == i64()); }
290
289
 
291
- inline bool operator!=(int v) { return (v != i()); };
292
- inline bool operator==(int v) { return (v == i()); };
290
+ inline bool operator!=(float v) const { return !operator==(v); }
291
+ inline bool operator==(float v) const { return (isNull() == false) && (v == f()); }
293
292
 
294
- inline bool operator!=(short v) { return (v != i16()); };
295
- inline bool operator==(short v) { return (v == i16()); };
296
-
297
- inline bool operator!=(__int64 v) { return (v != i64()); };
298
- inline bool operator==(__int64 v) { return (v == i64()); };
299
-
300
- inline bool operator!=(float v) { return (v != f()); };
301
- inline bool operator==(float v) { return (v == f()); };
302
-
303
- inline bool operator!=(double v) { return (v != d()); };
304
- inline bool operator==(double v) { return (v == d()); };
293
+ inline bool operator!=(double v) const { return !operator==(v); }
294
+ inline bool operator==(double v) const { return (isNull() == false) && (v == d()); }
305
295
 
306
296
  inline void setBin(const void* data, uint_td size)
307
297
  {
308
298
  setFV(data, size);
309
299
  m_fd->enableFlags.bitE = true;
310
300
  }
311
- inline void* getBin(uint_td& size) { return getFVbin(size); };
301
+ inline void* getBin(uint_td& size) const { return getFVbin(size); };
312
302
 
313
- int comp(const field& r, char logType = CMPLOGICAL_VAR_COMP_ALL) const;
303
+ inline bitset getBits() const { return bitset(i64());}
314
304
 
315
- /** @cond INTERNAL */
316
- bool isCompPartAndMakeValue();
317
- void offsetBlobPtr(size_t offset);
318
- compFieldFunc getCompFunc(char logType) const;
319
- /** @endcond */
305
+ int comp(const field& r, char logType = CMPLOGICAL_VAR_COMP_ALL) const;
320
306
  };
321
307
 
308
+
322
309
  /** @cond INTERNAL */
310
+ #ifndef SWIG
323
311
  /* For template tget type num by type.*/
324
312
 
325
313
  inline int getFieldType(int)
@@ -389,6 +377,7 @@ inline const _TCHAR* fieldValue(const field& fd, const _TCHAR*)
389
377
 
390
378
  DLLLIB const fielddef& dummyFd();
391
379
 
380
+ #endif // ndef SWIG
392
381
  /** @endcond */
393
382
 
394
383
  } // namespace client
@@ -122,16 +122,21 @@ class autoMemory;
122
122
  /* copyable */
123
123
  class fieldsBase : public refarymem
124
124
  {
125
- friend class multiRecordAlocatorImple;
126
- friend class recordsetImple;
127
- friend class recordsetQuery;
125
+ friend class multiRecordAlocatorImple; // null_ptr setInvalidMemblock ...
126
+ friend class recordsetImple; // setRecordData setFielddefs
127
+ friend class recordsetQuery; // setRecordData
128
+ friend class groupQueryImple; // setInvalidMemblock
128
129
 
129
130
  virtual unsigned char* ptr(int index) const = 0;
131
+ virtual unsigned char* nullPtr(int index) const = 0;
132
+ virtual int memoryBlockIndex(int index) const { return 0;}
133
+ virtual int memoryBlockIndexCache() const { return 0;}
130
134
 
131
135
  protected:
132
136
  /** @cond INTERNAL */
133
137
  fielddefs* m_fns;
134
- bool m_invalidRecord;
138
+ unsigned int m_InvalidFlags;
139
+
135
140
  virtual table* tbptr() const { return NULL; }
136
141
 
137
142
  void throwIndexError(short index) const
@@ -151,7 +156,7 @@ protected:
151
156
  }
152
157
 
153
158
  explicit inline fieldsBase(fielddefs* fns)
154
- : refarymem(), m_fns(fns), m_invalidRecord(false)
159
+ : refarymem(), m_fns(fns), m_InvalidFlags(0)
155
160
  {
156
161
  }
157
162
 
@@ -161,24 +166,44 @@ protected:
161
166
 
162
167
  virtual void setRecordData(autoMemory* am, unsigned char* ptr, size_t size,
163
168
  short* endFieldIndex, bool owner = false){};
169
+
170
+ inline void setInvalidMemblock(short index)
171
+ {
172
+ int num = memoryBlockIndex(index);
173
+ m_InvalidFlags |= ((2L << num) | 1L);
174
+ }
175
+
164
176
  /** @endcond */
165
177
  public:
166
178
 
167
179
  virtual ~fieldsBase(){};
168
180
 
169
- inline void setInvalidRecord(bool v) { m_invalidRecord = v; }
181
+ inline bool isInvalidRecord() const
182
+ {
183
+ return (m_InvalidFlags & 1) != 0;
184
+ }
170
185
 
171
- inline bool isInvalidRecord() const { return m_invalidRecord; }
186
+ inline void setInvalidRecord(bool v)
187
+ {
188
+ if (v)
189
+ m_InvalidFlags |= 1L;
190
+ else
191
+ m_InvalidFlags &= ~1L;
192
+ }
172
193
 
173
194
  inline field getFieldNoCheck(short index) const
174
195
  {
175
- return field(ptr((short)index), (*m_fns)[(short)index], m_fns);
196
+ unsigned char* p = ptr(index);
197
+ bool nullfield = (m_InvalidFlags &
198
+ (2L << memoryBlockIndexCache())) != 0;
199
+
200
+ return field(p, (*m_fns)[index], m_fns, nullfield);
176
201
  }
177
202
 
178
203
  inline field operator[](short index) const
179
204
  {
180
205
  if (m_fns->checkIndex(index))
181
- return field(ptr((short)index), (*m_fns)[(short)index], m_fns);
206
+ return getFieldNoCheck(index);
182
207
 
183
208
  throwIndexError(index);
184
209
  return field(NULL, dummyFd(), m_fns);
@@ -229,7 +254,12 @@ class fields : public fieldsBase
229
254
 
230
255
  inline unsigned char* ptr(int index) const
231
256
  {
232
- return (unsigned char*)m_tb.data();
257
+ return nullPtr(index) + (*m_fns)[index].nullbytes();
258
+ }
259
+
260
+ inline unsigned char* nullPtr(int index) const
261
+ {
262
+ return ((unsigned char*)m_tb.data());
233
263
  }
234
264
 
235
265
  table* tbptr() const { return &m_tb; }