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
@@ -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; }