transactd 3.0.0 → 3.1.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_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;
|