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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +2 -2
  3. data/bin/common/tdclc_32_3_5.dll +0 -0
  4. data/bin/common/tdclc_64_3_5.dll +0 -0
  5. data/build/common/options.cmake +12 -0
  6. data/build/common/transactd_cl_common.cmake +1 -0
  7. data/build/common/transactd_required.cmake +5 -0
  8. data/build/swig/ruby/tdclrb_wrap.cpp +1029 -130
  9. data/build/swig/tdcl.i +60 -5
  10. data/build/tdclc/CMakeLists.txt +30 -32
  11. data/build/tdclc/libtdclcm.map +1 -1
  12. data/build/tdclc/tdclc.cbproj +1 -1
  13. data/build/tdclc/tdclc.rc +4 -4
  14. data/build/tdclcpp/CMakeLists.txt +39 -48
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +4 -1
  17. data/build/tdclrb/CMakeLists.txt +5 -4
  18. data/build/tdclrb/tdclrb.rc +4 -4
  19. data/source/bzs/db/engine/mysql/database.cpp +45 -35
  20. data/source/bzs/db/engine/mysql/database.h +6 -8
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +11 -0
  22. data/source/bzs/db/engine/mysql/dbManager.h +1 -0
  23. data/source/bzs/db/engine/mysql/ha.cpp +174 -0
  24. data/source/bzs/db/engine/mysql/ha.h +50 -0
  25. data/source/bzs/db/engine/mysql/mysqlInternal.h +18 -1
  26. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +222 -9
  27. data/source/bzs/db/engine/mysql/mysqlProtocol.h +5 -0
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +23 -9
  29. data/source/bzs/db/protocol/tdap/client/client.h +125 -94
  30. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +139 -30
  31. data/source/bzs/db/protocol/tdap/client/connMgr.h +40 -8
  32. data/source/bzs/db/protocol/tdap/client/database.cpp +17 -17
  33. data/source/bzs/db/protocol/tdap/client/database.h +15 -0
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -4
  35. data/source/bzs/db/protocol/tdap/client/haNameResolver.cpp +486 -0
  36. data/source/bzs/db/protocol/tdap/client/haNameResolver.h +74 -0
  37. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +102 -71
  38. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +15 -3
  39. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +2 -5
  40. data/source/bzs/db/protocol/tdap/client/nsTable.h +2 -1
  41. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -2
  42. data/source/bzs/db/protocol/tdap/client/table.cpp +1 -2
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
  44. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +1 -0
  45. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +9 -7
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +2 -2
  47. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +328 -117
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +7 -8
  49. data/source/bzs/db/protocol/tdap/tdapcapi.h +81 -41
  50. data/source/bzs/db/transactd/connManager.cpp +118 -93
  51. data/source/bzs/db/transactd/connManager.h +6 -1
  52. data/source/bzs/db/transactd/connectionRecord.h +27 -7
  53. data/source/bzs/db/transactd/transactd.cpp +24 -13
  54. data/source/bzs/env/crosscompile.h +2 -0
  55. data/source/bzs/netsvc/client/iconnection.h +2 -0
  56. data/source/bzs/netsvc/client/tcpClient.cpp +45 -14
  57. data/source/bzs/netsvc/client/tcpClient.h +21 -4
  58. data/source/bzs/netsvc/server/IAppModule.h +1 -0
  59. data/source/bzs/netsvc/server/serverCpt.cpp +1 -1
  60. data/source/bzs/netsvc/server/serverPipe.cpp +2 -0
  61. data/source/bzs/netsvc/server/serverTpool.cpp +3 -5
  62. data/source/bzs/test/tdclatl/test_v3.js +91 -3
  63. data/source/bzs/test/tdclphp/transactd_v3_Test.php +89 -3
  64. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +69 -2
  65. data/source/bzs/test/trdclengn/testField.h +19 -1
  66. data/source/bzs/test/trdclengn/test_tdclcpp_ha.cpp +388 -0
  67. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +6 -1
  68. data/source/bzs/test/trdclengn/test_trdclengn.cpp +1 -0
  69. data/source/bzs/test/trdclengn/testbase.h +7 -1
  70. data/source/global/replication/haCommand.cpp +843 -0
  71. data/source/global/replication/haCommand.h +78 -0
  72. data/source/global/replication/haMgr.cpp +321 -0
  73. data/source/global/replication/replCommand.cpp +696 -0
  74. data/source/global/replication/replCommand.h +161 -0
  75. data/source/global/tdclatl/BinlogPos.cpp +10 -0
  76. data/source/global/tdclatl/BinlogPos.h +1 -0
  77. data/source/global/tdclatl/ConnMgr.cpp +89 -2
  78. data/source/global/tdclatl/ConnMgr.h +13 -1
  79. data/source/global/tdclatl/ConnRecord.cpp +8 -2
  80. data/source/global/tdclatl/ConnRecord.h +4 -3
  81. data/source/global/tdclatl/Database.cpp +13 -0
  82. data/source/global/tdclatl/Database.h +2 -0
  83. data/source/global/tdclatl/HaNameREsolver.cpp +54 -0
  84. data/source/global/tdclatl/HaNameREsolver.h +68 -0
  85. data/source/global/tdclatl/resource.h +0 -0
  86. data/source/global/tdclatl/tdclatl.idl +76 -5
  87. metadata +16 -6
  88. data/bin/common/tdclc_32_3_4.dll +0 -0
  89. data/bin/common/tdclc_64_3_4.dll +0 -0
  90. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +0 -423
  91. 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
- m_impl->buf.reset(new std::string(p));
167
- gtid = m_impl->buf->c_str();
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
- m_btrcallid(TD_CREATETABLE, posblk, pfs, &len, (void*)p,
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
- m_btrcallid(TD_CREATETABLE, posblk, NULL, NULL, (void*)p,
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 = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)p2,
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 = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)bufNew,
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 = m_btrcallid(TD_RESET_CLIENT, NULL, NULL, NULL, NULL, 0, 0,
641
- m_nsimpl->cidPtr);
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 = m_btrcallid(TD_BEGIN_SHAPSHOT + bias, NULL, bpos, &datalen, NULL, 0, 0,
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 = m_btrcallid(TD_GET_BLOB_BUF, NULL, &hd, NULL, NULL, 0, 0,
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 = m_btrcallid(TD_END_SNAPSHOT, NULL, NULL, NULL, NULL, 0, 0,
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 = m_btrcallid((ushort_td)(BIAS + TD_BEGIN_TRANSACTION), NULL,
736
- NULL, NULL, NULL, 0, 0, m_nsimpl->cidPtr);
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 = m_btrcallid(TD_END_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0,
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 = m_btrcallid(TD_ABORT_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0,
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 = m_btrcallid(TD_GET_SCHEMA, NULL, retbuf, size, (void*)p, keylen,
849
- SC_SUBOP_VIEW_BY_SQL, m_nsimpl->cidPtr);
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 = m_btrcallid(TD_GETDIRECTORY, NULL, NULL, NULL, tmp, 128, 0,
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 = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
923
- (keylen_td)(strlen(p) + 1), keyNum, clientID());
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 = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)URI,
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 = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, NULL,
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 = m_btrcallid(TD_RECONNECT + offset, pb, databuf, &datalen, (void*)p,
982
- (keylen_td)(strlen(p) + 1), tb->mode(), clientID());
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
- if (engins()[i])
989
+ nsdatabase* db = engins()[i];
990
+ if (db)
1010
991
  {
1011
- void* p = (*((void**)engins()[i]->m_nsimpl->cidPtr));
992
+ void* p = (*((void**)db->m_nsimpl->cidPtr));
1012
993
  if (p == ptr)
1013
994
  {
1014
- if (!engins()[i]->doReopenTables())
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 = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
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