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
@@ -38,7 +38,7 @@ protected:
|
|
38
38
|
/** @cond INTERNAL */
|
39
39
|
struct fieldNamesImple* m_impl;
|
40
40
|
/** @endcond */
|
41
|
-
|
41
|
+
void doAddValue(const _TCHAR* v, bool isNull);
|
42
42
|
public:
|
43
43
|
fieldNames();
|
44
44
|
fieldNames(const fieldNames& r);
|
@@ -63,6 +63,16 @@ public:
|
|
63
63
|
void release();
|
64
64
|
};
|
65
65
|
|
66
|
+
class DLLLIB fieldValues : public fieldNames
|
67
|
+
{
|
68
|
+
public:
|
69
|
+
fieldValues();
|
70
|
+
fieldValues(const fieldValues& r);
|
71
|
+
fieldValues& operator=(const fieldValues& r);
|
72
|
+
void addValue(const _TCHAR* v, bool isNull);
|
73
|
+
bool isNull(int index) const;
|
74
|
+
};
|
75
|
+
|
66
76
|
struct sortField
|
67
77
|
{
|
68
78
|
std::_tstring name;
|
@@ -99,7 +109,6 @@ class DLLLIB recordsetQuery : protected query
|
|
99
109
|
|
100
110
|
struct recordsetQueryImple* m_imple;
|
101
111
|
void init(const fielddefs* fdinfo);
|
102
|
-
bool isMatch(int ret, unsigned char compType) const;
|
103
112
|
bool match(const row_ptr row) const;
|
104
113
|
|
105
114
|
public:
|
@@ -139,6 +148,42 @@ public:
|
|
139
148
|
return *this;
|
140
149
|
}
|
141
150
|
|
151
|
+
inline recordsetQuery& whenIsNull(const _TCHAR* name)
|
152
|
+
{
|
153
|
+
query::whereIsNull(name);
|
154
|
+
return *this;
|
155
|
+
}
|
156
|
+
|
157
|
+
inline recordsetQuery& whenIsNotNull(const _TCHAR* name)
|
158
|
+
{
|
159
|
+
query::whereIsNotNull(name);
|
160
|
+
return *this;
|
161
|
+
}
|
162
|
+
|
163
|
+
inline recordsetQuery& andIsNull(const _TCHAR* name)
|
164
|
+
{
|
165
|
+
query::andIsNull(name);
|
166
|
+
return *this;
|
167
|
+
}
|
168
|
+
|
169
|
+
inline recordsetQuery& andIsNotNull(const _TCHAR* name)
|
170
|
+
{
|
171
|
+
query::andIsNotNull(name);
|
172
|
+
return *this;
|
173
|
+
}
|
174
|
+
|
175
|
+
inline recordsetQuery& orIsNull(const _TCHAR* name)
|
176
|
+
{
|
177
|
+
query::orIsNull(name);
|
178
|
+
return *this;
|
179
|
+
}
|
180
|
+
|
181
|
+
inline recordsetQuery& orIsNotNull(const _TCHAR* name)
|
182
|
+
{
|
183
|
+
query::orIsNotNull(name);
|
184
|
+
return *this;
|
185
|
+
}
|
186
|
+
|
142
187
|
inline const _TCHAR* toString() const { return queryBase::toString(); }
|
143
188
|
|
144
189
|
inline query* internalQuery() { return this; }
|
@@ -157,17 +202,19 @@ protected:
|
|
157
202
|
class groupFuncBaseImple* m_imple;
|
158
203
|
|
159
204
|
void init(const fielddefs* fdinfo);
|
160
|
-
unsigned char* stringResult(int
|
205
|
+
unsigned char* stringResult(int index) const;
|
161
206
|
uchar_td resultType() const;
|
162
207
|
ushort_td resultLen() const;
|
163
208
|
void operator()(const row_ptr& row, int index, bool insert);
|
164
209
|
|
165
210
|
virtual void initResultVariable(int index);
|
166
|
-
virtual void
|
211
|
+
virtual void doCalcEachkey(const field& fd, int index);
|
212
|
+
virtual void doCalc(const row_ptr& row, int index);
|
167
213
|
virtual void doReset();
|
168
214
|
virtual void doInit(const fielddefs* fdinfo);
|
169
|
-
virtual numeric_type numericResult(int
|
170
|
-
|
215
|
+
virtual numeric_type numericResult(int index) const;
|
216
|
+
bool insertFlag() const ;
|
217
|
+
void clearInsertFlag();
|
171
218
|
|
172
219
|
public:
|
173
220
|
groupFuncBase();
|
@@ -182,7 +229,10 @@ public:
|
|
182
229
|
void setResultName(const _TCHAR* v);
|
183
230
|
int resultKey() const;
|
184
231
|
void reset();
|
232
|
+
bool isNull(int index) const;
|
233
|
+
uchar_td decimals() const;
|
185
234
|
virtual groupFuncBase* clone() = 0;
|
235
|
+
|
186
236
|
};
|
187
237
|
|
188
238
|
class recordsetImple;
|
@@ -217,10 +267,10 @@ public:
|
|
217
267
|
class DLLLIB sum : public groupFuncBase
|
218
268
|
{
|
219
269
|
protected:
|
220
|
-
void
|
270
|
+
virtual void doCalcEachkey(const field& fd, int index);
|
221
271
|
groupFuncBase* clone();
|
222
272
|
public:
|
223
|
-
sum() {}
|
273
|
+
sum() : groupFuncBase() {}
|
224
274
|
sum(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
225
275
|
static sum* create(const fieldNames& targetNames,
|
226
276
|
const _TCHAR* resultName = NULL);
|
@@ -230,54 +280,56 @@ class DLLLIB count : public groupFuncBase
|
|
230
280
|
{
|
231
281
|
protected:
|
232
282
|
groupFuncBase* clone();
|
283
|
+
void doCalcEachkey(const field& fd, int index);
|
233
284
|
void doCalc(const row_ptr& row, int index);
|
234
|
-
|
285
|
+
void initResultVariable(int index);
|
235
286
|
public:
|
236
|
-
count() {}
|
287
|
+
count(): groupFuncBase(){}
|
237
288
|
count(const _TCHAR* resultName);
|
289
|
+
count(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
238
290
|
static count* create(const _TCHAR* resultName);
|
291
|
+
static count* create(const fieldNames& targetNames,
|
292
|
+
const _TCHAR* resultName = NULL);
|
239
293
|
};
|
240
294
|
|
241
|
-
class DLLLIB avg : public
|
295
|
+
class DLLLIB avg : public groupFuncBase
|
242
296
|
{
|
243
297
|
void initResultVariable(int index);
|
244
|
-
void
|
298
|
+
void doCalcEachkey(const field& fd, int index);
|
245
299
|
numeric_type numericResult(int index) const;
|
246
300
|
groupFuncBase* clone();
|
247
|
-
|
248
301
|
public:
|
249
|
-
avg()
|
302
|
+
avg();
|
250
303
|
avg(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
251
304
|
static avg* create(const fieldNames& targetNames,
|
252
305
|
const _TCHAR* resultName = NULL);
|
306
|
+
|
253
307
|
};
|
254
308
|
|
255
309
|
#undef min
|
256
|
-
class DLLLIB min : public
|
310
|
+
class DLLLIB min : public groupFuncBase
|
257
311
|
{
|
258
312
|
protected:
|
259
|
-
|
260
|
-
void doCalc(const row_ptr& row, int index);
|
313
|
+
void doCalcEachkey(const field& fd, int index);
|
261
314
|
groupFuncBase* clone();
|
262
315
|
min& operator=(const min& r);
|
263
316
|
|
264
317
|
public:
|
265
|
-
min() {}
|
318
|
+
min() : groupFuncBase() {}
|
266
319
|
min(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
267
320
|
static min* create(const fieldNames& targetNames,
|
268
321
|
const _TCHAR* resultName = NULL);
|
269
322
|
};
|
270
323
|
|
271
324
|
#undef max
|
272
|
-
class DLLLIB max : public
|
325
|
+
class DLLLIB max : public groupFuncBase
|
273
326
|
{
|
274
|
-
|
275
|
-
void doCalc(const row_ptr& row, int index);
|
327
|
+
void doCalcEachkey(const field& fd, int index);
|
276
328
|
groupFuncBase* clone();
|
277
329
|
max& operator=(const max& r);
|
278
330
|
|
279
331
|
public:
|
280
|
-
max() {}
|
332
|
+
max() : groupFuncBase(){}
|
281
333
|
max(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
282
334
|
static max* create(const fieldNames& targetNames,
|
283
335
|
const _TCHAR* resultName = NULL);
|
@@ -290,8 +342,9 @@ protected:
|
|
290
342
|
void doCalc(const row_ptr& row, int index);
|
291
343
|
void doInit(const fielddefs* fdinfo);
|
292
344
|
groupFuncBase* clone();
|
345
|
+
void storeValue(const row_ptr& row, int index);
|
293
346
|
public:
|
294
|
-
last() {}
|
347
|
+
last() : groupFuncBase(){}
|
295
348
|
last(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
296
349
|
static last* create(const fieldNames& targetNames,
|
297
350
|
const _TCHAR* resultName = NULL);
|
@@ -300,14 +353,13 @@ public:
|
|
300
353
|
|
301
354
|
class DLLLIB first : public last
|
302
355
|
{
|
303
|
-
bool m_readed;
|
304
356
|
protected:
|
305
357
|
void doCalc(const row_ptr& row, int index);
|
306
358
|
void doReset();
|
307
359
|
groupFuncBase* clone();
|
308
360
|
first& operator=(const first& r);
|
309
361
|
public:
|
310
|
-
first() {}
|
362
|
+
first() : last() {}
|
311
363
|
first(const fieldNames& targetNames, const _TCHAR* resultName = NULL);
|
312
364
|
static first* create(const fieldNames& targetNames,
|
313
365
|
const _TCHAR* resultName = NULL);
|
@@ -54,7 +54,7 @@ void autoMemory::setParams(unsigned char* p, size_t s, short* endIndex, bool own
|
|
54
54
|
endFieldIndex = endIndex;
|
55
55
|
if (owner)
|
56
56
|
{
|
57
|
-
ptr = new unsigned char[s];
|
57
|
+
ptr = new unsigned char[s+1];
|
58
58
|
if (p)
|
59
59
|
memcpy(ptr, p, size);
|
60
60
|
else
|
@@ -122,7 +122,7 @@ autoMemory* autoMemory::create()
|
|
122
122
|
//---------------------------------------------------------------------------
|
123
123
|
// class memoryRecord
|
124
124
|
//---------------------------------------------------------------------------
|
125
|
-
inline memoryRecord::memoryRecord() : fieldsBase(NULL)
|
125
|
+
inline memoryRecord::memoryRecord() : fieldsBase(NULL), m_blockIndexCache(0)
|
126
126
|
{
|
127
127
|
#ifdef JOIN_UNLIMIT
|
128
128
|
m_memblock.reserve(ROW_MEM_BLOCK_RESERVE);
|
@@ -131,7 +131,8 @@ inline memoryRecord::memoryRecord() : fieldsBase(NULL)
|
|
131
131
|
#endif
|
132
132
|
}
|
133
133
|
|
134
|
-
inline memoryRecord::memoryRecord(fielddefs& fdinfo) : fieldsBase(&fdinfo)
|
134
|
+
inline memoryRecord::memoryRecord(fielddefs& fdinfo) : fieldsBase(&fdinfo),
|
135
|
+
m_blockIndexCache(0)
|
135
136
|
{
|
136
137
|
#ifdef JOIN_UNLIMIT
|
137
138
|
m_memblock.reserve(ROW_MEM_BLOCK_RESERVE);
|
@@ -141,7 +142,7 @@ inline memoryRecord::memoryRecord(fielddefs& fdinfo) : fieldsBase(&fdinfo)
|
|
141
142
|
}
|
142
143
|
|
143
144
|
memoryRecord::memoryRecord(const memoryRecord& r)
|
144
|
-
: fieldsBase(r.m_fns)
|
145
|
+
: fieldsBase(r.m_fns),m_blockIndexCache(r.m_blockIndexCache)
|
145
146
|
{
|
146
147
|
#ifdef JOIN_UNLIMIT
|
147
148
|
m_memblock = r.m_memblock;
|
@@ -166,6 +167,7 @@ memoryRecord& memoryRecord::operator=(const memoryRecord& r)
|
|
166
167
|
if (this != &r)
|
167
168
|
{
|
168
169
|
m_fns = r.m_fns;
|
170
|
+
m_blockIndexCache = r.m_blockIndexCache;
|
169
171
|
#ifdef JOIN_UNLIMIT
|
170
172
|
m_memblock = r.m_memblock;
|
171
173
|
#endif
|
@@ -204,20 +206,30 @@ void memoryRecord::setRecordData(autoMemory* am, unsigned char* ptr,
|
|
204
206
|
m_memblock[m_memblockSize] = am;
|
205
207
|
++m_memblockSize;
|
206
208
|
#endif
|
209
|
+
m_InvalidFlags &= ~1L;
|
207
210
|
}
|
208
211
|
|
209
212
|
void memoryRecord::copyToBuffer(table* tb, bool updateOnly) const
|
210
213
|
{
|
211
|
-
if (
|
212
|
-
memcpy(tb->fieldPtr(0), ptr(0), m_fns->totalFieldLen());
|
213
|
-
else
|
214
|
+
if (m_fns->size())
|
214
215
|
{
|
215
|
-
|
216
|
+
short index = 0;
|
217
|
+
if (!updateOnly)
|
218
|
+
memcpy(tb->fields()[index].nullPtr(), nullPtr(index),
|
219
|
+
m_fns->totalFieldLen());
|
220
|
+
else
|
216
221
|
{
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
222
|
+
for (int i = 0; i < (int)m_fns->size(); ++i)
|
223
|
+
{
|
224
|
+
const fielddef& fd = (*m_fns)[i];
|
225
|
+
// ptr() return memory block first address
|
226
|
+
if (fd.enableFlags.bitE)
|
227
|
+
{
|
228
|
+
memcpy(tb->fieldPtr(i), ptr(i) + fd.pos, fd.len);
|
229
|
+
//copy null bits
|
230
|
+
tb->setFVNull(i, operator[](i).isNull());
|
231
|
+
}
|
232
|
+
}
|
221
233
|
}
|
222
234
|
}
|
223
235
|
}
|
@@ -294,7 +306,7 @@ writableRecord::writableRecord(table* tb, const aliasMap_type* alias)
|
|
294
306
|
m_tb->clearBuffer();
|
295
307
|
m_fddefs->clear();
|
296
308
|
m_fddefs->setAliases(alias);
|
297
|
-
m_fddefs->
|
309
|
+
m_fddefs->addSelectedFields(m_tb);
|
298
310
|
setRecordData(autoMemory::create(), 0, 0, &m_endIndex, true);
|
299
311
|
}
|
300
312
|
|
@@ -376,6 +388,12 @@ void writableRecord::save()
|
|
376
388
|
}
|
377
389
|
}
|
378
390
|
|
391
|
+
void writableRecord::clear()
|
392
|
+
{
|
393
|
+
m_tb->clearBuffer(table::defaultNull);
|
394
|
+
copyFromBuffer(m_tb);
|
395
|
+
}
|
396
|
+
|
379
397
|
writableRecord* writableRecord::create(table* tb, const aliasMap_type* alias)
|
380
398
|
{
|
381
399
|
writableRecord* p = new writableRecord(tb, alias);
|
@@ -77,37 +77,38 @@ class DLLLIB memoryRecord : public fieldsBase
|
|
77
77
|
autoMemory* m_memblock[JOINLIMIT_PER_RECORD];
|
78
78
|
int m_memblockSize;
|
79
79
|
#endif
|
80
|
-
|
80
|
+
mutable int m_blockIndexCache;
|
81
81
|
static memoryRecord* create(fielddefs& fdinfo, int n);
|
82
82
|
static memoryRecord* create(const memoryRecord& m, int n);
|
83
83
|
|
84
|
-
protected:
|
85
|
-
/** @cond INTERNAL */
|
86
84
|
|
87
|
-
|
88
|
-
inline memoryRecord(fielddefs& fdinfo);
|
89
|
-
memoryRecord(const memoryRecord& r);
|
90
|
-
~memoryRecord();
|
91
|
-
memoryRecord& operator=(const memoryRecord& r);
|
92
|
-
void copyToBuffer(table* tb, bool updateOnly = false) const;
|
85
|
+
/** @cond INTERNAL */
|
93
86
|
|
94
87
|
/* return memory block first address which not field ptr address */
|
95
88
|
inline unsigned char* ptr(int index) const
|
96
89
|
{
|
90
|
+
return nullPtr(index) + (*m_fns)[index].nullbytes();
|
91
|
+
}
|
92
|
+
|
93
|
+
inline unsigned char* nullPtr(int index) const
|
94
|
+
{
|
95
|
+
return m_memblock[memoryBlockIndex(index)]->ptr;
|
96
|
+
}
|
97
|
+
|
98
|
+
inline int memoryBlockIndex(int index) const
|
99
|
+
{
|
97
100
|
for (int i = 0; i < memBlockSize(); ++i)
|
98
101
|
if (*(m_memblock[i]->endFieldIndex) > index)
|
99
|
-
return
|
102
|
+
return m_blockIndexCache = i;
|
100
103
|
assert(0);
|
101
|
-
return
|
104
|
+
return 0;
|
102
105
|
}
|
103
106
|
|
107
|
+
int memoryBlockIndexCache() const { return m_blockIndexCache;}
|
108
|
+
|
104
109
|
inline const autoMemory& memBlockByField(int index) const
|
105
110
|
{
|
106
|
-
|
107
|
-
if (*(m_memblock[i]->endFieldIndex) > index)
|
108
|
-
return *m_memblock[i];
|
109
|
-
assert(0);
|
110
|
-
return *((autoMemory*)0);
|
111
|
+
return *m_memblock[memoryBlockIndex(index)];
|
111
112
|
}
|
112
113
|
|
113
114
|
inline const autoMemory& memBlock(int index) const
|
@@ -119,10 +120,6 @@ protected:
|
|
119
120
|
#else
|
120
121
|
inline int memBlockSize() const { return m_memblockSize; }
|
121
122
|
#endif
|
122
|
-
inline void copyFromBuffer(const table* tb)
|
123
|
-
{
|
124
|
-
memcpy(ptr(0), tb->fieldPtr(0), m_fns->totalFieldLen());
|
125
|
-
}
|
126
123
|
|
127
124
|
void removeLastMemBlock()
|
128
125
|
{
|
@@ -137,9 +134,21 @@ protected:
|
|
137
134
|
}
|
138
135
|
}
|
139
136
|
|
137
|
+
void releaseMemory();
|
138
|
+
|
139
|
+
protected:
|
140
|
+
inline memoryRecord();
|
141
|
+
inline memoryRecord(fielddefs& fdinfo);
|
142
|
+
memoryRecord(const memoryRecord& r);
|
143
|
+
~memoryRecord();
|
144
|
+
memoryRecord& operator=(const memoryRecord& r);
|
145
|
+
void copyToBuffer(table* tb, bool updateOnly = false) const;
|
146
|
+
inline void copyFromBuffer(const table* tb)
|
147
|
+
{
|
148
|
+
memcpy(nullPtr(0), tb->data(), m_fns->totalFieldLen());
|
149
|
+
}
|
140
150
|
void setRecordData(autoMemory* am, unsigned char* ptr, size_t size,
|
141
151
|
short* endFieldIndex, bool owner = false);
|
142
|
-
void releaseMemory();
|
143
152
|
|
144
153
|
/** @endcond */
|
145
154
|
public:
|
@@ -176,6 +185,7 @@ public:
|
|
176
185
|
void del(bool KeysetAlrady = false, bool noSeek = false);
|
177
186
|
void update(bool KeysetAlrady = false, bool noSeek = false);
|
178
187
|
void save();
|
188
|
+
void clear();// orverride
|
179
189
|
|
180
190
|
};
|
181
191
|
|
@@ -934,7 +934,7 @@ const char* nsdatabase::toServerUri(char* buf, int buflen, const _TCHAR* src,
|
|
934
934
|
if (trd)
|
935
935
|
{
|
936
936
|
stringConverter cv(CP_UTF8, GetACP());
|
937
|
-
cv.convert(buf, buflen, src, strlen_t(src))
|
937
|
+
cv.convert(buf, buflen, src, strlen_t(src)+1);// convert include null.
|
938
938
|
return buf;
|
939
939
|
}
|
940
940
|
#endif
|
@@ -55,7 +55,10 @@ DLLLIB BTRCALLID_PTR getTrnsctdEntryPoint();
|
|
55
55
|
class DLLLIB nsdatabase
|
56
56
|
{
|
57
57
|
friend class nstable;
|
58
|
+
friend class dbdef;
|
59
|
+
/** @cond INTERNAL */
|
58
60
|
friend bool reconnectSharedConnection(const void* ptr);
|
61
|
+
/** @endcond */
|
59
62
|
struct nsdbimpl* m_nsimpl;
|
60
63
|
nsdatabase(const nsdatabase&);
|
61
64
|
static unsigned int m_execCodepage;
|
@@ -79,7 +82,7 @@ protected:
|
|
79
82
|
void internalRelease() { nsdatabase::release(); }
|
80
83
|
void doReconnect(nstable* tb);
|
81
84
|
virtual bool doReopenDatabaseSchema(){ return true; }
|
82
|
-
|
85
|
+
virtual void* getExtendBufferForOpen(uint_td& size){ return NULL; };
|
83
86
|
public:
|
84
87
|
nsdatabase();
|
85
88
|
virtual void release();
|
@@ -30,10 +30,11 @@
|
|
30
30
|
#pragma package(smart_init)
|
31
31
|
|
32
32
|
/* TODO: To be support internal started transction with original flag.*/
|
33
|
-
|
34
|
-
#
|
35
|
-
#else
|
33
|
+
|
34
|
+
#if (defined(__x86_32__) || defined(__APPLE_32__))
|
36
35
|
#define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEE
|
36
|
+
#else
|
37
|
+
#define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEEFEEEFEEE
|
37
38
|
#endif
|
38
39
|
namespace bzs
|
39
40
|
{
|
@@ -49,14 +50,15 @@ namespace client
|
|
49
50
|
struct nstimpl
|
50
51
|
{
|
51
52
|
nstimpl()
|
52
|
-
:
|
53
|
+
: bulkIns(NULL), refCount(1), percentage(0), bookmarkLen(0), tableid(0), mode(0),
|
53
54
|
shared(false), isOpen(false)
|
54
55
|
{
|
55
56
|
memset(posblk, 0 ,POS_BLOCK_SIZE);
|
57
|
+
uri[0] = 0x00;
|
56
58
|
}
|
57
|
-
int refCount;
|
58
59
|
bulkInsert* bulkIns;
|
59
60
|
nsdatabase* nsdb;
|
61
|
+
int refCount;
|
60
62
|
percentage_td percentage;
|
61
63
|
ushort_td bookmarkLen;
|
62
64
|
bookmark_td bookmark;
|
@@ -211,7 +213,6 @@ void nstable::addref(void)
|
|
211
213
|
|
212
214
|
void nstable::release()
|
213
215
|
{
|
214
|
-
|
215
216
|
/* If before called database::drop() database::close() etc then
|
216
217
|
nstable::destory called.
|
217
218
|
Client cache nstable pointer that is invalid.
|
@@ -227,6 +228,7 @@ void nstable::release()
|
|
227
228
|
}
|
228
229
|
catch (...)
|
229
230
|
{
|
231
|
+
|
230
232
|
}
|
231
233
|
}
|
232
234
|
|
@@ -240,7 +242,8 @@ void nstable::doClose()
|
|
240
242
|
{
|
241
243
|
if (test(this) && m_impl && (m_impl->isOpen))
|
242
244
|
{
|
243
|
-
|
245
|
+
if (m_impl->nsdb->btrvFunc())
|
246
|
+
tdap(TD_CLOSETABLE);
|
244
247
|
if (m_stat == STATUS_SUCCESS)
|
245
248
|
m_impl->isOpen = false;
|
246
249
|
}
|
@@ -366,7 +369,7 @@ void nstable::doOpen(const _TCHAR* name, char_td mode, const _TCHAR* ownerName)
|
|
366
369
|
else
|
367
370
|
#endif
|
368
371
|
{
|
369
|
-
if (m_impl->uri
|
372
|
+
if (_tcscmp(m_impl->uri, name))
|
370
373
|
_tcscpy_s(m_impl->uri, MAX_PATH, name);
|
371
374
|
}
|
372
375
|
// for trnasctd
|
@@ -396,27 +399,35 @@ void nstable::doOpen(const _TCHAR* name, char_td mode, const _TCHAR* ownerName)
|
|
396
399
|
else
|
397
400
|
m_keynum = mode;
|
398
401
|
|
399
|
-
char ownerNameBuf[OWNERNAME_SIZE] = { 0x00 };
|
400
|
-
|
402
|
+
char ownerNameBuf[OWNERNAME_SIZE];// = { 0x00 };
|
403
|
+
uint_td size = 0;
|
404
|
+
char* buf = (char*)nsdb()->getExtendBufferForOpen(size);
|
405
|
+
if (!buf)
|
406
|
+
buf = ownerNameBuf;
|
407
|
+
|
408
|
+
m_pdata = (void*)buf;
|
401
409
|
if (NULL != ownerName && 0x00 != ownerName[0])
|
402
410
|
{
|
403
|
-
|
404
|
-
|
405
|
-
|
411
|
+
toCharCpy(buf, ownerName, OWNERNAME_SIZE);
|
412
|
+
m_datalen = (uint_td)strlen(buf) + 1;
|
413
|
+
|
406
414
|
if (m_datalen > 11)
|
407
415
|
{
|
408
416
|
m_stat = STATUS_TOO_LONG_OWNERNAME;
|
409
417
|
goto clean;
|
410
418
|
}
|
411
|
-
if (m_datalen < sizeof(
|
412
|
-
m_datalen = sizeof(
|
419
|
+
if (m_datalen < sizeof(ushort_td))
|
420
|
+
m_datalen = sizeof(ushort_td);/* for bookmarklen*/
|
413
421
|
}
|
414
422
|
else
|
415
423
|
{
|
416
424
|
m_impl->bookmarkLen = 0;
|
417
|
-
|
425
|
+
memcpy(buf, &m_impl->bookmarkLen, sizeof(ushort_td));
|
426
|
+
//m_pdata = &m_impl->bookmarkLen;
|
418
427
|
m_datalen = sizeof(ushort_td);/* for bookmarklen*/
|
419
428
|
}
|
429
|
+
if (size)
|
430
|
+
m_datalen = size;
|
420
431
|
tdap(TD_OPENTABLE);
|
421
432
|
if (m_stat == STATUS_SUCCESS)
|
422
433
|
{
|
@@ -424,10 +435,15 @@ void nstable::doOpen(const _TCHAR* name, char_td mode, const _TCHAR* ownerName)
|
|
424
435
|
m_impl->mode = mode;
|
425
436
|
if (!isUseTransactd())
|
426
437
|
m_impl->bookmarkLen = BTRV_BOOKMARK_SIZE;
|
427
|
-
else
|
428
|
-
|
429
|
-
|
430
|
-
m_impl->bookmarkLen =
|
438
|
+
else
|
439
|
+
{
|
440
|
+
ushort_td* p = (ushort_td*)m_pdata;
|
441
|
+
m_impl->bookmarkLen = *p;
|
442
|
+
if (m_impl->bookmarkLen == 0)
|
443
|
+
m_impl->bookmarkLen = BTRV_BOOKMARK_SIZE;
|
444
|
+
else if (m_impl->bookmarkLen == 0xFFFF) //No primary
|
445
|
+
m_impl->bookmarkLen = 0;
|
446
|
+
}
|
431
447
|
}
|
432
448
|
clean:
|
433
449
|
m_keybuf = svm_keybuf;
|
@@ -896,7 +912,7 @@ short_td nstable::tdapErr(HWND hWnd, short_td status, const _TCHAR* TableName,
|
|
896
912
|
}
|
897
913
|
#pragma warning(default : 4996)
|
898
914
|
|
899
|
-
if (
|
915
|
+
if (hWnd == 0)
|
900
916
|
return errorCode;
|
901
917
|
|
902
918
|
#ifdef _WIN32
|
@@ -937,9 +953,11 @@ _TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
|
|
937
953
|
_tfullpath(buf, path, MAX_PATH);
|
938
954
|
else
|
939
955
|
#endif
|
940
|
-
|
941
|
-
_TUCHAR* p =
|
942
|
-
_TUCHAR*
|
956
|
+
stripAuth(path, buf, MAX_PATH);
|
957
|
+
_TUCHAR* p = _tcsmrchr((_TUCHAR*)buf, PSEPARATOR_C);
|
958
|
+
_TUCHAR* p1 = _tcsmrchr((_TUCHAR*)buf, '?');
|
959
|
+
if (p1 && (p1 > p)) p = p1;
|
960
|
+
_TUCHAR* p2 = _tcsmrchr((_TUCHAR*)buf, '=');
|
943
961
|
if (p && p2)
|
944
962
|
{
|
945
963
|
if (p2 > p)
|
@@ -951,6 +969,14 @@ _TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
|
|
951
969
|
*p = 0x00;
|
952
970
|
if (p2)
|
953
971
|
*(p2 + 1) = 0x00;
|
972
|
+
if (uri && !_tcsstr(buf, _T("dbfile=")))
|
973
|
+
{
|
974
|
+
p = _tcsmrchr((_TUCHAR*)buf, '?');
|
975
|
+
if (!p)
|
976
|
+
_tcscat(buf, _T("?dbfile="));
|
977
|
+
else
|
978
|
+
_tcscat(buf, _T("dbfile="));
|
979
|
+
}
|
954
980
|
return buf;
|
955
981
|
}
|
956
982
|
|
@@ -1006,6 +1032,25 @@ bool nstable::test(nstable* p)
|
|
1006
1032
|
return false;
|
1007
1033
|
}
|
1008
1034
|
|
1035
|
+
void nstable::test_store(const char* values)
|
1036
|
+
{
|
1037
|
+
void* svm_pdata = m_pdata;
|
1038
|
+
m_stat = STATUS_SUCCESS;
|
1039
|
+
m_keylen = m_keybuflen;
|
1040
|
+
m_datalen = (uint_td)strlen(values) + 1;
|
1041
|
+
m_pdata = (void*)values;
|
1042
|
+
tdap(TD_STORE_TEST);
|
1043
|
+
m_pdata = svm_pdata;
|
1044
|
+
}
|
1045
|
+
|
1046
|
+
void nstable::setTimestampMode(int mode)
|
1047
|
+
{
|
1048
|
+
char_td keynum = m_keynum;
|
1049
|
+
m_keynum = (char_td)mode;
|
1050
|
+
tdap(TD_SET_TIMESTAMP_MODE);
|
1051
|
+
m_keynum = keynum;
|
1052
|
+
}
|
1053
|
+
|
1009
1054
|
} // namespace client
|
1010
1055
|
} // namespace tdap
|
1011
1056
|
} // namespace protocol
|
@@ -72,9 +72,9 @@ private:
|
|
72
72
|
|
73
73
|
protected:
|
74
74
|
void* m_pdata;
|
75
|
+
void* m_keybuf;
|
75
76
|
uint_td m_buflen;
|
76
77
|
uint_td m_datalen;
|
77
|
-
void* m_keybuf;
|
78
78
|
ushort_td m_op;
|
79
79
|
keylen_td m_keybuflen;
|
80
80
|
keylen_td m_keylen;
|
@@ -225,6 +225,7 @@ public:
|
|
225
225
|
void unlock(bookmark_td& bm);
|
226
226
|
void unlock();
|
227
227
|
char_td mode() const;
|
228
|
+
void setTimestampMode(int mode);
|
228
229
|
static _TCHAR* getFileName(const _TCHAR* uri, _TCHAR* retbuf);
|
229
230
|
static short_td tdapErr(HWND hWnd, short_td status,
|
230
231
|
const _TCHAR* tableName = NULL,
|
@@ -235,6 +236,7 @@ public:
|
|
235
236
|
static bool existsFile(const _TCHAR* filename);
|
236
237
|
/** @cond INTERNAL */
|
237
238
|
static bool test(nstable* p);
|
239
|
+
void test_store(const char* values);
|
238
240
|
/** @endcond*/
|
239
241
|
};
|
240
242
|
|