transactd 3.4.1 → 3.5.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/CMakeLists.txt +2 -2
- data/bin/common/tdclc_32_3_5.dll +0 -0
- data/bin/common/tdclc_64_3_5.dll +0 -0
- data/build/common/options.cmake +12 -0
- data/build/common/transactd_cl_common.cmake +1 -0
- data/build/common/transactd_required.cmake +5 -0
- data/build/swig/ruby/tdclrb_wrap.cpp +1029 -130
- data/build/swig/tdcl.i +60 -5
- data/build/tdclc/CMakeLists.txt +30 -32
- data/build/tdclc/libtdclcm.map +1 -1
- data/build/tdclc/tdclc.cbproj +1 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/CMakeLists.txt +39 -48
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +4 -1
- data/build/tdclrb/CMakeLists.txt +5 -4
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +45 -35
- data/source/bzs/db/engine/mysql/database.h +6 -8
- data/source/bzs/db/engine/mysql/dbManager.cpp +11 -0
- data/source/bzs/db/engine/mysql/dbManager.h +1 -0
- data/source/bzs/db/engine/mysql/ha.cpp +174 -0
- data/source/bzs/db/engine/mysql/ha.h +50 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +18 -1
- data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +222 -9
- data/source/bzs/db/engine/mysql/mysqlProtocol.h +5 -0
- data/source/bzs/db/protocol/tdap/client/client.cpp +23 -9
- data/source/bzs/db/protocol/tdap/client/client.h +125 -94
- data/source/bzs/db/protocol/tdap/client/connMgr.cpp +139 -30
- data/source/bzs/db/protocol/tdap/client/connMgr.h +40 -8
- data/source/bzs/db/protocol/tdap/client/database.cpp +17 -17
- data/source/bzs/db/protocol/tdap/client/database.h +15 -0
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -4
- data/source/bzs/db/protocol/tdap/client/haNameResolver.cpp +486 -0
- data/source/bzs/db/protocol/tdap/client/haNameResolver.h +74 -0
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +102 -71
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +15 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -5
- data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -2
- data/source/bzs/db/protocol/tdap/client/table.cpp +1 -2
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
- data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +9 -7
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +2 -2
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +328 -117
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +7 -8
- data/source/bzs/db/protocol/tdap/tdapcapi.h +81 -41
- data/source/bzs/db/transactd/connManager.cpp +118 -93
- data/source/bzs/db/transactd/connManager.h +6 -1
- data/source/bzs/db/transactd/connectionRecord.h +27 -7
- data/source/bzs/db/transactd/transactd.cpp +24 -13
- data/source/bzs/env/crosscompile.h +2 -0
- data/source/bzs/netsvc/client/iconnection.h +2 -0
- data/source/bzs/netsvc/client/tcpClient.cpp +45 -14
- data/source/bzs/netsvc/client/tcpClient.h +21 -4
- data/source/bzs/netsvc/server/IAppModule.h +1 -0
- data/source/bzs/netsvc/server/serverCpt.cpp +1 -1
- data/source/bzs/netsvc/server/serverPipe.cpp +2 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +3 -5
- data/source/bzs/test/tdclatl/test_v3.js +91 -3
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +89 -3
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +69 -2
- data/source/bzs/test/trdclengn/testField.h +19 -1
- data/source/bzs/test/trdclengn/test_tdclcpp_ha.cpp +388 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +6 -1
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +1 -0
- data/source/bzs/test/trdclengn/testbase.h +7 -1
- data/source/global/replication/haCommand.cpp +843 -0
- data/source/global/replication/haCommand.h +78 -0
- data/source/global/replication/haMgr.cpp +321 -0
- data/source/global/replication/replCommand.cpp +696 -0
- data/source/global/replication/replCommand.h +161 -0
- data/source/global/tdclatl/BinlogPos.cpp +10 -0
- data/source/global/tdclatl/BinlogPos.h +1 -0
- data/source/global/tdclatl/ConnMgr.cpp +89 -2
- data/source/global/tdclatl/ConnMgr.h +13 -1
- data/source/global/tdclatl/ConnRecord.cpp +8 -2
- data/source/global/tdclatl/ConnRecord.h +4 -3
- data/source/global/tdclatl/Database.cpp +13 -0
- data/source/global/tdclatl/Database.h +2 -0
- data/source/global/tdclatl/HaNameREsolver.cpp +54 -0
- data/source/global/tdclatl/HaNameREsolver.h +68 -0
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +76 -5
- metadata +16 -6
- data/bin/common/tdclc_32_3_4.dll +0 -0
- data/bin/common/tdclc_64_3_4.dll +0 -0
- data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +0 -423
- data/source/bzs/db/protocol/tdap/mysql/debuglog.h +0 -116
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
#ifndef BZS_DB_PROTOCOL_TDAP_CLIENT_HANAME_RESOLVER_H
|
|
2
|
+
#define BZS_DB_PROTOCOL_TDAP_CLIENT_HANAME_RESOLVER_H
|
|
3
|
+
/* =================================================================
|
|
4
|
+
Copyright (C) 2016 BizStation Corp All rights reserved.
|
|
5
|
+
|
|
6
|
+
This program is free software; you can redistribute it and/or
|
|
7
|
+
modify it under the terms of the GNU General Public License
|
|
8
|
+
as published by the Free Software Foundation; either version 2
|
|
9
|
+
of the License, or (at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU General Public License
|
|
17
|
+
along with this program; if not, write to the Free Software
|
|
18
|
+
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
|
19
|
+
02111-1307, USA.
|
|
20
|
+
================================================================= */
|
|
21
|
+
#include "export.h"
|
|
22
|
+
|
|
23
|
+
namespace bzs
|
|
24
|
+
{
|
|
25
|
+
namespace db
|
|
26
|
+
{
|
|
27
|
+
namespace protocol
|
|
28
|
+
{
|
|
29
|
+
namespace tdap
|
|
30
|
+
{
|
|
31
|
+
namespace client
|
|
32
|
+
{
|
|
33
|
+
|
|
34
|
+
/* haNameResolver::start() result code */
|
|
35
|
+
#define THNR_SUCCESS 0
|
|
36
|
+
#define THNR_SLAVE_HOSTS_NOT_FOUND 1
|
|
37
|
+
#define THNR_INVALID_HOSTS 2
|
|
38
|
+
#define THNR_REGISTER_FUNC_ERROR 3
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
#define THNR_OPT_DISABLE_CALL_FAILOVER 1
|
|
42
|
+
#define THNR_OPT_MASTER_CAN_CONCUR_SLAVE 2
|
|
43
|
+
#define THNR_OPT_FO_READONLY_CONTROL 4
|
|
44
|
+
|
|
45
|
+
class DLLLIB haNameResolver
|
|
46
|
+
{
|
|
47
|
+
private:
|
|
48
|
+
haNameResolver();
|
|
49
|
+
haNameResolver(const haNameResolver&);
|
|
50
|
+
~haNameResolver();
|
|
51
|
+
haNameResolver& operator=(const haNameResolver&);
|
|
52
|
+
public:
|
|
53
|
+
|
|
54
|
+
/* The slaves and the slaveHostsWithPort can be specified comma separated names. */
|
|
55
|
+
static int start(const char* master, const char* slaves,
|
|
56
|
+
const char* slaveHostsWithPort, short slaveNum,
|
|
57
|
+
const char* userName,
|
|
58
|
+
const char* password,
|
|
59
|
+
int option = 0);
|
|
60
|
+
static void addPortMap(short mysqlPort, short transactdPort);
|
|
61
|
+
static void clearPortMap();
|
|
62
|
+
static void stop();
|
|
63
|
+
static const char* master();
|
|
64
|
+
static const char* slave();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
} // namespace client
|
|
68
|
+
} // namespace tdap
|
|
69
|
+
} // namespace protocol
|
|
70
|
+
} // namespace db
|
|
71
|
+
} // namespace bzs
|
|
72
|
+
|
|
73
|
+
#endif // BZS_DB_PROTOCOL_TDAP_CLIENT_HANAME_RESOLVER_H
|
|
74
|
+
|
|
@@ -61,6 +61,7 @@ extern EnginsFunc engins;
|
|
|
61
61
|
unsigned int g_lastTrnTime = 0;
|
|
62
62
|
unsigned int nsdatabase::m_execCodepage = GetACP();
|
|
63
63
|
bool g_checkTablePtr = false;
|
|
64
|
+
bool g_enableAutoReconnect = false;
|
|
64
65
|
|
|
65
66
|
PACKAGE void registEnginsPtr(EnginsFunc func)
|
|
66
67
|
{
|
|
@@ -163,8 +164,13 @@ binlogPos::~binlogPos(){ delete m_impl;}
|
|
|
163
164
|
|
|
164
165
|
void binlogPos::setGtid(const char* p)
|
|
165
166
|
{
|
|
166
|
-
|
|
167
|
-
|
|
167
|
+
gtid = gtid_buf;
|
|
168
|
+
if (p)
|
|
169
|
+
{
|
|
170
|
+
m_impl->buf.reset(new std::string(p));
|
|
171
|
+
gtid = m_impl->buf->c_str();
|
|
172
|
+
}else
|
|
173
|
+
gtid_buf[0] = 0x00;
|
|
168
174
|
}
|
|
169
175
|
|
|
170
176
|
binlogPos& binlogPos::operator=(const binlogPos& r)
|
|
@@ -472,9 +478,8 @@ void nsdatabase::createTable(fileSpec* pfs, uint_td len,
|
|
|
472
478
|
;
|
|
473
479
|
const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
|
|
474
480
|
|
|
475
|
-
m_stat =
|
|
476
|
-
|
|
477
|
-
(uchar_td)strlen(p), (char_td)mode, m_nsimpl->cidPtr);
|
|
481
|
+
m_stat = tdapEx(TD_CREATETABLE, posblk, pfs, &len, (void*)p,
|
|
482
|
+
(uchar_td)strlen(p), (char_td)mode);
|
|
478
483
|
}
|
|
479
484
|
|
|
480
485
|
void nsdatabase::dropTable(const _TCHAR* pFullPath)
|
|
@@ -501,9 +506,8 @@ void nsdatabase::dropTable(const _TCHAR* pFullPath)
|
|
|
501
506
|
char buf2[MAX_PATH] = { 0x00 };
|
|
502
507
|
const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
|
|
503
508
|
|
|
504
|
-
m_stat =
|
|
505
|
-
|
|
506
|
-
(uchar_td)strlen(p) + 1, CR_SUBOP_DROP, m_nsimpl->cidPtr);
|
|
509
|
+
m_stat = tdapEx(TD_CREATETABLE, posblk, NULL, NULL, (void*)p,
|
|
510
|
+
(uchar_td)strlen(p) + 1, CR_SUBOP_DROP);
|
|
507
511
|
}
|
|
508
512
|
|
|
509
513
|
void nsdatabase::swapTablename(const _TCHAR* Name1, const _TCHAR* Name2)
|
|
@@ -516,9 +520,8 @@ void nsdatabase::swapTablename(const _TCHAR* Name1, const _TCHAR* Name2)
|
|
|
516
520
|
const char* p2 = toServerUri(buf2, MAX_PATH, Name2, isUseTransactd());
|
|
517
521
|
uint_td len = (uint_td)strlen(p);
|
|
518
522
|
|
|
519
|
-
m_stat =
|
|
520
|
-
(uchar_td)strlen(p2), CR_SUBOP_SWAPNAME
|
|
521
|
-
m_nsimpl->cidPtr);
|
|
523
|
+
m_stat = tdapEx(TD_CREATETABLE, posblk, (void*)p, &len, (void*)p2,
|
|
524
|
+
(uchar_td)strlen(p2), CR_SUBOP_SWAPNAME);
|
|
522
525
|
}
|
|
523
526
|
|
|
524
527
|
void nsdatabase::rename(const _TCHAR* pFullPath, const _TCHAR* newName)
|
|
@@ -554,9 +557,8 @@ void nsdatabase::rename(const _TCHAR* pFullPath, const _TCHAR* newName)
|
|
|
554
557
|
_tcscpy(buf, newName);
|
|
555
558
|
toServerUri(bufNew, MAX_PATH, newName, isUseTransactd());
|
|
556
559
|
|
|
557
|
-
m_stat =
|
|
558
|
-
(uchar_td)strlen(bufNew), CR_SUBOP_RENAME
|
|
559
|
-
m_nsimpl->cidPtr);
|
|
560
|
+
m_stat = tdapEx(TD_CREATETABLE, posblk, (void*)p, &len, (void*)bufNew,
|
|
561
|
+
(uchar_td)strlen(bufNew), CR_SUBOP_RENAME);
|
|
560
562
|
}
|
|
561
563
|
|
|
562
564
|
void nsdatabase::registerTable(nstable* tb)
|
|
@@ -637,10 +639,8 @@ void nsdatabase::reset()
|
|
|
637
639
|
m_nsimpl->bdfPath[0] = 0x00;
|
|
638
640
|
if (m_btrcallid)
|
|
639
641
|
{
|
|
640
|
-
m_stat =
|
|
641
|
-
|
|
642
|
-
m_stat = m_btrcallid(TD_STOP_ENGINE, NULL, NULL, NULL, NULL, 0, 0,
|
|
643
|
-
m_nsimpl->cidPtr);
|
|
642
|
+
m_stat = tdap(TD_RESET_CLIENT, NULL, NULL, NULL, NULL, 0, 0);
|
|
643
|
+
m_stat = tdap(TD_STOP_ENGINE, NULL, NULL, NULL, NULL, 0, 0);
|
|
644
644
|
if (m_stat == ERROR_TD_NOT_CONNECTED)
|
|
645
645
|
m_stat = STATUS_SUCCESS;
|
|
646
646
|
}
|
|
@@ -679,17 +679,7 @@ void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
|
|
|
679
679
|
if (m_nsimpl->snapShotCount == 0)
|
|
680
680
|
{
|
|
681
681
|
uint_td datalen = (bias == CONSISTENT_READ_WITH_BINLOG_POS) ? BINLOGPOS_SIZE : 0;
|
|
682
|
-
m_stat =
|
|
683
|
-
m_nsimpl->cidPtr);
|
|
684
|
-
#ifdef TEST_RECONNECT
|
|
685
|
-
if (canRecoverNetError(m_stat))
|
|
686
|
-
{
|
|
687
|
-
reconnect();
|
|
688
|
-
if (m_stat) return;
|
|
689
|
-
m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT + bias, NULL, NULL, NULL, NULL,
|
|
690
|
-
0, 0, m_nsimpl->cidPtr);
|
|
691
|
-
}
|
|
692
|
-
#endif
|
|
682
|
+
m_stat = tdapEx(TD_BEGIN_SHAPSHOT + bias, NULL, bpos, &datalen, NULL, 0, 0);
|
|
693
683
|
if (m_stat == 0)
|
|
694
684
|
{
|
|
695
685
|
if (bias == CONSISTENT_READ_WITH_BINLOG_POS)
|
|
@@ -699,8 +689,7 @@ void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
|
|
|
699
689
|
else if(bpos->type == REPL_POSTYPE_GTID)
|
|
700
690
|
{
|
|
701
691
|
const blobHeader* hd;
|
|
702
|
-
short stat =
|
|
703
|
-
m_nsimpl->cidPtr);
|
|
692
|
+
short stat = tdap(TD_GET_BLOB_BUF, NULL, &hd, NULL, NULL, 0, 0);
|
|
704
693
|
if (stat == 0)
|
|
705
694
|
{
|
|
706
695
|
assert(hd->rows);
|
|
@@ -710,19 +699,18 @@ void nsdatabase::beginSnapshot(short bias, binlogPos* bpos)
|
|
|
710
699
|
bpos->type = REPL_POSTYPE_POS;
|
|
711
700
|
}
|
|
712
701
|
}
|
|
713
|
-
m_nsimpl->snapShotCount
|
|
702
|
+
++m_nsimpl->snapShotCount;
|
|
714
703
|
}
|
|
715
704
|
}
|
|
716
705
|
else
|
|
717
|
-
m_nsimpl->snapShotCount
|
|
706
|
+
++m_nsimpl->snapShotCount;
|
|
718
707
|
}
|
|
719
708
|
|
|
720
709
|
void nsdatabase::endSnapshot()
|
|
721
710
|
{
|
|
722
711
|
m_nsimpl->snapShotCount--;
|
|
723
712
|
if (m_nsimpl->snapShotCount == 0)
|
|
724
|
-
m_stat =
|
|
725
|
-
m_nsimpl->cidPtr);
|
|
713
|
+
m_stat = tdap(TD_END_SNAPSHOT, NULL, NULL, NULL, NULL, 0, 0);
|
|
726
714
|
if (m_nsimpl->snapShotCount < 0)
|
|
727
715
|
m_nsimpl->snapShotCount = 0;
|
|
728
716
|
}
|
|
@@ -732,8 +720,8 @@ void nsdatabase::beginTrn(short BIAS)
|
|
|
732
720
|
if (!checkAssociate()) return;
|
|
733
721
|
if (m_nsimpl->tranCount == 0)
|
|
734
722
|
{
|
|
735
|
-
m_stat =
|
|
736
|
-
NULL, NULL, NULL, 0, 0
|
|
723
|
+
m_stat = tdapEx((ushort_td)(BIAS + TD_BEGIN_TRANSACTION), NULL,
|
|
724
|
+
NULL, NULL, NULL, 0, 0);
|
|
737
725
|
if (m_stat == 0)
|
|
738
726
|
m_nsimpl->tranCount++;
|
|
739
727
|
}
|
|
@@ -743,13 +731,10 @@ void nsdatabase::beginTrn(short BIAS)
|
|
|
743
731
|
|
|
744
732
|
void nsdatabase::endTrn()
|
|
745
733
|
{
|
|
746
|
-
|
|
747
734
|
m_nsimpl->tranCount--;
|
|
748
735
|
if (m_nsimpl->tranCount == 0)
|
|
749
736
|
{
|
|
750
|
-
m_stat =
|
|
751
|
-
m_nsimpl->cidPtr);
|
|
752
|
-
|
|
737
|
+
m_stat = tdap(TD_END_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0);
|
|
753
738
|
#ifdef _WIN32
|
|
754
739
|
g_lastTrnTime = GetTickCount();
|
|
755
740
|
#endif
|
|
@@ -760,9 +745,7 @@ void nsdatabase::endTrn()
|
|
|
760
745
|
|
|
761
746
|
void nsdatabase::abortTrn()
|
|
762
747
|
{
|
|
763
|
-
m_stat =
|
|
764
|
-
m_nsimpl->cidPtr);
|
|
765
|
-
|
|
748
|
+
m_stat = tdap(TD_ABORT_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0);
|
|
766
749
|
m_nsimpl->tranCount = 0;
|
|
767
750
|
#ifdef _WIN32
|
|
768
751
|
g_lastTrnTime = GetTickCount();
|
|
@@ -797,9 +780,7 @@ void nsdatabase::getBtrVersion(btrVersions* Vers, uchar_td* posblk)
|
|
|
797
780
|
posblk = posblkTmp;
|
|
798
781
|
|
|
799
782
|
uint_td datalen = sizeof(btrVersions);
|
|
800
|
-
|
|
801
|
-
m_stat = m_btrcallid(TD_VERSION, posblk, Vers, &datalen, NULL, 0, 0,
|
|
802
|
-
m_nsimpl->cidPtr);
|
|
783
|
+
m_stat = tdapEx(TD_VERSION, posblk, Vers, &datalen, NULL, 0, 0);
|
|
803
784
|
{
|
|
804
785
|
bool remote = false;
|
|
805
786
|
if (uriMode())
|
|
@@ -845,8 +826,8 @@ char* nsdatabase::getCreateViewSql(const _TCHAR* name , char* retbuf, uint_td* s
|
|
|
845
826
|
char Uri[MAX_PATH] = { 0x00 };
|
|
846
827
|
const char* p = nsdatabase::toServerUri(Uri, MAX_PATH, tmp, true);
|
|
847
828
|
keylen_td keylen = (keylen_td)strlen(p) + 1;
|
|
848
|
-
m_stat =
|
|
849
|
-
SC_SUBOP_VIEW_BY_SQL
|
|
829
|
+
m_stat = tdapEx(TD_GET_SCHEMA, NULL, retbuf, size, (void*)p, keylen,
|
|
830
|
+
SC_SUBOP_VIEW_BY_SQL);
|
|
850
831
|
if (m_stat != STATUS_SUCCESS)
|
|
851
832
|
retbuf[0] = 0x00;
|
|
852
833
|
return retbuf;
|
|
@@ -890,8 +871,7 @@ void nsdatabase::readDatabaseDirectory(_TCHAR* retbuf, uchar_td buflen)
|
|
|
890
871
|
{
|
|
891
872
|
// keynum is drive name A=1 B=2 C=3 0=default
|
|
892
873
|
char tmp[128];
|
|
893
|
-
m_stat =
|
|
894
|
-
m_nsimpl->cidPtr);
|
|
874
|
+
m_stat = tdapEx(TD_GETDIRECTORY, NULL, NULL, NULL, tmp, 128, 0);
|
|
895
875
|
toTCharCopy(retbuf, tmp, buflen);
|
|
896
876
|
}
|
|
897
877
|
|
|
@@ -919,8 +899,8 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
|
|
|
919
899
|
char uri_a[MAX_PATH] = { 0x00 };
|
|
920
900
|
const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
|
|
921
901
|
char_td keyNum = (isUseTransactd() == false) ? 0 : newConnection ? 3 : 0;
|
|
922
|
-
m_stat =
|
|
923
|
-
(keylen_td)(strlen(p) + 1), keyNum
|
|
902
|
+
m_stat = tdap(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
|
|
903
|
+
(keylen_td)(strlen(p) + 1), keyNum);
|
|
924
904
|
if (m_stat)
|
|
925
905
|
return false;
|
|
926
906
|
return true;
|
|
@@ -936,9 +916,8 @@ bool nsdatabase::disconnect(const _TCHAR* URI)
|
|
|
936
916
|
uint_td datalen = 0;
|
|
937
917
|
|
|
938
918
|
//Transactd not use uri.
|
|
939
|
-
m_stat =
|
|
940
|
-
(keylen_td)(_tcslen(URI) + 1), LG_SUBOP_DISCONNECT
|
|
941
|
-
clientID());
|
|
919
|
+
m_stat = tdap(TD_CONNECT, NULL, NULL, &datalen, (void*)URI,
|
|
920
|
+
(keylen_td)(_tcslen(URI) + 1), LG_SUBOP_DISCONNECT);
|
|
942
921
|
if (m_stat)
|
|
943
922
|
return false;
|
|
944
923
|
return true;
|
|
@@ -946,14 +925,12 @@ bool nsdatabase::disconnect(const _TCHAR* URI)
|
|
|
946
925
|
|
|
947
926
|
bool nsdatabase::disconnectForReconnectTest()
|
|
948
927
|
{
|
|
949
|
-
//Transactd only
|
|
950
928
|
if (!isUseTransactd())
|
|
951
929
|
return false;
|
|
952
930
|
|
|
953
931
|
uint_td datalen = 0;
|
|
954
|
-
m_stat =
|
|
955
|
-
0, LG_SUBOP_DISCONNECT_EX
|
|
956
|
-
clientID());
|
|
932
|
+
m_stat = tdap(TD_CONNECT, NULL, NULL, &datalen, NULL,
|
|
933
|
+
0, LG_SUBOP_DISCONNECT_EX);
|
|
957
934
|
if (m_stat)
|
|
958
935
|
return false;
|
|
959
936
|
return true;
|
|
@@ -970,7 +947,6 @@ void nsdatabase::doReconnect(nstable* tb)
|
|
|
970
947
|
{
|
|
971
948
|
uint_td datalen = 0;
|
|
972
949
|
char uri_a[MAX_PATH] = { 0x00 };
|
|
973
|
-
tb->abortBulkInsert();
|
|
974
950
|
datalen = tb->buflen();
|
|
975
951
|
tdap::posblk* pb = (tdap::posblk*)tb->posblk();
|
|
976
952
|
char* databuf = new char[datalen];
|
|
@@ -978,8 +954,8 @@ void nsdatabase::doReconnect(nstable* tb)
|
|
|
978
954
|
memcpy(databuf + 1, &pb->bookmarkLen, pb->bookmarkLen + 1);
|
|
979
955
|
const char* p = toServerUri(uri_a, MAX_PATH, tb->uri(), true);
|
|
980
956
|
short offset = (pb->lock) ? ROW_LOCK_X : 0;
|
|
981
|
-
m_stat =
|
|
982
|
-
(keylen_td)(strlen(p) + 1), tb->mode()
|
|
957
|
+
m_stat = tdap(TD_RECONNECT + offset, pb, databuf, &datalen, (void*)p,
|
|
958
|
+
(keylen_td)(strlen(p) + 1), tb->mode());
|
|
983
959
|
delete [] databuf;
|
|
984
960
|
}
|
|
985
961
|
|
|
@@ -1001,17 +977,22 @@ bool nsdatabase::doReopenTables()
|
|
|
1001
977
|
return (m_stat == 0);
|
|
1002
978
|
}
|
|
1003
979
|
|
|
980
|
+
/*
|
|
981
|
+
A single thread can access to the connection ,if it is shared from some engings.
|
|
982
|
+
*/
|
|
1004
983
|
bool reconnectSharedConnection(const void* ptr)
|
|
1005
984
|
{
|
|
985
|
+
//Lock engin count
|
|
1006
986
|
boost::mutex::scoped_lock lck(g_mutex);
|
|
1007
987
|
for (int i = 0; i < MAX_BTRENGIN; ++i)
|
|
1008
988
|
{
|
|
1009
|
-
|
|
989
|
+
nsdatabase* db = engins()[i];
|
|
990
|
+
if (db)
|
|
1010
991
|
{
|
|
1011
|
-
void* p = (*((void**)
|
|
992
|
+
void* p = (*((void**)db->m_nsimpl->cidPtr));
|
|
1012
993
|
if (p == ptr)
|
|
1013
994
|
{
|
|
1014
|
-
if (!
|
|
995
|
+
if (!db->doReopenTables())
|
|
1015
996
|
return false;
|
|
1016
997
|
}
|
|
1017
998
|
}
|
|
@@ -1024,18 +1005,48 @@ bool nsdatabase::reconnect()
|
|
|
1024
1005
|
//Transactd only
|
|
1025
1006
|
if (!isUseTransactd())
|
|
1026
1007
|
return false;
|
|
1008
|
+
if (m_nsimpl->tranCount || m_nsimpl->snapShotCount)
|
|
1009
|
+
return false;
|
|
1010
|
+
//check another databases has transactions
|
|
1011
|
+
{
|
|
1012
|
+
boost::mutex::scoped_lock lck(g_mutex);
|
|
1013
|
+
for (int i = 0; i < MAX_BTRENGIN; ++i)
|
|
1014
|
+
{
|
|
1015
|
+
nsdatabase* db = engins()[i];
|
|
1016
|
+
if (db && (db->m_nsimpl->tranCount || db->m_nsimpl->snapShotCount))
|
|
1017
|
+
{
|
|
1018
|
+
if (db->m_nsimpl->cidPtr == m_nsimpl->cidPtr)
|
|
1019
|
+
return false; // This is same thread
|
|
1020
|
+
}
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1027
1023
|
|
|
1028
|
-
m_nsimpl->tranCount = 0;
|
|
1029
|
-
m_nsimpl->snapShotCount = 0;
|
|
1030
1024
|
uint_td datalen = 0;
|
|
1031
1025
|
char uri_a[MAX_PATH] = { 0x00 };
|
|
1032
1026
|
const char* p = toServerUri(uri_a, MAX_PATH, m_nsimpl->bdfPath, true);
|
|
1033
|
-
m_stat =
|
|
1034
|
-
(keylen_td)(strlen(p) + 1),
|
|
1035
|
-
LG_SUBOP_RECONNECT, clientID());
|
|
1027
|
+
m_stat = tdap(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
|
|
1028
|
+
(keylen_td)(strlen(p) + 1), LG_SUBOP_RECONNECT);
|
|
1036
1029
|
if (m_stat) return false;
|
|
1037
1030
|
return reconnectSharedConnection((*(void**)m_nsimpl->cidPtr));
|
|
1031
|
+
}
|
|
1038
1032
|
|
|
1033
|
+
short nsdatabase::tdapEx(ushort_td op, void* posb, void* data, uint_td* datalen,
|
|
1034
|
+
void* keybuf, keylen_td keylen, char_td keyNum)
|
|
1035
|
+
{
|
|
1036
|
+
bool loop;
|
|
1037
|
+
short stat;
|
|
1038
|
+
do
|
|
1039
|
+
{
|
|
1040
|
+
loop = false;
|
|
1041
|
+
stat = m_btrcallid(op, posb, data, datalen, keybuf, keylen, keyNum, clientID());
|
|
1042
|
+
if (stat && nsdatabase::enableAutoReconnect() && canRecoverNetError(m_stat))
|
|
1043
|
+
{
|
|
1044
|
+
reconnect();
|
|
1045
|
+
if (stat) break;
|
|
1046
|
+
loop = true;
|
|
1047
|
+
}
|
|
1048
|
+
}while (loop);
|
|
1049
|
+
return stat;
|
|
1039
1050
|
}
|
|
1040
1051
|
|
|
1041
1052
|
bool nsdatabase::trnsactionFlushWaitStatus()
|
|
@@ -1126,6 +1137,26 @@ WIN_TPOOL_SHUTDOWN_PTR nsdatabase::getWinTPoolShutdownFunc()
|
|
|
1126
1137
|
|
|
1127
1138
|
}
|
|
1128
1139
|
|
|
1140
|
+
bool nsdatabase::registerHaNameResolver(HANAME_RESOLVER_PTR func)
|
|
1141
|
+
{
|
|
1142
|
+
if (hTrsdDLL == NULL)
|
|
1143
|
+
hTrsdDLL = LoadLibraryA(LIB_PREFIX TDCLC_LIBNAME);
|
|
1144
|
+
if (hTrsdDLL)
|
|
1145
|
+
{
|
|
1146
|
+
REGISTER_RESOLVER_PTR regist =
|
|
1147
|
+
(REGISTER_RESOLVER_PTR)GetProcAddress((HINSTANCE)hTrsdDLL,
|
|
1148
|
+
"RegisterHaNameResolver");
|
|
1149
|
+
if (regist)
|
|
1150
|
+
{
|
|
1151
|
+
regist(func);
|
|
1152
|
+
g_enableAutoReconnect = func != NULL;
|
|
1153
|
+
return true;
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
return false;
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
|
|
1129
1160
|
} // namespace client
|
|
1130
1161
|
} // namespace tdap
|
|
1131
1162
|
} // namespace protocol
|
|
@@ -41,6 +41,7 @@ namespace tdap
|
|
|
41
41
|
{
|
|
42
42
|
namespace client
|
|
43
43
|
{
|
|
44
|
+
extern DLLLIB bool g_enableAutoReconnect;
|
|
44
45
|
|
|
45
46
|
class dbdef;
|
|
46
47
|
class nstable;
|
|
@@ -67,8 +68,8 @@ struct DLLLIB binlogPos
|
|
|
67
68
|
private:
|
|
68
69
|
char gtid_buf[GTID_SIZE];
|
|
69
70
|
struct bpimple* m_impl;
|
|
70
|
-
void setGtid(const char* p);
|
|
71
71
|
public:
|
|
72
|
+
void setGtid(const char* p);
|
|
72
73
|
const char* gtid;
|
|
73
74
|
binlogPos();
|
|
74
75
|
binlogPos(const binlogPos& r);
|
|
@@ -95,9 +96,18 @@ class DLLLIB nsdatabase
|
|
|
95
96
|
protected:
|
|
96
97
|
BTRCALLID_PTR m_btrcallid;
|
|
97
98
|
short m_stat;
|
|
98
|
-
|
|
99
99
|
static const char* toServerUri(char* buf, int buflen, const _TCHAR* src,
|
|
100
100
|
bool trd);
|
|
101
|
+
short tdapEx(ushort_td op, void* posb, void* data, uint_td* datalen,
|
|
102
|
+
void* keybuf, keylen_td keylen, char_td keyNum);
|
|
103
|
+
|
|
104
|
+
inline short tdap(ushort_td op, void* posb, void* data, uint_td* datalen,
|
|
105
|
+
void* keybuf, keylen_td keylen, char_td keyNum)
|
|
106
|
+
{
|
|
107
|
+
return m_btrcallid(op, posb, data, datalen, keybuf, keylen, keyNum,
|
|
108
|
+
clientID());
|
|
109
|
+
}
|
|
110
|
+
|
|
101
111
|
virtual bool setUri(const _TCHAR* uri);
|
|
102
112
|
void reset();
|
|
103
113
|
void resetSnapshot();
|
|
@@ -174,13 +184,15 @@ public:
|
|
|
174
184
|
static bool trnsactionFlushWaitStatus();
|
|
175
185
|
static void setExecCodePage(unsigned int codepage);
|
|
176
186
|
static unsigned int execCodePage();
|
|
187
|
+
static inline bool enableAutoReconnect(){ return g_enableAutoReconnect;}
|
|
188
|
+
static inline void setEnableAutoReconnect(bool v){ g_enableAutoReconnect = v;}
|
|
189
|
+
static bool registerHaNameResolver(HANAME_RESOLVER_PTR func);
|
|
177
190
|
/** @cond INTERNAL */
|
|
178
191
|
void setTestPtrIgnore(bool v);
|
|
179
192
|
bool isTestPtrIgnore() const;
|
|
180
193
|
static WIN_TPOOL_SHUTDOWN_PTR getWinTPoolShutdownFunc();
|
|
181
194
|
static bool testTablePtr(nstable* ptr);
|
|
182
195
|
static void setCheckTablePtr(bool v);
|
|
183
|
-
|
|
184
196
|
/** @endcond */
|
|
185
197
|
};
|
|
186
198
|
|