transactd 3.0.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/common/tdclc_32_3_1.dll +0 -0
- data/bin/common/tdclc_64_3_1.dll +0 -0
- data/build/common/transactd.rc.in +1 -1
- data/build/swig/ruby/tdclrb_wrap.cpp +219 -15
- data/build/swig/tdcl.i +26 -0
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +5 -5
- data/build/tdclcpp/tdclcpp.rc +5 -5
- data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
- data/build/tdclrb/tdclrb.rc +5 -5
- data/source/bzs/db/engine/mysql/database.cpp +131 -29
- data/source/bzs/db/engine/mysql/database.h +8 -6
- data/source/bzs/db/engine/mysql/dbManager.cpp +30 -12
- data/source/bzs/db/engine/mysql/dbManager.h +1 -1
- data/source/bzs/db/engine/mysql/mysqlInternal.h +251 -24
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +2 -3
- data/source/bzs/db/protocol/tdap/client/bulkInsert.h +2 -2
- data/source/bzs/db/protocol/tdap/client/client.h +4 -3
- data/source/bzs/db/protocol/tdap/client/connMgr.h +1 -1
- data/source/bzs/db/protocol/tdap/client/database.cpp +195 -91
- data/source/bzs/db/protocol/tdap/client/database.h +6 -6
- data/source/bzs/db/protocol/tdap/client/databaseManager.h +9 -3
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +31 -25
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -2
- data/source/bzs/db/protocol/tdap/client/field.cpp +6 -16
- data/source/bzs/db/protocol/tdap/client/filter.h +28 -9
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +14 -4
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +20 -2
- data/source/bzs/db/protocol/tdap/client/pooledDatabaseManager.h +5 -2
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +2 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -16
- data/source/bzs/db/protocol/tdap/client/table.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/table.h +1 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -9
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +68 -21
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +3 -7
- data/source/bzs/db/protocol/tdap/tdapSchema.h +9 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +11 -3
- data/source/bzs/db/protocol/tdap/uri.h +3 -1
- data/source/bzs/env/crosscompile.h +17 -3
- data/source/bzs/test/tdclatl/test_v3.js +60 -2
- data/source/bzs/test/tdclphp/transactd_Test.php +8 -0
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +11 -3
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +32 -8
- data/source/bzs/test/tdclrb/bench_tdclcpp.rb +7 -7
- data/source/bzs/test/tdclrb/transactd_spec.rb +22 -1
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +29 -3
- data/source/bzs/test/trdclengn/testField.h +34 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +7 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +7 -8
- data/source/global/tdclatl/Database.cpp +34 -10
- data/source/global/tdclatl/Database.h +5 -5
- data/source/global/tdclatl/PooledDbManager.cpp +20 -3
- data/source/global/tdclatl/PooledDbManager.h +2 -2
- data/source/global/tdclatl/_IDatabaseEvents_CP.h +5 -4
- data/source/global/tdclatl/tdclatl.idl +157 -119
- metadata +4 -4
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
@@ -221,10 +221,12 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
221
221
|
case TD_END_TRANSACTION:
|
222
222
|
case TD_BEGIN_TRANSACTION:
|
223
223
|
case TD_ABORT_TRANSACTION:
|
224
|
-
case TD_BEGIN_SHAPSHOT:
|
225
224
|
case TD_END_SNAPSHOT:
|
226
225
|
client_t->req().paramMask = 0;
|
227
226
|
break;
|
227
|
+
case TD_BEGIN_SHAPSHOT:
|
228
|
+
client_t->req().paramMask = P_MASK_DATALEN | P_MASK_DATA;
|
229
|
+
break;
|
228
230
|
case TD_KEY_FIRST:
|
229
231
|
case TD_KEY_LAST:
|
230
232
|
case TD_KEY_FIRST_KO:
|
@@ -273,7 +275,7 @@ extern "C" PACKAGE_OSX short_td __STDCALL
|
|
273
275
|
if (client_t->req().keyNum == ST_SUB_GETSQL_BY_TABLEDEF)
|
274
276
|
{
|
275
277
|
client_t->req().result = 0;
|
276
|
-
client_t->getSqlCreate();
|
278
|
+
client_t->getSqlCreate(CHARSET_UTF8);
|
277
279
|
client_t->cleanup();
|
278
280
|
return client_t->req().result;
|
279
281
|
}
|
@@ -867,6 +867,7 @@ void field::storeValueDbl(double value)
|
|
867
867
|
void field::storeValueStrA(const char* data)
|
868
868
|
{
|
869
869
|
char* p = (char*)m_ptr + m_fd->pos;
|
870
|
+
m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
|
870
871
|
switch (m_fd->type)
|
871
872
|
{
|
872
873
|
case ft_string:
|
@@ -910,6 +911,7 @@ void field::storeValueStrA(const char* data)
|
|
910
911
|
const char* field::readValueStrA() const
|
911
912
|
{
|
912
913
|
char* data = (char*)m_ptr + m_fd->pos;
|
914
|
+
m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
|
913
915
|
switch (m_fd->type)
|
914
916
|
{
|
915
917
|
case ft_string:
|
@@ -957,6 +959,7 @@ const char* field::readValueStrA() const
|
|
957
959
|
void field::storeValueStrW(const WCHAR* data)
|
958
960
|
{
|
959
961
|
char* p = (char*)m_ptr + m_fd->pos;
|
962
|
+
m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
|
960
963
|
switch (m_fd->type)
|
961
964
|
{
|
962
965
|
case ft_string:
|
@@ -1003,6 +1006,7 @@ void field::storeValueStrW(const WCHAR* data)
|
|
1003
1006
|
const WCHAR* field::readValueStrW() const
|
1004
1007
|
{
|
1005
1008
|
char* data = (char*)m_ptr + m_fd->pos;
|
1009
|
+
m_fds->cv()->setCodePage(mysql::codePage(m_fd->charsetIndex()));
|
1006
1010
|
switch (m_fd->type)
|
1007
1011
|
{
|
1008
1012
|
case ft_string:
|
@@ -1727,6 +1731,7 @@ void field::setFV(const void* data, uint_td size)
|
|
1727
1731
|
case ft_mywvarbinary:
|
1728
1732
|
case ft_mywvarchar:
|
1729
1733
|
case ft_lstring:
|
1734
|
+
case ft_lvar:
|
1730
1735
|
{
|
1731
1736
|
int sizeByte = m_fd->varLenBytes();
|
1732
1737
|
size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
|
@@ -1746,15 +1751,6 @@ void field::setFV(const void* data, uint_td size)
|
|
1746
1751
|
memcpy(p + sizeByte, &data, sizeof(char*));
|
1747
1752
|
break;
|
1748
1753
|
}
|
1749
|
-
case ft_lvar:
|
1750
|
-
{
|
1751
|
-
int sizeByte = 2;
|
1752
|
-
size = std::min<uint_td>((uint_td)(m_fd->len - sizeByte), size);
|
1753
|
-
memset(p, 0, m_fd->len);
|
1754
|
-
memcpy(p, &size, sizeByte);
|
1755
|
-
memcpy(p + sizeByte, data, size);
|
1756
|
-
break;
|
1757
|
-
}
|
1758
1754
|
default:
|
1759
1755
|
size = std::min<uint_td>((uint_td)m_fd->len, size);
|
1760
1756
|
memset(p, 0, m_fd->len);
|
@@ -2134,6 +2130,7 @@ void* field::getFVbin(uint_td& size) const
|
|
2134
2130
|
case ft_mywvarbinary:
|
2135
2131
|
case ft_mywvarchar:
|
2136
2132
|
case ft_lstring:
|
2133
|
+
case ft_lvar:
|
2137
2134
|
{
|
2138
2135
|
int sizeByte = m_fd->varLenBytes();
|
2139
2136
|
size = 0;
|
@@ -2155,13 +2152,6 @@ void* field::getFVbin(uint_td& size) const
|
|
2155
2152
|
}
|
2156
2153
|
return NULL;
|
2157
2154
|
}
|
2158
|
-
case ft_lvar:
|
2159
|
-
{
|
2160
|
-
int sizeByte = 2;
|
2161
|
-
size = 0;
|
2162
|
-
memcpy(&size, p, sizeByte);
|
2163
|
-
return (void*)(p + sizeByte);
|
2164
|
-
}
|
2165
2155
|
default:
|
2166
2156
|
size = m_fd->len;
|
2167
2157
|
return (void*)(p);
|
@@ -571,6 +571,8 @@ class filter
|
|
571
571
|
uchar_td* m_buftmp;
|
572
572
|
|
573
573
|
int m_extendBuflen;
|
574
|
+
int m_limitRows;
|
575
|
+
int m_readedRows;
|
574
576
|
short m_stat;
|
575
577
|
ushort_td m_preparedId;
|
576
578
|
table::eFindType m_direction;
|
@@ -638,8 +640,8 @@ class filter
|
|
638
640
|
m_selectFieldIndexes.push_back(fieldNum);
|
639
641
|
bsize.select += r.size();
|
640
642
|
bsize.retRowSize += r.len;
|
641
|
-
|
642
|
-
if (
|
643
|
+
const fielddef& fd = m_tb->tableDef()->fieldDefs[fieldNum];
|
644
|
+
if (fd.nullbytes() && fd.isNullable())
|
643
645
|
{
|
644
646
|
++bsize.nullfields;
|
645
647
|
bsize.nullbytes = (bsize.nullfields + 7) / 8;
|
@@ -838,7 +840,9 @@ class filter
|
|
838
840
|
m_withBookmark = q->isBookmarkAlso();
|
839
841
|
m_cachedOptimize = q->getOptimize();
|
840
842
|
m_stopAtLimit = q->isStopAtLimit();
|
841
|
-
|
843
|
+
m_limitRows = m_stopAtLimit ? q->getLimit() : 0;
|
844
|
+
m_readedRows = 0;
|
845
|
+
m_seekByBookmarks = q->isSeekByBookmarks();
|
842
846
|
|
843
847
|
if (q->isAll())
|
844
848
|
addAllFields();
|
@@ -958,7 +962,9 @@ class filter
|
|
958
962
|
m_ret.maxRows =
|
959
963
|
(unsigned short)std::min<int>(calcMaxResultRows(), USHRT_MAX);
|
960
964
|
else if (resultBufferNeedSize() > maxDataBuffer())
|
961
|
-
m_ret.maxRows = calcMaxResultRows();
|
965
|
+
m_ret.maxRows = calcMaxResultRows();
|
966
|
+
if (m_stopAtLimit && (m_limitRows - m_readedRows < m_ret.maxRows))
|
967
|
+
m_ret.maxRows = m_limitRows - m_readedRows;
|
962
968
|
}
|
963
969
|
|
964
970
|
return len;
|
@@ -974,7 +980,6 @@ class filter
|
|
974
980
|
return true;
|
975
981
|
}
|
976
982
|
|
977
|
-
|
978
983
|
int doWriteBuffer()
|
979
984
|
{
|
980
985
|
#ifdef _DEBUG
|
@@ -1016,10 +1021,11 @@ class filter
|
|
1016
1021
|
|
1017
1022
|
|
1018
1023
|
filter(table* tb)
|
1019
|
-
: m_tb(tb), m_seeksWritedCount(0), m_extendBuflen(0),
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1024
|
+
: m_tb(tb), m_seeksWritedCount(0), m_extendBuflen(0),
|
1025
|
+
m_limitRows(0), m_readedRows(0), m_stat(0),
|
1026
|
+
m_preparedId(0), m_ignoreFields(false), m_seeksMode(false),
|
1027
|
+
m_useOptimize(true), m_withBookmark(true), m_hasManyJoin(false),
|
1028
|
+
m_preparingMode(false), m_ddba(false), m_stopAtLimit(false)
|
1023
1029
|
{
|
1024
1030
|
m_isTransactd = m_tb->isUseTransactd();
|
1025
1031
|
m_ddba = m_isTransactd;
|
@@ -1045,6 +1051,8 @@ public:
|
|
1045
1051
|
m_preparingMode = false;
|
1046
1052
|
m_preparedId = 0;
|
1047
1053
|
m_stat = 0;
|
1054
|
+
m_limitRows = 0;
|
1055
|
+
m_readedRows = 0;
|
1048
1056
|
bsize.clear();
|
1049
1057
|
}
|
1050
1058
|
|
@@ -1345,6 +1353,17 @@ public:
|
|
1345
1353
|
|
1346
1354
|
bool withBookmark() const { return m_withBookmark; }
|
1347
1355
|
|
1356
|
+
bool isReadLimit(int readed)
|
1357
|
+
{
|
1358
|
+
if (m_stopAtLimit)
|
1359
|
+
{
|
1360
|
+
m_readedRows += readed;
|
1361
|
+
return (m_limitRows - m_readedRows <= 0);
|
1362
|
+
}
|
1363
|
+
return false;
|
1364
|
+
}
|
1365
|
+
void resetReaded() { m_readedRows = 0;}
|
1366
|
+
|
1348
1367
|
static filter* create(table* tb)
|
1349
1368
|
{
|
1350
1369
|
return new filter(tb);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/* =================================================================
|
2
|
-
Copyright (C) 2000-
|
2
|
+
Copyright (C) 2000-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
|
@@ -546,6 +546,7 @@ bool nsdatabase::findTable(nstable* tb)
|
|
546
546
|
void nsdatabase::reset()
|
547
547
|
{
|
548
548
|
int i;
|
549
|
+
resetSnapshot();
|
549
550
|
|
550
551
|
if (m_nsimpl->tranCount)
|
551
552
|
{
|
@@ -592,11 +593,21 @@ void nsdatabase::reset()
|
|
592
593
|
m_btrcallid = getBtrvEntryPoint();
|
593
594
|
}
|
594
595
|
|
595
|
-
void nsdatabase::
|
596
|
+
void nsdatabase::resetSnapshot()
|
597
|
+
{
|
598
|
+
if (m_nsimpl->snapShotCount)
|
599
|
+
{
|
600
|
+
m_nsimpl->snapShotCount = 1;
|
601
|
+
endSnapshot();
|
602
|
+
}
|
603
|
+
}
|
604
|
+
|
605
|
+
void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
|
596
606
|
{
|
597
607
|
if (m_nsimpl->snapShotCount == 0)
|
598
608
|
{
|
599
|
-
|
609
|
+
uint_td datalen = (bias == CONSISTENT_READ_WITH_BINLOG_POS) ? sizeof(binlogPos) : 0;
|
610
|
+
m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT + bias, NULL, bpos, &datalen, NULL, 0, 0,
|
600
611
|
m_nsimpl->cidPtr);
|
601
612
|
#ifdef TEST_RECONNECT
|
602
613
|
if (canRecoverNetError(m_stat))
|
@@ -780,7 +791,6 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
|
780
791
|
m_stat = 0;
|
781
792
|
if (_tcsstr(URI, _T("://")) == NULL)
|
782
793
|
return true;
|
783
|
-
|
784
794
|
}
|
785
795
|
uint_td datalen = 0;
|
786
796
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_NSDATABASE_H
|
2
2
|
#define BZS_DB_PROTOCOL_TDAP_CLIENT_NSDATABASE_H
|
3
3
|
/* =================================================================
|
4
|
-
Copyright (C) 2000-
|
4
|
+
Copyright (C) 2000-2016 BizStation Corp All rights reserved.
|
5
5
|
|
6
6
|
This program is free software; you can redistribute it and/or
|
7
7
|
modify it under the terms of the GNU General Public License
|
@@ -52,6 +52,23 @@ DLLLIB void setTrnsctdEntryPoint(BTRCALLID_PTR p);
|
|
52
52
|
DLLLIB BTRCALLID_PTR getTrnsctdEntryPoint();
|
53
53
|
/** @endcond */
|
54
54
|
|
55
|
+
|
56
|
+
#pragma pack(push, 1)
|
57
|
+
pragma_pack1
|
58
|
+
#define BINLOGNAME_SIZE 119
|
59
|
+
#define GTID_SIZE 64
|
60
|
+
struct binlogPos
|
61
|
+
{
|
62
|
+
unsigned long long pos;
|
63
|
+
char type;
|
64
|
+
char filename[BINLOGNAME_SIZE];
|
65
|
+
char gtid[GTID_SIZE];
|
66
|
+
};
|
67
|
+
|
68
|
+
|
69
|
+
#pragma pack(pop)
|
70
|
+
pragma_pop
|
71
|
+
|
55
72
|
class DLLLIB nsdatabase
|
56
73
|
{
|
57
74
|
friend class nstable;
|
@@ -71,6 +88,7 @@ protected:
|
|
71
88
|
bool trd);
|
72
89
|
virtual bool setUri(const _TCHAR* uri);
|
73
90
|
void reset();
|
91
|
+
void resetSnapshot();
|
74
92
|
nstable** tables();
|
75
93
|
nsdatabase* clone() const;
|
76
94
|
nsdatabase& operator=(const nsdatabase&);
|
@@ -112,7 +130,7 @@ public:
|
|
112
130
|
NOWAIT_WRITE); // NoWit SingleLock
|
113
131
|
void endTrn();
|
114
132
|
void abortTrn();
|
115
|
-
void beginSnapshot(short bias = CONSISTENT_READ);
|
133
|
+
void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos=NULL);
|
116
134
|
void endSnapshot();
|
117
135
|
ushort_td trxIsolationServer() const ;
|
118
136
|
ushort_td trxLockWaitTimeoutServer() const ;
|
@@ -3,7 +3,7 @@
|
|
3
3
|
#define BZS_DB_PROTOCOL_TDAP_CLIENT_POOLEDDATABASEMANAGER_H
|
4
4
|
|
5
5
|
/* =================================================================
|
6
|
-
Copyright (C) 2014 BizStation Corp All rights reserved.
|
6
|
+
Copyright (C) 2014 2016 BizStation Corp All rights reserved.
|
7
7
|
|
8
8
|
This program is free software; you can redistribute it and/or
|
9
9
|
modify it under the terms of the GNU General Public License
|
@@ -165,7 +165,10 @@ public:
|
|
165
165
|
|
166
166
|
inline int enableTrn() { return m_db->enableTrn(); }
|
167
167
|
|
168
|
-
inline void beginSnapshot(short bias = CONSISTENT_READ
|
168
|
+
inline void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos = NULL)
|
169
|
+
{
|
170
|
+
m_db->beginSnapshot(bias, bpos);
|
171
|
+
}
|
169
172
|
|
170
173
|
inline void endSnapshot() { m_db->endSnapshot(); }
|
171
174
|
|
@@ -657,13 +657,14 @@ public:
|
|
657
657
|
{
|
658
658
|
assert(m_fds->size());
|
659
659
|
|
660
|
-
fielddef fd
|
660
|
+
fielddef fd;
|
661
661
|
memset(&fd, 0, sizeof(fielddef));
|
662
662
|
fd.len = len;
|
663
663
|
fd.pos = 0;
|
664
664
|
fd.type = type;
|
665
665
|
fd.decimals = decimals;
|
666
666
|
fd.setName(name);
|
667
|
+
fd.setCharsetIndex((*m_fds)[0].charsetIndex());
|
667
668
|
if (blobLenBytes(fd))
|
668
669
|
THROW_BZS_ERROR_WITH_MSG(_T("Can not append Blob or Text field."));
|
669
670
|
m_fds->push_back(&fd);
|
@@ -526,7 +526,7 @@ void makeSuffixNamesList(const tabledef* table, std::vector<std::string>& fds)
|
|
526
526
|
}
|
527
527
|
}
|
528
528
|
|
529
|
-
std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef*
|
529
|
+
std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* td,
|
530
530
|
uchar_td charsetIndexServer, const clsrv_ver* ver)
|
531
531
|
{
|
532
532
|
// Duplication of a name is inspected and, in duplication, _1 is added.
|
@@ -534,10 +534,10 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
|
|
534
534
|
std::string s = "CREATE TABLE `";
|
535
535
|
|
536
536
|
std::vector<std::string> fds;// suffix added names list
|
537
|
-
makeSuffixNamesList(
|
537
|
+
makeSuffixNamesList(td, fds);
|
538
538
|
|
539
539
|
uint_td schemaCodePage =
|
540
|
-
|
540
|
+
td->schemaCodePage ? td->schemaCodePage : GetACP();
|
541
541
|
if ((name && name[0]))
|
542
542
|
{
|
543
543
|
std::string name2 = name;
|
@@ -546,14 +546,17 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
|
|
546
546
|
s += getFileName(name2.c_str()) + "` (";
|
547
547
|
}
|
548
548
|
else
|
549
|
-
s += getFileName(
|
550
|
-
s += getFieldList(
|
551
|
-
insertNisFields(
|
552
|
-
s += getKeyList(
|
549
|
+
s += getFileName(td->fileNameA()) + "` (";
|
550
|
+
s += getFieldList(td, fds, ver);
|
551
|
+
insertNisFields(td, fds, s);
|
552
|
+
s += getKeyList(td, fds);
|
553
553
|
if (s[s.size() - 1] == ',')
|
554
554
|
s.erase(s.end() - 1);
|
555
|
-
|
556
|
-
|
555
|
+
std::string compress;
|
556
|
+
if (td->flags.bit3)
|
557
|
+
compress = "ROW_FORMAT=COMPRESSED ";
|
558
|
+
s += ") ENGINE=InnoDB " + compress + "default charset=" + std::string(mysql::charsetName(td->charsetIndex));
|
559
|
+
|
557
560
|
|
558
561
|
// create statement charset must be server default charset.
|
559
562
|
// server default charset writen in my.cnf.
|
@@ -563,20 +566,20 @@ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* ta
|
|
563
566
|
return s;
|
564
567
|
}
|
565
568
|
|
566
|
-
std::string sqlBuilder::sqlCreateIndex(const tabledef*
|
569
|
+
std::string sqlBuilder::sqlCreateIndex(const tabledef* td, int keyNum,
|
567
570
|
bool specifyKeyNum, uchar_td charsetIndexServer, const clsrv_ver* ver)
|
568
571
|
{
|
569
572
|
std::string s;
|
570
573
|
std::vector<std::string> fds;// suffix added names list
|
571
|
-
makeSuffixNamesList(
|
574
|
+
makeSuffixNamesList(td, fds);
|
572
575
|
uint_td schemaCodePage =
|
573
|
-
|
574
|
-
s += getFieldList(
|
575
|
-
insertNisFields(
|
576
|
+
td->schemaCodePage ? td->schemaCodePage : GetACP();
|
577
|
+
s += getFieldList(td, fds, ver);
|
578
|
+
insertNisFields(td, fds, s);
|
576
579
|
s = "`";
|
577
|
-
s+= getFileName(
|
580
|
+
s+= getFileName(td->fileNameA());
|
578
581
|
s += "` ADD";
|
579
|
-
getKey(
|
582
|
+
getKey(td, fds, keyNum, s, specifyKeyNum);
|
580
583
|
s.erase(s.end() - 1);
|
581
584
|
// create statement charset must be server default charset.
|
582
585
|
// server default charset writen in my.cnf.
|
@@ -822,7 +822,7 @@ bool table::isReadContinue(ushort_td& op)
|
|
822
822
|
// limit count control
|
823
823
|
if (isContinue)
|
824
824
|
{
|
825
|
-
if (filter->
|
825
|
+
if (filter->isReadLimit(m_impl->rc->rowCount()))
|
826
826
|
{
|
827
827
|
m_stat = STATUS_LIMMIT_OF_REJECT;
|
828
828
|
return false;
|
@@ -1181,6 +1181,7 @@ void table::setPrepare(const pq_handle stmt)
|
|
1181
1181
|
m_impl->resetBookmarks();
|
1182
1182
|
if (m_impl->filterPtr != stmt)
|
1183
1183
|
m_impl->filterPtr = stmt;
|
1184
|
+
m_impl->filterPtr->resetReaded();
|
1184
1185
|
if (nsdb()->isReconnected())
|
1185
1186
|
m_impl->filterPtr->setServerPreparedId(0);
|
1186
1187
|
}
|
@@ -44,7 +44,7 @@ class fields;
|
|
44
44
|
class table;
|
45
45
|
/** @endcond */
|
46
46
|
|
47
|
-
#if (defined(__BORLANDC__) && !defined(__clang__))
|
47
|
+
#if (defined(__BORLANDC__) && !defined(__APPLE__) && !defined(__clang__))
|
48
48
|
typedef void __stdcall(* recordCountFn)(table* tb, int count, bool& complate);
|
49
49
|
#else
|
50
50
|
/** @cond INTERNAL */
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_TRDBOOSTAPI_H
|
2
2
|
#define BZS_DB_PROTOCOL_TDAP_CLIENT_TRDBOOSTAPI_H
|
3
3
|
/*=================================================================
|
4
|
-
Copyright (C) 2013
|
4
|
+
Copyright (C) 2013-2016 BizStation Corp All rights reserved.
|
5
5
|
|
6
6
|
This program is free software; you can redistribute it and/or
|
7
7
|
modify it under the terms of the GNU General Public License
|
@@ -135,7 +135,7 @@ public:
|
|
135
135
|
m_type = v;
|
136
136
|
}
|
137
137
|
|
138
|
-
inline const _TCHAR* uri(
|
138
|
+
inline const _TCHAR* uri() const
|
139
139
|
{
|
140
140
|
return m_buf;
|
141
141
|
}
|
@@ -168,7 +168,7 @@ public:
|
|
168
168
|
virtual void endTrn() = 0;
|
169
169
|
virtual void abortTrn() = 0;
|
170
170
|
virtual int enableTrn() = 0;
|
171
|
-
virtual void beginSnapshot(short bias = CONSISTENT_READ) = 0;
|
171
|
+
virtual void beginSnapshot(short bias = CONSISTENT_READ, binlogPos* bpos = NULL) = 0;
|
172
172
|
virtual void endSnapshot() = 0;
|
173
173
|
virtual const _TCHAR* uri() const = 0;
|
174
174
|
virtual char_td mode() const = 0;
|
@@ -844,15 +844,16 @@ inline void connect(Database_Ptr db, const ConnectParam_type& connPrams,
|
|
844
844
|
template <class Database_Ptr>
|
845
845
|
inline void createDatabase(Database_Ptr db, const connectParams& connPrams)
|
846
846
|
{
|
847
|
-
db->create(connPrams.uri());
|
847
|
+
db->create(connPrams.uri(), connPrams.type());
|
848
848
|
if (db->stat())
|
849
849
|
throwDbError(db, _T("Create database : "), connPrams.uri());
|
850
850
|
}
|
851
851
|
|
852
852
|
template <class Database_Ptr>
|
853
|
-
inline void createDatabase(Database_Ptr db, const _TCHAR* uri
|
853
|
+
inline void createDatabase(Database_Ptr db, const _TCHAR* uri,
|
854
|
+
short type = TYPE_SCHEMA_BDF)
|
854
855
|
{
|
855
|
-
db->create(uri);
|
856
|
+
db->create(uri, type);
|
856
857
|
if (db->stat())
|
857
858
|
throwDbError(db, _T("Create database : "), uri);
|
858
859
|
}
|
@@ -885,9 +886,9 @@ inline void connectOpen(Database_Ptr db, const connectParams& connPrams,
|
|
885
886
|
openDatabase(db, connPrams);
|
886
887
|
}
|
887
888
|
|
888
|
-
template <class Database_Ptr> inline void dropDatabase(Database_Ptr db)
|
889
|
+
template <class Database_Ptr> inline void dropDatabase(Database_Ptr db, const _TCHAR* uri=NULL)
|
889
890
|
{
|
890
|
-
db->drop();
|
891
|
+
db->drop(uri);
|
891
892
|
if (db->stat())
|
892
893
|
nstable::throwError(std::_tstring(_T("Drop database ")).c_str(),
|
893
894
|
db->stat());
|
@@ -1265,7 +1266,10 @@ template <class DB> class snapshot
|
|
1265
1266
|
DB m_db;
|
1266
1267
|
|
1267
1268
|
public:
|
1268
|
-
snapshot(DB db, short bias = CONSISTENT_READ) : m_db(db)
|
1269
|
+
snapshot(DB db, short bias = CONSISTENT_READ, binlogPos* bpos=NULL) : m_db(db)
|
1270
|
+
{
|
1271
|
+
m_db->beginSnapshot(bias, bpos);
|
1272
|
+
}
|
1269
1273
|
|
1270
1274
|
~snapshot() { m_db->endSnapshot(); }
|
1271
1275
|
};
|
@@ -101,9 +101,10 @@ std::string getDatabaseName(const request& req, bool forSql)
|
|
101
101
|
{
|
102
102
|
std::vector<std::string> ssc;
|
103
103
|
std::vector<std::string> ss;
|
104
|
-
|
104
|
+
const char* p = (const char*)req.keybuf;
|
105
|
+
if (p && p[0])
|
105
106
|
{
|
106
|
-
|
107
|
+
std::string s(p);
|
107
108
|
split(ssc, s, "\t");
|
108
109
|
if (ssc.size())
|
109
110
|
{
|
@@ -265,7 +266,7 @@ int dbExecuter::errorCode(int ha_error)
|
|
265
266
|
else if (ha_error == HA_ERR_AUTOINC_ERANGE)
|
266
267
|
return STATUS_DUPPLICATE_KEYVALUE;
|
267
268
|
else if (ha_error == ER_PARSE_ERROR)
|
268
|
-
return
|
269
|
+
return STATUS_SQL_PARSE_ERROR;
|
269
270
|
else if (ha_error == ER_TABLE_EXISTS_ERROR)
|
270
271
|
return STATUS_TABLE_EXISTS_ERROR;
|
271
272
|
else if (ha_error == DBM_ERROR_TABLE_USED)
|
@@ -274,18 +275,25 @@ int dbExecuter::errorCode(int ha_error)
|
|
274
275
|
return ERROR_NO_DATABASE;
|
275
276
|
else if(ha_error == ER_NO_SUCH_TABLE)
|
276
277
|
return STATUS_TABLE_NOTOPEN;
|
278
|
+
else if(ha_error == ER_SPECIFIC_ACCESS_DENIED_ERROR)
|
279
|
+
return STATUS_ACCESS_DENIED;
|
277
280
|
return MYSQL_ERROR_OFFSET + ha_error;
|
278
281
|
}
|
279
282
|
|
280
283
|
bool isMetaDb(const request& req)
|
281
284
|
{
|
282
285
|
char buf[MAX_PATH];
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
286
|
+
const char* p = (const char*)req.keybuf;
|
287
|
+
char_m* st = NULL;
|
288
|
+
if (p && p[0])
|
289
|
+
{
|
290
|
+
strncpy(buf, p, MAX_PATH);
|
291
|
+
_strlwr(buf);
|
292
|
+
st = _mbsstr((char_m*)buf, (char_m*)BdfNameTitle);
|
293
|
+
if (st == NULL)
|
294
|
+
st = (char_m*)strstr(buf, TRANSACTD_SCHEMANAME);
|
295
|
+
}
|
296
|
+
return (st != NULL);
|
289
297
|
}
|
290
298
|
|
291
299
|
inline bool getUserPasswd(request& req, char* &user, char* &pwd)
|
@@ -415,7 +423,7 @@ inline bool dbExecuter::doCreateTable(request& req)
|
|
415
423
|
{
|
416
424
|
if (req.result == 0)
|
417
425
|
{
|
418
|
-
|
426
|
+
req.result = ddl_dropDataBase(db->thd(), db->name(), dbSqlname, req.cid);
|
419
427
|
if (ER_DB_DROP_EXISTS+ MYSQL_ERROR_OFFSET == req.result) req.result = 0;
|
420
428
|
}
|
421
429
|
return ret;
|
@@ -1075,7 +1083,7 @@ inline void dbExecuter::doInsertBulk(request& req)
|
|
1075
1083
|
smartBulkInsert sbi(m_tb, *n);
|
1076
1084
|
for (ushort_td i = 0; i < *n; i++)
|
1077
1085
|
{
|
1078
|
-
|
1086
|
+
ushort_td len = *((ushort_td*)pos);
|
1079
1087
|
if (pos + len > (const uchar*)req.data + *req.datalen)
|
1080
1088
|
{
|
1081
1089
|
ret = STATUS_BUFFERTOOSMALL;
|
@@ -1149,6 +1157,11 @@ inline enum_tx_isolation getIsolationLevel(int op)
|
|
1149
1157
|
return ISO_READ_COMMITTED;
|
1150
1158
|
}
|
1151
1159
|
|
1160
|
+
inline bool snapshotWithBinlogPos(int op)
|
1161
|
+
{
|
1162
|
+
return (op == CONSISTENT_READ_WITH_BINLOG_POS+TD_BEGIN_SHAPSHOT);
|
1163
|
+
}
|
1164
|
+
|
1152
1165
|
inline short getTrnsactionType(int op)
|
1153
1166
|
{
|
1154
1167
|
op = op % 1000;
|
@@ -1248,22 +1261,57 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1248
1261
|
doDelete(req);
|
1249
1262
|
break;
|
1250
1263
|
case TD_BEGIN_TRANSACTION:
|
1251
|
-
|
1252
|
-
|
1264
|
+
{
|
1265
|
+
database* db = getDatabaseCid(req.cid);
|
1266
|
+
transactionResult = db->beginTrn(getTrnsactionType(opTrn)
|
1253
1267
|
,getIsolationLevel(opTrn));
|
1268
|
+
req.result = errorCodeSht(db->stat());
|
1254
1269
|
break;
|
1270
|
+
}
|
1255
1271
|
case TD_END_TRANSACTION:
|
1256
|
-
|
1272
|
+
{
|
1273
|
+
database* db = getDatabaseCid(req.cid);
|
1274
|
+
transactionResult = db->commitTrn();
|
1275
|
+
req.result = errorCodeSht(db->stat());
|
1257
1276
|
break;
|
1277
|
+
}
|
1258
1278
|
case TD_ABORT_TRANSACTION:
|
1259
|
-
|
1279
|
+
{
|
1280
|
+
database* db = getDatabaseCid(req.cid);
|
1281
|
+
transactionResult = db->abortTrn();
|
1282
|
+
req.result = errorCodeSht(db->stat());
|
1260
1283
|
break;
|
1284
|
+
}
|
1261
1285
|
case TD_BEGIN_SHAPSHOT:
|
1262
|
-
|
1286
|
+
{
|
1287
|
+
bool withSnapshot = snapshotWithBinlogPos(opTrn);
|
1288
|
+
if (withSnapshot && *req.datalen < sizeof(binlogPos))
|
1289
|
+
req.result = STATUS_BUFFERTOOSMALL;
|
1290
|
+
else
|
1291
|
+
{
|
1292
|
+
binlogPos bpos;
|
1293
|
+
memset(&bpos, 0, sizeof(binlogPos));
|
1294
|
+
database* db = getDatabaseCid(req.cid);
|
1295
|
+
transactionResult = db->beginSnapshot(
|
1296
|
+
getIsolationLevel(opTrn), withSnapshot ? &bpos : NULL);
|
1297
|
+
req.result = errorCodeSht(db->stat());
|
1298
|
+
if (transactionResult && withSnapshot)
|
1299
|
+
{
|
1300
|
+
// return binlog position for replication.
|
1301
|
+
req.paramMask = P_MASK_STAT;
|
1302
|
+
memcpy(req.data, &bpos, sizeof(binlogPos));
|
1303
|
+
req.resultLen = sizeof(binlogPos);
|
1304
|
+
}
|
1305
|
+
}
|
1263
1306
|
break;
|
1307
|
+
}
|
1264
1308
|
case TD_END_SNAPSHOT:
|
1265
|
-
|
1309
|
+
{
|
1310
|
+
database* db = getDatabaseCid(req.cid);
|
1311
|
+
transactionResult = db->endSnapshot();
|
1312
|
+
req.result = errorCodeSht(db->stat());
|
1266
1313
|
break;
|
1314
|
+
}
|
1267
1315
|
case TD_TABLE_INFO: // support recordlen and recordCount only.
|
1268
1316
|
doStat(req);
|
1269
1317
|
break;
|
@@ -1450,12 +1498,11 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1450
1498
|
std::string tbname = m_tb->name();
|
1451
1499
|
m_tb->close();
|
1452
1500
|
m_tb = NULL;
|
1453
|
-
if (
|
1501
|
+
if (req.keyNum == CR_SUBOP_DROP)
|
1454
1502
|
{
|
1455
1503
|
database* db = getDatabaseCid(req.cid);
|
1456
1504
|
req.result = ddl_dropTable(db, tbname, db->name(), tbname);
|
1457
1505
|
}
|
1458
|
-
|
1459
1506
|
}
|
1460
1507
|
break;
|
1461
1508
|
case TD_BUILD_INDEX:
|
@@ -1604,8 +1651,8 @@ int dbExecuter::commandExec(request& req, netsvc::server::netWriter* nw)
|
|
1604
1651
|
if (transactionResult)
|
1605
1652
|
{
|
1606
1653
|
if ((op == TD_BEGIN_TRANSACTION) || (op == TD_BEGIN_SHAPSHOT))
|
1607
|
-
return EXECUTE_RESULT_FORCSE_SYNC;
|
1608
|
-
return EXECUTE_RESULT_FORCSE_ASYNC;
|
1654
|
+
return EXECUTE_RESULT_FORCSE_SYNC; // this is begin
|
1655
|
+
return EXECUTE_RESULT_FORCSE_ASYNC; // this is end
|
1609
1656
|
}
|
1610
1657
|
if (req.result == ERROR_TD_INVALID_CLINETHOST)
|
1611
1658
|
return EXECUTE_RESULT_ACCESS_DNIED;
|