transactd 2.3.0 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
- data/CMakeLists.txt +20 -15
- data/{README-JA → README-JA.md} +23 -23
- data/{README → README.md} +22 -24
- data/RELEASE_NOTE +120 -0
- data/RELEASE_NOTE-JA +110 -0
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
- data/build/swig/tdcl.i +22 -2
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -1
- data/build/tdclrb/CMakeLists.txt +6 -1
- data/build/tdclrb/bldgem/extconf.rb +5 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +44 -40
- data/source/bzs/db/engine/mysql/database.h +28 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
- data/source/bzs/db/engine/mysql/dbManager.h +2 -7
- data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
- data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
- data/source/bzs/db/protocol/tdap/client/client.h +41 -11
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
- data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
- data/source/bzs/db/protocol/tdap/client/database.h +3 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
- data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
- data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
- data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
- data/source/bzs/db/protocol/tdap/client/request.h +28 -11
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
- data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
- data/source/bzs/db/protocol/tdap/client/table.h +20 -5
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
- data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
- data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
- data/source/bzs/db/protocol/tdap/uri.h +41 -6
- data/source/bzs/db/transactd/appModule.cpp +0 -1
- data/source/bzs/db/transactd/appModule.h +0 -2
- data/source/bzs/db/transactd/connManager.cpp +202 -33
- data/source/bzs/db/transactd/connManager.h +11 -4
- data/source/bzs/db/transactd/connectionRecord.h +19 -5
- data/source/bzs/db/transactd/transactd.cpp +39 -8
- data/source/bzs/env/crosscompile.cpp +1 -1
- data/source/bzs/example/queryData.cpp +1 -1
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
- data/source/bzs/netsvc/client/tcpClient.h +171 -106
- data/source/bzs/netsvc/server/IAppModule.h +0 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
- data/source/bzs/netsvc/server/serverPipe.h +2 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
- data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
- data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
- data/source/global/tdclatl/Bookmark.cpp +28 -0
- data/source/global/tdclatl/Bookmark.h +65 -0
- data/source/global/tdclatl/Database.cpp +2 -2
- data/source/global/tdclatl/Database.h +1 -3
- data/source/global/tdclatl/DbDef.cpp +6 -0
- data/source/global/tdclatl/DbDef.h +1 -0
- data/source/global/tdclatl/QueryBase.cpp +29 -0
- data/source/global/tdclatl/QueryBase.h +4 -0
- data/source/global/tdclatl/Record.cpp +14 -2
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Table.cpp +80 -16
- data/source/global/tdclatl/Table.h +23 -8
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
- data/source/global/tdclatl/activeTable.cpp +2 -2
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +64 -14
- metadata +12 -12
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/tdclcpp/BUILDNUMBER.txt +0 -1
- data/build/tdclrb/BUILDNUMBER.txt +0 -1
- /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
- /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
- /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
@@ -31,13 +31,7 @@ namespace bzs
|
|
31
31
|
|
32
32
|
namespace db
|
33
33
|
{
|
34
|
-
namespace engine
|
35
|
-
{
|
36
|
-
namespace mysql
|
37
|
-
{
|
38
|
-
class table;
|
39
|
-
}
|
40
|
-
}
|
34
|
+
namespace engine{ namespace mysql { class table; } }
|
41
35
|
|
42
36
|
namespace protocol
|
43
37
|
{
|
@@ -46,9 +40,17 @@ namespace tdap
|
|
46
40
|
namespace client
|
47
41
|
{
|
48
42
|
|
43
|
+
short errorCode(const boost::system::error_code& e);
|
44
|
+
|
49
45
|
class request : public bzs::db::protocol::tdap::request,
|
50
46
|
public bzs::netsvc::client::idirectReadHandler
|
51
47
|
{
|
48
|
+
|
49
|
+
unsigned int handleError(const boost::system::error_code& e)
|
50
|
+
{
|
51
|
+
result = errorCode(e);
|
52
|
+
return 0;
|
53
|
+
}
|
52
54
|
public:
|
53
55
|
clientID* cid;
|
54
56
|
request() : bzs::db::protocol::tdap::request(), cid(NULL){};
|
@@ -56,14 +58,20 @@ public:
|
|
56
58
|
unsigned int onRead(unsigned int size, bzs::netsvc::client::connection* c) // orverride
|
57
59
|
{
|
58
60
|
unsigned int readlen = 0;
|
59
|
-
readlen += c->directRead(¶mMask, sizeof(uint_td)); // paramMask and result
|
61
|
+
readlen += c->directRead(¶mMask, sizeof(uint_td)); // paramMask and result
|
62
|
+
if (c->error()) return handleError(c->error());
|
63
|
+
|
60
64
|
if (P_MASK_POSBLK & paramMask)
|
65
|
+
{
|
61
66
|
readlen += c->directRead(pbk, TD_POSBLK_TRANSMIT_SIZE);
|
62
|
-
|
67
|
+
if (c->error()) return handleError(c->error());
|
68
|
+
}
|
63
69
|
if (P_MASK_DATALEN & paramMask)
|
64
70
|
{
|
65
71
|
uint_td tmp;
|
66
72
|
readlen += c->directRead(&tmp, sizeof(uint_td));
|
73
|
+
if (c->error()) return handleError(c->error());
|
74
|
+
|
67
75
|
if (*datalen < tmp)
|
68
76
|
{
|
69
77
|
result = STATUS_BUFFERTOOSMALL;
|
@@ -75,7 +83,10 @@ public:
|
|
75
83
|
data = pbk->allocFunc(pbk->tb, tmp);
|
76
84
|
*datalen = tmp;
|
77
85
|
if (P_MASK_DATA & paramMask)
|
86
|
+
{
|
78
87
|
readlen += c->directRead(data, *datalen);
|
88
|
+
if (c->error()) return handleError(c->error());
|
89
|
+
}
|
79
90
|
}
|
80
91
|
}
|
81
92
|
|
@@ -83,6 +94,7 @@ public:
|
|
83
94
|
{
|
84
95
|
keylen_td tmp;
|
85
96
|
readlen += c->directRead(&tmp, sizeof(keylen_td));
|
97
|
+
if (c->error()) return handleError(c->error());
|
86
98
|
if (keylen < tmp)
|
87
99
|
{
|
88
100
|
result = STATUS_KEYBUFFERTOOSMALL;
|
@@ -91,13 +103,18 @@ public:
|
|
91
103
|
memset(keybuf, 0, keylen);
|
92
104
|
keylen = tmp;
|
93
105
|
readlen += c->directRead(keybuf, keylen);
|
106
|
+
if (c->error()) return handleError(c->error());
|
94
107
|
}
|
95
108
|
if (P_MASK_KEYNUM & paramMask)
|
109
|
+
{
|
96
110
|
readlen += c->directRead(&keyNum, sizeof(char_td));
|
97
|
-
|
111
|
+
if (c->error()) return handleError(c->error());
|
112
|
+
}
|
98
113
|
if (paramMask & P_MASK_BLOBBODY)
|
99
114
|
{
|
100
|
-
blobHeader =
|
115
|
+
blobHeader =
|
116
|
+
(const bzs::db::blobHeader*)c->directReadRemain(size - readlen);
|
117
|
+
if (c->error()) return handleError(c->error());
|
101
118
|
readlen = size;
|
102
119
|
if (blobHeader->rows)
|
103
120
|
blobHeader->resetCur();
|
@@ -71,6 +71,8 @@ char g_buf[TMP_BUFSIZE];
|
|
71
71
|
#define NOTE_TYPE 12
|
72
72
|
#define VAR_TYPE 13
|
73
73
|
|
74
|
+
#define NIS_FD_KEYSEG_LIMIT 1
|
75
|
+
|
74
76
|
const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
|
75
77
|
const char* charsetName)
|
76
78
|
{
|
@@ -284,6 +286,17 @@ std::string getFiledList(const tabledef* table, std::vector<std::string>& fdl)
|
|
284
286
|
return s;
|
285
287
|
}
|
286
288
|
|
289
|
+
bool isNeedNis(const tabledef* table, const keydef& key)
|
290
|
+
{
|
291
|
+
if (key.segmentCount > NIS_FD_KEYSEG_LIMIT)
|
292
|
+
{
|
293
|
+
// If a first segment is not 1 byte of Logical
|
294
|
+
const fielddef& fd = table->fieldDefs[key.segments[0].fieldNum];
|
295
|
+
return (!((fd.len == 1) && (fd.type == ft_logical)));
|
296
|
+
}
|
297
|
+
return false;
|
298
|
+
}
|
299
|
+
|
287
300
|
void insertNisFields(const tabledef* table, std::vector<std::string>& fdl,
|
288
301
|
std::string& s)
|
289
302
|
{
|
@@ -293,7 +306,7 @@ void insertNisFields(const tabledef* table, std::vector<std::string>& fdl,
|
|
293
306
|
_ltoa_s(i, buf, 20, 10);
|
294
307
|
std::string fddef = "";
|
295
308
|
const keydef& key = table->keyDefs[i];
|
296
|
-
if (key
|
309
|
+
if (isNeedNis(table, key))
|
297
310
|
{
|
298
311
|
if (key.segments[0].flags.bit9)
|
299
312
|
fddef = std::string("`") + "$nfn" + buf +
|
@@ -332,17 +345,12 @@ std::string& getKey(const tabledef* table, std::vector<std::string>& fdl,
|
|
332
345
|
s += "(";
|
333
346
|
|
334
347
|
// "nf" segment is added to a head.
|
335
|
-
if (key
|
348
|
+
if (isNeedNis(table, key))
|
336
349
|
{
|
337
|
-
|
338
|
-
|
339
|
-
if (
|
340
|
-
|
341
|
-
if (key.segments[0].flags.bit9)
|
342
|
-
s += std::string("`") + "$nfn" + buf + "`,";
|
343
|
-
else if (key.segments[0].flags.bit3)
|
344
|
-
s += std::string("`") + "$nfa" + buf + "`,";
|
345
|
-
}
|
350
|
+
if (key.segments[0].flags.bit9)
|
351
|
+
s += std::string("`") + "$nfn" + buf + "`,";
|
352
|
+
else if (key.segments[0].flags.bit3)
|
353
|
+
s += std::string("`") + "$nfa" + buf + "`,";
|
346
354
|
}
|
347
355
|
for (int j = 0; j < key.segmentCount; j++)
|
348
356
|
{
|
@@ -29,6 +29,7 @@
|
|
29
29
|
#include <bzs/rtl/stringBuffers.h>
|
30
30
|
#include "stringConverter.h"
|
31
31
|
#include <boost/timer.hpp>
|
32
|
+
#include <boost/thread/mutex.hpp>
|
32
33
|
|
33
34
|
#pragma package(smart_init)
|
34
35
|
|
@@ -60,8 +61,8 @@ class recordCache;
|
|
60
61
|
|
61
62
|
struct tbimpl
|
62
63
|
{
|
63
|
-
|
64
|
-
|
64
|
+
boost::mutex bookmarkMutex;
|
65
|
+
uchar_td* bookMarks;
|
65
66
|
client::fields fields;
|
66
67
|
pq_handle filterPtr;
|
67
68
|
recordCache* rc;
|
@@ -71,8 +72,9 @@ struct tbimpl
|
|
71
72
|
void* bfAtcPtr;
|
72
73
|
void* optionalData;
|
73
74
|
uint_td dataBufferLen;
|
74
|
-
int bookMarksMemSize;
|
75
|
-
int maxBookMarkedCount;
|
75
|
+
unsigned int bookMarksMemSize;
|
76
|
+
unsigned int maxBookMarkedCount;
|
77
|
+
recordCountFn onRecordCountFunc;
|
76
78
|
char keybuf[MAX_KEYLEN];
|
77
79
|
char keyNumIndex[128];
|
78
80
|
|
@@ -87,7 +89,7 @@ struct tbimpl
|
|
87
89
|
: bookMarks(NULL), fields(tb), rc(NULL), mraPtr(NULL),
|
88
90
|
dataBak(NULL), smartUpDate(NULL), bfAtcPtr(NULL), optionalData(NULL),
|
89
91
|
dataBufferLen(0), bookMarksMemSize(0), maxBookMarkedCount(0),
|
90
|
-
smartUpDateFlag(false), dataPacked(false)
|
92
|
+
onRecordCountFunc(NULL), smartUpDateFlag(false), dataPacked(false)
|
91
93
|
{
|
92
94
|
memset(&keyNumIndex[0], 0, 128);
|
93
95
|
}
|
@@ -101,6 +103,62 @@ struct tbimpl
|
|
101
103
|
if (bookMarks)
|
102
104
|
free(bookMarks);
|
103
105
|
}
|
106
|
+
|
107
|
+
inline void resetBookmarks()
|
108
|
+
{
|
109
|
+
boost::mutex::scoped_lock lck(bookmarkMutex);
|
110
|
+
maxBookMarkedCount = 0;
|
111
|
+
}
|
112
|
+
|
113
|
+
inline uchar_td* bookmarks(unsigned int index, ushort_td len)
|
114
|
+
{
|
115
|
+
boost::mutex::scoped_lock lck(bookmarkMutex);
|
116
|
+
unsigned int pos = index * (len + 2) + 2;
|
117
|
+
if ((index < maxBookMarkedCount) && bookMarks)
|
118
|
+
return bookMarks + pos;
|
119
|
+
return NULL;
|
120
|
+
}
|
121
|
+
|
122
|
+
/*inline bookmark_td* bookmarksPtr(unsigned int index)
|
123
|
+
{
|
124
|
+
boost::mutex::scoped_lock lck(bookmarkMutex);
|
125
|
+
unsigned int pos = index * 6 + 2;
|
126
|
+
if ((index < maxBookMarkedCount) && bookMarks)
|
127
|
+
return (bookmark_td*)((char*)bookMarks + pos);
|
128
|
+
return NULL;
|
129
|
+
}*/
|
130
|
+
|
131
|
+
inline short insertBookmarks(unsigned int start, void* data, ushort_td len,
|
132
|
+
ushort_td count)
|
133
|
+
{
|
134
|
+
unsigned int size = (start + count) * (2 + len);
|
135
|
+
boost::mutex::scoped_lock lck(bookmarkMutex);
|
136
|
+
if (!bookMarks)
|
137
|
+
{
|
138
|
+
bookMarks = (uchar_td*)malloc(BOOKMARK_ALLOC_SIZE);
|
139
|
+
if (bookMarks)
|
140
|
+
bookMarksMemSize = BOOKMARK_ALLOC_SIZE;
|
141
|
+
else
|
142
|
+
return STATUS_CANT_ALLOC_MEMORY;
|
143
|
+
}
|
144
|
+
|
145
|
+
if (bookMarksMemSize < size)
|
146
|
+
{
|
147
|
+
bookMarks = (uchar_td*)realloc(bookMarks, size + BOOKMARK_ALLOC_SIZE);
|
148
|
+
bookMarksMemSize = size + BOOKMARK_ALLOC_SIZE;
|
149
|
+
}
|
150
|
+
if (bookMarks)
|
151
|
+
{
|
152
|
+
//if (start + count > m_impl->maxBookMarkedCount)
|
153
|
+
memcpy(bookMarks + (start * (2 + len)), data,
|
154
|
+
count * (2 + len));
|
155
|
+
maxBookMarkedCount = start + count;
|
156
|
+
}
|
157
|
+
else
|
158
|
+
return STATUS_CANT_ALLOC_MEMORY;
|
159
|
+
return STATUS_SUCCESS;
|
160
|
+
}
|
161
|
+
|
104
162
|
};
|
105
163
|
|
106
164
|
// ---------------------------------------------------------------------------
|
@@ -123,7 +181,7 @@ class recordCache
|
|
123
181
|
unsigned int m_len;
|
124
182
|
unsigned int m_unpackLen;
|
125
183
|
unsigned int m_rowCount;
|
126
|
-
|
184
|
+
uchar_td* m_bookmark;
|
127
185
|
uchar_td* m_ptr;
|
128
186
|
uchar_td* m_tmpPtr;
|
129
187
|
blobHeader* m_hd;
|
@@ -156,7 +214,7 @@ public:
|
|
156
214
|
m_ptr += DATASIZE_BYTE;
|
157
215
|
if (bookmarkSize)
|
158
216
|
{
|
159
|
-
m_bookmark =
|
217
|
+
m_bookmark = m_ptr;
|
160
218
|
m_ptr += bookmarkSize;
|
161
219
|
}
|
162
220
|
}
|
@@ -302,7 +360,7 @@ public:
|
|
302
360
|
m_ptr += DATASIZE_BYTE;
|
303
361
|
if (m_filter->bookmarkSize())
|
304
362
|
{
|
305
|
-
m_bookmark =
|
363
|
+
m_bookmark = m_ptr;
|
306
364
|
m_ptr += m_filter->bookmarkSize();
|
307
365
|
}
|
308
366
|
m_tmpPtr = data + totalSize;
|
@@ -371,7 +429,7 @@ public:
|
|
371
429
|
}
|
372
430
|
|
373
431
|
inline unsigned int len() const { return m_unpackLen; };
|
374
|
-
inline
|
432
|
+
inline uchar_td* bookmarkCurRow() const { return m_bookmark; };
|
375
433
|
inline int row() const { return m_row; }
|
376
434
|
|
377
435
|
inline int rowCount() const { return m_rowCount; }
|
@@ -500,41 +558,6 @@ fields& table::fields()
|
|
500
558
|
return m_impl->fields;
|
501
559
|
}
|
502
560
|
|
503
|
-
void table::setBookMarks(int StartId, void* Data, ushort_td Count)
|
504
|
-
{
|
505
|
-
long size = (StartId + Count) * 6;
|
506
|
-
|
507
|
-
if (!m_impl->bookMarks)
|
508
|
-
{
|
509
|
-
m_impl->bookMarks = malloc(BOOKMARK_ALLOC_SIZE);
|
510
|
-
if (m_impl->bookMarks)
|
511
|
-
m_impl->bookMarksMemSize = BOOKMARK_ALLOC_SIZE;
|
512
|
-
else
|
513
|
-
{
|
514
|
-
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
515
|
-
return;
|
516
|
-
}
|
517
|
-
}
|
518
|
-
|
519
|
-
if (m_impl->bookMarksMemSize < size)
|
520
|
-
{
|
521
|
-
|
522
|
-
m_impl->bookMarks =
|
523
|
-
realloc(m_impl->bookMarks, size + BOOKMARK_ALLOC_SIZE);
|
524
|
-
m_impl->bookMarksMemSize = size + BOOKMARK_ALLOC_SIZE;
|
525
|
-
}
|
526
|
-
if (m_impl->bookMarks)
|
527
|
-
{
|
528
|
-
if (StartId + Count - 1 > m_impl->maxBookMarkedCount)
|
529
|
-
m_impl->maxBookMarkedCount = StartId + Count - 1;
|
530
|
-
memcpy((void*)((char*)m_impl->bookMarks + ((StartId - 1) * 6)), Data,
|
531
|
-
Count * 6);
|
532
|
-
}
|
533
|
-
else
|
534
|
-
m_stat = STATUS_CANT_ALLOC_MEMORY;
|
535
|
-
return;
|
536
|
-
}
|
537
|
-
|
538
561
|
inline short calcNextReadRecordCount(ushort_td curCount, int eTime)
|
539
562
|
{
|
540
563
|
ushort_td ret = curCount;
|
@@ -550,6 +573,22 @@ inline short calcNextReadRecordCount(ushort_td curCount, int eTime)
|
|
550
573
|
return ret;
|
551
574
|
}
|
552
575
|
|
576
|
+
void table::setOnRecordCount(const recordCountFn v)
|
577
|
+
{
|
578
|
+
m_impl->onRecordCountFunc = v;
|
579
|
+
}
|
580
|
+
|
581
|
+
recordCountFn table::onRecordCount() const
|
582
|
+
{
|
583
|
+
return m_impl->onRecordCountFunc;
|
584
|
+
}
|
585
|
+
|
586
|
+
void table::onRecordCounting(size_t count, bool& complate)
|
587
|
+
{
|
588
|
+
if (m_impl->onRecordCountFunc)
|
589
|
+
m_impl->onRecordCountFunc(this, (int)count, complate);
|
590
|
+
}
|
591
|
+
|
553
592
|
uint_td table::doRecordCount(bool estimate, bool fromCurrent)
|
554
593
|
{
|
555
594
|
uint_td result = 0;
|
@@ -584,11 +623,14 @@ uint_td table::doRecordCount(bool estimate, bool fromCurrent)
|
|
584
623
|
|
585
624
|
bookmark_td bm = bookmark();
|
586
625
|
|
626
|
+
|
587
627
|
ushort_td tmpRejectCount = filter->rejectCount();
|
588
628
|
ushort_td tmpRecCount = filter->recordCount();
|
589
629
|
|
590
630
|
filter->setIgnoreFields(true);
|
591
|
-
m_impl->
|
631
|
+
m_impl->resetBookmarks();
|
632
|
+
bool withBookmark = filter->withBookmark();
|
633
|
+
|
592
634
|
if (fromCurrent)
|
593
635
|
m_stat = curStat;
|
594
636
|
else if (op == TD_KEY_NEXT_MULTI)
|
@@ -629,11 +671,11 @@ uint_td table::doRecordCount(bool estimate, bool fromCurrent)
|
|
629
671
|
}
|
630
672
|
recCountOnce = calcNextReadRecordCount(recCountOnce, eTime);
|
631
673
|
filter->setMaxRows(recCountOnce);
|
632
|
-
result += *((ushort_td*)m_pdata
|
633
|
-
|
634
|
-
|
635
|
-
*((ushort_td*)m_pdata
|
636
|
-
|
674
|
+
result += *((ushort_td*)m_pdata);
|
675
|
+
if (withBookmark)
|
676
|
+
insertBookmarks(m_impl->maxBookMarkedCount,
|
677
|
+
(void*)((char*)m_pdata + 2), *((ushort_td*)m_pdata));
|
678
|
+
|
637
679
|
onRecordCounting(result, Complete);
|
638
680
|
if (Complete)
|
639
681
|
break;
|
@@ -648,7 +690,7 @@ uint_td table::doRecordCount(bool estimate, bool fromCurrent)
|
|
648
690
|
filter->setIgnoreFields(false);
|
649
691
|
filter->setMaxRows(tmpRecCount);
|
650
692
|
|
651
|
-
if (bm)
|
693
|
+
if (!bm.empty)
|
652
694
|
seekByBookmark(bm);
|
653
695
|
m_impl->exBookMarking = false;
|
654
696
|
m_stat = tmpStat;
|
@@ -781,10 +823,13 @@ short table::statReasonOfFind() const
|
|
781
823
|
|
782
824
|
bookmark_td table::bookmarkFindCurrent() const
|
783
825
|
{
|
784
|
-
|
826
|
+
bookmark_td bm;
|
785
827
|
if (!m_impl->rc->isEndOfRow(m_impl->rc->row()))
|
786
|
-
|
787
|
-
|
828
|
+
{
|
829
|
+
memcpy(bm.val, m_impl->rc->bookmarkCurRow(), bookmarkLen());
|
830
|
+
bm.empty = false;
|
831
|
+
}
|
832
|
+
return bm;
|
788
833
|
}
|
789
834
|
|
790
835
|
inline bool checkStatus(short v)
|
@@ -876,7 +921,13 @@ void table::btrvSeekMulti()
|
|
876
921
|
}
|
877
922
|
else
|
878
923
|
{
|
879
|
-
|
924
|
+
if (m_impl->filterPtr->isSeekByBookmarks())
|
925
|
+
{
|
926
|
+
memcpy(m_pdata, m_impl->keybuf, bookmarkLen());
|
927
|
+
m_datalen = m_buflen;
|
928
|
+
tdap((ushort_td)(TD_MOVE_BOOKMARK));
|
929
|
+
}else
|
930
|
+
tdap((ushort_td)(TD_KEY_SEEK));
|
880
931
|
if (!doSeekMultiAfter(i))
|
881
932
|
return;
|
882
933
|
}
|
@@ -1090,9 +1141,11 @@ void table::setPrepare(const pq_handle stmt)
|
|
1090
1141
|
}
|
1091
1142
|
m_impl->rc->reset();
|
1092
1143
|
m_impl->exBookMarking = false;
|
1093
|
-
m_impl->
|
1144
|
+
m_impl->resetBookmarks();
|
1094
1145
|
if (m_impl->filterPtr != stmt)
|
1095
1146
|
m_impl->filterPtr = stmt;
|
1147
|
+
if (nsdb()->isReconnected())
|
1148
|
+
m_impl->filterPtr->setServerPreparedId(0);
|
1096
1149
|
}
|
1097
1150
|
|
1098
1151
|
pq_handle table::setQuery(const queryBase* query, bool serverPrepare)
|
@@ -1101,7 +1154,7 @@ pq_handle table::setQuery(const queryBase* query, bool serverPrepare)
|
|
1101
1154
|
m_stat = 0;
|
1102
1155
|
m_impl->rc->reset();
|
1103
1156
|
m_impl->exBookMarking = false;
|
1104
|
-
m_impl->
|
1157
|
+
m_impl->resetBookmarks();
|
1105
1158
|
m_impl->filterPtr.reset();
|
1106
1159
|
if (query == NULL)
|
1107
1160
|
return m_impl->filterPtr;
|
@@ -1510,9 +1563,8 @@ uint_td table::unPack(char* ptr, size_t size)
|
|
1510
1563
|
if (fd.type == ft_myfixedbinary)
|
1511
1564
|
{
|
1512
1565
|
int dl = *((unsigned short*)(pos));
|
1513
|
-
assert(dl == fd.len - 2);
|
1514
1566
|
memmove(pos, pos + 2, dl);
|
1515
|
-
pos +=
|
1567
|
+
pos += fd.len - 2;
|
1516
1568
|
*((unsigned short*)(pos)) = 0x00;
|
1517
1569
|
;
|
1518
1570
|
pos += 2;
|
@@ -1918,23 +1970,42 @@ unsigned int table::getRecordHash()
|
|
1918
1970
|
return hash((const char*)fieldPtr(0), datalen());
|
1919
1971
|
}
|
1920
1972
|
|
1921
|
-
|
1973
|
+
void table::insertBookmarks(unsigned int start, void* data, ushort_td count)
|
1922
1974
|
{
|
1923
|
-
|
1924
|
-
ret = m_impl->maxBookMarkedCount;
|
1925
|
-
return ret;
|
1975
|
+
m_stat = m_impl->insertBookmarks(start, data, bookmarkLen(), count);
|
1926
1976
|
}
|
1927
1977
|
|
1928
|
-
|
1978
|
+
int table::bookmarksCount() const
|
1929
1979
|
{
|
1930
|
-
|
1980
|
+
return m_impl->maxBookMarkedCount;
|
1981
|
+
}
|
1931
1982
|
|
1932
|
-
|
1933
|
-
|
1934
|
-
|
1935
|
-
|
1983
|
+
void table::moveBookmarks(unsigned int index)
|
1984
|
+
{
|
1985
|
+
seekByBookmark((bookmark_td*)m_impl->bookmarks(index, bookmarkLen()));
|
1986
|
+
}
|
1987
|
+
|
1988
|
+
bookmark_td table::bookmarks(unsigned int index) const
|
1989
|
+
{
|
1990
|
+
bookmark_td bm;
|
1991
|
+
uchar_td* p = m_impl->bookmarks(index, bookmarkLen());
|
1992
|
+
if (p)
|
1993
|
+
{
|
1994
|
+
memcpy(bm.val, p, bookmarkLen());
|
1995
|
+
bm.empty = false;
|
1996
|
+
}else
|
1997
|
+
{
|
1998
|
+
bm.empty = true;
|
1999
|
+
m_stat = STATUS_PROGRAM_ERROR;
|
2000
|
+
}
|
2001
|
+
return bm;
|
1936
2002
|
}
|
1937
2003
|
|
2004
|
+
/*bookmark_td* table::bookmarksPtr(unsigned int index) const
|
2005
|
+
{
|
2006
|
+
return m_impl->bookmarksPtr(index);
|
2007
|
+
}*/
|
2008
|
+
|
1938
2009
|
short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
|
1939
2010
|
{
|
1940
2011
|
return nstable::tdapErr(hWnd, m_stat, (*m_tableDef)->tableName(), retbuf);
|
@@ -2120,7 +2191,8 @@ struct impl
|
|
2120
2191
|
impl()
|
2121
2192
|
: m_reject(1), m_limit(0), m_joinKeySize(0),
|
2122
2193
|
m_optimize(queryBase::none), m_direction(table::findForword),
|
2123
|
-
m_nofilter(false), m_withBookmark(false), m_stopAtLimit(false)
|
2194
|
+
m_nofilter(false), m_withBookmark(false), m_stopAtLimit(false),
|
2195
|
+
m_seekByBookmarks(false)
|
2124
2196
|
{
|
2125
2197
|
}
|
2126
2198
|
|
@@ -2139,6 +2211,7 @@ struct impl
|
|
2139
2211
|
{
|
2140
2212
|
bool m_withBookmark : 1;
|
2141
2213
|
bool m_stopAtLimit : 1;
|
2214
|
+
bool m_seekByBookmarks : 1;
|
2142
2215
|
};
|
2143
2216
|
};
|
2144
2217
|
|
@@ -2223,6 +2296,7 @@ void queryBase::addSeekKeyValue(const _TCHAR* value, bool reset)
|
|
2223
2296
|
}
|
2224
2297
|
m_impl->m_keyValues.push_back(value);
|
2225
2298
|
m_impl->m_nofilter = false;
|
2299
|
+
m_impl->m_seekByBookmarks = false;
|
2226
2300
|
}
|
2227
2301
|
|
2228
2302
|
void queryBase::addSeekKeyValuePtr(const void* value, ushort_td len,
|
@@ -2236,6 +2310,13 @@ void queryBase::addSeekKeyValuePtr(const void* value, ushort_td len,
|
|
2236
2310
|
}
|
2237
2311
|
m_impl->m_keyValuesPtr.push_back(keyValuePtr(value, len, typeStr));
|
2238
2312
|
m_impl->m_nofilter = false;
|
2313
|
+
m_impl->m_seekByBookmarks = false;
|
2314
|
+
}
|
2315
|
+
|
2316
|
+
void queryBase::addSeekBookmark(bookmark_td& bm, ushort_td len, bool reset)
|
2317
|
+
{
|
2318
|
+
addSeekKeyValuePtr(&bm, len, KEYVALUE_PTR, reset);
|
2319
|
+
m_impl->m_seekByBookmarks = true;
|
2239
2320
|
}
|
2240
2321
|
|
2241
2322
|
void queryBase::clearSeekKeyValues()
|
@@ -2439,6 +2520,12 @@ queryBase& queryBase::stopAtLimit(bool v)
|
|
2439
2520
|
return *this;
|
2440
2521
|
}
|
2441
2522
|
|
2523
|
+
bool queryBase::isSeekByBookmarks() const
|
2524
|
+
{
|
2525
|
+
return m_impl->m_seekByBookmarks;
|
2526
|
+
}
|
2527
|
+
|
2528
|
+
|
2442
2529
|
const std::vector<std::_tstring>& queryBase::getSelects() const
|
2443
2530
|
{
|
2444
2531
|
return m_impl->m_selects;
|
@@ -41,6 +41,17 @@ namespace client
|
|
41
41
|
class database;
|
42
42
|
class queryBase;
|
43
43
|
class fields;
|
44
|
+
class table;
|
45
|
+
/** @endcond */
|
46
|
+
|
47
|
+
#if (defined(__BORLANDC__) && !defined(__clang__))
|
48
|
+
typedef void __stdcall(* recordCountFn)(table* tb, int count, bool& complate);
|
49
|
+
#else
|
50
|
+
/** @cond INTERNAL */
|
51
|
+
/** Callback function on a record was record count. */
|
52
|
+
typedef void(__STDCALL* recordCountFn)(table* tb, int count, bool& complate);
|
53
|
+
#endif
|
54
|
+
|
44
55
|
#define null_str _T("")
|
45
56
|
|
46
57
|
#pragma warning(disable : 4251)
|
@@ -120,7 +131,6 @@ protected:
|
|
120
131
|
void* dataBak() const;
|
121
132
|
void* reallocDataBuffer(uint_td v);
|
122
133
|
int dataBufferLen() const;
|
123
|
-
void setBookMarks(int StartId, void* Data, ushort_td Count);
|
124
134
|
uint_td unPack(char* ptr, size_t size);
|
125
135
|
uint_td pack(char* ptr, size_t size);
|
126
136
|
keylen_td writeKeyData(); // orverride
|
@@ -147,7 +157,7 @@ protected:
|
|
147
157
|
|
148
158
|
virtual void doInit(tabledef** def, short filenum, bool regularDir);
|
149
159
|
|
150
|
-
virtual void onRecordCounting(size_t count, bool&
|
160
|
+
virtual void onRecordCounting(size_t count, bool& cancel);
|
151
161
|
|
152
162
|
virtual void setNoUpdateTimeStamp(bool v){};
|
153
163
|
|
@@ -172,8 +182,10 @@ public:
|
|
172
182
|
void* optionalData() const;
|
173
183
|
void setOptionalData(void* v);
|
174
184
|
bool myDateTimeValueByBtrv() const;
|
175
|
-
int
|
176
|
-
|
185
|
+
void insertBookmarks(unsigned int start, void* data, ushort_td count);
|
186
|
+
int bookmarksCount() const;
|
187
|
+
void moveBookmarks(unsigned int index);
|
188
|
+
bookmark_td bookmarks(unsigned int index) const;
|
177
189
|
void clearBuffer();
|
178
190
|
unsigned int getRecordHash();
|
179
191
|
void smartUpdate();
|
@@ -275,6 +287,8 @@ public:
|
|
275
287
|
void keyValueDescription(_TCHAR* buf, int bufsize);
|
276
288
|
short getCurProcFieldCount() const;
|
277
289
|
short getCurProcFieldIndex(short index) const;
|
290
|
+
void setOnRecordCount(const recordCountFn v);
|
291
|
+
recordCountFn onRecordCount() const;
|
278
292
|
client::fields& fields();
|
279
293
|
};
|
280
294
|
|
@@ -328,6 +342,7 @@ public:
|
|
328
342
|
void addLogic(const _TCHAR* combine, const _TCHAR* name,
|
329
343
|
const _TCHAR* logic, const _TCHAR* value);
|
330
344
|
void addSeekKeyValue(const _TCHAR* value, bool reset = false);
|
345
|
+
void addSeekBookmark(bookmark_td& bm, ushort_td len, bool reset = false);
|
331
346
|
void addSeekKeyValuePtr(const void* value, ushort_td len, short typeStr,
|
332
347
|
bool reset = false);
|
333
348
|
void reserveSeekKeyValueSize(size_t v);
|
@@ -350,13 +365,13 @@ public:
|
|
350
365
|
eOptimize getOptimize() const;
|
351
366
|
bool isStopAtLimit() const;
|
352
367
|
bool isBookmarkAlso() const;
|
368
|
+
bool isSeekByBookmarks() const;
|
353
369
|
short selectCount() const;
|
354
370
|
const _TCHAR* getSelect(short index) const;
|
355
371
|
short whereTokens() const;
|
356
372
|
const _TCHAR* getWhereToken(short index) const;
|
357
373
|
void setWhereToken(short index, const _TCHAR* v);
|
358
374
|
void reverseAliasName(const _TCHAR* alias, const _TCHAR* src);
|
359
|
-
|
360
375
|
void release(); // don't virtual
|
361
376
|
static queryBase* create();
|
362
377
|
};
|