transactd 3.4.1 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -72,7 +72,8 @@ endif()
72
72
  if(WIN32)
73
73
  link_directories("${TRANSACTD_RUBY_GEM_ROOT_PATH}/bin/common")
74
74
  else()
75
- link_directories("../tdclcpp")
75
+ cmake_policy(SET CMP0015 OLD)
76
+ link_directories(../tdclcpp)
76
77
  endif()
77
78
 
78
79
 
@@ -145,11 +146,11 @@ if(TRANSACTD_HAVE_RB_THREAD_CALL_WITHOUT_GVL)
145
146
  endif()
146
147
  if(MSVC)
147
148
  set_property(TARGET ${this_target} APPEND PROPERTY COMPILE_DEFINITIONS
148
- WIN32 _WIN32 _WINDOWS _USRDLL BOOST_ALL_NO_LIB
149
- LIB_TDCLCPP TRDCL_AUTOLINK TRDCLENGN_EXPORTS _CRT_SECURE_NO_WARNINGS)
149
+ WIN32 _WIN32 _WINDOWS _USRDLL
150
+ TRDCL_AUTOLINK TRDCLENGN_EXPORTS _CRT_SECURE_NO_WARNINGS)
150
151
  else()
151
152
  set_property(TARGET ${this_target} APPEND PROPERTY COMPILE_DEFINITIONS
152
- PIC _REENTRANT BOOST_ALL_NO_LIB)
153
+ PIC _REENTRANT)
153
154
  if(NOT MINGW)
154
155
  set_property(TARGET ${this_target} APPEND PROPERTY COMPILE_DEFINITIONS
155
156
  LINUX)
@@ -29,8 +29,8 @@
29
29
  //
30
30
 
31
31
  VS_VERSION_INFO VERSIONINFO
32
- FILEVERSION 3,4,1,204
33
- PRODUCTVERSION 3,4,1,204
32
+ FILEVERSION 3,5,0,220
33
+ PRODUCTVERSION 3,5,0,220
34
34
  FILEFLAGSMASK 0x3fL
35
35
  #ifdef _DEBUG
36
36
  FILEFLAGS 0x1L
@@ -47,9 +47,9 @@ BEGIN
47
47
  BEGIN
48
48
  VALUE "CompanyName", "BizStation Corp."
49
49
  VALUE "FileDescription", "Transactd Ruby client"
50
- VALUE "FileVersion", "3.4.1.204"
50
+ VALUE "FileVersion", "3.5.0.220"
51
51
  VALUE "LegalCopyright", "Copyright(C) 2016 BizStation Corp"
52
- VALUE "ProductVersion", "3.4.1.204"
52
+ VALUE "ProductVersion", "3.5.0.220"
53
53
  VALUE "ProductName", "Transactd Client (GPL V2)"
54
54
  END
55
55
  END
@@ -2094,7 +2094,7 @@ void table::readRecords(IReadRecordsHandler* hdr, bool includeCurrent, int type,
2094
2094
  bool noBookmark)
2095
2095
  {
2096
2096
 
2097
- if ((m_table->file->inited == handler::NONE) || !m_cursor)
2097
+ if ((m_table->file->inited == handler::NONE) || (m_table->file->inited == handler::INDEX && !m_cursor))
2098
2098
  {
2099
2099
  m_stat = STATUS_NO_CURRENT;
2100
2100
  return;
@@ -2108,50 +2108,58 @@ void table::readRecords(IReadRecordsHandler* hdr, bool includeCurrent, int type,
2108
2108
  // dummy bookmark , use if bobbokmark=true
2109
2109
  unsigned int tmp = 0;
2110
2110
  const uchar* bm = (unsigned char*)&tmp;
2111
-
2111
+ uint poslen = posPtrLen();
2112
+ short tmp_stat = 0;
2113
+ bool inTrn = m_db.inSnapshot() || m_db.inTransaction();
2112
2114
  // Is a current position read or not?
2113
2115
  bool read = !includeCurrent;
2114
2116
  bool forword =
2115
2117
  (type == READ_RECORD_GETNEXT) || (type == READ_RECORD_STEPNEXT);
2118
+
2116
2119
  while ((reject != 0) && (rows != 0))
2117
2120
  {
2118
2121
  if (read)
2119
2122
  {
2120
2123
  unlockRow(false);
2121
-
2122
- if (type == READ_RECORD_GETNEXT)
2123
- m_stat = m_table->file->ha_index_next(m_table->record[0]);
2124
- else if (type == READ_RECORD_GETPREV)
2125
- m_stat = m_table->file->ha_index_prev(m_table->record[0]);
2126
- else if (type == READ_RECORD_STEPNEXT)
2127
- m_stat = m_table->file->ha_rnd_next(m_table->record[0]);
2128
- else if (type == READ_RECORD_STEPPREV)
2124
+ switch(type)
2129
2125
  {
2126
+ case READ_RECORD_GETNEXT:
2127
+ m_stat = m_table->file->ha_index_next(m_table->record[0]);break;
2128
+ case READ_RECORD_GETPREV:
2129
+ m_stat = m_table->file->ha_index_prev(m_table->record[0]);break;
2130
+ case READ_RECORD_STEPNEXT:
2131
+ m_stat = m_table->file->ha_rnd_next(m_table->record[0]);break;
2132
+ default: //READ_RECORD_STEPPREV
2133
+ setCursorStaus();
2130
2134
  m_stat = STATUS_NOSUPPORT_OP;
2131
2135
  return;
2132
2136
  }
2133
- setCursorStaus();
2137
+ //setCursorStaus();
2134
2138
  }
2135
2139
  else
2136
2140
  read = true;
2137
2141
 
2138
2142
  if (m_stat)
2143
+ {
2144
+ tmp_stat = m_stat;
2139
2145
  break;
2146
+ }
2140
2147
  int ret = hdr->match(forword);
2141
2148
  if (ret == REC_MACTH)
2142
2149
  {
2143
-
2144
2150
  if (!noBookmark)
2145
2151
  bm = position();
2146
- m_stat = hdr->write(bm, posPtrLen());
2147
- if (m_stat)
2152
+ tmp_stat = hdr->write(bm, poslen);
2153
+ if (tmp_stat)
2148
2154
  break;
2149
2155
  --rows;
2150
2156
  }else
2151
2157
  {
2152
- unlock();
2158
+ if (inTrn) unlock();
2159
+
2153
2160
  if (ret == REC_NOMACTH_NOMORE)
2154
2161
  {
2162
+ setCursorStaus();
2155
2163
  m_stat = STATUS_REACHED_FILTER_COND;
2156
2164
  return;
2157
2165
  }
@@ -2159,6 +2167,8 @@ void table::readRecords(IReadRecordsHandler* hdr, bool includeCurrent, int type,
2159
2167
  --reject;
2160
2168
  }
2161
2169
  }
2170
+ setCursorStaus();
2171
+ m_stat = tmp_stat;
2162
2172
  if (reject == 0)
2163
2173
  m_stat = STATUS_LIMMIT_OF_REJECT;
2164
2174
  }
@@ -2722,6 +2732,26 @@ void table::getCreateSql(String* s)
2722
2732
  cp_store_create_info(m_db.thd(), &tables, s, NULL, (int)FALSE);
2723
2733
  }
2724
2734
 
2735
+ void table::setValue(int index, const std::string& v, int type)
2736
+ {
2737
+ Field* field = *(m_table->field + index);
2738
+ if ((v.size() == 1) && (v[0] == 0x00))
2739
+ field->set_null();
2740
+ else
2741
+ field->set_notnull();
2742
+ if ((type == UPDATE_INC) || (type == UPDATE_DEC))
2743
+ {
2744
+ __int64 old = field->val_int();
2745
+ __int64 intv = _atoi64(v.c_str());
2746
+ if (type == UPDATE_INC)
2747
+ field->store(old + intv, false);
2748
+ else
2749
+ field->store(old - intv, false);
2750
+ }
2751
+ else
2752
+ field->store(v.c_str(), (uint)v.size(), &my_charset_bin);
2753
+ }
2754
+
2725
2755
  #ifdef USE_HANDLERSOCKET
2726
2756
 
2727
2757
  int table::fieldIndexByName(const char* name) const
@@ -2744,26 +2774,6 @@ void table::setUseFieldList(const std::string& csv)
2744
2774
  addUseField(fieldIndexByName(values[i].c_str()));
2745
2775
  }
2746
2776
 
2747
- void table::setValue(int index, const std::string& v, int type)
2748
- {
2749
- Field* field = *(m_table->field + index);
2750
- if ((v.size() == 1) && (v[0] == 0x00))
2751
- field->set_null();
2752
- else
2753
- field->set_notnull();
2754
- if ((type == UPDATE_INC) || (type == UPDATE_DEC))
2755
- {
2756
- __int64 old = field->val_int();
2757
- __int64 intv = _atoi64(v.c_str());
2758
- if (type == UPDATE_INC)
2759
- field->store(old + intv, false);
2760
- else
2761
- field->store(old - intv, false);
2762
- }
2763
- else
2764
- field->store(v.c_str(), (uint)v.size(), &my_charset_bin);
2765
- }
2766
-
2767
2777
  void table::setUseValues(const std::vector<std::string>& values, int type)
2768
2778
  {
2769
2779
  for (int i = 0; i < (int)values.size(); i++)
@@ -78,6 +78,9 @@ class table;
78
78
  */
79
79
  #define REF_SIZE_MAX 112
80
80
 
81
+ #define UPDATE_REPLACE 0
82
+ #define UPDATE_INC 1
83
+ #define UPDATE_DEC 2
81
84
 
82
85
 
83
86
  /** Control mysql table cahche
@@ -346,7 +349,6 @@ class table : private boost::noncopyable
346
349
  bookmarks* bms();
347
350
  int percentage(uchar* first, uchar* last, uchar* cur);
348
351
 
349
- bool setNonKey(bool scan = false);
350
352
  void fillNull(uchar* ptr, int size);
351
353
 
352
354
  inline void* keybuf() const { return &m_keybuf[0]; }
@@ -382,19 +384,12 @@ class table : private boost::noncopyable
382
384
  std::vector<int> m_useFields;
383
385
  void checkFiledIndex(int index);
384
386
  int fieldIndexByName(const char* name) const;
385
-
386
387
  void addUseField(int index) { m_useFields.push_back(index); };
387
-
388
388
  public:
389
389
  std::vector<int>& useFields() { return m_useFields; };
390
390
  void setUseFieldList(const std::string& csv);
391
- void setValue(int index, const std::string& v, int type);
392
391
  void setUseValues(const std::vector<std::string>& values, int type);
393
392
 
394
- #define UPDATE_REPLACE 0
395
- #define UPDATE_INC 1
396
- #define UPDATE_DEC 2
397
-
398
393
  #endif
399
394
 
400
395
  public:
@@ -524,6 +519,7 @@ public:
524
519
  {
525
520
  return (1U << m_table->key_info[(int)m_keyNum].user_defined_key_parts) - 1;
526
521
  }
522
+ bool setNonKey(bool scan = false);
527
523
  unsigned long long tableFlags() const { return m_table->file->ha_table_flags();}
528
524
  void seekKey(enum ha_rkey_function find_flag, key_part_map keyMap);
529
525
  void getNextSame(key_part_map keyMap);
@@ -779,6 +775,8 @@ public:
779
775
  inline void setTimestampAlways(bool v) { m_timestampAlways = v;}
780
776
 
781
777
  void getCreateSql(String* s);
778
+
779
+ void setValue(int index, const std::string& v, int type);
782
780
  };
783
781
 
784
782
  class fieldBitmap
@@ -157,6 +157,17 @@ void dbManager::releaseDatabase(short cid)
157
157
  m_handles.erase(m_handles.begin() + i);
158
158
  }
159
159
 
160
+ int dbManager::trxProcessing()
161
+ {
162
+ int transactins = 0;
163
+ for (size_t i = 0; i < m_dbs.size(); i++)
164
+ {
165
+ if (m_dbs[i]->inTransaction() || m_dbs[i]->inSnapshot())
166
+ ++transactins;
167
+ }
168
+ return transactins;
169
+ }
170
+
160
171
  database* dbManager::useDataBase(int id) const
161
172
  {
162
173
  if (id >= (int)m_dbs.size())
@@ -99,6 +99,7 @@ public:
99
99
  bool isShutDown() const;
100
100
  const databases& dbs() const { return m_dbs; }
101
101
  boost::mutex& mutex() { return m_mutex; }
102
+ int trxProcessing();
102
103
  };
103
104
 
104
105
  } // namespace mysql
@@ -0,0 +1,174 @@
1
+ /*=================================================================
2
+ Copyright (C) 2016 BizStation Corp All rights reserved.
3
+
4
+ This program is free software; you can redistribute it and/or
5
+ modify it under the terms of the GNU General Public License
6
+ as published by the Free Software Foundation; either version 2
7
+ of the License, or (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License
15
+ along with this program; if not, write to the Free Software
16
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17
+ 02111-1307, USA.
18
+ =================================================================*/
19
+ #include <my_config.h>
20
+ # include <string>
21
+ #include <boost/thread.hpp>
22
+ #include "ha.h"
23
+ #include "mysqlInternal.h"
24
+ #include <bzs/env/fileopen.h>
25
+ #include <bzs/db/protocol/tdap/tdapcapi.h>
26
+
27
+ /* implemnts in transactd.cpp */
28
+ extern unsigned int g_startup_ha;
29
+
30
+ unsigned int g_ha;
31
+ bool trx_blocking = trx_noblock;
32
+
33
+ namespace bzs
34
+ {
35
+ namespace db
36
+ {
37
+ namespace engine
38
+ {
39
+ namespace mysql
40
+ {
41
+
42
+ #define roleInfoName "transactd_srv_master"
43
+
44
+
45
+ boost::recursive_try_mutex g_tmtx_ha;
46
+ boost::try_mutex g_tmtx_trx;
47
+
48
+ int getRoleFromFile()
49
+ {
50
+ int ret = -1;
51
+ char filename[FN_REFLEN];
52
+ fn_format(filename, roleInfoName, "", ".info", MY_REPLACE_EXT | MY_UNPACK_FILENAME);
53
+ FILE* fp = fileOpen(filename, "r");
54
+ if (fp)
55
+ {
56
+ char buf[20];
57
+ char* p = fgets(buf, 20, fp);
58
+ if (p && *p)
59
+ ret = atol(p);
60
+ fclose(fp);
61
+ }else
62
+ sql_print_error("Transactd: File : %s was not opened for read", filename);
63
+ return ret;
64
+ }
65
+
66
+ bool saveRoleToFile(int role)
67
+ {
68
+ char filename[FN_REFLEN];
69
+ fn_format(filename, roleInfoName, "", ".info", MY_REPLACE_EXT | MY_UNPACK_FILENAME);
70
+ FILE* fp = fileOpen(filename, "w");
71
+ if (fp)
72
+ {
73
+ const char* p = (role == HA_ROLE_MASTER) ? "1" :
74
+ ((role == HA_ROLE_NONE) ? "2" : "0");
75
+ fputs(p, fp);
76
+ fclose(fp);
77
+ return true;
78
+ }
79
+ sql_print_error("Transactd: File : %s was not opened for write", filename);
80
+ return true;
81
+ }
82
+
83
+ int initHa()
84
+ {
85
+ boost::recursive_try_mutex::scoped_lock lck(g_tmtx_ha);
86
+ g_ha = g_startup_ha & ~HA_RESTORE_ROLE;
87
+ if (g_startup_ha & HA_RESTORE_ROLE)
88
+ {
89
+ int ret = getRoleFromFile();
90
+ if (ret != -1)
91
+ g_ha |= (unsigned int)ret;
92
+ }
93
+ return g_ha;
94
+ }
95
+
96
+ bool haLock()
97
+ {
98
+ return g_tmtx_ha.try_lock();
99
+ }
100
+
101
+ bool haUnlock()
102
+ {
103
+ #ifdef _WIN32
104
+ if (g_tmtx_ha.locking_thread_id)
105
+ {
106
+ g_tmtx_ha.unlock();
107
+ return true;
108
+ }
109
+ return false;
110
+ #else
111
+ g_tmtx_ha.unlock();
112
+ return true;
113
+ #endif
114
+ }
115
+
116
+ bool setRole(int role)
117
+ {
118
+ int ret = getRole();
119
+ if (ret != role)
120
+ {
121
+ if (g_tmtx_ha.try_lock())
122
+ {
123
+ g_ha &= ~(HA_ROLE_MASTER | HA_ROLE_NONE);
124
+ g_ha |= role;
125
+ saveRoleToFile(role);
126
+ g_tmtx_ha.unlock();
127
+ return true;
128
+ }
129
+ return false;
130
+ }
131
+ return true;
132
+ }
133
+
134
+ int getRole()
135
+ {
136
+ return (g_ha & (HA_ROLE_MASTER | HA_ROLE_NONE));
137
+ }
138
+
139
+ bool setEnableFailover(bool enable)
140
+ {
141
+ if (g_tmtx_ha.try_lock())
142
+ {
143
+ if (enable)
144
+ g_ha |= HA_ENABLE_FAILOVER;
145
+ else
146
+ g_ha &= ~HA_ENABLE_FAILOVER;
147
+ g_tmtx_ha.unlock();
148
+ return true;
149
+ }
150
+ return false;
151
+ }
152
+
153
+ bool getEnableFailover()
154
+ {
155
+ return (g_ha & HA_ENABLE_FAILOVER) != 0;
156
+ }
157
+
158
+ bool setTrxBlock(bool v)
159
+ {
160
+ if (g_tmtx_trx.try_lock())
161
+ {
162
+ trx_blocking = v ? trx_block : trx_noblock;
163
+ g_tmtx_trx.unlock();
164
+ return true;
165
+ }
166
+ return false;
167
+ }
168
+
169
+
170
+ } // namespace mysql
171
+ } // namespace engine
172
+ } // namespace db
173
+ } // namespace bzs
174
+