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,899 @@
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
+
23
+ #include "nsTable.h"
24
+ #include "nsDatabase.h"
25
+ #include "bulkInsert.h"
26
+
27
+ #include <limits.h>
28
+ #include <string.h> // Required for _fstrstr()
29
+ #include <stdio.h>
30
+ #include <stdlib.h>
31
+ #include <time.h>
32
+ #include <boost/filesystem.hpp>
33
+
34
+
35
+
36
+
37
+
38
+ #pragma package(smart_init)
39
+
40
+ /* TODO: To be support internal started transction with original flag.*/
41
+ #ifdef __x86_64__
42
+ #define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEEFEEEFEEE
43
+ #else
44
+ #define MEM_FREED_MAGIC_NUMBER (nstimpl*)0x0FEEEFEEE
45
+ #endif
46
+ namespace bzs
47
+ {
48
+ namespace db
49
+ {
50
+ namespace protocol
51
+ {
52
+ namespace tdap
53
+ {
54
+ namespace client
55
+ {
56
+
57
+ struct nstimpl
58
+ {
59
+ nstimpl():refCount(1), bulkIns(NULL), shared(false), isOpen(false)
60
+ {
61
+ posblk[0] = 0x00;
62
+ }
63
+ int refCount;
64
+ bulkInsert* bulkIns;
65
+ nsdatabase* nsdb;
66
+ percentage_td percentage;
67
+ bookmark_td bookmark;
68
+ _TCHAR uri[MAX_PATH];
69
+ uchar_td posblk[POS_BLOCK_SIZE];
70
+ short tableid;
71
+ bool shared;
72
+ bool isOpen;
73
+ };
74
+
75
+ // -----------------------------------------------------------------
76
+ // class nstable
77
+ // -----------------------------------------------------------------
78
+ extern TCHAR* getErrorMessageLocale(int errorCode, _TCHAR* buf, size_t size);
79
+
80
+ nstable::nstable(nsdatabase *pbe)
81
+ {
82
+ m_impl = new nstimpl();
83
+ m_impl->nsdb = pbe;
84
+
85
+ //addref to nsdatabase
86
+ pbe->addref();
87
+ if (pbe->openTableCount() == nsdatabase::maxtables)
88
+ {
89
+ m_stat = STATUS_LMITS_MAX_TABLES;
90
+ m_impl->nsdb = NULL;
91
+ return;
92
+ }
93
+ pbe->registerTable(this);
94
+ m_keylen = 0;
95
+ m_keynum = 0;
96
+ m_pdata = NULL;
97
+ m_keybuf = NULL;
98
+ m_stat = STATUS_SUCCESS;
99
+ m_read = true;
100
+ m_write = true;
101
+ m_insart = true;
102
+ m_delete = true;
103
+
104
+ }
105
+
106
+ nstable::~nstable()
107
+ {
108
+ if (m_impl->bulkIns)
109
+ delete m_impl->bulkIns;
110
+ close();
111
+
112
+ if (!m_impl->shared)
113
+ m_impl->nsdb->unregisterTable(this);
114
+ m_impl->nsdb->internalRelease();
115
+ delete m_impl;
116
+ m_impl = MEM_FREED_MAGIC_NUMBER;
117
+ }
118
+
119
+ TCHAR* nstable::getErrorMessage(int errorCode, _TCHAR* buf, size_t size)
120
+ {
121
+ return getErrorMessageLocale(errorCode, buf, size);
122
+
123
+ }
124
+
125
+ /* Key number is set by user.
126
+ KyeNum
127
+ - -1 = Unlock the record that specified by bm in multi records.
128
+ - -2 = Unlock all records
129
+ - �{ = Unlock single record.
130
+ */
131
+ void nstable::unlock(bookmark_td bm)
132
+ {
133
+ void* db = m_pdata;
134
+ if (m_keynum == -1)
135
+ m_pdata = &bm;
136
+ m_datalen = 4;
137
+ tdap(TD_UNLOCK);
138
+ m_pdata = db;
139
+ }
140
+
141
+ void nstable::seekByBookmark() {seekByBookmark(m_impl->bookmark);}
142
+
143
+ const _TCHAR* nstable::uri() const {return m_impl->uri;}
144
+
145
+ const uchar_td* nstable::posblk() const {return m_impl->posblk;}
146
+
147
+ nsdatabase* nstable::nsdb() const {return m_impl->nsdb;}
148
+
149
+ bulkInsert* nstable::bulkIns() const {return m_impl->bulkIns;}
150
+
151
+ void nstable::setIsOpen(bool v) {m_impl->isOpen = v;}
152
+
153
+ bool nstable::isOpen() const {return m_impl->isOpen;}
154
+
155
+ short nstable::tableid() const {return m_impl->tableid;}
156
+
157
+ void nstable::setTableid(short v) {m_impl->tableid = v;}
158
+
159
+ void nstable::setShared()
160
+ {
161
+ m_impl->shared = true;
162
+ m_impl->nsdb->unregisterTable(this);
163
+ }
164
+
165
+ int nstable::refCount() const
166
+ {
167
+ return m_impl->refCount;
168
+ }
169
+
170
+ void nstable::addref(void)
171
+ {
172
+ ++m_impl->refCount;
173
+ }
174
+
175
+ void nstable::release()
176
+ {
177
+
178
+ /* If before called database::drop() database::close() etc then nstable::destory called.
179
+ Client cache nstable pointer that is invalid.
180
+ It test by test method.
181
+ */
182
+ try
183
+ {
184
+ if (test(this))
185
+ {
186
+ if (--m_impl->refCount == 0)
187
+ delete this;
188
+ }
189
+ }catch(...){}
190
+ }
191
+
192
+ void nstable::destroy()
193
+ {
194
+ if (!m_impl->shared)
195
+ delete this;
196
+ }
197
+
198
+ void nstable::doClose()
199
+ {
200
+ if (test(this) && m_impl && (m_impl->isOpen))
201
+ {
202
+ tdap(TD_CLOSETABLE);
203
+ if (m_stat == STATUS_SUCCESS)
204
+ m_impl->isOpen = false;
205
+ }
206
+ }
207
+
208
+ void nstable::stepFirst(ushort_td LockBias)
209
+ {
210
+ m_datalen = m_buflen;
211
+ tdap((ushort_td)(TD_POS_FIRST + LockBias));
212
+ if (m_stat == STATUS_SUCCESS)
213
+ onReadAfter();
214
+ }
215
+
216
+ void nstable::stepLast(ushort_td LockBias)
217
+ {
218
+ m_datalen = m_buflen;
219
+ tdap((ushort_td)(TD_POS_LAST + LockBias));
220
+ if (m_stat == STATUS_SUCCESS)
221
+ onReadAfter();
222
+ }
223
+
224
+ void nstable::stepPrev(ushort_td LockBias)
225
+ {
226
+ m_datalen = m_buflen;
227
+ tdap((ushort_td)(TD_POS_PREV + LockBias));
228
+ if (m_stat == STATUS_SUCCESS)
229
+ onReadAfter();
230
+ }
231
+
232
+ void nstable::stepNext(ushort_td LockBias)
233
+ {
234
+ m_datalen = m_buflen;
235
+ tdap((ushort_td)(TD_POS_NEXT + LockBias));
236
+ if (m_stat == STATUS_SUCCESS)
237
+ onReadAfter();
238
+ }
239
+
240
+ void nstable::seekFirst(ushort_td LockBias)
241
+ {
242
+ m_datalen = m_buflen;
243
+ m_keylen = m_keybuflen;
244
+ tdap((ushort_td)(TD_KEY_FIRST + LockBias));
245
+ if (m_stat == STATUS_SUCCESS)
246
+ onReadAfter();
247
+ }
248
+
249
+ void nstable::seekLast(ushort_td LockBias)
250
+ {
251
+ m_datalen = m_buflen;
252
+ m_keylen = m_keybuflen;
253
+ tdap((ushort_td)(TD_KEY_LAST + LockBias));
254
+ if (m_stat == STATUS_SUCCESS)
255
+ onReadAfter();
256
+ }
257
+
258
+ void nstable::seekPrev(ushort_td LockBias)
259
+ {
260
+ m_datalen = m_buflen;
261
+ m_keylen = m_keybuflen;
262
+ tdap((ushort_td)(TD_KEY_PREV + LockBias));
263
+ if (m_stat == STATUS_SUCCESS)
264
+ onReadAfter();
265
+ }
266
+
267
+ void nstable::seekNext(ushort_td LockBias)
268
+ {
269
+ m_datalen = m_buflen;
270
+ m_keylen = m_keybuflen;
271
+ tdap((ushort_td)(TD_KEY_NEXT + LockBias));
272
+ if (m_stat == STATUS_SUCCESS)
273
+ onReadAfter();
274
+ }
275
+
276
+ void nstable::seek(ushort_td LockBias)
277
+ {
278
+ m_keylen = writeKeyData();
279
+ m_datalen = m_buflen;
280
+ tdap((ushort_td)(TD_KEY_SEEK + LockBias));
281
+ if (m_stat == STATUS_SUCCESS)
282
+ onReadAfter();
283
+ }
284
+
285
+ void nstable::seekGreater(bool orEqual, ushort_td LockBias)
286
+ {
287
+ m_keylen = writeKeyData();
288
+ m_datalen = m_buflen;
289
+ if (orEqual)
290
+ tdap((ushort_td)(TD_KEY_OR_AFTER + LockBias));
291
+ else
292
+ tdap((ushort_td)(TD_KEY_AFTER + LockBias));
293
+ if (m_stat == STATUS_SUCCESS)
294
+ onReadAfter();
295
+ }
296
+
297
+ void nstable::seekLessThan(bool orEqual, ushort_td LockBias)
298
+ {
299
+ m_keylen = writeKeyData();
300
+ m_datalen = m_buflen;
301
+ if (orEqual)
302
+ tdap((ushort_td)(TD_KEY_OR_BEFORE + LockBias));
303
+ else
304
+ tdap((ushort_td)(TD_KEY_BEFORE + LockBias));
305
+ if (m_stat == STATUS_SUCCESS)
306
+ onReadAfter();
307
+ }
308
+
309
+ void nstable::doOpen(const _TCHAR* name, char_td mode, const _TCHAR* ownerName)
310
+ {
311
+ void* svm_keybuf = m_keybuf;
312
+ char_td svm_keynum = m_keynum;
313
+ keylen_td svm_keybuflen = m_keylen;
314
+
315
+ if (m_impl->nsdb == NULL)
316
+ {
317
+ m_stat = STATUS_LMITS_MAX_TABLES;
318
+ return;
319
+ }
320
+ #ifdef _WIN32
321
+ // if name has space then covert to short path name.
322
+ if ((m_impl->nsdb->useLongFilename() == false) && _tcsstr(name, _T(" ")))
323
+ GetShortPathName(name, m_impl->uri, MAX_PATH);
324
+ else
325
+ #endif
326
+ if (m_impl->uri != name)
327
+ _tcscpy_s(m_impl->uri, MAX_PATH, name);
328
+
329
+ // for trnasctd
330
+ if (m_impl->nsdb->isTransactdUri(m_impl->uri))
331
+ {
332
+ if (m_impl->nsdb->setUseTransactd() == false)
333
+ {
334
+ m_stat = STATUS_REQUESTER_DEACTIVE;
335
+ return;
336
+ }
337
+ }
338
+
339
+ char tmpName[MAX_PATH]={0x00};
340
+ const char* p = nsdatabase::toServerUri(tmpName, MAX_PATH, m_impl->uri, m_impl->nsdb->isUseTransactd());
341
+ m_keybuf = (void*)p;
342
+ m_keylen = (keylen_td)strlen(p) + 1;
343
+
344
+ if (m_impl->nsdb->localSharing())
345
+ m_keynum = (char_td)(mode - 64);
346
+ else
347
+ m_keynum = mode;
348
+
349
+ char ownerNameBuf[OWNERNAME_SIZE+1] = {0x00};
350
+ if (NULL != ownerName && 0x00 != ownerName[0])
351
+ {
352
+ const char* p = toChar(ownerNameBuf, ownerName, 22);
353
+ m_pdata = (void*)p;
354
+ m_datalen = (uint_td)strlen(p) + 1;
355
+ if (m_datalen > 11)
356
+ {
357
+ m_stat = STATUS_TOO_LONG_OWNERNAME;
358
+ return;
359
+ }
360
+
361
+ }
362
+ else
363
+ m_datalen = 0;
364
+
365
+ tdap(TD_OPENTABLE);
366
+ if (m_stat == STATUS_SUCCESS)
367
+ m_impl->isOpen = true;
368
+ m_keybuf = svm_keybuf;
369
+ m_keynum = svm_keynum;
370
+ m_keylen = svm_keybuflen;
371
+ }
372
+
373
+ void nstable::doUpdate(eUpdateType type)
374
+ {
375
+ int trnCount = nsdb()->enableTrn();
376
+ if (m_write == false)
377
+ {
378
+ m_stat = STATUS_NO_ACR_UPDATE_DELETE;
379
+ return;
380
+ }
381
+
382
+
383
+
384
+ if (onUpdateCheck(type) == false)
385
+ return;
386
+
387
+ m_stat = STATUS_SUCCESS;
388
+ int option = onUpdateBefore();
389
+ if (m_stat)
390
+ {
391
+ if (trnCount < nsdb()->enableTrn())
392
+ nsdb()->abortTrn();
393
+ return ;
394
+ }
395
+ char_td keynum = m_keynum;
396
+ m_keylen = m_keybuflen;
397
+
398
+ if (type == changeCurrentNcc)
399
+ m_keynum = -1;
400
+ else
401
+ m_keylen = writeKeyData();
402
+ m_datalen = getWriteImageLen();
403
+
404
+ if (m_impl->nsdb->isUseTransactd() && (type == changeInKey))
405
+ tdap(TD_REC_UPDATEATKEY);
406
+ else
407
+ tdap(TD_REC_UPDATE);
408
+ m_keynum = keynum;
409
+ onUpdateAfter(option);
410
+ }
411
+
412
+ void nstable::doDel(bool inkey)
413
+ {
414
+ if (m_delete == false)
415
+ {
416
+ m_stat = STATUS_NO_ACR_UPDATE_DELETE;
417
+ return;
418
+ }
419
+ if (onDeleteCheck(inkey)==false)
420
+ return;
421
+
422
+ m_datalen = m_buflen;
423
+ if (m_impl->nsdb->isUseTransactd() && inkey)
424
+ {
425
+ if (!isUniqeKey(m_keynum))
426
+ {
427
+ m_stat = STATUS_INVALID_KEYNUM;
428
+ return;
429
+ }
430
+ m_keylen = writeKeyData();
431
+ tdap(TD_REC_DELLETEATKEY);
432
+ }
433
+ else
434
+ {
435
+ if (inkey)
436
+ {
437
+ m_keylen = writeKeyData();
438
+ seek();
439
+ if (m_stat)
440
+ return;
441
+ }
442
+ tdap(TD_REC_DELETE);
443
+ }
444
+
445
+ }
446
+
447
+ void nstable::onInsertAfter(int beforeResult)
448
+ {
449
+ if (m_stat == STATUS_SUCCESS)
450
+ onReadAfter();
451
+ }
452
+
453
+ ushort_td nstable::doInsert(bool ncc)
454
+ {
455
+ int trnCount = nsdb()->enableTrn();
456
+ if (m_insart == false)
457
+ {
458
+ m_stat = STATUS_NO_ACR_INSERT;
459
+ return 0;
460
+ }
461
+ m_stat = STATUS_SUCCESS;
462
+ int option = onInsertBefore();
463
+ if (m_stat)
464
+ {
465
+ if (trnCount < nsdb()->enableTrn())
466
+ nsdb()->abortTrn();
467
+ return 0;
468
+ }
469
+ ushort_td ins_rows = 0;
470
+ char_td keynum = m_keynum;
471
+ m_keylen = m_keybuflen;
472
+ if (m_datalen > m_buflen)
473
+ m_stat = STATUS_INVALID_VALLEN;
474
+ m_datalen = getWriteImageLen();
475
+ if (m_impl->bulkIns)
476
+ ins_rows = m_impl->bulkIns->insert((const char*)data(), m_datalen, this);
477
+ else
478
+ {
479
+ tdap(TD_REC_INSERT);
480
+ if (ncc)
481
+ m_keynum = -1;
482
+ if (m_stat == STATUS_SUCCESS)
483
+ ins_rows = 1;
484
+ }
485
+ m_keynum = keynum;
486
+ onInsertAfter(option);
487
+
488
+ return ins_rows;
489
+ }
490
+
491
+ void nstable::beginBulkInsert(int maxBuflen)
492
+ {
493
+ if (m_impl->bulkIns)
494
+ delete m_impl->bulkIns;
495
+ m_impl->bulkIns = new bulkInsert(maxBuflen);
496
+ m_stat = STATUS_SUCCESS;
497
+ }
498
+
499
+ ushort_td nstable::doCommitBulkInsert(bool autoCommit)
500
+ {
501
+ ushort_td count = 0;
502
+ if (m_impl->bulkIns && m_impl->bulkIns->count())
503
+ {
504
+ void* p = m_pdata;
505
+ uint_td len = m_datalen;
506
+ m_pdata = m_impl->bulkIns->data();
507
+ m_datalen = m_impl->bulkIns->dataLen();
508
+ m_keylen = m_keybuflen;
509
+ tdap(TD_INSERT_BULK);
510
+
511
+ if (m_stat == STATUS_SUCCESS)
512
+ count = (*(ushort_td*)m_pdata);
513
+ m_pdata = p;
514
+ m_datalen = len;
515
+ if (!autoCommit)
516
+ {
517
+ delete m_impl->bulkIns;
518
+ m_impl->bulkIns = NULL;
519
+ }
520
+ }
521
+ return count;
522
+ }
523
+
524
+ void nstable::abortBulkInsert()
525
+ {
526
+ delete m_impl->bulkIns;
527
+ m_impl->bulkIns = NULL;
528
+ m_stat = STATUS_SUCCESS;
529
+ }
530
+
531
+ bookmark_td nstable::bookmark()
532
+ {
533
+ void* db = m_pdata;
534
+
535
+ m_pdata = &m_impl->bookmark;
536
+ m_datalen = sizeof(bookmark_td);
537
+ tdap(TD_BOOKMARK);
538
+ m_pdata = db;
539
+
540
+ return m_impl->bookmark;
541
+ }
542
+
543
+ void nstable::seekByBookmark(bookmark_td bm, ushort_td LockBias)
544
+ {
545
+ int count = 0;
546
+ memcpy(m_pdata, &bm, sizeof(bookmark_td));
547
+ m_datalen = m_buflen;
548
+ m_keylen = m_keybuflen;
549
+ tdap((ushort_td)(TD_MOVE_BOOKMARK + LockBias));
550
+ if (m_stat == STATUS_SUCCESS)
551
+ onReadAfter();
552
+ // TODO: This code has some problem.
553
+ while (m_stat == STATUS_BUFFERTOOSMALL)
554
+ {
555
+ count++;
556
+ m_buflen = m_buflen * 2;
557
+ m_datalen = m_buflen;
558
+ m_pdata = realloc(m_pdata, m_buflen);
559
+ memcpy(m_pdata, &bm, sizeof(bookmark_td));
560
+ tdap(TD_MOVE_BOOKMARK);
561
+ if (m_stat == STATUS_SUCCESS)
562
+ {
563
+ onReadAfter();
564
+ break;
565
+ }
566
+ if (count > 10)
567
+ break;
568
+ }
569
+ }
570
+
571
+ percentage_td nstable::getPercentage()
572
+ {
573
+ void* db = m_pdata;
574
+ m_pdata = &m_impl->percentage;
575
+ m_datalen = sizeof(percentage_td);
576
+ m_keylen = m_keybuflen;
577
+ tdap(TD_GET_PER);
578
+ m_impl->percentage &= 0xffff;
579
+ m_pdata = db;
580
+ return m_impl->percentage;
581
+ }
582
+
583
+ percentage_td nstable::getPercentage(bookmark_td bm)
584
+ {
585
+ void* db = m_pdata;
586
+ char_td ky = m_keynum;
587
+
588
+ m_pdata = &m_impl->percentage;
589
+ m_datalen = sizeof(percentage_td);
590
+ m_keynum = -1;
591
+
592
+ m_impl->percentage = bm;
593
+ m_keylen = m_keybuflen;
594
+ tdap(TD_GET_PER);
595
+ m_impl->percentage &= 0xffff;
596
+
597
+ m_pdata = db;
598
+ m_keynum = ky;
599
+
600
+ return m_impl->percentage;
601
+ }
602
+
603
+ void nstable::seekByPercentage()
604
+ {
605
+ if (m_impl->percentage < 0)
606
+ m_impl->percentage = 0;
607
+ else if (m_impl->percentage > 10000)
608
+ m_impl->percentage = 10000;
609
+ memcpy(m_pdata, &m_impl->percentage, sizeof(TD_GET_PER));
610
+ m_datalen = m_buflen;
611
+ m_keylen = m_keybuflen;
612
+ tdap(TD_MOVE_PER);
613
+ if (m_stat == STATUS_SUCCESS)
614
+ onReadAfter();
615
+
616
+ }
617
+
618
+ void nstable::seekByPercentage(percentage_td pc)
619
+ {
620
+ if (pc < 0)
621
+ pc = 0;
622
+ else if (pc > 10000)
623
+ pc = 10000;
624
+ memcpy(m_pdata, &pc, sizeof(percentage_td));
625
+ m_datalen = m_buflen;
626
+ m_keylen = m_keybuflen;
627
+ tdap(TD_MOVE_PER);
628
+ if (m_stat == STATUS_SUCCESS)
629
+ onReadAfter();
630
+
631
+ }
632
+
633
+ void nstable::setOwnerName(const _TCHAR* Owner_p, char_td mode)
634
+ {
635
+
636
+ void* svm_pdata = m_pdata;
637
+ void* svm_keybuf = m_keybuf;
638
+ keylen_td svm_keybuflen = m_keylen;
639
+ char_td svm_keynum = m_keynum;
640
+
641
+ char buf[21];
642
+ const char* Owner = toChar(buf, Owner_p, 20);
643
+
644
+ char dataBuf[9];
645
+ char keyBuf[9];
646
+
647
+ m_datalen = (uint_td)strlen(Owner) + 1;
648
+ m_keylen = (keylen_td)(strlen(Owner) + 1);
649
+ m_keynum = mode;
650
+ strcpy(dataBuf, Owner);
651
+ strcpy(keyBuf, Owner);
652
+ m_pdata = dataBuf;
653
+ m_keybuf = keyBuf;
654
+
655
+ tdap(TD_SET_OWNERNAME);
656
+
657
+ m_pdata = svm_pdata;
658
+ m_keybuf = svm_keybuf;
659
+ m_keylen = svm_keybuflen;
660
+ m_keynum = svm_keynum;
661
+ }
662
+
663
+ void nstable::clearOwnerName() {tdap(TD_CLEAR_OWNERNAME);}
664
+
665
+ void nstable::stats(void* dataBuf, uint_td len, bool estimate)
666
+ {
667
+ void* svm_pdata = m_pdata;
668
+ void* svm_keybuf = m_keybuf;
669
+ keylen_td svm_keybuflen = m_keylen;
670
+ char_td svm_keynum = m_keynum;
671
+ uchar_td keyBuf[255];
672
+
673
+ m_pdata = dataBuf;
674
+ m_datalen = len;
675
+ m_keybuf = keyBuf;
676
+ m_keylen = 255;
677
+ m_keynum = estimate;
678
+
679
+ tdap(TD_TABLE_INFO);
680
+
681
+ m_pdata = svm_pdata;
682
+ m_keybuf = svm_keybuf;
683
+ m_keylen = svm_keybuflen;
684
+ m_keynum = svm_keynum;
685
+ }
686
+
687
+ uint_td nstable::doRecordCount(bool estimate, bool fromCurrent)
688
+ {
689
+ fileSpec *fs;
690
+ uint_td Count;
691
+
692
+ fs = (fileSpec*)malloc(1920);
693
+ stats(fs, 1920, estimate);
694
+ Count = fs->recCount;
695
+ free(fs);
696
+ return Count;
697
+ }
698
+
699
+ ushort_td nstable::recordLength()
700
+ {
701
+ fileSpec *fs;
702
+ ushort_td len = 0;
703
+
704
+ fs = (fileSpec*)malloc(1920);
705
+ stats(fs, 1920, true);
706
+ if (m_stat == STATUS_SUCCESS)
707
+ len = fs->recLen;
708
+ free(fs);
709
+ return len;
710
+ }
711
+
712
+ void nstable::doCreateIndex(bool specifyKeyNum)
713
+ {
714
+ if (specifyKeyNum)
715
+ m_keynum += ((uchar_td)0x80);
716
+ tdap(TD_BUILD_INDEX);
717
+ if (specifyKeyNum)
718
+ m_keynum -= ((uchar_td)0x80);
719
+
720
+ }
721
+
722
+ void nstable::dropIndex(bool NoRenumber)
723
+ {
724
+ if (NoRenumber)
725
+ m_keynum += ((uchar_td)0x80);
726
+ tdap(TD_DROP_INDEX);
727
+ if (NoRenumber)
728
+ m_keynum -= ((uchar_td)0x80);
729
+
730
+ }
731
+
732
+ short_td nstable::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
733
+ {
734
+ return tdapErr(hWnd, m_stat, m_impl->uri, retbuf);
735
+ }
736
+
737
+ void nstable::tdap(ushort_td op)
738
+ {
739
+ short LoopCount = 0;
740
+ m_op = op;
741
+ if ((op > 4) && (!m_read))
742
+ {
743
+ m_stat = STATUS_NO_ACR_READ;
744
+ return;
745
+ }
746
+
747
+ do
748
+ {
749
+ if (m_op != TD_OPENTABLE && m_impl->isOpen == false)
750
+ {
751
+ m_stat = STATUS_TABLE_YET_OPEN;
752
+ return;
753
+ }
754
+ else if (m_op == TD_CLOSETABLE && m_impl->nsdb->enableTrn() > 0)
755
+ {
756
+ m_stat = STATUS_DURING_TRANSACTION;
757
+ return;
758
+ }
759
+ BTRCALLID_PTR func = m_impl->nsdb->btrvFunc();
760
+ m_stat = func(m_op, m_impl->posblk, m_pdata, &m_datalen, m_keybuf, m_keylen, m_keynum,
761
+ m_impl->nsdb->clientID());
762
+
763
+ // Wait for record lock or file lock.
764
+ //LoopCount++;
765
+ switch (m_stat)
766
+ {
767
+ case STATUS_LOCK_ERROR: Sleep(m_impl->nsdb->lockWaitTime());
768
+ break;
769
+ case STATUS_FILE_LOCKED: Sleep(m_impl->nsdb->lockWaitTime());
770
+ break;
771
+
772
+ default: return;
773
+ }
774
+ }
775
+ while ((m_stat != STATUS_SUCCESS)
776
+ && (m_impl->nsdb->lockWaitCount() != LoopCount++));
777
+
778
+ }
779
+
780
+ /* tdap error handling
781
+ */
782
+ short_td nstable::tdapErr(HWND hWnd, short_td status, const _TCHAR* TableName, _TCHAR* retbuf)
783
+ {
784
+ if (status == STATUS_SUCCESS) return 0;
785
+ else if (status == STATUS_EOF) return 0;
786
+ else if (status == STATUS_NOT_FOUND_TI) return 0;
787
+
788
+ _TCHAR buf[512];
789
+ short_td errorCode = status;
790
+ getErrorMessage(errorCode, buf, 512);
791
+
792
+ #pragma warning(disable:4996)
793
+ if (retbuf)
794
+ _stprintf(retbuf, _T("table_name:%s %s"), TableName, buf);
795
+ #pragma warning(default:4996)
796
+
797
+ if ((int)hWnd <= 0) return errorCode;
798
+
799
+ #ifdef _WIN32
800
+ if (TableName)
801
+ MessageBox(hWnd, buf, TableName, MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
802
+ else
803
+ MessageBox(hWnd, buf, _T("tdapErr"), MB_OK | MB_ICONSTOP | MB_SYSTEMMODAL);
804
+ #endif
805
+ return errorCode;
806
+ }
807
+
808
+
809
+ void nstable::throwError(const _TCHAR* caption, short statusCode)
810
+ {
811
+ _TCHAR tmp[1024]={0x00};
812
+ nstable::tdapErr(0x00, statusCode, NULL, tmp);
813
+ _TCHAR tmp2[1024]={0x00};
814
+ _stprintf_s(tmp2, 1024, _T("%s\n%s\n"),caption, tmp);
815
+ THROW_BZS_ERROR_WITH_CODEMSG(statusCode, tmp2);
816
+ }
817
+
818
+ _TCHAR* nstable::getDirURI(const _TCHAR* path, _TCHAR* buf)
819
+ {
820
+ bool uri = false;
821
+ if (_tcsstr(path, _T("btrv://")) || _tcsstr(path, _T("tdap://")))
822
+ uri = true;
823
+ #ifdef _WIN32
824
+ if (uri == false)
825
+ _tfullpath(buf, path, MAX_PATH);
826
+ else
827
+ #endif
828
+ _tcscpy(buf, path);
829
+ _TUCHAR* p = _tcsmrchr((_TUCHAR*)buf, PSEPARATOR_C);
830
+ _TUCHAR* p2 = _tcsmrchr((_TUCHAR*)buf, '=');
831
+ if (p && p2)
832
+ {
833
+ if (p2 > p)
834
+ p = NULL;
835
+ else
836
+ p2 = NULL;
837
+ }
838
+ if (p)
839
+ * p = 0x00;
840
+ if (p2)
841
+ * (p2 + 1) = 0x00;
842
+ return buf;
843
+ }
844
+
845
+ /* Get file name from full path name.
846
+ *
847
+ */
848
+ _TCHAR* nstable::getFileName(const _TCHAR* path, _TCHAR* filename)
849
+ {
850
+
851
+ _TUCHAR* p = _tcsmrchr((_TUCHAR*)path, PSEPARATOR_C);
852
+ _TUCHAR* p2 = _tcsmrchr((_TUCHAR*)path, '=');
853
+ filename[0] = 0x00;
854
+ if (p2 > p)
855
+ p = p2;
856
+
857
+ if (p)
858
+ {
859
+ p++;
860
+ if (*p)
861
+ _tcscpy(filename, (_TCHAR*)p);
862
+ }
863
+ else
864
+ _tcscpy(filename, path);
865
+
866
+ return filename;
867
+ }
868
+
869
+ bool nstable::existsFile(const _TCHAR* filename)
870
+ {
871
+ return boost::filesystem::exists(filename);
872
+ }
873
+
874
+ bool nstable::test(nstable* p)
875
+ {
876
+ try
877
+ {
878
+
879
+ char* pp = (char*)(p);
880
+ #ifdef _WIN32
881
+ _TCHAR buf[256];
882
+ wsprintf(buf, _T("test(%p) = %p\n"), p, *((nstimpl**)(pp + 4)));
883
+ OutputDebugString(buf);
884
+ #endif
885
+ #ifdef __x86_64__
886
+ return (MEM_FREED_MAGIC_NUMBER != *((nstimpl**)(pp + sizeof(char*))));
887
+ #else
888
+ return (MEM_FREED_MAGIC_NUMBER != *((nstimpl**)(pp + sizeof(char*))));
889
+ #endif
890
+ }
891
+ catch(...){};
892
+ return false;
893
+ }
894
+
895
+ }// namespace client
896
+ }// namespace tdap
897
+ }// namespace protocol
898
+ }// namespace db
899
+ }// namespace bzs