transactd 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/common/tdclc_32_3_2.dll +0 -0
- data/bin/common/{tdclc_64_3_1.dll → tdclc_64_3_2.dll} +0 -0
- data/build/swig/ruby/ruby.swg +3 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +2413 -126
- data/build/swig/tdcl.i +120 -9
- data/build/tdclc/tdclc.cbproj +4 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +8 -1
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +138 -130
- data/source/bzs/db/engine/mysql/database.h +43 -48
- data/source/bzs/db/engine/mysql/dbManager.cpp +81 -96
- data/source/bzs/db/engine/mysql/dbManager.h +13 -22
- data/source/bzs/db/engine/mysql/mysqlInternal.h +157 -291
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +425 -0
- data/source/bzs/db/engine/mysql/mysqlProtocol.h +72 -0
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +8 -6
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +7 -3
- data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -0
- data/source/bzs/db/protocol/tdap/client/client.h +22 -8
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +225 -21
- data/source/bzs/db/protocol/tdap/client/connMgr.h +42 -16
- data/source/bzs/db/protocol/tdap/client/database.cpp +58 -15
- data/source/bzs/db/protocol/tdap/client/database.h +3 -3
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +93 -85
- data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +9 -5
- data/source/bzs/db/protocol/tdap/client/filter.h +2 -2
- data/source/bzs/db/protocol/tdap/client/groupComp.h +2 -2
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +71 -12
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +35 -2
- data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -0
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -1
- data/source/bzs/db/protocol/tdap/client/recordset.h +15 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +21 -16
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +32 -11
- data/source/bzs/db/protocol/tdap/client/serializer.h +4 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +3 -2
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +18 -14
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +8 -3
- data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +83 -43
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +3 -1
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +7 -7
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +247 -137
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +9 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -4
- data/source/bzs/db/protocol/tdap/tdapSchema.h +3 -7
- data/source/bzs/db/protocol/tdap/tdapcapi.h +23 -3
- data/source/bzs/db/protocol/tdap/uri.h +40 -0
- data/source/bzs/db/transactd/appModule.cpp +14 -5
- data/source/bzs/db/transactd/appModule.h +10 -1
- data/source/bzs/db/transactd/connManager.cpp +93 -48
- data/source/bzs/db/transactd/connManager.h +10 -7
- data/source/bzs/db/transactd/connectionRecord.h +114 -19
- data/source/bzs/env/tstring.h +2 -0
- data/source/bzs/example/changeSchema.cpp +1 -1
- data/source/bzs/example/changeSchema_c.cpp +1 -1
- data/source/bzs/example/insertRecords.cpp +2 -1
- data/source/bzs/example/insertRecords_c.cpp +2 -1
- data/source/bzs/example/queryData.cpp +5 -2
- data/source/bzs/netsvc/server/IAppModule.h +6 -0
- data/source/bzs/test/tdclatl/test_v3.js +75 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +104 -7
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +84 -0
- data/source/bzs/test/trdclengn/testField.h +66 -6
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +10 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +85 -0
- data/source/bzs/test/trdclengn/testbase.h +1 -1
- data/source/global/tdclatl/BinlogPos.cpp +64 -0
- data/source/global/tdclatl/BinlogPos.h +84 -0
- data/source/global/tdclatl/ConnMgr.cpp +285 -0
- data/source/global/tdclatl/ConnMgr.h +83 -0
- data/source/global/tdclatl/ConnRecord.cpp +123 -0
- data/source/global/tdclatl/ConnRecord.h +69 -0
- data/source/global/tdclatl/ConnRecords.cpp +57 -0
- data/source/global/tdclatl/ConnRecords.h +55 -0
- data/source/global/tdclatl/Database.cpp +36 -0
- data/source/global/tdclatl/Database.h +4 -0
- data/source/global/tdclatl/Table.cpp +14 -1
- data/source/global/tdclatl/Table.h +1 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +148 -4
- metadata +14 -4
- data/bin/common/tdclc_32_3_1.dll +0 -0
@@ -23,6 +23,7 @@
|
|
23
23
|
#include <sys/stat.h>
|
24
24
|
#include <stdio.h>
|
25
25
|
#include <boost/thread/mutex.hpp>
|
26
|
+
#include <bzs/db/protocol/tdap/uri.h>
|
26
27
|
|
27
28
|
#ifdef LINUX
|
28
29
|
#include <dlfcn.h>
|
@@ -146,27 +147,31 @@ struct nsdbimpl
|
|
146
147
|
short snapShotCount;
|
147
148
|
nstable* tables[nsdatabase::maxtables];
|
148
149
|
uchar_td cidPtr[16];
|
149
|
-
uchar_td* cid() { return cidPtr; }
|
150
150
|
_TCHAR bdfPath[MAX_PATH];
|
151
151
|
short tableCount;
|
152
152
|
short lockWaitCount;
|
153
153
|
short lockWaitTime;
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
154
|
+
short enginIndex;
|
155
|
+
struct
|
156
|
+
{
|
157
|
+
bool uriMode : 1;
|
158
|
+
bool uselongFilename : 1;
|
159
|
+
bool localSharing : 1;
|
160
|
+
bool ignoreTestPtr : 1;
|
161
|
+
bool reconnected : 1;
|
162
|
+
bool associateMode : 1;
|
163
|
+
};
|
159
164
|
nsdbimpl()
|
160
165
|
: refCount(1), tranCount(0), id(0), snapShotCount(0), tableCount(0),
|
161
|
-
lockWaitCount(10), lockWaitTime(100), uriMode(false),
|
166
|
+
lockWaitCount(10), lockWaitTime(100), enginIndex(0), uriMode(false),
|
162
167
|
uselongFilename(false), localSharing(false), ignoreTestPtr(false),
|
163
|
-
reconnected(false)
|
168
|
+
reconnected(false), associateMode(false)
|
164
169
|
{
|
165
170
|
}
|
166
171
|
|
167
172
|
void setId(unsigned short id_)
|
168
173
|
{
|
169
|
-
id = id_;
|
174
|
+
id = enginIndex = id_;
|
170
175
|
|
171
176
|
// make client id
|
172
177
|
memset(cidPtr, 0, 12);
|
@@ -184,6 +189,7 @@ struct nsdbimpl
|
|
184
189
|
lockWaitTime = rt.lockWaitCount;
|
185
190
|
uselongFilename = rt.uselongFilename;
|
186
191
|
uriMode = rt.uriMode;
|
192
|
+
associateMode = rt.associateMode;
|
187
193
|
}
|
188
194
|
return *this;
|
189
195
|
}
|
@@ -241,6 +247,11 @@ nsdatabase::nsdatabase() : m_stat(0)
|
|
241
247
|
m_nsimpl->setId((unsigned short)index + 1);
|
242
248
|
}
|
243
249
|
|
250
|
+
void nsdatabase::setAssociate()
|
251
|
+
{
|
252
|
+
m_nsimpl->associateMode = true;
|
253
|
+
}
|
254
|
+
|
244
255
|
int nsdatabase::refCount() const
|
245
256
|
{
|
246
257
|
return m_nsimpl->refCount;
|
@@ -262,8 +273,8 @@ nsdatabase::~nsdatabase()
|
|
262
273
|
reset();
|
263
274
|
|
264
275
|
boost::mutex::scoped_lock lck(g_mutex);
|
265
|
-
if (m_nsimpl->
|
266
|
-
engins()[m_nsimpl->
|
276
|
+
if (m_nsimpl->enginIndex != 0)
|
277
|
+
engins()[m_nsimpl->enginIndex - 1] = NULL;
|
267
278
|
delete m_nsimpl;
|
268
279
|
m_nsimpl = 0x00;
|
269
280
|
#ifdef _WIN32
|
@@ -593,6 +604,21 @@ void nsdatabase::reset()
|
|
593
604
|
m_btrcallid = getBtrvEntryPoint();
|
594
605
|
}
|
595
606
|
|
607
|
+
bool nsdatabase::checkAssociate()
|
608
|
+
{
|
609
|
+
if (m_nsimpl->associateMode)
|
610
|
+
{
|
611
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
612
|
+
return false;
|
613
|
+
}
|
614
|
+
return true;
|
615
|
+
}
|
616
|
+
|
617
|
+
bool nsdatabase::isAssociate() const
|
618
|
+
{
|
619
|
+
return m_nsimpl->associateMode;
|
620
|
+
}
|
621
|
+
|
596
622
|
void nsdatabase::resetSnapshot()
|
597
623
|
{
|
598
624
|
if (m_nsimpl->snapShotCount)
|
@@ -604,6 +630,8 @@ void nsdatabase::resetSnapshot()
|
|
604
630
|
|
605
631
|
void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
|
606
632
|
{
|
633
|
+
if (!checkAssociate()) return;
|
634
|
+
|
607
635
|
if (m_nsimpl->snapShotCount == 0)
|
608
636
|
{
|
609
637
|
uint_td datalen = (bias == CONSISTENT_READ_WITH_BINLOG_POS) ? sizeof(binlogPos) : 0;
|
@@ -637,6 +665,7 @@ void nsdatabase::endSnapshot()
|
|
637
665
|
|
638
666
|
void nsdatabase::beginTrn(short BIAS)
|
639
667
|
{
|
668
|
+
if (!checkAssociate()) return;
|
640
669
|
if (m_nsimpl->tranCount == 0)
|
641
670
|
{
|
642
671
|
m_stat = m_btrcallid((ushort_td)(BIAS + TD_BEGIN_TRANSACTION), NULL,
|
@@ -737,6 +766,28 @@ void nsdatabase::getBtrVersion(btrVersions* Vers, uchar_td* posblk)
|
|
737
766
|
}
|
738
767
|
}
|
739
768
|
|
769
|
+
char* nsdatabase::getCreateViewSql(const _TCHAR* name , char* retbuf, uint_td* size)
|
770
|
+
{
|
771
|
+
if (isUseTransactd() == false)
|
772
|
+
{
|
773
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
774
|
+
return retbuf;
|
775
|
+
}
|
776
|
+
_TCHAR tmp[MAX_PATH];
|
777
|
+
stripParam(uri(), tmp, MAX_PATH);
|
778
|
+
_tcscat(tmp, _T("?dbfile="));
|
779
|
+
_tcscat(tmp, name);
|
780
|
+
|
781
|
+
char Uri[MAX_PATH] = { 0x00 };
|
782
|
+
const char* p = nsdatabase::toServerUri(Uri, MAX_PATH, tmp, true);
|
783
|
+
keylen_td keylen = (keylen_td)strlen(p) + 1;
|
784
|
+
m_stat = m_btrcallid(TD_GET_SCHEMA, NULL, retbuf, size, (void*)p, keylen,
|
785
|
+
SC_SUBOP_VIEW_BY_SQL, m_nsimpl->cidPtr);
|
786
|
+
if (m_stat != STATUS_SUCCESS)
|
787
|
+
retbuf[0] = 0x00;
|
788
|
+
return retbuf;
|
789
|
+
}
|
790
|
+
|
740
791
|
bool nsdatabase::useLongFilename()
|
741
792
|
{
|
742
793
|
return m_nsimpl->uselongFilename;
|
@@ -782,6 +833,13 @@ void nsdatabase::readDatabaseDirectory(_TCHAR* retbuf, uchar_td buflen)
|
|
782
833
|
|
783
834
|
bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
784
835
|
{
|
836
|
+
if (!checkAssociate()) return false;
|
837
|
+
if (isOpened())
|
838
|
+
{
|
839
|
+
m_stat = STATUS_DB_YET_OPEN;
|
840
|
+
return false;
|
841
|
+
}
|
842
|
+
|
785
843
|
if (isTransactdUri(URI))
|
786
844
|
{
|
787
845
|
if (!setUseTransactd())
|
@@ -806,6 +864,8 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
|
806
864
|
|
807
865
|
bool nsdatabase::disconnect(const _TCHAR* URI)
|
808
866
|
{
|
867
|
+
if (!checkAssociate()) return false;
|
868
|
+
|
809
869
|
if (!URI || (URI[0] == 0x00) || isTransactdUri(URI))
|
810
870
|
if (!setUseTransactd())
|
811
871
|
return false;
|
@@ -820,7 +880,6 @@ bool nsdatabase::disconnect(const _TCHAR* URI)
|
|
820
880
|
return true;
|
821
881
|
}
|
822
882
|
|
823
|
-
|
824
883
|
bool nsdatabase::disconnectForReconnectTest()
|
825
884
|
{
|
826
885
|
//Transactd only
|
@@ -99,6 +99,8 @@ protected:
|
|
99
99
|
void addref();
|
100
100
|
void internalRelease() { nsdatabase::release(); }
|
101
101
|
void doReconnect(nstable* tb);
|
102
|
+
void setAssociate();
|
103
|
+
bool checkAssociate();
|
102
104
|
virtual bool doReopenDatabaseSchema(){ return true; }
|
103
105
|
virtual void* getExtendBufferForOpen(uint_td& size){ return NULL; };
|
104
106
|
public:
|
@@ -152,8 +154,11 @@ public:
|
|
152
154
|
bool disconnectForReconnectTest(); //for connection brokn emulate
|
153
155
|
bool reconnect();
|
154
156
|
bool isReconnected() const;
|
157
|
+
bool isAssociate() const;
|
158
|
+
virtual bool isOpened() const { return false;}
|
159
|
+
char* getCreateViewSql(const _TCHAR* name, char* retbuf, uint_td* size);
|
155
160
|
|
156
|
-
static const int maxtables =
|
161
|
+
static const int maxtables = 150;
|
157
162
|
static bool trnsactionFlushWaitStatus();
|
158
163
|
static void setExecCodePage(unsigned int codepage);
|
159
164
|
static unsigned int execCodePage();
|
@@ -163,6 +168,7 @@ public:
|
|
163
168
|
static WIN_TPOOL_SHUTDOWN_PTR getWinTPoolShutdownFunc();
|
164
169
|
static bool testTablePtr(nstable* ptr);
|
165
170
|
static void setCheckTablePtr(bool v);
|
171
|
+
|
166
172
|
/** @endcond */
|
167
173
|
};
|
168
174
|
|
@@ -762,6 +762,40 @@ void nstable::clearOwnerName()
|
|
762
762
|
tdap(TD_CLEAR_OWNERNAME);
|
763
763
|
}
|
764
764
|
|
765
|
+
char* nstable::getCreateSql(char* retbuf, uint_td* size /* in out */)
|
766
|
+
{
|
767
|
+
if (isUseTransactd() == false)
|
768
|
+
{
|
769
|
+
m_stat = STATUS_NOSUPPORT_OP;
|
770
|
+
return retbuf;
|
771
|
+
}
|
772
|
+
|
773
|
+
void* tmp = m_keybuf;
|
774
|
+
char_td keynum = m_keynum;
|
775
|
+
void* pdata = m_pdata;
|
776
|
+
|
777
|
+
char tmpName[MAX_PATH] = { 0x00 };
|
778
|
+
const char* p = nsdatabase::toServerUri(tmpName, MAX_PATH, uri(), true);
|
779
|
+
m_keybuf = (void*)p;
|
780
|
+
m_keylen = (keylen_td)strlen(p) + 1;
|
781
|
+
m_pdata = retbuf;
|
782
|
+
m_datalen = *size;
|
783
|
+
m_keynum = SC_SUBOP_BY_SQL;
|
784
|
+
|
785
|
+
tdap((ushort_td)TD_GET_SCHEMA);
|
786
|
+
if (m_stat != STATUS_SUCCESS)
|
787
|
+
{
|
788
|
+
retbuf[0] = 0x00;
|
789
|
+
*size = 0;
|
790
|
+
}else
|
791
|
+
*size = m_datalen;
|
792
|
+
|
793
|
+
m_keybuf = tmp;
|
794
|
+
m_keynum = keynum;
|
795
|
+
m_pdata = pdata;
|
796
|
+
return retbuf;
|
797
|
+
}
|
798
|
+
|
765
799
|
void nstable::stats(void* dataBuf, uint_td len, bool estimate)
|
766
800
|
{
|
767
801
|
void* svm_pdata = m_pdata;
|
@@ -811,7 +845,6 @@ ushort_td nstable::recordLength()
|
|
811
845
|
|
812
846
|
void nstable::doCreateIndex(bool specifyKeyNum)
|
813
847
|
{
|
814
|
-
|
815
848
|
if (specifyKeyNum)
|
816
849
|
m_keynum += ((uchar_td)0x80);
|
817
850
|
tdap(TD_BUILD_INDEX);
|
@@ -965,7 +998,7 @@ _TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
|
|
965
998
|
else
|
966
999
|
p2 = NULL;
|
967
1000
|
}
|
968
|
-
if (p)
|
1001
|
+
if (p && (uri == false))
|
969
1002
|
*p = 0x00;
|
970
1003
|
if (p2)
|
971
1004
|
*(p2 + 1) = 0x00;
|
@@ -222,6 +222,7 @@ public:
|
|
222
222
|
void clearOwnerName();
|
223
223
|
ushort_td recordLength();
|
224
224
|
void stats(void* databuffer, uint_td buflen, bool estimate = true);
|
225
|
+
char* getCreateSql(char* retbuf, uint_td* size);
|
225
226
|
void unlock(bookmark_td& bm);
|
226
227
|
void unlock();
|
227
228
|
char_td mode() const;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*=================================================================
|
2
|
-
Copyright (C) 2014 BizStation Corp All rights reserved.
|
2
|
+
Copyright (C) 2014-2016 BizStation Corp All rights reserved.
|
3
3
|
|
4
4
|
This program is free software; you can redistribute it and/or
|
5
5
|
modify it under the terms of the GNU General Public License
|
@@ -208,6 +208,10 @@ void recordset::dump()
|
|
208
208
|
{
|
209
209
|
m_imple->dump();
|
210
210
|
}
|
211
|
+
void recordset::dump(std::tostream& os)
|
212
|
+
{
|
213
|
+
m_imple->dump(os);
|
214
|
+
}
|
211
215
|
#endif
|
212
216
|
|
213
217
|
} // namespace client
|
@@ -19,6 +19,10 @@
|
|
19
19
|
02111-1307, USA.
|
20
20
|
=================================================================*/
|
21
21
|
#include "groupQuery.h"
|
22
|
+
#ifdef _DEBUG
|
23
|
+
#include <iostream>
|
24
|
+
#include <bzs/env/tstring.h>
|
25
|
+
#endif
|
22
26
|
|
23
27
|
namespace bzs
|
24
28
|
{
|
@@ -74,6 +78,17 @@ public:
|
|
74
78
|
|
75
79
|
#ifdef _DEBUG
|
76
80
|
void dump();
|
81
|
+
void dump(std::tostream& os);
|
82
|
+
|
83
|
+
/*
|
84
|
+
Output to file.
|
85
|
+
|
86
|
+
#include <fstream>
|
87
|
+
std::locale::global(std::locale("japanese"));
|
88
|
+
std::wofstream ost("temp.txt");
|
89
|
+
rs.dump(ost);
|
90
|
+
*/
|
91
|
+
|
77
92
|
#endif
|
78
93
|
};
|
79
94
|
|
@@ -81,14 +81,14 @@ class dumpRecordset
|
|
81
81
|
return s;
|
82
82
|
}
|
83
83
|
|
84
|
-
void printValue(size_t width, std::ios::fmtflags f, const _TCHAR* value)
|
84
|
+
void printValue(std::tostream& os, size_t width, std::ios::fmtflags f, const _TCHAR* value)
|
85
85
|
{
|
86
|
-
|
87
|
-
|
86
|
+
os.setf(f, std::ios::adjustfield);
|
87
|
+
os << _T(" ") << std::setw(width) << value << _T(" |");
|
88
88
|
}
|
89
89
|
|
90
90
|
const _TCHAR* value(const fielddef& fd) {return fd.name();}
|
91
|
-
const _TCHAR* value(const field& fd)
|
91
|
+
const _TCHAR* value(const field& fd)
|
92
92
|
{
|
93
93
|
if (fd.isNull())
|
94
94
|
return _T("NULL");
|
@@ -96,31 +96,31 @@ class dumpRecordset
|
|
96
96
|
}
|
97
97
|
|
98
98
|
template <class T>
|
99
|
-
void printRecord(const T& coll)
|
99
|
+
void printRecord(std::tostream& os, const T& coll)
|
100
100
|
{
|
101
|
-
|
101
|
+
os << _T("|");
|
102
102
|
for (size_t col = 0; col < m_widths.size(); ++col)
|
103
|
-
printValue(m_widths[col], m_ailgns[col], value(coll[(short)col]));
|
104
|
-
|
103
|
+
printValue(os, m_widths[col], m_ailgns[col], value(coll[(short)col]));
|
104
|
+
os << std::endl;
|
105
105
|
}
|
106
106
|
public:
|
107
|
-
void operator()(RS& rs)
|
107
|
+
void operator()(std::tostream& os, RS& rs)
|
108
108
|
{
|
109
109
|
if (rs.size())
|
110
110
|
{
|
111
111
|
cacheWidthAndAlign(rs);
|
112
112
|
std::_tstring line = makeLine();
|
113
113
|
//header
|
114
|
-
|
115
|
-
printRecord(*rs.fieldDefs());
|
116
|
-
|
114
|
+
os << line;
|
115
|
+
printRecord(os, *rs.fieldDefs());
|
116
|
+
os << line;
|
117
117
|
|
118
118
|
//field value
|
119
119
|
for(size_t i = 0; i < rs.size(); ++i)
|
120
|
-
printRecord(rs[i]);
|
121
|
-
|
120
|
+
printRecord(os, rs[i]);
|
121
|
+
os << line;
|
122
122
|
}else
|
123
|
-
|
123
|
+
os << _T("Empty set ") << std::endl;
|
124
124
|
}
|
125
125
|
};
|
126
126
|
#endif
|
@@ -697,7 +697,12 @@ public:
|
|
697
697
|
void dump()
|
698
698
|
{
|
699
699
|
dumpRecordset<recordsetImple> dumpRs;
|
700
|
-
dumpRs(*this);
|
700
|
+
dumpRs(std::tcout, *this);
|
701
|
+
}
|
702
|
+
void dump(std::tostream& os)
|
703
|
+
{
|
704
|
+
dumpRecordset<recordsetImple> dumpRs;
|
705
|
+
dumpRs(os, *this);
|
701
706
|
}
|
702
707
|
#endif
|
703
708
|
};
|
@@ -66,8 +66,14 @@ BOOST_CLASS_EXPORT_GUID(bzs::db::protocol::tdap::client::reverseOrderStatement,
|
|
66
66
|
|
67
67
|
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::groupFuncBase, 1)
|
68
68
|
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::queryBase, 1)
|
69
|
-
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::readStatement, 1)
|
70
69
|
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::readHasMany, 1)
|
70
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::executable, 2)
|
71
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::readStatement, 2)
|
72
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::groupByStatement, 2)
|
73
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::matchByStatement, 2)
|
74
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::orderByStatement, 2)
|
75
|
+
BOOST_CLASS_VERSION(bzs::db::protocol::tdap::client::reverseOrderStatement, 2)
|
76
|
+
|
71
77
|
namespace bzs
|
72
78
|
{
|
73
79
|
namespace db
|
@@ -117,8 +123,15 @@ void serialize_string(Archive& ar, const char* name, std::_tstring& v)
|
|
117
123
|
}
|
118
124
|
|
119
125
|
template <class Archive>
|
120
|
-
void
|
126
|
+
void serializeExecutable(Archive& ar, executable& exec, const unsigned int version)
|
121
127
|
{
|
128
|
+
if (version >= 2)
|
129
|
+
{
|
130
|
+
int v = (int)exec.isEnabled();
|
131
|
+
ar& make_nvp("enabled", v);
|
132
|
+
if (Archive::is_loading::value)
|
133
|
+
exec.setEnabled(v);
|
134
|
+
}
|
122
135
|
}
|
123
136
|
|
124
137
|
template <class Archive>
|
@@ -148,40 +161,45 @@ void serialize(Archive& ar, sortFields& q, const unsigned int)
|
|
148
161
|
}
|
149
162
|
|
150
163
|
template <class Archive>
|
151
|
-
void serialize(Archive& ar, groupByStatement& q, const unsigned int
|
164
|
+
void serialize(Archive& ar, groupByStatement& q, const unsigned int version)
|
152
165
|
{
|
153
166
|
boost::serialization::base_object<executable>(q);
|
167
|
+
serializeExecutable(ar, q, version);
|
154
168
|
ar& boost::serialization::make_nvp(
|
155
169
|
"keyFields", boost::serialization::base_object<fieldNames>(q));
|
156
170
|
ar& boost::serialization::make_nvp("functions", *q.m_statements);
|
157
171
|
}
|
158
172
|
|
159
173
|
template <class Archive>
|
160
|
-
void serialize(Archive& ar, matchByStatement& q, const unsigned int
|
174
|
+
void serialize(Archive& ar, matchByStatement& q, const unsigned int version)
|
161
175
|
{
|
162
176
|
boost::serialization::base_object<executable>(q);
|
177
|
+
serializeExecutable(ar, q, version);
|
163
178
|
ar& make_nvp("matchByStatement",
|
164
179
|
boost::serialization::base_object<recordsetQuery>(q));
|
165
180
|
}
|
166
181
|
|
167
182
|
template <class Archive>
|
168
|
-
void serialize(Archive& ar, orderByStatement& q, const unsigned int
|
183
|
+
void serialize(Archive& ar, orderByStatement& q, const unsigned int version)
|
169
184
|
{
|
170
185
|
boost::serialization::base_object<executable>(q);
|
186
|
+
serializeExecutable(ar, q, version);
|
171
187
|
ar& boost::serialization::make_nvp("sortFields", *q.m_sortFields);
|
172
188
|
}
|
173
189
|
|
174
190
|
template <class Archive>
|
175
|
-
void serialize(Archive&
|
176
|
-
const unsigned int
|
191
|
+
void serialize(Archive& ar, reverseOrderStatement& q,
|
192
|
+
const unsigned int version)
|
177
193
|
{
|
178
194
|
boost::serialization::base_object<executable>(q);
|
195
|
+
serializeExecutable(ar, q, version);
|
179
196
|
}
|
180
197
|
|
181
198
|
template <class Archive>
|
182
199
|
void serialize(Archive& ar, readStatement& q, const unsigned int version)
|
183
200
|
{
|
184
201
|
boost::serialization::base_object<executable>(q);
|
202
|
+
serializeExecutable(ar, q, version);
|
185
203
|
if (version < 1)
|
186
204
|
ar& boost::serialization::make_nvp(
|
187
205
|
"keyFields", boost::serialization::base_object<fieldNames>(q));
|
@@ -440,7 +458,7 @@ void serialize(Archive& ar, alias_type& q, const unsigned int /*version*/)
|
|
440
458
|
void executable::release()
|
441
459
|
{
|
442
460
|
delete this;
|
443
|
-
}
|
461
|
+
}
|
444
462
|
|
445
463
|
//---------------------------------------------------------------------------
|
446
464
|
// class groupByStatement
|
@@ -673,9 +691,12 @@ struct queryStatementsImple
|
|
673
691
|
{
|
674
692
|
for (size_t i = 0; i < statements.size(); ++i)
|
675
693
|
{
|
676
|
-
statements[i]->
|
677
|
-
|
678
|
-
|
694
|
+
if (statements[i]->isEnabled())
|
695
|
+
{
|
696
|
+
statements[i]->execute(rs);
|
697
|
+
if (listner)
|
698
|
+
listner->onExecuted(statements[i], rs);
|
699
|
+
}
|
679
700
|
}
|
680
701
|
}
|
681
702
|
|
@@ -60,11 +60,14 @@ namespace client
|
|
60
60
|
class DLLLIBSTMT executable
|
61
61
|
{
|
62
62
|
friend struct queryStatementsImple;
|
63
|
-
|
63
|
+
bool m_enabled;
|
64
64
|
public:
|
65
|
+
executable() : m_enabled(true){}
|
65
66
|
virtual ~executable(){};
|
66
67
|
virtual void execute(recordset& rs) = 0;
|
67
68
|
void release();
|
69
|
+
void setEnabled(bool v) { m_enabled = v; }
|
70
|
+
bool isEnabled() const { return m_enabled; }
|
68
71
|
virtual const int typeID() const = 0;
|
69
72
|
};
|
70
73
|
|
@@ -281,7 +281,8 @@ std::string sqlBuilder::getFieldList(const tabledef* table, std::vector<std::str
|
|
281
281
|
s += fdl[i];
|
282
282
|
s += "` ";
|
283
283
|
len = fd.len - fd.varLenBytes();
|
284
|
-
|
284
|
+
if (fd.type == ft_myfixedbinary)
|
285
|
+
len -= 2;
|
285
286
|
/*
|
286
287
|
Although len is a number of bytes in BDF, it becomes the number of
|
287
288
|
characters in MySQL.
|
@@ -489,7 +490,7 @@ std::string sqlBuilder::getKeyList(const tabledef* table, std::vector<std::strin
|
|
489
490
|
return s;
|
490
491
|
}
|
491
492
|
|
492
|
-
std::string convertString(unsigned int toPage, unsigned int fromPage,
|
493
|
+
std::string sqlBuilder::convertString(unsigned int toPage, unsigned int fromPage,
|
493
494
|
const char* p)
|
494
495
|
{
|
495
496
|
std::string s;
|
@@ -54,6 +54,9 @@ public:
|
|
54
54
|
|
55
55
|
static std::string sqlCreateIndex(const tabledef* table, int keyNum,
|
56
56
|
bool specifyKeyNum, uchar_td charsetIndexServer, const clsrv_ver* ver);
|
57
|
+
|
58
|
+
static std::string convertString(unsigned int toPage, unsigned int fromPage,
|
59
|
+
const char* p);
|
57
60
|
};
|
58
61
|
|
59
62
|
} // namespace client
|
@@ -351,7 +351,7 @@ public:
|
|
351
351
|
else
|
352
352
|
memcpy(m_tmpPtr, m_ptr, m_len);
|
353
353
|
if (bd)
|
354
|
-
bd = m_tb->setBlobFieldPointer((char*)m_tmpPtr, m_hd, bd);
|
354
|
+
bd = m_tb->setBlobFieldPointer(((char*)m_tmpPtr) + td->nullbytes(), m_hd, bd);
|
355
355
|
}
|
356
356
|
}
|
357
357
|
++m_row;
|
@@ -444,7 +444,7 @@ public:
|
|
444
444
|
else
|
445
445
|
m_tmpPtr = m_ptr;
|
446
446
|
|
447
|
-
m_tb->setBlobFieldPointer((char*)m_tmpPtr, m_hd);
|
447
|
+
m_tb->setBlobFieldPointer((char*)m_tmpPtr + td->nullbytes(), m_hd);
|
448
448
|
return m_tmpPtr;
|
449
449
|
}
|
450
450
|
}
|
@@ -1509,7 +1509,7 @@ keylen_td table::writeKeyDataTo(uchar_td* to, int keySize)
|
|
1509
1509
|
if ((f.bit9 | f.bit3) && (transactd == true))
|
1510
1510
|
isNull = false;
|
1511
1511
|
fielddef& fd = (*m_tableDef)->fieldDefs[fdnum];
|
1512
|
-
to = fd.keyCopy(to, (uchar_td*)fieldPtr(fdnum), 0xff, isNull);
|
1512
|
+
to = fd.keyCopy(to, (uchar_td*)fieldPtr(fdnum), 0xff, isNull, transactd);
|
1513
1513
|
}
|
1514
1514
|
return (keylen_td)(to - start);
|
1515
1515
|
}
|
@@ -1548,7 +1548,7 @@ uint_td table::doGetWriteImageLen()
|
|
1548
1548
|
uint_td bytes = fd.blobLenBytes();
|
1549
1549
|
if (bytes)
|
1550
1550
|
{
|
1551
|
-
uchar_td* fdptr = (uchar_td*)m_pdata + fd.pos;
|
1551
|
+
uchar_td* fdptr = (uchar_td*)m_pdata + fd.pos + td->nullbytes();
|
1552
1552
|
blob b(fd.blobDataLen(fdptr), i, fd.blobDataPtr(fdptr));
|
1553
1553
|
addSendBlob(&b);
|
1554
1554
|
}
|
@@ -1648,16 +1648,20 @@ unsigned char* table::setBlobFieldPointer(char* ptr, const blobHeader* hd, unsig
|
|
1648
1648
|
|
1649
1649
|
//copy size byte
|
1650
1650
|
memcpy(fdptr, &f->size, sizeByte);
|
1651
|
-
|
1652
|
-
//copy data
|
1653
|
-
if (to)
|
1651
|
+
if (f->size)
|
1654
1652
|
{
|
1655
|
-
|
1656
|
-
data
|
1657
|
-
to
|
1658
|
-
|
1659
|
-
|
1660
|
-
|
1653
|
+
const char* data = f->data();
|
1654
|
+
//copy data
|
1655
|
+
if (to)
|
1656
|
+
{
|
1657
|
+
memcpy(to, data, f->size);
|
1658
|
+
data = (char*)to;
|
1659
|
+
to += f->size;
|
1660
|
+
}
|
1661
|
+
//copy address
|
1662
|
+
memcpy(fdptr + sizeByte, &data, sizeof(char*));
|
1663
|
+
}else
|
1664
|
+
memset(fdptr + sizeByte, 0, sizeof(char*));
|
1661
1665
|
f = f->next();
|
1662
1666
|
}
|
1663
1667
|
++hd->curRow;
|
@@ -1678,7 +1682,7 @@ void table::onReadAfter()
|
|
1678
1682
|
if (blobFieldUsed())
|
1679
1683
|
{
|
1680
1684
|
const blobHeader* hd = getBlobHeader();
|
1681
|
-
setBlobFieldPointer((char*)m_pdata, hd);
|
1685
|
+
setBlobFieldPointer((char*)m_pdata + (*m_tableDef)->nullbytes(), hd);
|
1682
1686
|
}
|
1683
1687
|
if ((*m_tableDef)->recordlen() - m_datalen > 0)
|
1684
1688
|
memset((char*)m_pdata + m_datalen, 0, (*m_tableDef)->recordlen() - m_datalen);
|
@@ -807,6 +807,12 @@ inline database_ptr createDatabaseObject()
|
|
807
807
|
return p;
|
808
808
|
}
|
809
809
|
|
810
|
+
inline database_ptr createAssociateObject(database_ptr db)
|
811
|
+
{
|
812
|
+
database_ptr p(db->createAssociate(), releaseDatabase);
|
813
|
+
return p;
|
814
|
+
}
|
815
|
+
|
810
816
|
template <class Database_Ptr>
|
811
817
|
inline void disconnect(Database_Ptr db, const connectParams& connPrams)
|
812
818
|
{
|
@@ -889,9 +895,8 @@ inline void connectOpen(Database_Ptr db, const connectParams& connPrams,
|
|
889
895
|
template <class Database_Ptr> inline void dropDatabase(Database_Ptr db, const _TCHAR* uri=NULL)
|
890
896
|
{
|
891
897
|
db->drop(uri);
|
892
|
-
if (db->stat())
|
893
|
-
|
894
|
-
db->stat());
|
898
|
+
if (db->stat() && (db->stat() != ERROR_NO_DATABASE))
|
899
|
+
throwDbError(db, _T("Drop database : "), uri ? uri : _T(""));
|
895
900
|
}
|
896
901
|
|
897
902
|
template <class Database_Ptr>
|