transactd 1.0.1

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 (218) hide show
  1. checksums.yaml +7 -0
  2. data/BUILD_UNIX-JA +174 -0
  3. data/BUILD_WIN-JA +256 -0
  4. data/CMakeLists.txt +96 -0
  5. data/COPYING +339 -0
  6. data/README +406 -0
  7. data/README-JA +424 -0
  8. data/bin/common/tdclc_32_1_0.dll +0 -0
  9. data/bin/common/tdclc_64_1_0.dll +0 -0
  10. data/build/common/check_for_link_iconv.cmake +73 -0
  11. data/build/common/copyifgreater.cmd +30 -0
  12. data/build/common/copyifgreater.js +290 -0
  13. data/build/common/get_boost_libs.cmake +106 -0
  14. data/build/common/get_ruby_path.cmake +115 -0
  15. data/build/common/options.cmake +127 -0
  16. data/build/common/smart_install.cmake +263 -0
  17. data/build/common/system.cmake +122 -0
  18. data/build/common/transactd.rc.in +52 -0
  19. data/build/common/transactd_cl_common.cmake +101 -0
  20. data/build/common/transactd_cl_output.cmake +93 -0
  21. data/build/common/transactd_common.cmake +237 -0
  22. data/build/common/transactd_required.cmake +28 -0
  23. data/build/swig/ruby/generate.cmake.in +35 -0
  24. data/build/swig/ruby/generate.cmd.in +19 -0
  25. data/build/swig/ruby/ruby.swg +101 -0
  26. data/build/swig/tdcl.i +188 -0
  27. data/build/tdclc/BUILDNUMBER.txt +1 -0
  28. data/build/tdclc/CMakeLists.txt +170 -0
  29. data/build/tdclc/tdclc_32.cbproj +181 -0
  30. data/build/tdclc/tdclc_64.cbproj +205 -0
  31. data/build/tdclcpp/BUILDNUMBER.txt +1 -0
  32. data/build/tdclcpp/CMakeLists.txt +142 -0
  33. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +239 -0
  34. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +304 -0
  35. data/build/tdclrb/BUILDNUMBER.txt +1 -0
  36. data/build/tdclrb/CMakeLists.txt +258 -0
  37. data/build/tdclrb/GEM_VERSION +3 -0
  38. data/build/tdclrb/bldgem/extconf.rb +123 -0
  39. data/build/tdclrb/gem/INSTALLLOG.win32 +9 -0
  40. data/build/tdclrb/gem/Makefile.win32-VS +65 -0
  41. data/build/tdclrb/gem/Makefile.win32-prebuilt +48 -0
  42. data/build/tdclrb/gem/detect.rb +31 -0
  43. data/build/tdclrb/gem/helper.rb +113 -0
  44. data/build/tdclrb/gem/transactd.rb +22 -0
  45. data/build/tdclrb/gem_output.cmake +44 -0
  46. data/source/bzs/db/IBlobBuffer.h +51 -0
  47. data/source/bzs/db/blobBuffer.h +177 -0
  48. data/source/bzs/db/blobStructs.h +85 -0
  49. data/source/bzs/db/engine/mysql/IReadRecords.h +52 -0
  50. data/source/bzs/db/engine/mysql/bookmark.h +195 -0
  51. data/source/bzs/db/engine/mysql/database.cpp +1882 -0
  52. data/source/bzs/db/engine/mysql/database.h +465 -0
  53. data/source/bzs/db/engine/mysql/dbManager.cpp +303 -0
  54. data/source/bzs/db/engine/mysql/dbManager.h +143 -0
  55. data/source/bzs/db/engine/mysql/errorMessage.cpp +75 -0
  56. data/source/bzs/db/engine/mysql/errorMessage.h +43 -0
  57. data/source/bzs/db/engine/mysql/fieldAccess.h +158 -0
  58. data/source/bzs/db/engine/mysql/mydebuglog.cpp +349 -0
  59. data/source/bzs/db/engine/mysql/mydebuglog.h +89 -0
  60. data/source/bzs/db/engine/mysql/mysqlInternal.h +171 -0
  61. data/source/bzs/db/engine/mysql/mysqlThd.cpp +169 -0
  62. data/source/bzs/db/engine/mysql/mysqlThd.h +35 -0
  63. data/source/bzs/db/engine/mysql/percentageKey.h +260 -0
  64. data/source/bzs/db/protocol/ICommandExecuter.h +49 -0
  65. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +689 -0
  66. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +228 -0
  67. data/source/bzs/db/protocol/tdap/btrDate.cpp +437 -0
  68. data/source/bzs/db/protocol/tdap/btrDate.h +227 -0
  69. data/source/bzs/db/protocol/tdap/client/bulkInsert.h +127 -0
  70. data/source/bzs/db/protocol/tdap/client/client.cpp +106 -0
  71. data/source/bzs/db/protocol/tdap/client/client.h +292 -0
  72. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +144 -0
  73. data/source/bzs/db/protocol/tdap/client/connMgr.h +82 -0
  74. data/source/bzs/db/protocol/tdap/client/database.cpp +863 -0
  75. data/source/bzs/db/protocol/tdap/client/database.h +118 -0
  76. data/source/bzs/db/protocol/tdap/client/databaseFactory.cpp +100 -0
  77. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +1640 -0
  78. data/source/bzs/db/protocol/tdap/client/dbDef.h +135 -0
  79. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +434 -0
  80. data/source/bzs/db/protocol/tdap/client/errorMessage.cpp +92 -0
  81. data/source/bzs/db/protocol/tdap/client/errorMessage_ja.cpp +98 -0
  82. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +174 -0
  83. data/source/bzs/db/protocol/tdap/client/fieldDDF.h +91 -0
  84. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +140 -0
  85. data/source/bzs/db/protocol/tdap/client/fileDDF.h +86 -0
  86. data/source/bzs/db/protocol/tdap/client/filter.cpp +527 -0
  87. data/source/bzs/db/protocol/tdap/client/filter.h +154 -0
  88. data/source/bzs/db/protocol/tdap/client/indexDDF.cpp +137 -0
  89. data/source/bzs/db/protocol/tdap/client/indexDDF.h +84 -0
  90. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +724 -0
  91. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +123 -0
  92. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +899 -0
  93. data/source/bzs/db/protocol/tdap/client/nsTable.h +199 -0
  94. data/source/bzs/db/protocol/tdap/client/request.h +198 -0
  95. data/source/bzs/db/protocol/tdap/client/sharedData.cpp +58 -0
  96. data/source/bzs/db/protocol/tdap/client/sharedData.h +56 -0
  97. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +574 -0
  98. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +53 -0
  99. data/source/bzs/db/protocol/tdap/client/stringConverter.h +627 -0
  100. data/source/bzs/db/protocol/tdap/client/table.cpp +2613 -0
  101. data/source/bzs/db/protocol/tdap/client/table.h +221 -0
  102. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +1096 -0
  103. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +179 -0
  104. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +40 -0
  105. data/source/bzs/db/protocol/tdap/client/trnsctcl.def +11 -0
  106. data/source/bzs/db/protocol/tdap/myDateTime.cpp +500 -0
  107. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +184 -0
  108. data/source/bzs/db/protocol/tdap/mysql/characterset.h +60 -0
  109. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +284 -0
  110. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +53 -0
  111. data/source/bzs/db/protocol/tdap/mysql/debuglog.cpp +383 -0
  112. data/source/bzs/db/protocol/tdap/mysql/debuglog.h +106 -0
  113. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +680 -0
  114. data/source/bzs/db/protocol/tdap/mysql/request.h +202 -0
  115. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +1020 -0
  116. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +141 -0
  117. data/source/bzs/db/protocol/tdap/tdapRequest.h +190 -0
  118. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +295 -0
  119. data/source/bzs/db/protocol/tdap/tdapSchema.h +558 -0
  120. data/source/bzs/db/protocol/tdap/tdapcapi.h +423 -0
  121. data/source/bzs/db/transactd/appBuilderImple.h +55 -0
  122. data/source/bzs/db/transactd/appModule.cpp +183 -0
  123. data/source/bzs/db/transactd/appModule.h +80 -0
  124. data/source/bzs/db/transactd/connManager.cpp +201 -0
  125. data/source/bzs/db/transactd/connManager.h +60 -0
  126. data/source/bzs/db/transactd/connectionRecord.h +69 -0
  127. data/source/bzs/db/transactd/transactd.cpp +325 -0
  128. data/source/bzs/env/compiler.h +135 -0
  129. data/source/bzs/env/crosscompile.cpp +130 -0
  130. data/source/bzs/env/crosscompile.h +150 -0
  131. data/source/bzs/env/fileopen.h +36 -0
  132. data/source/bzs/env/mbcswchrLinux.cpp +40 -0
  133. data/source/bzs/env/mbcswchrLinux.h +88 -0
  134. data/source/bzs/env/tstring.h +183 -0
  135. data/source/bzs/example/changeSchema.cpp +117 -0
  136. data/source/bzs/example/changeSchema_c.cpp +78 -0
  137. data/source/bzs/example/connection_pool_c.cpp +171 -0
  138. data/source/bzs/example/createDatabase.cpp +305 -0
  139. data/source/bzs/example/createDatabase_c.cpp +202 -0
  140. data/source/bzs/example/deleteRecords.cpp +87 -0
  141. data/source/bzs/example/deleteRecords_c.cpp +57 -0
  142. data/source/bzs/example/dropDatabase.cpp +59 -0
  143. data/source/bzs/example/dropDatabase_c.cpp +34 -0
  144. data/source/bzs/example/insertRecords.cpp +212 -0
  145. data/source/bzs/example/insertRecords_c.cpp +153 -0
  146. data/source/bzs/example/readRecords.cpp +141 -0
  147. data/source/bzs/example/readRecords_c.cpp +107 -0
  148. data/source/bzs/example/updateRecords.cpp +99 -0
  149. data/source/bzs/example/updateRecords_c.cpp +71 -0
  150. data/source/bzs/example/update_with_transaction.cpp +104 -0
  151. data/source/bzs/example/update_with_transaction_c.cpp +80 -0
  152. data/source/bzs/netsvc/client/tcpClient.cpp +226 -0
  153. data/source/bzs/netsvc/client/tcpClient.h +489 -0
  154. data/source/bzs/netsvc/server/IAppModule.h +94 -0
  155. data/source/bzs/netsvc/server/iserver.h +65 -0
  156. data/source/bzs/netsvc/server/serverCpt.cpp +522 -0
  157. data/source/bzs/netsvc/server/serverCpt.h +88 -0
  158. data/source/bzs/netsvc/server/serverPipe.cpp +705 -0
  159. data/source/bzs/netsvc/server/serverPipe.h +96 -0
  160. data/source/bzs/netsvc/server/serverTpool.cpp +416 -0
  161. data/source/bzs/netsvc/server/serverTpool.h +84 -0
  162. data/source/bzs/rtl/benchmark.cpp +96 -0
  163. data/source/bzs/rtl/benchmark.h +65 -0
  164. data/source/bzs/rtl/datetime.cpp +375 -0
  165. data/source/bzs/rtl/datetime.h +53 -0
  166. data/source/bzs/rtl/debuglog.cpp +106 -0
  167. data/source/bzs/rtl/debuglog.h +97 -0
  168. data/source/bzs/rtl/exception.h +116 -0
  169. data/source/bzs/rtl/stl_uty.cpp +35 -0
  170. data/source/bzs/rtl/stl_uty.h +29 -0
  171. data/source/bzs/rtl/stringBuffers.cpp +101 -0
  172. data/source/bzs/rtl/stringBuffers.h +58 -0
  173. data/source/bzs/rtl/strtrim.cpp +135 -0
  174. data/source/bzs/rtl/strtrim.h +46 -0
  175. data/source/bzs/test/tdclatl/bench_tdclatl.js +445 -0
  176. data/source/bzs/test/tdclrb/bench_tdclcpp.rb +375 -0
  177. data/source/bzs/test/tdclrb/prepare.rb +226 -0
  178. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +172 -0
  179. data/source/bzs/test/tdclrb/transactd_kanjischema_spec.rb +208 -0
  180. data/source/bzs/test/tdclrb/transactd_spec.rb +1536 -0
  181. data/source/bzs/test/transactdBench/transactdBench.cpp +430 -0
  182. data/source/bzs/test/transactdBench/transactdBench2.cpp +342 -0
  183. data/source/bzs/test/trdclengn/test_trdclengn.cpp +2030 -0
  184. data/source/global/tdclatl/Database.cpp +503 -0
  185. data/source/global/tdclatl/Database.h +139 -0
  186. data/source/global/tdclatl/DbDef.cpp +242 -0
  187. data/source/global/tdclatl/DbDef.h +79 -0
  188. data/source/global/tdclatl/Field.cpp +92 -0
  189. data/source/global/tdclatl/Field.h +59 -0
  190. data/source/global/tdclatl/FieldDef.cpp +238 -0
  191. data/source/global/tdclatl/FieldDef.h +87 -0
  192. data/source/global/tdclatl/Flags.cpp +111 -0
  193. data/source/global/tdclatl/Flags.h +55 -0
  194. data/source/global/tdclatl/KeyDef.cpp +51 -0
  195. data/source/global/tdclatl/KeyDef.h +55 -0
  196. data/source/global/tdclatl/KeySegment.cpp +55 -0
  197. data/source/global/tdclatl/Table.cpp +600 -0
  198. data/source/global/tdclatl/Table.h +144 -0
  199. data/source/global/tdclatl/TableDef.cpp +291 -0
  200. data/source/global/tdclatl/TableDef.h +86 -0
  201. data/source/global/tdclatl/TdVersion.cpp +74 -0
  202. data/source/global/tdclatl/TdVersion.h +54 -0
  203. data/source/global/tdclatl/_IDatabaseEvents_CP.h +113 -0
  204. data/source/global/tdclatl/dllmain.cpp +30 -0
  205. data/source/global/tdclatl/dllmain.h +27 -0
  206. data/source/global/tdclatl/keySegment.h +57 -0
  207. data/source/global/tdclatl/resource.h +0 -0
  208. data/source/global/tdclatl/stdafx.cpp +2 -0
  209. data/source/global/tdclatl/stdafx.h +25 -0
  210. data/source/global/tdclatl/targetver.h +4 -0
  211. data/source/global/tdclatl/tdclatl.cpp +68 -0
  212. data/source/global/tdclatl/tdclatl.def +10 -0
  213. data/source/global/tdclatl/tdclatl.idl +1035 -0
  214. data/source/linux/charsetConvert.h +112 -0
  215. data/source/linux/linuxTypes.h +33 -0
  216. data/source/linux/tchar.h +428 -0
  217. data/transactd.gemspec +97 -0
  218. metadata +267 -0
@@ -0,0 +1,724 @@
1
+ /* =================================================================
2
+ Copyright (C) 2000-2013 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 <bzs/env/tstring.h>
20
+ #pragma hdrstop
21
+
22
+ //#define BOOST_THREAD_BUILD_LIB
23
+ #if (__BCPLUSPLUS__ && _WIN64)
24
+ # define BOOST_ALL_NO_LIB
25
+ #endif
26
+
27
+ #include "nsDatabase.h"
28
+ #include "nsTable.h"
29
+ #include "stringConverter.h"
30
+ #include <sys/stat.h>
31
+ #include <stdio.h>
32
+ #include <boost/thread/mutex.hpp>
33
+
34
+ #ifdef LINUX
35
+ #include <dlfcn.h>
36
+ #include <cstddef>
37
+ #include <bzs/env/crosscompile.h>
38
+ typedef void* HANDLE;
39
+ typedef void* HINSTANCE;
40
+ #endif
41
+
42
+ #pragma package(smart_init)
43
+
44
+
45
+ #if (__BCPLUSPLUS__)
46
+ # ifdef _WIN64
47
+ # pragma comment(lib, "boost_chrono-bcb64-mt-1_50.a")
48
+ # pragma comment(lib, "boost_thread-bcb64-mt-1_50.a")
49
+ # else
50
+ # pragma comment(lib, "libboost_system-bcb-mt-s-1_39.lib")
51
+ # pragma comment(lib, "libboost_filesystem-bcb-mt-s-1_39.lib")
52
+ # pragma comment(lib, "libboost_thread-bcb-mt-s-1_39.lib")
53
+ # endif
54
+ #endif
55
+
56
+
57
+
58
+ namespace bzs
59
+ {
60
+ namespace db
61
+ {
62
+ namespace protocol
63
+ {
64
+ namespace tdap
65
+ {
66
+ namespace client
67
+ {
68
+ extern EnginsFunc engins;
69
+ unsigned int g_lastTrnTime = 0;
70
+ unsigned int nsdatabase::m_execCodepage = GetACP();
71
+
72
+
73
+ void registEnginsPtr(EnginsFunc func) {engins = func;}
74
+
75
+ BTRCALLID_PTR BTRCALLIDX = NULL;
76
+ BTRCALLID_PTR MYTICALLID = NULL;
77
+
78
+ HANDLE hBtrvDLL = NULL;
79
+ HANDLE hTrsdDLL = NULL;
80
+
81
+ #ifdef LINUX
82
+ #define LIB_PREFIX "lib"
83
+ #else
84
+ #define LIB_PREFIX
85
+ #endif
86
+
87
+ BTRCALLID_PTR getTrnsctdEntryPoint()
88
+ {
89
+ if (MYTICALLID)
90
+ return MYTICALLID;
91
+
92
+
93
+ if (hTrsdDLL == NULL)
94
+ hTrsdDLL = LoadLibraryA(LIB_PREFIX TDCLC_LIBNAME);
95
+
96
+ if (hTrsdDLL)
97
+ MYTICALLID = (BTRCALLID_PTR)GetProcAddress((HINSTANCE)hTrsdDLL, "BTRCALLID");
98
+ return MYTICALLID;
99
+ }
100
+
101
+ BTRCALLID_PTR getBtrvEntryPoint() {return BTRCALLIDX;}
102
+
103
+ int smartLoadLibrary()
104
+ {
105
+ int ret = 0;
106
+ if (hBtrvDLL == NULL)
107
+ hBtrvDLL = LoadLibrary(_T("W3Btrv7"));
108
+
109
+ if (hBtrvDLL == NULL)
110
+ hBtrvDLL = LoadLibrary(_T("WBtrv32"));
111
+
112
+ if (hBtrvDLL)
113
+ BTRCALLIDX = (BTRCALLID_PTR)GetProcAddress((HINSTANCE)hBtrvDLL, "BTRCALLID");
114
+ if (BTRCALLIDX)
115
+ ret = 1;
116
+ MYTICALLID = getTrnsctdEntryPoint();
117
+ if (MYTICALLID)
118
+ ret = 2;
119
+ return ret;
120
+ }
121
+
122
+ void smartFreeLibrary()
123
+ {
124
+ if (hBtrvDLL)
125
+ FreeLibrary((HINSTANCE)hBtrvDLL);
126
+
127
+ if (hTrsdDLL)
128
+ FreeLibrary((HINSTANCE)hTrsdDLL);
129
+ hBtrvDLL = NULL;
130
+ hTrsdDLL = NULL;
131
+ BTRCALLIDX = NULL;
132
+ MYTICALLID = NULL;
133
+ }
134
+
135
+ struct nsdbimpl
136
+ {
137
+ int refCount;
138
+ int tranCount;
139
+ unsigned short id;
140
+ short snapShotCount;
141
+ nstable* tables[nsdatabase::maxtables];
142
+ uchar_td clientID[16];
143
+ uchar_td* cid() {return clientID;}
144
+ _TCHAR bdfPath[MAX_PATH];
145
+ short tableCount;
146
+ short lockWaitCount;
147
+ short lockWaitTime;
148
+ bool uriMode;
149
+ bool uselongFilename;
150
+ bool localSharing;
151
+
152
+ nsdbimpl() : refCount(1), snapShotCount(0), tranCount(0), uselongFilename(false), tableCount(0),
153
+ lockWaitCount(10), lockWaitTime(100), localSharing(false), uriMode(false)
154
+ {
155
+
156
+ }
157
+
158
+ void setId(unsigned short id_)
159
+ {
160
+ id = id_;
161
+
162
+ // make client id
163
+ memset(clientID, 0, 12);
164
+ clientID[12] = 'G';
165
+ clientID[13] = 'X';
166
+ memcpy(&clientID[14], &id, 2);
167
+ bdfPath[0] = 0x00;
168
+ }
169
+
170
+ nsdbimpl& operator= (const nsdbimpl & rt)
171
+ {
172
+ if (&rt != this)
173
+ {
174
+ lockWaitCount = rt.lockWaitCount;
175
+ lockWaitTime = rt.lockWaitCount;
176
+ uselongFilename = rt.uselongFilename;
177
+ uriMode = rt.uriMode;
178
+ }
179
+ return *this;
180
+ }
181
+
182
+ };
183
+
184
+ boost::mutex g_mutex;
185
+
186
+ nsdatabase::nsdatabase() : m_stat(0)
187
+ {
188
+ m_nsimpl = new nsdbimpl();
189
+ int type = 0;
190
+ if (hBtrvDLL == 0x00)
191
+ type = smartLoadLibrary();
192
+
193
+ m_btrcallid = getBtrvEntryPoint();
194
+ if (m_btrcallid == NULL)
195
+ m_btrcallid = getTrnsctdEntryPoint();
196
+
197
+ if ((type == 2) || MYTICALLID)
198
+ setUseLongFilename(true);
199
+ else
200
+ {
201
+ btrVersions v;
202
+ memset(&v, 0, sizeof(btrVersions));
203
+ uchar_td posblk[POS_BLOCK_SIZE] = {0x00};
204
+ getBtrVersion(&v, posblk);
205
+ if ((v.versions[1].majorVersion >= 9) || (v.versions[0].majorVersion >= 9))
206
+ setUseLongFilename(true);
207
+ }
208
+
209
+ for (int i = 0; i < maxtables; i++)
210
+ m_nsimpl->tables[i] = NULL;
211
+
212
+ boost::mutex::scoped_lock lck(g_mutex);
213
+ // serach empty
214
+ int i;
215
+ for (i = 0; i < MAX_BTRENGIN; i++)
216
+ if (engins()[i] == NULL)
217
+ break;
218
+
219
+ engins()[i] = this;
220
+
221
+ // no empty
222
+ if (MAX_BTRENGIN == i)
223
+ {
224
+ m_stat = -1;
225
+ return;
226
+ }
227
+ m_nsimpl->setId((unsigned short)i);
228
+
229
+ }
230
+
231
+ int nsdatabase::refCount()const {return m_nsimpl->refCount;}
232
+
233
+ void nsdatabase::addref()
234
+ {
235
+ ++m_nsimpl->refCount;
236
+ }
237
+
238
+ void nsdatabase::release()
239
+ {
240
+ if (--m_nsimpl->refCount == 0)
241
+ delete this;
242
+ }
243
+
244
+ nsdatabase::~nsdatabase()
245
+ {
246
+ reset();
247
+
248
+ boost::mutex::scoped_lock lck(g_mutex);
249
+ if (m_nsimpl->id != 0)
250
+ engins()[m_nsimpl->id] = NULL;
251
+ delete m_nsimpl;
252
+ #ifdef _WIN32
253
+ OutputDebugString(_T("delete database\n"));
254
+ #endif
255
+ }
256
+
257
+ nsdatabase* nsdatabase::clone() const
258
+ {
259
+ nsdatabase* p = new nsdatabase();
260
+ *p = *this;
261
+ return p;
262
+ }
263
+
264
+ nsdatabase& nsdatabase:: operator = (const nsdatabase & rt)
265
+ {
266
+ if (&rt != this)
267
+ {
268
+ *m_nsimpl = *rt.m_nsimpl;
269
+ setUri(rt.uri());
270
+ m_btrcallid = rt.m_btrcallid;
271
+ }
272
+ return *this;
273
+ }
274
+
275
+ int nsdatabase::enableTrn() const {return m_nsimpl->tranCount;}
276
+
277
+ short nsdatabase::stat() const {return m_stat;}
278
+
279
+ uchar_td* nsdatabase::clientID() const {return m_nsimpl->clientID;}
280
+
281
+ short nsdatabase::openTableCount() const {return m_nsimpl->tableCount;}
282
+
283
+ _TCHAR* nsdatabase::uri() const {return m_nsimpl->bdfPath;}
284
+
285
+ bool nsdatabase::uriMode() const {return m_nsimpl->uriMode;}
286
+
287
+ nstable** nsdatabase::tables() {return m_nsimpl->tables;}
288
+
289
+ short nsdatabase::lockWaitCount() const {return m_nsimpl->lockWaitCount;}
290
+
291
+ void nsdatabase::setLockWaitCount(short v) {m_nsimpl->lockWaitCount = v;}
292
+
293
+ short nsdatabase::lockWaitTime() const {return m_nsimpl->lockWaitTime;}
294
+
295
+ void nsdatabase::setLockWaitTime(short v) {m_nsimpl->lockWaitTime = v;}
296
+
297
+ bool nsdatabase::localSharing() const {return m_nsimpl->localSharing;}
298
+
299
+ void nsdatabase::setLocalSharing(bool v) {m_nsimpl->localSharing = v;}
300
+
301
+
302
+
303
+ bool nsdatabase::setUri(const _TCHAR* Path)
304
+ {
305
+ _TCHAR buf[MAX_PATH];
306
+
307
+ #ifdef _WIN32
308
+ _TCHAR* lpFilePart;
309
+ if (useLongFilename() == false)
310
+ {
311
+ GetFullPathName(Path, MAX_PATH, buf, &lpFilePart);
312
+ GetShortPathName(buf, m_nsimpl->bdfPath, MAX_PATH);
313
+ _tcsmupr((_TUCHAR*)m_nsimpl->bdfPath);
314
+ }
315
+ else
316
+ #endif
317
+ _tcscpy(m_nsimpl->bdfPath, Path);
318
+
319
+ m_nsimpl->uriMode = false;
320
+ if (_tcsstr(m_nsimpl->bdfPath, _T("btrv://")) || _tcsstr(m_nsimpl->bdfPath, _T("tdap://")))
321
+ m_nsimpl->uriMode = true;
322
+ #ifdef _WIN32
323
+ else
324
+ {
325
+ struct _stat statbuf;
326
+ if (_tstat(m_nsimpl->bdfPath, &statbuf) == -1)
327
+ return false;
328
+ }
329
+ #endif
330
+ return true;
331
+ }
332
+
333
+ void nsdatabase::createTable(fileSpec *pfs, uint_td len, const _TCHAR *pFullPath, short_td mode)
334
+ {
335
+ _TCHAR buf[MAX_PATH];
336
+ _TCHAR posblk[128] = {0x00};
337
+ #ifdef _WIN32
338
+ if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
339
+ {
340
+ GetShortPathName(pFullPath, buf, MAX_PATH);
341
+ }
342
+ else
343
+ #endif
344
+ {
345
+ _tcscpy(buf, pFullPath);
346
+ }
347
+ // tdap
348
+ if (isTransactdUri(buf))
349
+ {
350
+ if (setUseTransactd() == false)
351
+ return;
352
+ }
353
+
354
+ char buf2[MAX_PATH]={0x00};;
355
+ const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
356
+
357
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, pfs, &len, (void*)p, (uchar_td)strlen(p),
358
+ (char_td)mode, m_nsimpl->clientID);
359
+ }
360
+
361
+ void nsdatabase::dropTable(const _TCHAR* pFullPath)
362
+ {
363
+ _TCHAR buf[MAX_PATH];
364
+ _TCHAR posblk[128] = {0x00};
365
+ #ifdef _WIN32
366
+ if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
367
+ {
368
+ GetShortPathName(pFullPath, buf, MAX_PATH);
369
+ }
370
+ else
371
+ #endif
372
+ {
373
+ _tcscpy(buf, pFullPath);
374
+ }
375
+ // tdap
376
+ if (isTransactdUri(buf))
377
+ {
378
+ if (setUseTransactd() == false)
379
+ return;
380
+ }
381
+
382
+ char buf2[MAX_PATH]={0x00};
383
+ const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
384
+
385
+
386
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, NULL, NULL, (void*)p, (uchar_td)strlen(p)+1, CR_SUBOP_DROP,
387
+ m_nsimpl->clientID);
388
+ }
389
+
390
+ void nsdatabase::swapTablename(const _TCHAR* Name1, const _TCHAR* Name2)
391
+ {
392
+ _TCHAR posblk[128] = {0x00};
393
+
394
+ char buf1[MAX_PATH]={0x00};
395
+ char buf2[MAX_PATH]={0x00};
396
+ const char* p = toServerUri(buf1, MAX_PATH, Name1, isUseTransactd());
397
+ const char* p2 = toServerUri(buf2, MAX_PATH, Name2, isUseTransactd());
398
+ uint_td len = (uint_td)strlen(p);
399
+
400
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)p2, (uchar_td)strlen(p2),
401
+ CR_SUBOP_SWAPNAME, m_nsimpl->clientID);
402
+ }
403
+
404
+ void nsdatabase::rename(const _TCHAR* pFullPath, const _TCHAR* newName)
405
+ {
406
+ _TCHAR buf[MAX_PATH];
407
+ _TCHAR posblk[128] = {0x00};
408
+ #ifdef _WIN32
409
+ if ((useLongFilename() == false) && _tcsstr(pFullPath, _T(" ")))
410
+ {
411
+ GetShortPathName(pFullPath, buf, MAX_PATH);
412
+ }
413
+ else
414
+ #endif
415
+ {
416
+ _tcscpy(buf, pFullPath);
417
+ }
418
+ if (isTransactdUri(buf))
419
+ {
420
+ if (setUseTransactd() == false)
421
+ return;
422
+ }
423
+
424
+ char buf2[MAX_PATH]={0x00};
425
+ const char* p = toServerUri(buf2, MAX_PATH, buf, isUseTransactd());
426
+ uint_td len = (uint_td)strlen(p);
427
+
428
+
429
+
430
+ char bufNew[MAX_PATH]={0x00};
431
+ #ifdef _WIN32
432
+ if ((useLongFilename() == false) && _tcsstr(newName, _T(" ")))
433
+ GetShortPathName(newName, buf, MAX_PATH);
434
+ else
435
+ #endif
436
+ _tcscpy(buf, newName);
437
+ toServerUri(bufNew, MAX_PATH, newName, isUseTransactd());
438
+
439
+
440
+
441
+ m_stat = m_btrcallid(TD_CREATETABLE, posblk, (void*)p, &len, (void*)bufNew, (uchar_td)strlen(bufNew),
442
+ CR_SUBOP_RENAME, m_nsimpl->clientID);
443
+ }
444
+
445
+ void nsdatabase::registerTable(nstable* tb)
446
+ {
447
+ int i;
448
+ for (i = 0; i < maxtables; i++)
449
+ {
450
+ if (m_nsimpl->tables[i] == NULL)
451
+ {
452
+ m_nsimpl->tables[i] = tb;
453
+ m_nsimpl->tableCount++;
454
+ break;
455
+ }
456
+ }
457
+ }
458
+
459
+ void nsdatabase::unregisterTable(nstable* table)
460
+ {
461
+ int i;
462
+ for (i = 0; i < maxtables; i++)
463
+ {
464
+ if (m_nsimpl->tables[i] == table)
465
+ {
466
+ m_nsimpl->tables[i] = NULL;
467
+ m_nsimpl->tableCount--;
468
+ break;
469
+ }
470
+ }
471
+ }
472
+
473
+
474
+ void nsdatabase::reset()
475
+ {
476
+ int i;
477
+
478
+ if (m_nsimpl->tranCount)
479
+ {
480
+ #ifdef _WIN32
481
+ #ifdef ARBTREGN_PKG
482
+ int ret = MessageBox(NULL, _T("Is an uncompleted transaction aborted?"), NULL, 33);
483
+ #else
484
+ int ret = 2;
485
+ #endif
486
+ #else
487
+ int ret = 2;
488
+ #endif
489
+
490
+ m_nsimpl->tranCount = 1;
491
+ if (ret == 1)
492
+ abortTrn();
493
+ else
494
+ endTrn();
495
+ }
496
+
497
+ for (i = 0; i < maxtables; i++)
498
+ {
499
+ if (m_nsimpl->tables[i] != NULL)
500
+ {
501
+ m_nsimpl->tables[i]->destroy();
502
+ m_nsimpl->tables[i] = NULL;
503
+ }
504
+ }
505
+ m_nsimpl->lockWaitCount = 10;
506
+ m_nsimpl->lockWaitTime = 200;
507
+ m_nsimpl->tableCount = 0;
508
+ m_nsimpl->bdfPath[0] = 0x00;
509
+ if (m_btrcallid)
510
+ {
511
+ m_stat = m_btrcallid(TD_RESET_CLIENT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
512
+ m_stat = m_btrcallid(TD_STOP_ENGINE, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
513
+ if (m_stat == ERROR_TD_NOT_CONNECTED)
514
+ m_stat = STATUS_SUCCESS;
515
+ }
516
+ if (getBtrvEntryPoint())
517
+ m_btrcallid = getBtrvEntryPoint();
518
+
519
+ }
520
+
521
+ void nsdatabase::beginSnapshot()
522
+ {
523
+ if (m_nsimpl->snapShotCount == 0)
524
+ m_stat = m_btrcallid(TD_BEGIN_SHAPSHOT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
525
+ m_nsimpl->snapShotCount++;
526
+ }
527
+
528
+ void nsdatabase::endSnapshot()
529
+ {
530
+ m_nsimpl->snapShotCount--;
531
+ if (m_nsimpl->snapShotCount == 0)
532
+ m_stat = m_btrcallid(TD_END_SNAPSHOT, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
533
+
534
+ }
535
+
536
+ void nsdatabase::beginTrn(short BIAS)
537
+ {
538
+ if (m_nsimpl->tranCount == 0)
539
+ {
540
+ m_stat = m_btrcallid((ushort_td)(BIAS + TD_BEGIN_TRANSACTION), NULL, NULL, NULL, NULL, 0, 0,
541
+ m_nsimpl->clientID);
542
+ if (m_stat == 0)
543
+ m_nsimpl->tranCount++;
544
+ }else
545
+ m_nsimpl->tranCount++;
546
+ }
547
+
548
+ void nsdatabase::endTrn()
549
+ {
550
+
551
+ m_nsimpl->tranCount--;
552
+ if (m_nsimpl->tranCount == 0)
553
+ {
554
+ m_stat = m_btrcallid(TD_END_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
555
+
556
+ #ifdef _WIN32
557
+ g_lastTrnTime = GetTickCount();
558
+ #endif
559
+ }
560
+ if (m_nsimpl->tranCount < 0)
561
+ m_nsimpl->tranCount = 0;
562
+ }
563
+
564
+ void nsdatabase::abortTrn()
565
+ {
566
+ m_stat = m_btrcallid(TD_ABORT_TRANSACTION, NULL, NULL, NULL, NULL, 0, 0, m_nsimpl->clientID);
567
+
568
+ m_nsimpl->tranCount = 0;
569
+ #ifdef _WIN32
570
+ g_lastTrnTime = GetTickCount();
571
+ #endif
572
+ }
573
+
574
+ short_td nsdatabase::tdapErr(HWND hWnd, _TCHAR* retbuf) {
575
+ return nstable::tdapErr(hWnd, m_stat, _T("Engin"), retbuf);}
576
+
577
+ void nsdatabase::getBtrVersion(btrVersions* Vers, uchar_td* posblk)
578
+ {
579
+
580
+ uchar_td posblkTmp[128] = {0x00};
581
+ if (posblk == NULL)
582
+ posblk = posblkTmp;
583
+
584
+ uint_td datalen = sizeof(btrVersions);
585
+
586
+ m_stat = m_btrcallid(TD_VERSION, posblk, Vers, &datalen, NULL, 0, 0, m_nsimpl->clientID);
587
+ {
588
+ bool remote = false;
589
+ if (uriMode())
590
+ remote = true;
591
+ #ifdef _WIN32
592
+ else if (_tcsstr(m_nsimpl->bdfPath, PSEPARATOR PSEPARATOR) == m_nsimpl->bdfPath)
593
+ remote = true;
594
+ else
595
+ {
596
+ _TCHAR drive[3] = {0x00};
597
+ _tcsncpy(drive, m_nsimpl->bdfPath, 2);
598
+ if (DRIVE_REMOTE == GetDriveType(drive))
599
+ remote = true;
600
+ }
601
+ #endif
602
+ if (remote)
603
+ {
604
+ //faile shareing
605
+ if (datalen / 5 == 2)
606
+ {
607
+ Vers->versions[2] = Vers->versions[1];
608
+ Vers->versions[2].type = 'F';
609
+ }
610
+ }
611
+ else
612
+ memset(&Vers->versions[2], 0, sizeof(btrVersion));
613
+ }
614
+
615
+ }
616
+
617
+ bool nsdatabase::useLongFilename() {return m_nsimpl->uselongFilename;}
618
+
619
+ void nsdatabase::setUseLongFilename(bool value) {m_nsimpl->uselongFilename = value;}
620
+
621
+ bool nsdatabase::setUseTransactd()
622
+ {
623
+ m_btrcallid = getTrnsctdEntryPoint();
624
+ if (m_btrcallid == NULL)
625
+ m_stat = STATUS_REQUESTER_DEACTIVE; // can not load db engin;
626
+ else
627
+ {
628
+ m_nsimpl->uriMode = true;
629
+ setLockWaitCount(0);
630
+ setLockWaitTime(0);
631
+
632
+ }
633
+ return (m_btrcallid != NULL);
634
+ }
635
+
636
+ bool nsdatabase::isTransactdUri(const _TCHAR* uri) {return (_tcsstr(uri, _T("tdap://")) != NULL);
637
+
638
+ }
639
+
640
+ bool nsdatabase::isUseTransactd() {return (m_btrcallid == getTrnsctdEntryPoint());}
641
+
642
+ void nsdatabase::readDatabaseDirectory(_TCHAR* retBuf, uchar_td buflen)
643
+ {
644
+ // keynum is drive name A=1 B=2 C=3 0=default
645
+ char tmp[128];
646
+ m_stat = m_btrcallid(TD_GETDIRECTORY, NULL, NULL, NULL, tmp, 128, 0, m_nsimpl->clientID);
647
+ toTChar(retBuf, tmp, buflen);
648
+ }
649
+
650
+ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
651
+ {
652
+ if (isTransactdUri(URI))
653
+ if (!setUseTransactd())
654
+ return false;
655
+
656
+ uint_td datalen = 0;
657
+
658
+ char uri_a[MAX_PATH]={0x00};
659
+ const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
660
+ char_td keyNum = newConnection ? 3 : 0;
661
+ m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p, (keylen_td)(strlen(p) + 1),
662
+ keyNum, clientID());
663
+ if (m_stat)
664
+ return false;
665
+ return true;
666
+ }
667
+
668
+ bool nsdatabase::disconnect(const _TCHAR* URI)
669
+ {
670
+ if (isTransactdUri(URI))
671
+ if (!setUseTransactd())
672
+ return false;
673
+ uint_td datalen = 0;
674
+ char uri_a[MAX_PATH];
675
+ const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
676
+ m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p, (keylen_td)(strlen(p) + 1), 1,
677
+ clientID());
678
+ if (m_stat)
679
+ return false;
680
+ return true;
681
+
682
+ }
683
+
684
+ bool nsdatabase::trnsactionFlushWaitStatus()
685
+ {
686
+ bool ret = false;
687
+ #ifdef _WIN32
688
+ if (g_lastTrnTime)
689
+ ret = ((GetTickCount() - g_lastTrnTime) < 8000);
690
+ else
691
+ #endif
692
+ g_lastTrnTime = 0;
693
+ return ret;
694
+ }
695
+
696
+ void nsdatabase::setExecCodePage(unsigned int codepage)
697
+ {
698
+ m_execCodepage = codepage;
699
+ }
700
+
701
+ unsigned int nsdatabase::execCodePage()
702
+ {
703
+ return m_execCodepage;
704
+ }
705
+
706
+ const char* nsdatabase::toServerUri(char* buf, int buflen, const _TCHAR* src, bool trd)
707
+ {
708
+ #ifdef _UNICODE
709
+ if (trd)
710
+ {
711
+ stringConverter cv(CP_UTF8, GetACP());
712
+ cv.convert(buf, buflen, src, strlen_t(src));
713
+ return buf;
714
+ }
715
+ #endif
716
+ return toChar(buf, src, buflen);
717
+
718
+ }
719
+
720
+ }// namespace client
721
+ }// namespace tdap
722
+ }// namespace protocol
723
+ }// namespace db
724
+ }// namespace bzs