transactd 2.2.0 → 2.3.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 +6 -6
- data/README +20 -18
- data/README-JA +19 -17
- data/RELEASE_NOTE +144 -0
- data/RELEASE_NOTE-JA +153 -0
- data/bin/common/tdclc_32_2_3.dll +0 -0
- data/bin/common/tdclc_64_2_3.dll +0 -0
- data/build/common/get_ruby_path.cmake +1 -1
- data/build/swig/ruby/ruby.swg +10 -9
- data/build/swig/ruby/tdclrb_wrap.cpp +1416 -561
- data/build/swig/tdcl.i +30 -3
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/BUILDNUMBER.txt +1 -0
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/BUILDNUMBER.txt +1 -0
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +85 -41
- data/source/bzs/db/engine/mysql/database.h +35 -5
- data/source/bzs/db/engine/mysql/mysqlInternal.h +189 -37
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +21 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +11 -0
- data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +11 -4
- data/source/bzs/db/protocol/tdap/client/client.h +30 -1
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +35 -5
- data/source/bzs/db/protocol/tdap/client/field.cpp +100 -51
- data/source/bzs/db/protocol/tdap/client/field.h +7 -7
- data/source/bzs/db/protocol/tdap/client/filter.h +20 -6
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +337 -58
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +56 -13
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +83 -5
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +20 -6
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +7 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +8 -4
- data/source/bzs/db/protocol/tdap/client/request.h +11 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +40 -2
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/table.cpp +124 -71
- data/source/bzs/db/protocol/tdap/client/table.h +8 -7
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +33 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +20 -4
- data/source/bzs/db/protocol/tdap/mysql/request.h +14 -0
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +132 -69
- data/source/bzs/db/protocol/tdap/tdapRequest.h +18 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +32 -22
- data/source/bzs/db/protocol/tdap/tdapSchema.h +69 -4
- data/source/bzs/db/protocol/tdap/tdapcapi.h +13 -5
- data/source/bzs/db/protocol/tdap/uri.h +4 -4
- data/source/bzs/db/transactd/transactd.cpp +6 -5
- data/source/bzs/env/crosscompile.cpp +17 -0
- data/source/bzs/env/crosscompile.h +4 -1
- data/source/bzs/env/mbcswchrLinux.cpp +3 -0
- data/source/bzs/example/deleteRecords.cpp +13 -0
- data/source/bzs/example/deleteRecords_c.cpp +8 -1
- data/source/bzs/example/insertRecords.cpp +14 -0
- data/source/bzs/example/insertRecords_c.cpp +8 -1
- data/source/bzs/example/ormap_c.cpp +8 -1
- data/source/bzs/example/queryData.cpp +92 -2
- data/source/bzs/example/queryData.h +3 -1
- data/source/bzs/example/readRecords.cpp +13 -0
- data/source/bzs/example/readRecords_c.cpp +8 -1
- data/source/bzs/example/updateRecords.cpp +13 -0
- data/source/bzs/example/updateRecords_c.cpp +8 -1
- data/source/bzs/example/update_with_transaction.cpp +13 -0
- data/source/bzs/example/update_with_transaction_c.cpp +8 -1
- data/source/bzs/example/useORMRecord.cpp +9 -3
- data/source/bzs/netsvc/client/iconnection.h +8 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +61 -16
- data/source/bzs/netsvc/client/tcpClient.h +430 -214
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +115 -19
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +33 -5
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +21 -3
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +17 -3
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +26 -8
- data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +13 -6
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +14 -8
- data/source/bzs/test/tdclrb/transactd_spec.rb +117 -27
- data/source/bzs/test/transactdBench/scaling_bench.cpp +5 -5
- data/source/bzs/test/transactdBench/workerBase.h +2 -2
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +898 -51
- data/source/global/tdclatl/Database.cpp +12 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/FieldDef.cpp +19 -0
- data/source/global/tdclatl/FieldDef.h +4 -0
- data/source/global/tdclatl/FieldDefs.cpp +14 -16
- data/source/global/tdclatl/GroupQuery.cpp +21 -16
- data/source/global/tdclatl/GroupQuery.h +1 -1
- data/source/global/tdclatl/QueryBase.cpp +14 -0
- data/source/global/tdclatl/QueryBase.h +2 -0
- data/source/global/tdclatl/Record.cpp +41 -10
- data/source/global/tdclatl/Record.h +1 -1
- data/source/global/tdclatl/Recordset.cpp +117 -31
- data/source/global/tdclatl/Recordset.h +6 -5
- data/source/global/tdclatl/Table.cpp +24 -28
- data/source/global/tdclatl/Table.h +3 -4
- data/source/global/tdclatl/activeTable.cpp +149 -103
- data/source/global/tdclatl/activeTable.h +1 -1
- data/source/global/tdclatl/tdclatl.idl +38 -18
- data/transactd.gemspec +1 -1
- metadata +8 -4
- data/bin/common/tdclc_32_2_2.dll +0 -0
- data/bin/common/tdclc_64_2_2.dll +0 -0
@@ -66,7 +66,7 @@ inline const _TCHAR* hostName(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
66
66
|
if (st)
|
67
67
|
{
|
68
68
|
const _TCHAR* en = _tcsstr(st, _T("/"));
|
69
|
-
if (en)
|
69
|
+
if (en && en > st)
|
70
70
|
{
|
71
71
|
_tcsncpy_s(buf, size, st, en - st);
|
72
72
|
buf[en - st] = 0x00;
|
@@ -85,7 +85,7 @@ inline const _TCHAR* dbname(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
85
85
|
if (st)
|
86
86
|
{
|
87
87
|
const _TCHAR* en = _tcsstr(st + 1, _T("?"));
|
88
|
-
if (en)
|
88
|
+
if (en && en > st)
|
89
89
|
{
|
90
90
|
_tcsncpy_s(buf, size, st + 1, en - (st + 1));
|
91
91
|
buf[en - (st + 1)] = 0x00;
|
@@ -103,7 +103,7 @@ inline const _TCHAR* schemaTable(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
103
103
|
{
|
104
104
|
st+= 7;
|
105
105
|
const _TCHAR* en = _tcsrchr(uri, _T('.'));
|
106
|
-
if (en)
|
106
|
+
if (en && en > st)
|
107
107
|
{
|
108
108
|
_tcsncpy_s(buf, size, st, en - st);
|
109
109
|
buf[en - st] = 0x00;
|
@@ -122,7 +122,7 @@ inline const _TCHAR* userName(const _TCHAR* uri, _TCHAR* buf, size_t size)
|
|
122
122
|
if (st)
|
123
123
|
{
|
124
124
|
const _TCHAR* en = _tcsstr(st, _T("@"));
|
125
|
-
if (en)
|
125
|
+
if (en && en > st)
|
126
126
|
{
|
127
127
|
_tcsncpy_s(buf, size, st, en - st);
|
128
128
|
buf[en - st] = 0x00;
|
@@ -35,8 +35,9 @@
|
|
35
35
|
|
36
36
|
/** tcp server type
|
37
37
|
*/
|
38
|
-
#define TCP_CPT_SERVER
|
39
|
-
#define TCP_TPOOL_SERVER
|
38
|
+
#define TCP_CPT_SERVER 1
|
39
|
+
#define TCP_TPOOL_SERVER 2
|
40
|
+
#define PIPE_SHARE_MEM_SIZE 6292480 // 6Mbyte + 1024
|
40
41
|
|
41
42
|
using namespace bzs::netsvc::server;
|
42
43
|
|
@@ -50,7 +51,7 @@ static unsigned int g_tcpServerType = TCP_CPT_SERVER;
|
|
50
51
|
|
51
52
|
static unsigned int g_maxTcpConnections = 200;
|
52
53
|
static unsigned int g_pool_threads = 20;
|
53
|
-
unsigned int g_pipeCommSharememSize =
|
54
|
+
unsigned int g_pipeCommSharememSize = PIPE_SHARE_MEM_SIZE;
|
54
55
|
int g_tableNmaeLower = 1; // defined in btrvProtocol.h
|
55
56
|
unsigned int g_lock_wait_timeout = 1;
|
56
57
|
char* g_transaction_isolation = NULL;
|
@@ -257,8 +258,8 @@ static MYSQL_SYSVAR_STR(auth_type, g_auth_type,
|
|
257
258
|
*/
|
258
259
|
#ifdef PIPE_SERVER
|
259
260
|
static MYSQL_SYSVAR_UINT(pipe_comm_sharemem_size, g_pipeCommSharememSize,
|
260
|
-
PLUGIN_VAR_READONLY, "66000..52428800", 0, 0,
|
261
|
-
66000, 52428800, 0);
|
261
|
+
PLUGIN_VAR_READONLY, "66000..52428800 ", 0, 0, PIPE_SHARE_MEM_SIZE,
|
262
|
+
66000, 52428800, 0);
|
262
263
|
static MYSQL_SYSVAR_UINT(max_pipe_connections, g_maxPipeConnections,
|
263
264
|
PLUGIN_VAR_READONLY, "1..100", 0, 0, 50, 1, 100, 0);
|
264
265
|
static MYSQL_SYSVAR_INT(use_piped_local, g_usePipedLocal, PLUGIN_VAR_READONLY,
|
@@ -114,6 +114,23 @@ int wcsncmp16(const char16_t* sl, const char16_t* sr, size_t n)
|
|
114
114
|
return 0 - *sr;
|
115
115
|
}
|
116
116
|
|
117
|
+
int wmemcmp16(const char16_t* sl, const char16_t* sr, size_t n)
|
118
|
+
{
|
119
|
+
if (n == 0)
|
120
|
+
return 0;
|
121
|
+
while (1)
|
122
|
+
{
|
123
|
+
if (*sl != *sr)
|
124
|
+
return (int)(*sl - *sr);
|
125
|
+
if (--n == 0)
|
126
|
+
return 0;
|
127
|
+
++sl;
|
128
|
+
++sr;
|
129
|
+
}
|
130
|
+
return 0 - *sr;
|
131
|
+
}
|
132
|
+
|
133
|
+
|
117
134
|
char16_t* wmemset16(char16_t* p, char16_t c, size_t n)
|
118
135
|
{
|
119
136
|
char16_t* end = p + n;
|
@@ -78,9 +78,11 @@ char16_t* _strlwr16(char16_t* s);
|
|
78
78
|
size_t strlen16(const char16_t* src);
|
79
79
|
int wcsnicmp16(const char16_t* sl, const char16_t* sr, size_t n);
|
80
80
|
int wcsncmp16(const char16_t* sl, const char16_t* sr, size_t n);
|
81
|
+
int wmemcmp16(const char16_t* sl, const char16_t* sr, size_t n);
|
81
82
|
char16_t* wmemset16(char16_t* p, char16_t c, size_t n);
|
82
83
|
char16_t* wmemcpy(char16_t* dest, const char16_t* src, size_t count);
|
83
84
|
|
85
|
+
|
84
86
|
/* operating system */
|
85
87
|
#ifndef _TCHAR
|
86
88
|
#define _TCHAR char
|
@@ -143,8 +145,9 @@ typedef unsigned __int32 char32_t; // 32bit
|
|
143
145
|
#define wcsnicmp16(A, B, C) \
|
144
146
|
_wcsnicmp((const wchar_t*)(A), (const wchar_t*)(B), C)
|
145
147
|
#define wcsncmp16(A, B, C) wcsncmp((const wchar_t*)(A), (const wchar_t*)(B), C)
|
148
|
+
#define wmemcmp16(A, B, C) wmemcmp((const wchar_t*)(A), (const wchar_t*)(B), C)
|
146
149
|
#define wmemset16 wmemset
|
147
|
-
#define strlen16 wcslen
|
150
|
+
#define strlen16(A) wcslen((const wchar_t*)(A))
|
148
151
|
|
149
152
|
/* operating system */
|
150
153
|
#define PSEPARATOR _T("\\")
|
@@ -42,6 +42,7 @@ void initCvtProcess()
|
|
42
42
|
{
|
43
43
|
int ret = pthread_key_create(&g_tls1, cleanupTls);
|
44
44
|
assert(ret == 0);
|
45
|
+
pthread_setspecific(g_tls1, NULL);
|
45
46
|
}
|
46
47
|
|
47
48
|
void deinitCvtProcess()
|
@@ -51,6 +52,8 @@ void deinitCvtProcess()
|
|
51
52
|
|
52
53
|
cvt& getCvt(int index)
|
53
54
|
{
|
55
|
+
if (g_tls1 == 0)
|
56
|
+
initCvtProcess();
|
54
57
|
cvt* p = (cvt*)pthread_getspecific(g_tls1);
|
55
58
|
if (p == NULL)
|
56
59
|
{
|
@@ -48,6 +48,19 @@ bool deleteUser(table* tb)
|
|
48
48
|
*/
|
49
49
|
bool openDatabase(database* db, const _TCHAR* uri)
|
50
50
|
{
|
51
|
+
/******************************************************
|
52
|
+
!!! Important !!!
|
53
|
+
When using a multi-threaded,
|
54
|
+
please request a new connection for each database.
|
55
|
+
*******************************************************/
|
56
|
+
// When using a multi-threaded, set to true.
|
57
|
+
bool newConnection = false;
|
58
|
+
if (!db->connect(uri, newConnection))
|
59
|
+
{
|
60
|
+
showError(_T("connect daatabase"), NULL, db->stat());
|
61
|
+
return false;
|
62
|
+
}
|
63
|
+
|
51
64
|
db->open(uri, TYPE_SCHEMA_BDF);
|
52
65
|
if (db->stat() != 0)
|
53
66
|
{
|
@@ -37,7 +37,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
37
37
|
{
|
38
38
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
39
39
|
_T("test"));
|
40
|
-
|
40
|
+
/******************************************************
|
41
|
+
!!! Important !!!
|
42
|
+
When using a multi-threaded,
|
43
|
+
please request a new connection for each database.
|
44
|
+
*******************************************************/
|
45
|
+
// When using a multi-threaded, set to true.
|
46
|
+
bool newConnection = false;
|
47
|
+
connectOpen(db, param, newConnection);
|
41
48
|
|
42
49
|
table_ptr tb = openTable(db, _T("user"));
|
43
50
|
deleteUser(tb);
|
@@ -161,6 +161,20 @@ void readImage(const _TCHAR* path, std::vector<char>& s)
|
|
161
161
|
*/
|
162
162
|
bool openDatabase(database* db, const _TCHAR* uri)
|
163
163
|
{
|
164
|
+
/******************************************************
|
165
|
+
!!! Important !!!
|
166
|
+
When using a multi-threaded,
|
167
|
+
please request a new connection for each database.
|
168
|
+
*******************************************************/
|
169
|
+
// When using a multi-threaded, set to true.
|
170
|
+
bool newConnection = false;
|
171
|
+
|
172
|
+
if (!db->connect(uri, newConnection))
|
173
|
+
{
|
174
|
+
showError(_T("connect daatabase"), NULL, db->stat());
|
175
|
+
return false;
|
176
|
+
}
|
177
|
+
|
164
178
|
db->open(uri, TYPE_SCHEMA_BDF);
|
165
179
|
if (db->stat() != 0)
|
166
180
|
{
|
@@ -121,7 +121,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
121
121
|
{
|
122
122
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
123
123
|
_T("test"));
|
124
|
-
|
124
|
+
/******************************************************
|
125
|
+
!!! Important !!!
|
126
|
+
When using a multi-threaded,
|
127
|
+
please request a new connection for each database.
|
128
|
+
*******************************************************/
|
129
|
+
// When using a multi-threaded, set to true.
|
130
|
+
bool newConnection = false;
|
131
|
+
connectOpen(db, param, newConnection);
|
125
132
|
|
126
133
|
table_ptr tb = openTable(db, _T("group1"));
|
127
134
|
insertGroups(tb);
|
@@ -601,7 +601,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
601
601
|
{
|
602
602
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
603
603
|
_T("test"));
|
604
|
-
|
604
|
+
/******************************************************
|
605
|
+
!!! Important !!!
|
606
|
+
When using a multi-threaded,
|
607
|
+
please request a new connection for each database.
|
608
|
+
*******************************************************/
|
609
|
+
// When using a multi-threaded, set to true.
|
610
|
+
bool newConnection = false;
|
611
|
+
connectOpen(db, param, newConnection);
|
605
612
|
|
606
613
|
databaseManager mgr(db);
|
607
614
|
std::vector<user_ptr> users;
|
@@ -214,6 +214,12 @@ bool createUserExtTable(dbdef* def)
|
|
214
214
|
fd->type = BLOB_TYPE;
|
215
215
|
#ifndef USE_PSQL_DATABASE
|
216
216
|
fd->len = 10;
|
217
|
+
++filedIndex;
|
218
|
+
fd = def->insertField(tableid, filedIndex);
|
219
|
+
fd->setName(_T("binary"));
|
220
|
+
fd->type = BLOB_TYPE;
|
221
|
+
fd->len = 10;
|
222
|
+
|
217
223
|
#else
|
218
224
|
fd->len = 16000;
|
219
225
|
#endif
|
@@ -276,6 +282,69 @@ bool createCacheTable(dbdef* def)
|
|
276
282
|
return true;
|
277
283
|
}
|
278
284
|
|
285
|
+
bool createBlobOnlyTable(dbdef* def)
|
286
|
+
{
|
287
|
+
short tableid = 4;
|
288
|
+
tabledef t;
|
289
|
+
tabledef* td = &t;
|
290
|
+
td->charsetIndex = mysql::charsetIndex(GetACP());
|
291
|
+
td->schemaCodePage = CP_UTF8;
|
292
|
+
td->id = tableid;
|
293
|
+
td->setTableName(_T("blobonly"));
|
294
|
+
td->setFileName(_T("blobonly"));
|
295
|
+
|
296
|
+
def->insertTable(td);
|
297
|
+
if (def->stat() != 0)
|
298
|
+
return showDbdefError(def, _T("blobonly insertTable"));
|
299
|
+
|
300
|
+
short filedIndex = 0;
|
301
|
+
fielddef* fd = def->insertField(tableid, filedIndex);
|
302
|
+
fd->setName(_T("id"));
|
303
|
+
fd->type = ft_integer;
|
304
|
+
fd->len = 4;
|
305
|
+
|
306
|
+
++filedIndex;
|
307
|
+
fd = def->insertField(tableid, filedIndex);
|
308
|
+
fd->setName(_T("binary"));
|
309
|
+
fd->type = BLOB_TYPE;
|
310
|
+
fd->len = 10;
|
311
|
+
|
312
|
+
char keyNum = 0;
|
313
|
+
keydef* kd = def->insertKey(tableid, keyNum);
|
314
|
+
keySegment* seg1 = &kd->segments[0];
|
315
|
+
seg1->fieldNum = 0;
|
316
|
+
seg1->flags.bit8 = true; // extended key type
|
317
|
+
seg1->flags.bit1 = true; // chanageable
|
318
|
+
kd->segmentCount = 1;
|
319
|
+
td = def->tableDefs(tableid);
|
320
|
+
td->primaryKeyNum = keyNum;
|
321
|
+
def->updateTableDef(tableid);
|
322
|
+
if (def->stat() != 0)
|
323
|
+
return showDbdefError(def, _T("blobonly updateTableDef"));
|
324
|
+
return true;
|
325
|
+
}
|
326
|
+
|
327
|
+
void fillBlobField(short fieldNum, int id, table* tb, unsigned char* buf)
|
328
|
+
{
|
329
|
+
for (int j = 0 ; j < 256 ; ++j)
|
330
|
+
buf[j] = (unsigned char)(j + id);
|
331
|
+
tb->setFV(fieldNum, buf, 256);
|
332
|
+
}
|
333
|
+
|
334
|
+
bool compBlobField(int id, field& fd)
|
335
|
+
{
|
336
|
+
uint_td size;
|
337
|
+
unsigned char* p = (unsigned char*)fd.getBin(size);
|
338
|
+
if (size != 256) return false;
|
339
|
+
|
340
|
+
for (int j = 0 ; j < 256 ; ++j)
|
341
|
+
{
|
342
|
+
if (p[j] != (unsigned char)(j + id))
|
343
|
+
return false;
|
344
|
+
}
|
345
|
+
return true;
|
346
|
+
}
|
347
|
+
|
279
348
|
bool insertData(database_ptr db, int maxId)
|
280
349
|
{
|
281
350
|
_TCHAR tmp[256];
|
@@ -300,6 +369,13 @@ bool insertData(database_ptr db, int maxId)
|
|
300
369
|
return false;
|
301
370
|
}
|
302
371
|
|
372
|
+
table* tbb = db->openTable(_T("blobonly"), TD_OPEN_NORMAL);
|
373
|
+
if (db->stat())
|
374
|
+
{
|
375
|
+
showDbError(db.get(), _T("openTable blobonly"));
|
376
|
+
return false;
|
377
|
+
}
|
378
|
+
|
303
379
|
dbTransaction trn(db);
|
304
380
|
trn.begin();
|
305
381
|
|
@@ -326,6 +402,7 @@ bool insertData(database_ptr db, int maxId)
|
|
326
402
|
return showTableError(tbg, _T("groups insert"));
|
327
403
|
}
|
328
404
|
|
405
|
+
unsigned char bin[256];
|
329
406
|
tbe->clearBuffer();
|
330
407
|
for (int i = 1; i <= maxId; ++i)
|
331
408
|
{
|
@@ -334,15 +411,27 @@ bool insertData(database_ptr db, int maxId)
|
|
334
411
|
tbe->setFV(1, tmp);
|
335
412
|
_stprintf_s(tmp, 256, _T("%d blob"), i);
|
336
413
|
tbe->setFV(2, tmp);
|
414
|
+
fillBlobField(3, i, tbe, bin);
|
337
415
|
tbe->insert();
|
338
416
|
if (tbe->stat() != 0)
|
339
417
|
return showTableError(tbe, _T("extention insert"));
|
340
418
|
}
|
341
419
|
|
420
|
+
tbb->clearBuffer();
|
421
|
+
for (int i = 1; i <= 10; ++i)
|
422
|
+
{
|
423
|
+
tbb->setFV((short)0, i);
|
424
|
+
fillBlobField(1, i, tbb, bin);
|
425
|
+
tbb->insert();
|
426
|
+
if (tbb->stat() != 0)
|
427
|
+
return showTableError(tbb, _T("blobonly insert"));
|
428
|
+
}
|
429
|
+
|
342
430
|
trn.end();
|
343
431
|
tbg->release();
|
344
432
|
tbu->release();
|
345
433
|
tbe->release();
|
434
|
+
tbb->release();
|
346
435
|
return true;
|
347
436
|
}
|
348
437
|
|
@@ -354,7 +443,7 @@ bool checkVersion(database_ptr db)
|
|
354
443
|
tabledef* td = def->tableDefs(3);
|
355
444
|
if (td)
|
356
445
|
{
|
357
|
-
if (td->fieldCount ==
|
446
|
+
if (td->fieldCount == 4)
|
358
447
|
{
|
359
448
|
table_ptr tb = openTable(db, _T("extention"));
|
360
449
|
return (tb->recordCount(false) == 20000);
|
@@ -386,7 +475,8 @@ int prebuiltData(database_ptr db, const connectParams& param, bool foceCreate,
|
|
386
475
|
return 1;
|
387
476
|
if (!createUserExtTable(db->dbDef()))
|
388
477
|
return 1;
|
389
|
-
|
478
|
+
if (!createBlobOnlyTable(db->dbDef()))
|
479
|
+
return 1;
|
390
480
|
if (!insertData(db, maxId))
|
391
481
|
return 1;
|
392
482
|
std::tcout << _T("done!") << std::endl;
|
@@ -10,7 +10,9 @@ int prebuiltData(bzs::db::protocol::tdap::client::database_ptr db,
|
|
10
10
|
bool foceCreate = false, int maxId = 20000);
|
11
11
|
|
12
12
|
bool createCacheTable(bzs::db::protocol::tdap::client::dbdef* def);
|
13
|
-
|
13
|
+
void fillBlobField(short fieldNum, int id, bzs::db::protocol::tdap::client::table* tb,
|
14
|
+
unsigned char* buf);
|
15
|
+
bool compBlobField(int id, bzs::db::protocol::tdap::client::field& fd);
|
14
16
|
const _TCHAR* name_field_str(_TCHAR* buf);
|
15
17
|
|
16
18
|
#endif // BZS_EXSAMPLE_QUERYDATA_H
|
@@ -98,6 +98,19 @@ bool readUsers(table* tb, std::vector<user*>& users)
|
|
98
98
|
*/
|
99
99
|
bool openDatabase(database* db, const _TCHAR* uri)
|
100
100
|
{
|
101
|
+
/******************************************************
|
102
|
+
!!! Important !!!
|
103
|
+
When using a multi-threaded,
|
104
|
+
please request a new connection for each database.
|
105
|
+
*******************************************************/
|
106
|
+
// When using a multi-threaded, set to true.
|
107
|
+
bool newConnection = false;
|
108
|
+
if (!db->connect(uri, newConnection))
|
109
|
+
{
|
110
|
+
showError(_T("connect daatabase"), NULL, db->stat());
|
111
|
+
return false;
|
112
|
+
}
|
113
|
+
|
101
114
|
db->open(uri, TYPE_SCHEMA_BDF);
|
102
115
|
if (db->stat() != 0)
|
103
116
|
{
|
@@ -86,7 +86,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
86
86
|
{
|
87
87
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
88
88
|
_T("test"));
|
89
|
-
|
89
|
+
/******************************************************
|
90
|
+
!!! Important !!!
|
91
|
+
When using a multi-threaded,
|
92
|
+
please request a new connection for each database.
|
93
|
+
*******************************************************/
|
94
|
+
// When using a multi-threaded, set to true.
|
95
|
+
bool newConnection = false;
|
96
|
+
connectOpen(db, param, newConnection);
|
90
97
|
|
91
98
|
table_ptr tb = openTable(db, _T("user"));
|
92
99
|
std::vector<user_ptr> users;
|
@@ -60,6 +60,19 @@ bool updateUsers(table* tb)
|
|
60
60
|
*/
|
61
61
|
bool openDatabase(database* db, const _TCHAR* uri)
|
62
62
|
{
|
63
|
+
/******************************************************
|
64
|
+
!!! Important !!!
|
65
|
+
When using a multi-threaded,
|
66
|
+
please request a new connection for each database.
|
67
|
+
*******************************************************/
|
68
|
+
// When using a multi-threaded, set to true.
|
69
|
+
bool newConnection = false;
|
70
|
+
if (!db->connect(uri, newConnection))
|
71
|
+
{
|
72
|
+
showError(_T("connect daatabase"), NULL, db->stat());
|
73
|
+
return false;
|
74
|
+
}
|
75
|
+
|
63
76
|
db->open(uri, TYPE_SCHEMA_BDF);
|
64
77
|
if (db->stat() != 0)
|
65
78
|
{
|
@@ -51,7 +51,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
51
51
|
{
|
52
52
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
53
53
|
_T("test"));
|
54
|
-
|
54
|
+
/******************************************************
|
55
|
+
!!! Important !!!
|
56
|
+
When using a multi-threaded,
|
57
|
+
please request a new connection for each database.
|
58
|
+
*******************************************************/
|
59
|
+
// When using a multi-threaded, set to true.
|
60
|
+
bool newConnection = false;
|
61
|
+
connectOpen(db, param, newConnection);
|
55
62
|
|
56
63
|
table_ptr tb = openTable(db, _T("user"));
|
57
64
|
updateUsers(tb);
|
@@ -61,6 +61,19 @@ bool updateUsers(table* tb)
|
|
61
61
|
*/
|
62
62
|
bool openDatabase(database* db, const _TCHAR* uri)
|
63
63
|
{
|
64
|
+
/******************************************************
|
65
|
+
!!! Important !!!
|
66
|
+
When using a multi-threaded,
|
67
|
+
please request a new connection for each database.
|
68
|
+
*******************************************************/
|
69
|
+
// When using a multi-threaded, set to true.
|
70
|
+
bool newConnection = false;
|
71
|
+
if (!db->connect(uri, newConnection))
|
72
|
+
{
|
73
|
+
showError(_T("connect daatabase"), NULL, db->stat());
|
74
|
+
return false;
|
75
|
+
}
|
76
|
+
|
64
77
|
db->open(uri, TYPE_SCHEMA_BDF);
|
65
78
|
if (db->stat() != 0)
|
66
79
|
{
|
@@ -51,7 +51,14 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
51
51
|
{
|
52
52
|
connectParams param(_T("tdap"), _T("localhost"), _T("test"),
|
53
53
|
_T("test"));
|
54
|
-
|
54
|
+
/******************************************************
|
55
|
+
!!! Important !!!
|
56
|
+
When using a multi-threaded,
|
57
|
+
please request a new connection for each database.
|
58
|
+
*******************************************************/
|
59
|
+
// When using a multi-threaded, set to true.
|
60
|
+
bool newConnection = false;
|
61
|
+
connectOpen(db, param, newConnection);
|
55
62
|
|
56
63
|
table_ptr tb = openTable(db, _T("user"));
|
57
64
|
dbTransaction trn(db);
|
@@ -156,11 +156,17 @@ int _tmain(int argc, _TCHAR* argv[])
|
|
156
156
|
{
|
157
157
|
connectParams param(_T("tdap"), _T("localhost"), _T("mri"),
|
158
158
|
_T("dj32.bdf"));
|
159
|
-
|
160
|
-
|
159
|
+
/******************************************************
|
160
|
+
!!! Important !!!
|
161
|
+
When using a multi-threaded,
|
162
|
+
please request a new connection for each database.
|
163
|
+
*******************************************************/
|
164
|
+
// When using a multi-threaded, set to true.
|
165
|
+
bool newConnection = false;
|
166
|
+
connectOpen(db, param, newConnection);
|
161
167
|
|
168
|
+
databaseManager mgr(db);
|
162
169
|
recordset rowset;
|
163
|
-
|
164
170
|
bzs::rtl::benchmark bm;
|
165
171
|
bm.report(boost::bind(readUsers, &mgr, &rowset), "exec time ");
|
166
172
|
showConsole(rowset);
|
@@ -22,10 +22,16 @@
|
|
22
22
|
#pragma warn -8012
|
23
23
|
#endif
|
24
24
|
|
25
|
+
#include <boost/version.hpp>
|
26
|
+
#if (BOOST_VERSION > 104900)
|
27
|
+
#include <boost/asio.hpp>
|
28
|
+
#else
|
25
29
|
#include <boost/asio/ip/tcp.hpp>
|
26
30
|
#include <boost/asio/buffer.hpp>
|
31
|
+
#endif
|
27
32
|
#include <vector>
|
28
33
|
|
34
|
+
|
29
35
|
#ifdef __BCPLUSPLUS__
|
30
36
|
#pragma warn +8012
|
31
37
|
#endif
|
@@ -76,6 +82,8 @@ class connection
|
|
76
82
|
public:
|
77
83
|
virtual ~connection(){};
|
78
84
|
virtual void connect() = 0;
|
85
|
+
virtual void reconnect(boost::asio::ip::tcp::endpoint& ep) = 0;
|
86
|
+
virtual void cleanup() = 0;
|
79
87
|
virtual void addref() = 0;
|
80
88
|
virtual void release() = 0;
|
81
89
|
virtual int refCount() const = 0;
|