transactd 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,2613 @@
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
+ #include "table.h"
23
+ #include "filter.h"
24
+ #include "database.h"
25
+ #include "bulkInsert.h"
26
+ #include "stringConverter.h"
27
+ #include <bzs/rtl/strtrim.h>
28
+ #include <bzs/rtl/stringBuffers.h>
29
+ #include <bzs/db/protocol/tdap/myDateTime.cpp>
30
+ #include <bzs/db/blobStructs.h>
31
+ #include <vector>
32
+ #include <algorithm>
33
+ #include <boost/timer.hpp>
34
+ #include <boost/shared_array.hpp>
35
+
36
+ #pragma package(smart_init)
37
+
38
+ #ifdef __BCPLUSPLUS__
39
+ #define _strupr strupr
40
+ #endif
41
+
42
+ using namespace bzs::db;
43
+ using namespace bzs::rtl;
44
+ using namespace bzs::db::protocol::tdap;
45
+
46
+ namespace bzs
47
+ {
48
+ namespace db
49
+ {
50
+ namespace protocol
51
+ {
52
+ namespace tdap
53
+ {
54
+ namespace client
55
+ {
56
+
57
+ #ifdef _WIN32
58
+ #ifdef _INICODE
59
+ #define EXEC_CODEPAGE CP_UTF16
60
+ #else
61
+ #define EXEC_CODEPAGE GetACP()
62
+ #endif
63
+ #else
64
+ #define EXEC_CODEPAGE CP_UTF8
65
+ #endif
66
+
67
+ #define BOOKMARK_ALLOC_SIZE 40960
68
+ #define BOOKMARK_SIZE 4
69
+ #define DATASIZE_BYTE 2
70
+
71
+ class CFiledNameIndex
72
+ {
73
+
74
+ public:
75
+ CFiledNameIndex(short i, std::_tstring n);
76
+ bool operator < (const CFiledNameIndex& rt) const ;
77
+
78
+ short index;
79
+
80
+ std::_tstring name;
81
+ };
82
+
83
+ class recordCache;
84
+
85
+
86
+ struct tbimpl
87
+ {
88
+ stringConverter* cv;
89
+ void* bookMarks;
90
+ filter* filterPtr;
91
+ recordCache* rc;
92
+ void* dataBak;
93
+ void* smartUpDate;
94
+ void* bfAtcPtr;
95
+ void* optionalData;
96
+ int bookMarksMemSize;
97
+ int maxBookMarkedCount;
98
+ char keybuf[MAX_KEYLEN];
99
+ char exNext;
100
+ char keyNumIndex[128];
101
+ short exSlideStat;
102
+
103
+ struct
104
+ {
105
+ unsigned char exBookMarking : 1;
106
+ unsigned char myDateTimeValueByBtrv: 1;
107
+ unsigned char trimPadChar: 1;
108
+ unsigned char usePadChar: 1;
109
+ unsigned char smartUpDateFlag: 1;
110
+ unsigned char logicalToString: 1;
111
+ unsigned char dataPacked: 1;
112
+ };
113
+
114
+ std::vector<boost::shared_array<char> >blobs;
115
+ ::bzs::rtl::stringBuffer strBufs;
116
+ std::vector<CFiledNameIndex>fields;
117
+
118
+ tbimpl() : strBufs(4096), bookMarks(NULL),bfAtcPtr(NULL), maxBookMarkedCount(0), bookMarksMemSize(0),
119
+ filterPtr(NULL), rc(NULL), dataBak(NULL), optionalData(NULL),myDateTimeValueByBtrv(true), trimPadChar(true),
120
+ usePadChar(true), smartUpDate(NULL), smartUpDateFlag(false)
121
+ , logicalToString(false),dataPacked(false)
122
+ {
123
+ memset(&keyNumIndex[0], 0, 128);
124
+
125
+ }
126
+
127
+ ~tbimpl()
128
+ {
129
+
130
+ if (dataBak)
131
+ free(dataBak);
132
+ if (smartUpDate)
133
+ free(smartUpDate);
134
+ if (bookMarks)
135
+ free(bookMarks);
136
+
137
+ delete filterPtr;
138
+ }
139
+ };
140
+
141
+ // ---------------------------------------------------------------------------
142
+ // class recordCache
143
+ // ---------------------------------------------------------------------------
144
+
145
+ unsigned int hash(const char *s, int len)
146
+ {
147
+ unsigned int h = 0;
148
+ for (int i = 0; i < len; i++)
149
+ h = h * 137 + *(s + i);
150
+ return h % 1987;
151
+ }
152
+
153
+ class recordCache
154
+ {
155
+ table* m_tb;
156
+ filter* m_pFilter;
157
+ unsigned int m_row;
158
+ unsigned int m_len;
159
+ unsigned int m_unpackLen;
160
+ unsigned int m_rowCount;
161
+ bookmark_td m_bookmark;
162
+ char* m_ptr;
163
+ char* m_tmpPtr;
164
+ blobHeader* m_hd;
165
+
166
+ public:
167
+ inline recordCache(table* tb) : m_tb(tb) {reset();}
168
+
169
+ inline void reset()
170
+ {
171
+ m_pFilter = NULL;
172
+ m_row = 0;
173
+ m_rowCount = 0;
174
+ m_ptr = NULL;
175
+ m_len = 0;
176
+ m_tmpPtr = NULL;
177
+ }
178
+
179
+ inline void reset(filter* p, char* data, unsigned int totalSize, const blobHeader* hd)
180
+ {
181
+ m_pFilter = p;
182
+ m_row = 0;
183
+ m_rowCount = *((unsigned short*)data);
184
+ m_ptr = data + DATASIZE_BYTE;
185
+ m_len = m_unpackLen = *((unsigned short*)m_ptr); // Not include bookmark and size bytes.
186
+ m_ptr += DATASIZE_BYTE;
187
+ m_bookmark = *((bookmark_td*)(m_ptr));
188
+ m_ptr += BOOKMARK_SIZE;
189
+ m_tmpPtr = data + totalSize;
190
+ m_hd = const_cast<blobHeader*>(hd);
191
+ }
192
+
193
+ inline const char* moveRow(int count)
194
+ {
195
+ for (int i = 0; i < count; i++)
196
+ {
197
+ m_ptr += m_len;
198
+ m_len = m_unpackLen = *((unsigned short*)m_ptr);
199
+ m_ptr += DATASIZE_BYTE;
200
+ m_bookmark = *((bookmark_td*)(m_ptr));
201
+ m_ptr += BOOKMARK_SIZE;
202
+
203
+ if (m_hd)
204
+ {
205
+ m_hd->nextField = (blobField*)m_hd->nextField->next();
206
+ ++m_hd->curRow;
207
+ }
208
+ }
209
+ m_tb->m_impl->strBufs.clear();
210
+ if (m_pFilter->fieldSelected())
211
+ {
212
+ int offset = 0;
213
+ memset(m_tmpPtr, 0, m_len);
214
+ for (int i = 0; i < m_pFilter->fieldCount(); i++)
215
+ {
216
+ memcpy((char*)m_tmpPtr + m_pFilter->fieldOffset(i), m_ptr + offset,
217
+ m_pFilter->fieldLen(i));
218
+ offset += m_pFilter->fieldLen(i);
219
+ }
220
+ m_tb->setBlobFieldPointer(m_tmpPtr, m_hd);
221
+ return m_tmpPtr;
222
+ }
223
+ else if (m_tb->valiableFormatType())
224
+ {
225
+ memcpy(m_tmpPtr, m_ptr, m_len);
226
+ m_unpackLen = m_tb->unPack((char*)m_tmpPtr, m_len);
227
+ m_tb->setBlobFieldPointer(m_tmpPtr, m_hd);
228
+ return m_tmpPtr;
229
+ }
230
+ else
231
+ {
232
+ m_tb->setBlobFieldPointer(m_ptr, m_hd);
233
+ return m_ptr;
234
+ }
235
+ }
236
+
237
+ inline const char* setRow(unsigned int rowNum)
238
+ {
239
+ if (rowNum < m_rowCount)
240
+ {
241
+ unsigned int moveCount = rowNum - m_row;
242
+ m_row = rowNum;
243
+ return moveRow(moveCount);
244
+ }
245
+ return NULL;
246
+ }
247
+
248
+ inline unsigned int len() const {return m_unpackLen;};
249
+ inline bookmark_td bookmarkCurRow() const {return m_bookmark;};
250
+ inline int row() const {return m_row;}
251
+
252
+ inline int rowCount() const {return m_rowCount;}
253
+ inline bool isEndOfRow(unsigned int row) const {return (m_rowCount && (row == m_rowCount));}
254
+ inline bool withinCache(unsigned int row) const {return (row < m_rowCount);}
255
+ };
256
+
257
+ // ---------------------------------------------------------------------------
258
+ // class CFiledNameIndex
259
+ // ---------------------------------------------------------------------------
260
+ CFiledNameIndex::CFiledNameIndex(short i, std::_tstring n) : index(i), name(n)
261
+ {
262
+
263
+ }
264
+
265
+ bool CFiledNameIndex:: operator < (const CFiledNameIndex& rt) const
266
+ {
267
+ return name < rt.name;
268
+ };
269
+
270
+
271
+ inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
272
+ {
273
+ __int64 ret = 0;
274
+ switch (fd.type)
275
+ {
276
+ case ft_integer:
277
+ case ft_autoinc:
278
+ switch (fd.len)
279
+ {
280
+ case 1: ret = *((char*)(ptr + fd.pos));
281
+ break;
282
+ case 2: ret = *((short*)(ptr + fd.pos));
283
+ break;
284
+ case 4: ret = *((int*)(ptr + fd.pos));
285
+ break;
286
+ case 8: ret = *((__int64*)(ptr + fd.pos));
287
+ break;
288
+ }
289
+ case ft_uinteger:
290
+ case ft_logical:
291
+ case ft_bit:
292
+ case ft_currency:
293
+ case ft_date:
294
+ case ft_time:
295
+ case ft_timestamp:
296
+ case ft_mydate:
297
+ case ft_mytime:
298
+ case ft_mydatetime:
299
+ case ft_mytimestamp:
300
+ switch (fd.len)
301
+ {
302
+ case 1: ret = *((unsigned char*)(ptr + fd.pos));
303
+ break;
304
+ case 2: ret = *((unsigned short*)(ptr + fd.pos));
305
+ break;
306
+ case 4: ret = *((unsigned int*)(ptr + fd.pos));
307
+ break;
308
+ case 3:
309
+ case 5:
310
+ case 6:
311
+ case 7: memcpy(&ret, ptr + fd.pos, fd.len);
312
+ break;
313
+ case 8: ret = *((__int64*)(ptr + fd.pos));
314
+ break;
315
+ }
316
+ }
317
+ return ret;
318
+ }
319
+
320
+ inline void setValue(const fielddef& fd, uchar_td* ptr, __int64 value)
321
+ {
322
+ switch (fd.type)
323
+ {
324
+ case ft_integer:
325
+ case ft_autoinc:
326
+ {
327
+ switch (fd.len)
328
+ {
329
+ case 1: *((char*)(ptr + fd.pos)) = (char)value;
330
+ break;
331
+ case 2: *((short*)(ptr + fd.pos)) = (short)value;
332
+ break;
333
+ case 4: *((int*)(ptr + fd.pos)) = (int)value;
334
+ break;
335
+ case 8: *((__int64*)(ptr + fd.pos)) = (int)value;
336
+ break;
337
+ }
338
+ }
339
+ case ft_uinteger:
340
+ case ft_logical:
341
+ case ft_bit:
342
+ case ft_currency:
343
+ case ft_date:
344
+ case ft_time:
345
+ case ft_timestamp:
346
+ case ft_mytime:
347
+ case ft_mydate:
348
+ case ft_mydatetime:
349
+ case ft_mytimestamp: memcpy(ptr + fd.pos, &value, fd.len);
350
+ break;
351
+ }
352
+ }
353
+
354
+
355
+
356
+
357
+
358
+ table::table(nsdatabase *pbe) : nstable(pbe)
359
+ {
360
+ m_impl = new tbimpl();
361
+
362
+ m_impl->cv = new stringConverter(nsdatabase::execCodePage(), nsdatabase::execCodePage());
363
+
364
+ m_impl->rc = new recordCache(this);
365
+
366
+ m_keybuflen = MAX_KEYLEN;
367
+ m_pdata = NULL;
368
+ m_keybuf = &m_impl->keybuf[0];
369
+ m_keynum = 0;
370
+
371
+ }
372
+
373
+ table::~table()
374
+ {
375
+ delete m_impl->rc;
376
+ delete m_impl->cv;
377
+ delete m_impl;
378
+
379
+ }
380
+
381
+ inline uchar_td table::charset() const {return m_tableDef->charsetIndex;};
382
+
383
+ bool table::trimPadChar() const {return m_impl->trimPadChar;}
384
+
385
+ void table::setTrimPadChar(bool v) {m_impl->trimPadChar = v;}
386
+
387
+ bool table::usePadChar() const {return m_impl->usePadChar;};
388
+
389
+ void table::setUsePadChar(bool v) {m_impl->usePadChar = v;};
390
+
391
+ void* table::dataBak() const {return m_impl->dataBak;};
392
+
393
+ void table::setDataBak(void* v) {m_impl->dataBak = v;};
394
+
395
+ void* table::optionalData() const {return m_impl->optionalData;}
396
+
397
+ void table::setOptionalData(void* v) {m_impl->optionalData = v;}
398
+
399
+ bool table::myDateTimeValueByBtrv() const {return m_impl->myDateTimeValueByBtrv;}
400
+
401
+ bool table::logicalToString() const {return m_impl->logicalToString;};
402
+
403
+ void table::setLogicalToString(bool v) {m_impl->logicalToString = v;}
404
+
405
+ void table::setBookMarks(int StartId, void* Data, ushort_td Count)
406
+ {
407
+ long size = (StartId + Count) * 6;
408
+ if (m_impl->bookMarksMemSize < size)
409
+ {
410
+
411
+ m_impl->bookMarks = realloc(m_impl->bookMarks, size + BOOKMARK_ALLOC_SIZE);
412
+ m_impl->bookMarksMemSize = size + BOOKMARK_ALLOC_SIZE;
413
+ }
414
+ if (m_impl->bookMarks)
415
+ {
416
+ if (StartId + Count - 1 > m_impl->maxBookMarkedCount)
417
+ m_impl->maxBookMarkedCount = StartId + Count - 1;
418
+ memcpy((void*)((char*)m_impl->bookMarks + ((StartId - 1) * 6)), Data, Count * 6);
419
+ }
420
+ else
421
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
422
+ return;
423
+
424
+ }
425
+
426
+ inline short calcNextReadRecordCount(ushort_td curCount, int eTime)
427
+ {
428
+ ushort_td ret = curCount;
429
+ if (eTime == 0)
430
+ ret = (ushort_td)(curCount * (short)2);
431
+ else
432
+ ret = (ushort_td)(curCount * ((float)100 / (float)eTime));
433
+
434
+ if (ret > 10000)
435
+ return 10000;
436
+ if (ret == 0)
437
+ return 1;
438
+ return ret;
439
+ }
440
+
441
+ uint_td table::doRecordCount(bool estimate, bool fromCurrent)
442
+ {
443
+ uint_td result = 0;
444
+
445
+ if (m_impl->filterPtr)
446
+ {
447
+ short curStat = m_stat;
448
+ m_impl->exBookMarking = true;
449
+ ushort_td recCountOnce = 50;
450
+
451
+ bookmark_td bm = bookmark();
452
+ ushort_td tmpFieldCount = m_impl->filterPtr->fieldCount();
453
+ ushort_td tmpRejectCount = m_impl->filterPtr->rejectCount();
454
+ ushort_td tmpRecCount = m_impl->filterPtr->recordCount();
455
+ _TCHAR* str = new _TCHAR[_tcslen(filterStr()) + 1];
456
+ if (str)
457
+ {
458
+ _tcscpy(str, filterStr());
459
+ m_impl->filterPtr->setFieldCount(0);
460
+ m_stat = 0;
461
+ m_impl->filterPtr->setFilter(str, tmpRejectCount, 10000);
462
+ if (m_stat != 0)
463
+ {
464
+ // restore filter string
465
+ m_impl->filterPtr->setFieldCount(tmpFieldCount);
466
+ m_impl->filterPtr->setFilter(str, tmpRejectCount, tmpRecCount);
467
+ delete[]str;
468
+ str = NULL;
469
+ }
470
+ }
471
+ else
472
+ assert(0);
473
+ m_impl->maxBookMarkedCount = 0;
474
+ if (fromCurrent)
475
+ m_stat = curStat;
476
+ else
477
+ seekFirst();
478
+
479
+ *(m_impl->filterPtr->recordCountDirect()) = recCountOnce;
480
+ if (m_stat == 0)
481
+ {
482
+ m_impl->filterPtr->setPosTypeNext(false);
483
+ boost::timer t;
484
+ btrvGetExtend(TD_KEY_NEXT_MULTI);
485
+ int eTime = (int)(t.elapsed() * 1000);
486
+ while ((m_stat == 0) || (m_stat == STATUS_LIMMIT_OF_REJECT) || (m_stat == STATUS_EOF)
487
+ || (m_stat == STATUS_REACHED_FILTER_COND))
488
+ {
489
+ bool Complete = false;
490
+ if ((m_stat == STATUS_EOF) || (m_stat == STATUS_REACHED_FILTER_COND))
491
+ {
492
+ Complete = true;
493
+ m_stat = STATUS_EOF;
494
+ }
495
+ else if (m_stat == STATUS_LIMMIT_OF_REJECT)
496
+ {
497
+ if (tmpRejectCount != 0)
498
+ {
499
+ if (tmpRejectCount == 1)
500
+ m_stat = STATUS_EOF;
501
+ Complete = true;
502
+ }
503
+ }
504
+ recCountOnce = calcNextReadRecordCount(recCountOnce, eTime);
505
+
506
+ *(m_impl->filterPtr->recordCountDirect()) = recCountOnce;
507
+ result += *((ushort_td*)m_impl->dataBak);
508
+ setBookMarks(m_impl->maxBookMarkedCount + 1, (void*)((char*)m_impl->dataBak + 2),
509
+ *((ushort_td*)m_impl->dataBak));
510
+ m_impl->maxBookMarkedCount = result;
511
+
512
+ onRecordCounting(result, Complete);
513
+ if (Complete)
514
+ break;
515
+ t.restart();
516
+ m_impl->filterPtr->setPosTypeNext(true);
517
+ btrvGetExtend(TD_KEY_NEXT_MULTI);
518
+ eTime = (int)(t.elapsed() * 1000);
519
+ }
520
+ }
521
+ short tmpStat = m_stat;
522
+ if (str)
523
+ {
524
+ setFilter(str, tmpRejectCount, tmpRecCount);
525
+ delete[]str;
526
+ }
527
+ if (bm)
528
+ seekByBookmark(bm);
529
+ m_impl->exBookMarking = false;
530
+ m_stat = tmpStat;
531
+ }
532
+ else
533
+ return nstable::doRecordCount(estimate, fromCurrent);
534
+
535
+ return result;
536
+ }
537
+
538
+ void table::btrvGetExtend(ushort_td op)
539
+ {
540
+
541
+ if (op >= TD_KEY_GE_NEXT_MULTI)
542
+ m_keylen = writeKeyData();
543
+ m_pdata = m_impl->dataBak;
544
+ m_impl->filterPtr->WriteBuffer();
545
+ m_datalen = m_impl->filterPtr->exDataBufLen();
546
+ tdap(op);
547
+ short stat = m_stat;
548
+ m_impl->rc->reset(m_impl->filterPtr, (char*)m_impl->dataBak, m_datalen, blobFieldUsed() ?
549
+ getBlobHeader() : NULL);
550
+
551
+ m_stat = stat;
552
+ m_impl->exSlideStat = m_stat;
553
+ //There is the right record.
554
+ if (m_impl->rc->rowCount() && (!m_impl->exBookMarking))
555
+ {
556
+ m_pdata = (void*)m_impl->rc->setRow(0);
557
+ m_datalen = m_impl->rc->len();
558
+
559
+ m_stat = STATUS_SUCCESS;
560
+ }else if ((m_stat == STATUS_LIMMIT_OF_REJECT) && (m_impl->filterPtr->rejectCount()>=1))
561
+ m_stat = STATUS_EOF;
562
+
563
+
564
+ }
565
+
566
+ void table::getRecords(ushort_td op)
567
+ {
568
+ do
569
+ {
570
+ btrvGetExtend(op);
571
+ m_impl->filterPtr->setPosTypeNext(true);
572
+
573
+ }while (m_stat == STATUS_LIMMIT_OF_REJECT && (m_impl->filterPtr->rejectCount()==0));
574
+ if ((m_stat == STATUS_REACHED_FILTER_COND) || (m_stat == STATUS_LIMMIT_OF_REJECT))
575
+ m_stat = STATUS_EOF;
576
+ }
577
+
578
+ bookmark_td table::bookmarkFindCurrent() const
579
+ {
580
+
581
+ if (!m_impl->rc->isEndOfRow(m_impl->rc->row()))
582
+ return m_impl->rc->bookmarkCurRow();
583
+ return 0;
584
+
585
+ }
586
+
587
+ void table::find(eFindType type)
588
+ {
589
+ if (nsdb()->isUseTransactd())
590
+ {
591
+ m_impl->rc->reset();
592
+ ushort_td op = (type == findForword) ? TD_KEY_GE_NEXT_MULTI:TD_KEY_LE_PREV_MULTI;
593
+ doFind(op, true/*notIncCurrent*/);
594
+ }
595
+ else
596
+ {
597
+ if (type == findForword)
598
+ seekGreater(true);
599
+ else
600
+ seekLessThan(true);
601
+ if (m_stat == 0)
602
+ {
603
+ if (type == findForword)
604
+ findNext(true);
605
+ else
606
+ findPrev(true);
607
+ }
608
+ }
609
+
610
+
611
+ }
612
+
613
+ void table::findFirst()
614
+ {
615
+ seekFirst();
616
+ if (m_stat == 0)
617
+ {
618
+ if (m_impl->filterPtr)
619
+ {
620
+ m_impl->exNext = 1;
621
+ m_impl->filterPtr->setPosTypeNext(false);
622
+ getRecords(TD_KEY_NEXT_MULTI);
623
+ }
624
+ }
625
+ }
626
+
627
+ void table::findLast()
628
+ {
629
+ seekLast();
630
+ if (m_stat == 0)
631
+ {
632
+ if (m_impl->filterPtr)
633
+ {
634
+ m_impl->exNext = -1;
635
+ m_impl->filterPtr->setPosTypeNext(false);
636
+ getRecords(TD_KEY_PREV_MULTI);
637
+ }
638
+ }
639
+ }
640
+
641
+ void table::doFind( ushort_td op, bool notIncCurrent)
642
+ {
643
+ /*
644
+ First, read from cache.
645
+ If whole row readed from cache then select operation by m_impl->exSlideStat
646
+
647
+ */
648
+ m_stat = 0;
649
+ int row = m_impl->rc->row() + 1;
650
+
651
+ if (m_impl->rc->withinCache(row) && (!m_impl->exBookMarking))
652
+ { /* read from cache */
653
+ m_pdata = (void*)m_impl->rc->setRow(row);
654
+ m_datalen = m_impl->rc->len();
655
+ }
656
+ else if (m_impl->rc->isEndOfRow(row))
657
+ {
658
+ /* whole row readed */
659
+ /* A special situation that if rejectCount() == 0 and status = STATUS_LIMMIT_OF_REJECT
660
+ then it continues . */
661
+ if ((m_impl->exSlideStat == 0)
662
+ || ((m_impl->exSlideStat == STATUS_LIMMIT_OF_REJECT)
663
+ && (m_impl->filterPtr->rejectCount() == 0)))
664
+ {
665
+ getRecords(op);
666
+ return;
667
+ }
668
+ if ((m_impl->exSlideStat == STATUS_LIMMIT_OF_REJECT) ||
669
+ (m_impl->exSlideStat == STATUS_REACHED_FILTER_COND))
670
+ m_stat = STATUS_EOF;
671
+ else
672
+ m_stat = m_impl->exSlideStat;
673
+ m_impl->exSlideStat = 0;
674
+ }
675
+ else
676
+ {
677
+ m_impl->exNext = ((op == TD_KEY_NEXT_MULTI) || (op == TD_KEY_GE_NEXT_MULTI)) ? 1: -1;
678
+ m_impl->filterPtr->setPosTypeNext(notIncCurrent);
679
+ getRecords(op);
680
+ }
681
+
682
+ }
683
+
684
+ void table::findNext(bool notIncCurrent)
685
+ {
686
+
687
+ if (m_impl->filterPtr)
688
+ doFind(TD_KEY_NEXT_MULTI, notIncCurrent);
689
+ else if (notIncCurrent == true)
690
+ seekNext();
691
+ }
692
+
693
+ void table::findPrev(bool notIncCurrent)
694
+ {
695
+ if (m_impl->filterPtr)
696
+ doFind(TD_KEY_PREV_MULTI, notIncCurrent);
697
+ else if (notIncCurrent == true)
698
+ seekPrev();
699
+
700
+ }
701
+
702
+ void table::setFilter(const _TCHAR* str, ushort_td RejectCount, ushort_td CashCount)
703
+ {
704
+
705
+ m_stat = 0;
706
+ m_pdata = m_impl->dataBak;
707
+ m_impl->rc->reset();
708
+ m_impl->exBookMarking = false;
709
+ m_impl->exSlideStat = 0;
710
+ m_impl->exNext = 0;
711
+ if (str[0] == 0x00)
712
+ {
713
+ m_impl->maxBookMarkedCount = 0;
714
+ delete m_impl->filterPtr;
715
+ m_impl->filterPtr = NULL;
716
+ return;
717
+ }
718
+ if (m_impl->filterPtr)
719
+ m_impl->filterPtr->init(this);
720
+ else
721
+ m_impl->filterPtr = new filter(this);
722
+ if (m_impl->filterPtr == NULL)
723
+ {
724
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
725
+ return;
726
+
727
+ }
728
+ if (!m_impl->filterPtr->setFilter(str, RejectCount, CashCount))
729
+ {
730
+ m_stat = STATUS_FILTERSTRING_ERROR;
731
+ delete m_impl->filterPtr;
732
+ m_impl->filterPtr = NULL;
733
+ return;
734
+ }
735
+ if (!m_impl->bookMarks)
736
+ {
737
+ m_impl->bookMarks = malloc(40960);
738
+ if (m_impl->bookMarks)
739
+ m_impl->bookMarksMemSize = 40960;
740
+ else
741
+ {
742
+ m_stat = STATUS_FILTERSTRING_ERROR;
743
+ delete m_impl->filterPtr;
744
+ m_impl->filterPtr = NULL;
745
+ }
746
+ }
747
+ }
748
+
749
+ const _TCHAR* table::filterStr()
750
+ {
751
+ if (m_impl->filterPtr)
752
+ return m_impl->filterPtr->filterStr();
753
+ else
754
+ return NULL;
755
+ }
756
+
757
+ void table::clearBuffer()
758
+ {
759
+ memset(m_pdata, 0x00, m_buflen);
760
+ if (blobFieldUsed())
761
+ resetSendBlob();
762
+
763
+ }
764
+
765
+ void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
766
+ {
767
+ keydef* KeyDef;
768
+ short FieldNum;
769
+ int j;
770
+
771
+ KeyDef = &m_tableDef->keyDefs[m_keynum];
772
+ for (j = 0; j < KeyDef->segmentCount; j++)
773
+ {
774
+ FieldNum = KeyDef->segments[j].fieldNum;
775
+ ks[j].keyPos = (ushort_td)(m_tableDef->fieldDefs[FieldNum].pos + 1);
776
+ ks[j].keyLen = m_tableDef->fieldDefs[FieldNum].len;
777
+ ks[j].keyFlag.all = KeyDef->segments[j].flags.all;
778
+ ks[j].keyCount = 0;
779
+ ks[j].keyType = m_tableDef->fieldDefs[FieldNum].type;
780
+
781
+ if (ks[j].keyFlag.bit3 == true)
782
+ ks[j].nullValue = m_tableDef->fieldDefs[FieldNum].nullValue;
783
+ else
784
+ ks[j].nullValue = 0;
785
+ ks[j].reserve2[0] = 0;
786
+ ks[j].reserve2[1] = 0;
787
+
788
+ if (SpecifyKeyNum == true)
789
+ ks[j].keyNo = m_keynum;
790
+ else
791
+ ks[j].keyNo = 0;
792
+
793
+ ks[j].acsNo = 0;
794
+ }
795
+ }
796
+
797
+ void table::doCreateIndex(bool SpecifyKeyNum)
798
+ {
799
+ int segmentCount = m_tableDef->keyDefs[m_keynum].segmentCount;
800
+ keySpec* ks = new keySpec[segmentCount];
801
+ getKeySpec(ks, SpecifyKeyNum);
802
+ m_pdata = ks;
803
+ m_datalen = sizeof(keySpec) * segmentCount;
804
+ nstable::doCreateIndex(SpecifyKeyNum);
805
+ m_pdata = m_impl->dataBak;
806
+ delete[]ks;
807
+ }
808
+
809
+ void table::smartUpdate()
810
+ {
811
+ if (!m_impl->smartUpDate)
812
+ m_impl->smartUpDate = malloc(m_buflen);
813
+ if (m_impl->smartUpDate)
814
+ {
815
+ memcpy(m_impl->smartUpDate, data(), m_buflen);
816
+ m_impl->smartUpDateFlag = true;
817
+ }
818
+ else
819
+ m_impl->smartUpDateFlag = false;
820
+ }
821
+
822
+ bool table::isUniqeKey(char_td keynum)
823
+ {
824
+ if ((keynum>=0) && (keynum < m_tableDef->keyCount))
825
+ {
826
+ keydef* kd = &m_tableDef->keyDefs[m_keynum];
827
+ return !(kd->segments[0].flags.bit0);
828
+ }
829
+ return false;
830
+ }
831
+
832
+ bool table::onUpdateCheck(eUpdateType type)
833
+ {
834
+ //Check uniqe key
835
+ if (type == changeInKey)
836
+ {
837
+ if (!isUniqeKey(m_keynum))
838
+ {
839
+ m_stat = STATUS_INVALID_KEYNUM;
840
+ return false;
841
+ }else
842
+ {
843
+ if (nsdb()->isUseTransactd()==false)
844
+ {
845
+ //backup update data
846
+ smartUpdate();
847
+ seek();
848
+ m_impl->smartUpDateFlag = false;
849
+ if (m_stat)
850
+ return false;
851
+ memcpy(m_pdata, m_impl->smartUpDate, m_datalen);
852
+ }
853
+ }
854
+ }
855
+ else if (m_impl->smartUpDateFlag)
856
+ {
857
+ m_stat = 0;
858
+ if (memcmp(m_impl->smartUpDate, data(), m_buflen) == 0)
859
+ {
860
+ m_impl->smartUpDateFlag = false;
861
+ return false;
862
+ }
863
+ }
864
+ return true;
865
+ }
866
+
867
+ void table::onUpdateAfter(int beforeResult)
868
+ {
869
+ if (blobFieldUsed())
870
+ resetSendBlob();
871
+ if (valiableFormatType() && m_impl->dataPacked)
872
+ m_datalen = unPack((char*)m_pdata, m_datalen);
873
+
874
+ }
875
+
876
+ bool table::onDeleteCheck(bool inkey)
877
+ {
878
+ client::database *db = static_cast<client::database*>(nsdb());
879
+ deleteRecordFn func = db->onDeleteRecord();
880
+ if (func)
881
+ {
882
+ if (func(db, this, inkey))
883
+ {
884
+ m_stat = STATUS_CANT_DEL_FOR_REL;
885
+ return false;
886
+ }
887
+ }
888
+ return true;
889
+ }
890
+
891
+ ushort_td table::doCommitBulkInsert(bool autoCommit)
892
+ {
893
+ ushort_td ret = nstable::doCommitBulkInsert(autoCommit);
894
+ if (blobFieldUsed())
895
+ resetSendBlob();
896
+ return ret;
897
+ }
898
+
899
+ void table::onInsertAfter(int beforeResult)
900
+ {
901
+ if (valiableFormatType() && m_impl->dataPacked)
902
+ m_datalen = unPack((char*)m_pdata, m_datalen);
903
+ if (blobFieldUsed())
904
+ resetSendBlob();
905
+ }
906
+
907
+ void* table::attachBuffer(void* NewPtr, bool unpack, size_t size)
908
+ {
909
+ void* oldptr;
910
+ if (!m_impl->bfAtcPtr)
911
+ m_impl->bfAtcPtr = m_pdata;
912
+ oldptr = m_pdata;
913
+ m_pdata = NewPtr;
914
+ ushort_td len = recordLength();
915
+ if (len < m_tableDef->maxRecordLen)
916
+ len = m_tableDef->maxRecordLen;
917
+ if (unpack)
918
+ len = unPack((char*)m_pdata, size);
919
+ m_datalen = len;
920
+ return oldptr;
921
+ }
922
+
923
+ void table::dettachBuffer()
924
+ {
925
+ if (m_impl->bfAtcPtr)
926
+ m_pdata = m_impl->bfAtcPtr;
927
+ m_impl->bfAtcPtr = NULL;
928
+
929
+ }
930
+
931
+ void table::init(tabledef* Def, short fnum, bool regularDir) {doInit(Def, fnum, regularDir);}
932
+
933
+ void table::doInit(tabledef* Def, short fnum, bool /*regularDir*/)
934
+ {
935
+ m_tableDef = Def;
936
+ ushort_td len;
937
+
938
+ m_impl->cv->setCodePage(mysql::codePage(m_tableDef->charsetIndex));
939
+
940
+ if ((len = recordLength()) < m_tableDef->maxRecordLen)
941
+ len = m_tableDef->maxRecordLen;
942
+
943
+ if (len == 0)
944
+ {
945
+ m_stat = STATUS_INVALID_RECLEN;
946
+ return;
947
+ }
948
+
949
+ for (short i = 0; i < m_tableDef->keyCount; i++)
950
+ {
951
+ if (m_tableDef->flags.bitA == true)
952
+ m_impl->keyNumIndex[m_tableDef->keyDefs[i].keyNumber] = (char)i;
953
+ else
954
+ m_impl->keyNumIndex[i] = (char)i;
955
+ }
956
+ if (m_impl->dataBak)
957
+ free(m_impl->dataBak);
958
+ m_impl->dataBak = (void*) malloc(len);
959
+
960
+ if (m_impl->dataBak == NULL)
961
+ {
962
+ if (m_impl->dataBak)
963
+ free(m_impl->dataBak);
964
+ m_impl->dataBak = NULL;
965
+ m_stat = STATUS_CANT_ALLOC_MEMORY;
966
+ return;
967
+ }
968
+ m_pdata = m_impl->dataBak;
969
+ m_buflen = len;
970
+ m_datalen = len;
971
+ setTableid(fnum);
972
+
973
+ }
974
+
975
+ keylen_td table::writeKeyData()
976
+ {
977
+ if (m_tableDef->keyCount)
978
+ {
979
+ keydef& keydef = m_tableDef->keyDefs[(short)m_impl->keyNumIndex[m_keynum]];
980
+ uchar_td* to = (uchar_td*)m_impl->keybuf;
981
+
982
+ for (int j = 0; j < keydef.segmentCount; j++)
983
+ {
984
+ int fdnum = keydef.segments[j].fieldNum;
985
+ fielddef& fd = m_tableDef->fieldDefs[fdnum];
986
+ uchar_td* from = (uchar_td*)m_pdata + fd.pos;
987
+ to = fd.keyCopy(to, from);
988
+ }
989
+ return (keylen_td)(to - (uchar_td*)m_impl->keybuf);
990
+ }
991
+ return 0;
992
+ }
993
+
994
+ uint_td table::pack(char*ptr, size_t size)
995
+ {
996
+ char* pos = ptr;
997
+ char* end = pos + size;
998
+ int movelen;
999
+ for (int i = 0; i < m_tableDef->fieldCount; i++)
1000
+ {
1001
+ fielddef& fd = m_tableDef->fieldDefs[i];
1002
+ int blen = fd.varLenBytes();
1003
+ int dl = fd.len; // length
1004
+ if (blen == 1)
1005
+ dl = *((unsigned char*)(pos)) + blen;
1006
+ else if (blen == 2)
1007
+ dl = *((unsigned short*)(pos)) + blen;
1008
+ pos += dl;
1009
+ if ((movelen = fd.len - dl) != 0)
1010
+ {
1011
+ end -= movelen;
1012
+ memmove(pos, pos + movelen, end - pos);
1013
+ }
1014
+ }
1015
+ m_impl->dataPacked = true;
1016
+ return (uint_td)(pos - ptr);
1017
+ }
1018
+
1019
+ uint_td table::doGetWriteImageLen()
1020
+ {
1021
+ if (!blobFieldUsed() && !valiableFormatType() && (m_tableDef->flags.bit0 == false))
1022
+ return m_buflen;
1023
+ // Make blob pointer list
1024
+ if (blobFieldUsed())
1025
+ {
1026
+ for (ushort_td i = 0; i < m_tableDef->fieldCount; i++)
1027
+ {
1028
+ fielddef& fd = m_tableDef->fieldDefs[i];
1029
+ uint_td bytes = fd.blobLenBytes();
1030
+ if (bytes)
1031
+ {
1032
+ uchar_td* fdptr = (uchar_td*)m_pdata + fd.pos;
1033
+ blob b(fd.blobDataLen(fdptr), i, fd.blobDataPtr(fdptr));
1034
+ addSendBlob(&b);
1035
+ }
1036
+ }
1037
+ addBlobEndRow(); // end row
1038
+ }
1039
+ else
1040
+ addSendBlob(NULL);
1041
+
1042
+ if (valiableFormatType())
1043
+ return pack((char*)m_pdata, m_buflen);
1044
+ else
1045
+ {
1046
+ fielddef* FieldDef = &m_tableDef->fieldDefs[m_tableDef->fieldCount - 1];
1047
+ size_t len = 0;
1048
+ short* pos;
1049
+
1050
+ if (FieldDef->type == ft_note)
1051
+ len = strlen((char*)fieldPtr((short)(m_tableDef->fieldCount - 1))) + 1;
1052
+ else if (FieldDef->type == ft_lvar)
1053
+ {
1054
+ // xx................xx.............00
1055
+ // ln--data----------ln-----data----00
1056
+ pos = (short*)fieldPtr((short)(m_tableDef->fieldCount - 1));
1057
+ while (*pos)
1058
+ {
1059
+ len += 2; // size
1060
+ len += *pos;
1061
+ pos = (short*)((char*)pos + (*pos + 2)); // next position
1062
+
1063
+ }
1064
+ len += 2;
1065
+ }
1066
+ else
1067
+ len = FieldDef->len;
1068
+
1069
+ len += FieldDef->pos;
1070
+
1071
+ return (uint_td)len;
1072
+ }
1073
+ }
1074
+
1075
+ uint_td table::unPack(char* ptr, size_t size)
1076
+ {
1077
+ char* pos = ptr;
1078
+ const char* end = pos + size;
1079
+ const char* max = pos + m_buflen;
1080
+ int movelen;
1081
+ for (int i = 0; i < m_tableDef->fieldCount; i++)
1082
+ {
1083
+ fielddef& fd = m_tableDef->fieldDefs[i];
1084
+ int blen = fd.varLenBytes();
1085
+ int dl = fd.len; // length
1086
+ if (blen == 1)
1087
+ dl = *((unsigned char*)(pos)) + blen;
1088
+ else if (blen == 2)
1089
+ dl = *((unsigned short*)(pos)) + blen;
1090
+ if ((movelen = fd.len - dl) != 0)
1091
+ {
1092
+ if (max < end + movelen)
1093
+ return 0;
1094
+ const char* src = pos + dl;
1095
+ memmove(pos + fd.len, src, end - src);
1096
+ end += movelen;
1097
+ }
1098
+ pos += fd.len;
1099
+ }
1100
+ m_impl->dataPacked = false;
1101
+ return (uint_td)(pos - ptr);
1102
+ }
1103
+
1104
+ void table::addBlobEndRow()
1105
+ {
1106
+ char_td knum = m_keynum;
1107
+ m_keynum = TD_ASBLOB_ENDROW;
1108
+ addSendBlob(NULL);
1109
+ m_keynum = knum;
1110
+ }
1111
+
1112
+ void table::resetSendBlob()
1113
+ {
1114
+ addSendBlob(NULL);
1115
+ m_impl->blobs.clear();
1116
+
1117
+ }
1118
+
1119
+ void table::addSendBlob(const blob* blob)
1120
+ {
1121
+ short stat = m_stat;
1122
+ const void *tmp = data();
1123
+ setData((void*)blob);
1124
+ tdap(TD_ADD_SENDBLOB);
1125
+ setData((void*)tmp);
1126
+ m_stat = stat;
1127
+ }
1128
+
1129
+ const blobHeader* table::getBlobHeader()
1130
+ {
1131
+ short stat = m_stat;
1132
+ const blobHeader* p;
1133
+ const void *tmp = data();
1134
+ setData(&p);
1135
+ tdap(TD_GET_BLOB_BUF);
1136
+ setData((void*)tmp);
1137
+ std::swap(stat, m_stat);
1138
+
1139
+ if (stat)
1140
+ return NULL;
1141
+ return p;
1142
+
1143
+ }
1144
+
1145
+ void table::setBlobFieldPointer(char* ptr, const blobHeader* hd)
1146
+ {
1147
+ if (hd)
1148
+ {
1149
+ assert(hd->curRow < hd->rows);
1150
+ const blobField* f = hd->nextField;
1151
+ for (int i = 0; i < hd->fieldCount; i++)
1152
+ {
1153
+ fielddef& fd = m_tableDef->fieldDefs[f->fieldNum];
1154
+ char* fdptr = ptr + fd.pos;
1155
+ int sizeByte = fd.blobLenBytes();
1156
+ memcpy(fdptr, &f->size, sizeByte);
1157
+ const char* data = f->data();
1158
+ memcpy(fdptr + sizeByte, &data, sizeof(char*));
1159
+ f = f->next();
1160
+ }
1161
+ ++hd->curRow;
1162
+ hd->nextField = (blobField*)f;
1163
+ }
1164
+
1165
+ }
1166
+
1167
+ void table::onReadAfter()
1168
+ {
1169
+ m_impl->strBufs.clear();
1170
+ if (valiableFormatType())
1171
+ {
1172
+ m_datalen = unPack((char*)m_pdata, m_datalen);
1173
+ if (m_datalen == 0)
1174
+ m_stat = 22;
1175
+ }
1176
+ if (blobFieldUsed())
1177
+ {
1178
+ const blobHeader* hd = getBlobHeader();
1179
+ setBlobFieldPointer((char*)m_pdata, hd);
1180
+ }
1181
+ if (m_buflen - m_datalen > 0)
1182
+ memset((char*)m_pdata + m_datalen, 0, m_buflen - m_datalen);
1183
+
1184
+ }
1185
+
1186
+ short table::fieldNumByName(const _TCHAR* name)
1187
+ {
1188
+ short i=0;
1189
+ if (name == 0) return i;
1190
+ if (m_impl->fields.size() == 0)
1191
+ {
1192
+ #ifdef _UNICODE
1193
+ wchar_t buf[74];
1194
+ for (i = 0; i < m_tableDef->fieldCount; i++)
1195
+ m_impl->fields.push_back(CFiledNameIndex(i, m_tableDef->fieldDefs[i].name(buf)));
1196
+ #else
1197
+ for (i = 0; i < m_tableDef->fieldCount; i++)
1198
+ m_impl->fields.push_back(CFiledNameIndex(i, m_tableDef->fieldDefs[i].name()));
1199
+ #endif
1200
+
1201
+ sort(m_impl->fields.begin(), m_impl->fields.end());
1202
+ }
1203
+ if (binary_search(m_impl->fields.begin(), m_impl->fields.end(), CFiledNameIndex(0, name)))
1204
+ {
1205
+ std::vector<CFiledNameIndex>::iterator p;
1206
+ p = lower_bound(m_impl->fields.begin(), m_impl->fields.end(), CFiledNameIndex(0, name));
1207
+ return m_impl->fields[p - m_impl->fields.begin()].index;
1208
+ }
1209
+
1210
+ return -1;
1211
+ }
1212
+
1213
+ void* table::fieldPtr(short index)
1214
+ {
1215
+ if (checkIndex(index) == false)
1216
+ return NULL;
1217
+ return (void*)((char*) m_pdata + m_tableDef->fieldDefs[index].pos);
1218
+ }
1219
+
1220
+ void table::setFVA(short index, const char* data)
1221
+ {
1222
+
1223
+ __int64 value;
1224
+ double fltValue;
1225
+ if (checkIndex(index) == false)
1226
+ return;
1227
+ fielddef& fd = m_tableDef->fieldDefs[index];
1228
+
1229
+ char* p = (char*)m_pdata + fd.pos;
1230
+ if (data == NULL)
1231
+ {
1232
+ memset(p, 0, fd.len);
1233
+ return;
1234
+ }
1235
+
1236
+ switch (fd.type)
1237
+ {
1238
+ case ft_string:
1239
+ return store<stringStore, char, char>(p, data, fd, m_impl->cv, m_impl->usePadChar);
1240
+ case ft_note:
1241
+ case ft_zstring: return store<zstringStore, char, char>(p, data, fd, m_impl->cv);
1242
+ case ft_wzstring: return store<wzstringStore, WCHAR, char>(p, data, fd, m_impl->cv);
1243
+ case ft_wstring:
1244
+ return store<wstringStore, WCHAR, char>(p, data, fd, m_impl->cv, m_impl->usePadChar);
1245
+ case ft_mychar: return store<myCharStore, char, char>(p, data, fd, m_impl->cv);
1246
+ case ft_myvarchar: return store<myVarCharStore, char, char>(p, data, fd, m_impl->cv);
1247
+ case ft_lstring:
1248
+ case ft_myvarbinary: return store<myVarBinaryStore, char, char>(p, data, fd, m_impl->cv);
1249
+ case ft_mywchar: return store<myWcharStore, WCHAR, char>(p, data, fd, m_impl->cv);
1250
+ case ft_mywvarchar: return store<myWvarCharStore, WCHAR, char>(p, data, fd, m_impl->cv);
1251
+ case ft_mywvarbinary: return store<myWvarBinaryStore, WCHAR, char>(p, data, fd, m_impl->cv);
1252
+ case ft_myblob:
1253
+ case ft_mytext:
1254
+ {
1255
+ char* tmp = blobStore<char>(p, data, fd, m_impl->cv);
1256
+ m_impl->blobs.push_back(boost::shared_array<char>(tmp));
1257
+ return;
1258
+ }
1259
+ case ft_decimal:
1260
+ case ft_money:
1261
+ case ft_numeric:
1262
+ case ft_bfloat:
1263
+ case ft_numericsts:
1264
+ case ft_numericsa:
1265
+ case ft_currency: // currecy
1266
+ case ft_float: // float double
1267
+ fltValue = atof(data);
1268
+ setFV(index, fltValue);
1269
+ return;
1270
+ case ft_lvar: // Lvar
1271
+ return;
1272
+
1273
+ case ft_date: // date mm/dd/yy
1274
+ value = /*StrToBtrDate*/atobtrd((const char*) data).i;
1275
+ break;
1276
+ case ft_time: // time hh:nn:ss
1277
+ value = /*StrToBtrTime*/atobtrt((const char*)data).i;
1278
+ break;
1279
+ case ft_uinteger:
1280
+ case ft_integer:
1281
+ case ft_autoinc:
1282
+ case ft_bit: value = _atoi64(data);
1283
+ break;
1284
+ case ft_logical:
1285
+ if (m_impl->logicalToString)
1286
+ {
1287
+ char tmp[5];
1288
+ strncpy(tmp, data, 5);
1289
+ if (strcmp(_strupr(tmp), "YES") == 0)
1290
+ value = 1;
1291
+ else
1292
+ value = 0;
1293
+ }
1294
+ else
1295
+ value = atol(data);
1296
+ break;
1297
+ case ft_timestamp:
1298
+ case ft_mytimestamp: value = 0;
1299
+ break;
1300
+ case ft_mydate:
1301
+ {
1302
+ myDate d;
1303
+ d = data;
1304
+ value = d.getValue();
1305
+ break;
1306
+ }
1307
+ case ft_mytime:
1308
+ {
1309
+ myTime t(fd.len);
1310
+ t = data;
1311
+ value = t.getValue();
1312
+ break;
1313
+ }
1314
+
1315
+ case ft_mydatetime:
1316
+ {
1317
+ myDateTime t(fd.len);
1318
+ t = data;
1319
+ value = t.getValue();
1320
+ break;
1321
+ }
1322
+ default: return;
1323
+ }
1324
+ setValue(fd, (uchar_td*)m_pdata, value);
1325
+ }
1326
+
1327
+ #ifdef _WIN32
1328
+
1329
+ void table::setFVW(short index, const wchar_t* data)
1330
+ {
1331
+
1332
+ int value;
1333
+ double fltValue;
1334
+ if (checkIndex(index) == false)
1335
+ return;
1336
+ fielddef& fd = m_tableDef->fieldDefs[index];
1337
+
1338
+ char* p = (char*)m_pdata + fd.pos;
1339
+ if (data == NULL)
1340
+ {
1341
+ memset(p, 0, fd.len);
1342
+ return;
1343
+ }
1344
+
1345
+ switch (fd.type)
1346
+ {
1347
+ case ft_string:
1348
+ return store<stringStore, char, WCHAR>(p, data, fd, m_impl->cv, m_impl->usePadChar);
1349
+ case ft_note:
1350
+ case ft_zstring: return store<zstringStore, char, WCHAR>(p, data, fd, m_impl->cv);
1351
+ case ft_wzstring: return store<wzstringStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
1352
+ case ft_wstring:
1353
+ return store<wstringStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv, m_impl->usePadChar);
1354
+ case ft_mychar: return store<myCharStore, char, WCHAR>(p, data, fd, m_impl->cv);
1355
+ case ft_myvarchar: return store<myVarCharStore, char, WCHAR>(p, data, fd, m_impl->cv);
1356
+ case ft_lstring:
1357
+ case ft_myvarbinary: return store<myVarBinaryStore, char, WCHAR>(p, data, fd, m_impl->cv);
1358
+ case ft_mywchar: return store<myWcharStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
1359
+ case ft_mywvarchar: return store<myWvarCharStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
1360
+ case ft_mywvarbinary: return store<myWvarBinaryStore, WCHAR, WCHAR>(p, data, fd, m_impl->cv);
1361
+ case ft_myblob:
1362
+ case ft_mytext:
1363
+ {
1364
+ char* tmp = blobStore<WCHAR>(p, data, fd, m_impl->cv);
1365
+ m_impl->blobs.push_back(boost::shared_array<char>(tmp));
1366
+ return;
1367
+ }
1368
+
1369
+ case ft_date: // date mm/dd/yy
1370
+ value = /*StrToBtrDate*/atobtrd(data).i;
1371
+ setFV(index, value);
1372
+ break;
1373
+ case ft_time: // time hh:nn:ss
1374
+ value = /*StrToBtrTime*/atobtrt(data).i;
1375
+ setFV(index, value);
1376
+ return;
1377
+
1378
+ case ft_uinteger:
1379
+ case ft_integer:
1380
+ case ft_autoinc:
1381
+ case ft_bit:
1382
+ {
1383
+ __int64 v = _wtoi64(data);
1384
+ setFV(index, v);
1385
+ break;
1386
+ }
1387
+ case ft_logical:
1388
+ if (m_impl->logicalToString)
1389
+ {
1390
+ wchar_t tmp[5];
1391
+ wcsncpy(tmp, data, 5);
1392
+
1393
+ if (wcscmp(_wcsupr(tmp), L"YES") == 0)
1394
+ value = 1;
1395
+ else
1396
+ value = 0;
1397
+ }
1398
+ else
1399
+ value = _wtol(data);
1400
+ setFV(index, value);
1401
+ break;
1402
+
1403
+ case ft_decimal:
1404
+ case ft_money:
1405
+ case ft_numeric:
1406
+ case ft_bfloat:
1407
+ case ft_numericsts:
1408
+ case ft_numericsa:
1409
+ case ft_currency:
1410
+ case ft_float: fltValue = _wtof(data);
1411
+ setFV(index, fltValue);
1412
+ break;
1413
+ case ft_timestamp:
1414
+ {
1415
+ __int64 v = 0;
1416
+ setFV(index, v);
1417
+ return;
1418
+ }
1419
+ case ft_mydate:
1420
+ {
1421
+ myDate d;
1422
+ d = data;
1423
+ setValue(fd, (uchar_td *)m_pdata, d.getValue());
1424
+ return;
1425
+ }
1426
+ case ft_mytime:
1427
+ {
1428
+ myTime t(fd.len);
1429
+ t = data;
1430
+ setValue(fd, (uchar_td*)m_pdata, t.getValue());
1431
+ return;
1432
+ }
1433
+ case ft_mydatetime:
1434
+ {
1435
+ myDateTime t(fd.len);
1436
+ t = data;
1437
+ setFV(index, t.getValue());
1438
+ return;
1439
+ }
1440
+ case ft_mytimestamp:
1441
+ case ft_lvar: break;
1442
+ }
1443
+
1444
+ }
1445
+
1446
+ void table::setFVW(const _TCHAR* FieldName, const wchar_t* data)
1447
+ {
1448
+ short index = fieldNumByName(FieldName);
1449
+ setFVW(index, data);
1450
+ }
1451
+
1452
+ #endif //_WIN32
1453
+
1454
+ void table::setFV(short index, unsigned char data)
1455
+ {
1456
+ int value = (long)data;
1457
+ setFV(index, value);
1458
+ }
1459
+
1460
+ void table::setFV(short index, int data)
1461
+ {
1462
+ char buf[20];
1463
+ double d;
1464
+ if (checkIndex(index) == false)
1465
+ return;
1466
+ int v = data;
1467
+ fielddef& fd = m_tableDef->fieldDefs[index];
1468
+ switch (fd.type)
1469
+ {
1470
+
1471
+ case ft_mydate:
1472
+ {
1473
+ myDate myd;
1474
+ myd.setValue(data, m_impl->myDateTimeValueByBtrv);
1475
+ setValue(fd, (uchar_td*)m_pdata, myd.getValue());
1476
+ break;
1477
+ }
1478
+ case ft_mytime:
1479
+ {
1480
+ myTime myt(fd.len);
1481
+ myt.setValue(data, m_impl->myDateTimeValueByBtrv);
1482
+ setValue(fd, (uchar_td*)m_pdata, myt.getValue());
1483
+ break;
1484
+ }
1485
+ case ft_integer:
1486
+ case ft_date:
1487
+ case ft_time:
1488
+ case ft_uinteger:
1489
+ case ft_logical:
1490
+ case ft_autoinc:
1491
+ case ft_bit:
1492
+ case ft_mydatetime:
1493
+ switch (m_tableDef->fieldDefs[index].len)
1494
+ {
1495
+ case 1: *((char*)((char*)m_pdata + fd.pos)) = (char) v;
1496
+ break;
1497
+ case 2: *((short*)((char*)m_pdata + fd.pos)) = (short)v;
1498
+ break;
1499
+ case 3: memcpy((char*)m_pdata + fd.pos, &v, 3);
1500
+ break;
1501
+ case 4: *((int*)((char*)m_pdata + fd.pos)) = v;
1502
+ break;
1503
+ case 8: *((__int64*)((char*)m_pdata + fd.pos)) = v;
1504
+ break;
1505
+ }
1506
+ break;
1507
+
1508
+ case ft_timestamp:
1509
+ {
1510
+ __int64 v = 0;
1511
+ setFV(index, v);
1512
+ return;
1513
+ }
1514
+ case ft_decimal:
1515
+ case ft_money:
1516
+ case ft_numeric:
1517
+ case ft_bfloat:
1518
+ case ft_numericsts:
1519
+ case ft_numericsa:
1520
+
1521
+ case ft_currency:
1522
+ case ft_float: d = (double)data;
1523
+ setFV(index, d);
1524
+ break;
1525
+ case ft_string:
1526
+ case ft_zstring:
1527
+ case ft_note:
1528
+ case ft_myvarbinary:
1529
+ case ft_myvarchar:
1530
+ case ft_mychar:
1531
+ if (data == 0)
1532
+ setFVA(index, "");
1533
+ else
1534
+ {
1535
+ _ltoa_s(data, buf, 20, 10);
1536
+ setFVA(index, buf);
1537
+ }
1538
+ break;
1539
+ case ft_mywvarbinary:
1540
+ case ft_mywvarchar:
1541
+ case ft_mywchar:
1542
+ case ft_wstring:
1543
+ case ft_wzstring:
1544
+ {
1545
+ if (data == 0)
1546
+ setFV(index, _T(""));
1547
+ else
1548
+ {
1549
+ _TCHAR buf[30];
1550
+ _ltot_s(data, buf, 30, 10);
1551
+ setFV(index, buf);
1552
+ }
1553
+ break;
1554
+ }
1555
+ case ft_lvar: break;
1556
+
1557
+ }
1558
+ }
1559
+
1560
+ void table::setFV(short index, double data)
1561
+ {
1562
+ char buf[20];
1563
+ __int64 i64;
1564
+ if (checkIndex(index) == false)
1565
+ return;
1566
+
1567
+ switch (m_tableDef->fieldDefs[index].type)
1568
+ {
1569
+ case ft_currency: // currency
1570
+ i64 = (__int64)(data * 10000 + 0.5);
1571
+ setFV(index, i64);
1572
+ break;
1573
+ case ft_bfloat: // bfloat
1574
+ case ft_float:
1575
+ switch (m_tableDef->fieldDefs[index].len)
1576
+ {
1577
+ case 4: *((float*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos)) = (float)data;
1578
+ break;
1579
+ case 8: *((double*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos)) = data;
1580
+ break;
1581
+ default:
1582
+ break;
1583
+ }
1584
+ break;
1585
+ case ft_decimal:
1586
+ case ft_money: setFVDecimal(index, data);
1587
+ break;
1588
+ case ft_numeric:
1589
+ case ft_numericsts:
1590
+ case ft_numericsa: setFVNumeric(index, data);
1591
+ break;
1592
+
1593
+ case ft_integer:
1594
+ case ft_date:
1595
+ case ft_time:
1596
+ case ft_uinteger:
1597
+ case ft_logical:
1598
+ case ft_autoinc:
1599
+ case ft_timestamp:
1600
+ case ft_bit:
1601
+ case ft_mydate:
1602
+ case ft_mytime:
1603
+ case ft_mydatetime:
1604
+ case ft_mytimestamp: i64 = (__int64)data;
1605
+ setFV(index, i64);
1606
+ break;
1607
+ case ft_string:
1608
+ case ft_zstring:
1609
+ case ft_note:
1610
+ case ft_myvarbinary:
1611
+ case ft_myvarchar:
1612
+ case ft_mychar:
1613
+ if (data == 0)
1614
+ setFVA(index, "");
1615
+ else
1616
+ {
1617
+ sprintf(buf, "%f", data);
1618
+ setFVA(index, buf);
1619
+ break;
1620
+ }
1621
+ case ft_lvar: break;
1622
+ case ft_mywvarbinary:
1623
+ case ft_mywvarchar:
1624
+ case ft_mywchar:
1625
+ case ft_wstring:
1626
+ case ft_wzstring:
1627
+ {
1628
+ if (data == 0)
1629
+ setFV(index, _T(""));
1630
+ else
1631
+ {
1632
+ _TCHAR buf[40];
1633
+ _stprintf_s(buf, 40, _T("%f"), data);
1634
+ setFV(index, buf);
1635
+ }
1636
+ break;
1637
+ }
1638
+ }
1639
+ }
1640
+
1641
+ void table::setFV(short index, bool data)
1642
+ {
1643
+ int value = (int)data;
1644
+ setFV(index, value);
1645
+ }
1646
+
1647
+ void table::setFV(short index, short data)
1648
+ {
1649
+ int value = (int)data;
1650
+ setFV(index, value);
1651
+ }
1652
+
1653
+ void table::setFV(short index, float data)
1654
+ {
1655
+ double value = (double)data;
1656
+ setFV(index, value);
1657
+
1658
+ }
1659
+
1660
+ short table::getFVsht(short index) {return (short)getFVlng(index);}
1661
+
1662
+ int table::getFVlng(short index)
1663
+ {
1664
+ int ret = 0;
1665
+
1666
+ if (checkIndex(index) == false)
1667
+ return 0;
1668
+ fielddef& fd = m_tableDef->fieldDefs[index];
1669
+ switch (fd.type)
1670
+ {
1671
+ case ft_integer:
1672
+ case ft_autoinc:
1673
+ switch (fd.len)
1674
+ {
1675
+ case 1: ret = *(((char*)m_pdata + fd.pos));
1676
+ break;
1677
+ case 2: ret = *((short*)((char*)m_pdata + fd.pos));
1678
+ break;
1679
+ case 3: memcpy(&ret, (char*)m_pdata + fd.pos, 3);
1680
+ ret = ((ret & 0xFFFFFF) << 8) / 0x100;
1681
+ break;
1682
+ case 8:
1683
+ case 4: ret = *((int*)((char*)m_pdata + fd.pos));
1684
+ break;
1685
+ }
1686
+ break;
1687
+ case ft_uinteger:
1688
+ case ft_logical:
1689
+ case ft_bit:
1690
+ case ft_date:
1691
+ case ft_time:
1692
+ case ft_timestamp:
1693
+ case ft_mydatetime:
1694
+ case ft_mytimestamp:
1695
+ switch (fd.len)
1696
+ {
1697
+ case 1: ret = *((unsigned char*)((char*)m_pdata + fd.pos));
1698
+ break;
1699
+ case 2: ret = *((unsigned short*)((char*)m_pdata + fd.pos));
1700
+ break;
1701
+ case 3: memcpy(&ret, (char*)m_pdata + fd.pos, 3);
1702
+ break;
1703
+ case 8:
1704
+ case 4:
1705
+ ret = *((unsigned int*)((char*)m_pdata + fd.pos));
1706
+ break;
1707
+ }
1708
+ break;
1709
+ case ft_mydate:
1710
+ {
1711
+ myDate myd;
1712
+ myd.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
1713
+ ret = myd.getValue(m_impl->myDateTimeValueByBtrv);
1714
+ break;
1715
+ }
1716
+ case ft_mytime:
1717
+ {
1718
+ myTime myt(fd.len);
1719
+ myt.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
1720
+ ret = (int)myt.getValue(m_impl->myDateTimeValueByBtrv);
1721
+ break; ;
1722
+ }
1723
+ case ft_string:
1724
+ case ft_zstring:
1725
+ case ft_note:
1726
+ case ft_myvarbinary:
1727
+ case ft_myvarchar:
1728
+ case ft_mychar: ret = atol(getFVAstr(index));
1729
+ break;
1730
+ case ft_wstring:
1731
+ case ft_wzstring:
1732
+ case ft_mywvarbinary:
1733
+ case ft_mywvarchar:
1734
+ case ft_mywchar: ret = _ttol(getFVstr(index));
1735
+ break;
1736
+ case ft_currency: ret = (long)(*((__int64*)((char*)m_pdata + fd.pos)) / 10000);
1737
+ break;
1738
+ case ft_bfloat:
1739
+ case ft_float: ret = (long)getFVdbl(index);
1740
+ break;
1741
+ case ft_decimal:
1742
+ case ft_money: ret = (long)getFVDecimal(index);
1743
+ break;
1744
+ case ft_numeric:
1745
+ case ft_numericsts:
1746
+ case ft_numericsa: ret = (long)getFVnumeric(index);
1747
+ break;
1748
+
1749
+ case ft_lvar: break;
1750
+ default: return 0;
1751
+ }
1752
+ return ret;
1753
+ }
1754
+
1755
+ float table::getFVflt(short index) {return (float) getFVdbl(index);}
1756
+
1757
+ double table::getFVdbl(short index)
1758
+ {
1759
+ double ret = 0;
1760
+ if (checkIndex(index) == false)
1761
+ return 0;
1762
+ switch (m_tableDef->fieldDefs[index].type)
1763
+ {
1764
+ case ft_currency:
1765
+ ret = (double) * ((__int64*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
1766
+ ret = ret / 10000;
1767
+ break;
1768
+
1769
+ case ft_bfloat:
1770
+ case ft_timestamp:
1771
+ case ft_float:
1772
+ switch (m_tableDef->fieldDefs[index].len)
1773
+ {
1774
+ case 4: ret = (double) * ((float*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
1775
+ break;
1776
+ case 10: // long double
1777
+ case 8: ret = (double) * ((double*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos));
1778
+ break;
1779
+ }
1780
+ break;
1781
+ case ft_string:
1782
+ case ft_zstring:
1783
+ case ft_note:
1784
+ case ft_myvarbinary:
1785
+ case ft_myvarchar:
1786
+ case ft_mychar: ret = atof(getFVAstr(index));
1787
+ break;
1788
+ case ft_wstring:
1789
+ case ft_wzstring:
1790
+ case ft_mywvarbinary:
1791
+ case ft_mywvarchar:
1792
+ case ft_mywchar: ret = _ttof(getFVstr(index));
1793
+ break;
1794
+ case ft_integer:
1795
+ case ft_date:
1796
+ case ft_time:
1797
+ case ft_uinteger:
1798
+ case ft_logical:
1799
+ case ft_autoinc:
1800
+ case ft_bit:
1801
+ case ft_mydate:
1802
+ case ft_mytime:
1803
+ case ft_mydatetime:
1804
+ case ft_mytimestamp: ret = (double)getFV64(index);
1805
+ break;
1806
+
1807
+ case ft_decimal:
1808
+ case ft_money: ret = getFVDecimal(index);
1809
+ break;
1810
+ case ft_numeric:
1811
+ case ft_numericsts:
1812
+ case ft_numericsa: ret = getFVnumeric(index);
1813
+ break;
1814
+ case ft_lvar: break;
1815
+ default: return 0;
1816
+ }
1817
+ return ret;
1818
+ }
1819
+
1820
+ unsigned char table::getFVbyt(short index) {return (unsigned char)getFVlng(index);}
1821
+
1822
+ #ifdef _WIN32
1823
+
1824
+ const wchar_t* table::getFVWstr(short index)
1825
+ {
1826
+
1827
+ if (checkIndex(index) == false)
1828
+ return NULL;
1829
+
1830
+ fielddef& fd = m_tableDef->fieldDefs[index];
1831
+ char* data = (char*)m_pdata + fd.pos;
1832
+ switch (fd.type)
1833
+ {
1834
+ case ft_string:
1835
+ return read<stringStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
1836
+ m_impl->trimPadChar);
1837
+ case ft_note:
1838
+ case ft_zstring: return read<zstringStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1839
+ case ft_wzstring:
1840
+ return read<wzstringStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1841
+ case ft_wstring:
1842
+ return read<wstringStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
1843
+ m_impl->trimPadChar);
1844
+ case ft_mychar:
1845
+ return read<myCharStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
1846
+ m_impl->trimPadChar);
1847
+ case ft_myvarchar:
1848
+ return read<myVarCharStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1849
+ case ft_lstring:
1850
+ case ft_myvarbinary:
1851
+ return read<myVarBinaryStore, char, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1852
+ case ft_mywchar:
1853
+ return read<myWcharStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv,
1854
+ m_impl->trimPadChar);
1855
+ case ft_mywvarchar:
1856
+ return read<myWvarCharStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1857
+ case ft_mywvarbinary:
1858
+ return read<myWvarBinaryStore, WCHAR, WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1859
+ case ft_myblob:
1860
+ case ft_mytext: return readBlob<WCHAR>(data, &m_impl->strBufs, fd, m_impl->cv);
1861
+ }
1862
+ wchar_t* p = (wchar_t*) m_impl->strBufs.getPtrW(max(fd.len * 2, 50));
1863
+
1864
+ wchar_t buf[10] = L"%0.";
1865
+
1866
+ switch (fd.type)
1867
+ {
1868
+
1869
+ case ft_integer:
1870
+ case ft_bit:
1871
+ case ft_autoinc: _i64tow_s(getFV64(index), p, 50, 10);
1872
+ return p;
1873
+ case ft_logical:
1874
+ if (m_impl->logicalToString)
1875
+ {
1876
+ if (getFVlng(index))
1877
+ return L"Yes";
1878
+ else
1879
+ return L"No";
1880
+ }
1881
+ else
1882
+ _i64tow_s(getFV64(index), p, 50, 10);
1883
+
1884
+ case ft_bfloat:
1885
+ case ft_float:
1886
+ case ft_currency:
1887
+ {
1888
+
1889
+ swprintf_s(p, 50, L"%lf", getFVdbl(index));
1890
+ int k = (int)wcslen(p) - 1;
1891
+ while (k >= 0)
1892
+ {
1893
+ if (p[k] == L'0')
1894
+ p[k] = 0x00;
1895
+ else if (p[k] == L'.')
1896
+ {
1897
+ p[k] = 0x00;
1898
+ break;
1899
+ }
1900
+ else
1901
+ break;
1902
+ k--;
1903
+ }
1904
+ break;
1905
+ }
1906
+ case ft_uinteger: swprintf_s(p, 50, L"%u", getFVlng(index));
1907
+ break;
1908
+ case ft_date: return btrdtoa(getFVlng(index), p);
1909
+ case ft_time: return btrttoa(getFVlng(index), p);
1910
+ case ft_mydate:
1911
+ {
1912
+ myDate d;
1913
+ d.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
1914
+ return d.toStr(p, m_impl->myDateTimeValueByBtrv);
1915
+ }
1916
+ case ft_mytime:
1917
+ {
1918
+
1919
+ myTime t(fd.len);
1920
+ t.setValue(getValue64(fd, (const uchar_td*)m_pdata));
1921
+ return t.toStr(p);
1922
+
1923
+ }
1924
+ case ft_mydatetime:
1925
+ {
1926
+ myDateTime t(fd.len);
1927
+ t.setValue(getFV64(index));
1928
+ return t.toStr(p);
1929
+ }
1930
+ case ft_mytimestamp:
1931
+ {
1932
+ myTimeStamp ts(fd.len);
1933
+ ts.setValue(getFV64(index));
1934
+ return ts.toStr(p);
1935
+ }
1936
+ case ft_decimal:
1937
+ case ft_money:
1938
+ case ft_numeric:
1939
+ case ft_numericsts:
1940
+ case ft_numericsa: _ltow_s(fd.decimals, p, 50, 10);
1941
+ wcscat(buf, p);
1942
+ wcscat(buf, L"lf");
1943
+ swprintf(p, 50, buf, getFVdbl(index));
1944
+ break;
1945
+ case ft_lvar: return NULL;
1946
+ case ft_timestamp: return btrTimeStamp(getFV64(index)).toString(p);
1947
+ default: p[0] = 0x00;
1948
+ }
1949
+ return p;
1950
+ }
1951
+
1952
+ const wchar_t* table::getFVWstr(const _TCHAR* FieldName)
1953
+ {
1954
+ short index = fieldNumByName(FieldName);
1955
+ return getFVWstr(index);
1956
+
1957
+ }
1958
+ #endif //_WIN32
1959
+
1960
+ const char* table::getFVAstr(short index)
1961
+ {
1962
+ char buf[10] = "%0.";
1963
+
1964
+ if (checkIndex(index) == false)
1965
+ return NULL;
1966
+ fielddef& fd = m_tableDef->fieldDefs[index];
1967
+
1968
+ char* data = (char*)m_pdata + fd.pos;
1969
+ switch (fd.type)
1970
+ {
1971
+
1972
+ case ft_string:
1973
+ return read<stringStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv,
1974
+ m_impl->trimPadChar);
1975
+ case ft_note:
1976
+ case ft_zstring: return read<zstringStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1977
+ case ft_wzstring:
1978
+ return read<wzstringStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1979
+ case ft_wstring:
1980
+ return read<wstringStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv,
1981
+ m_impl->trimPadChar);
1982
+ case ft_mychar:
1983
+ return read<myCharStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv,
1984
+ m_impl->trimPadChar);
1985
+ case ft_myvarchar:
1986
+ return read<myVarCharStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1987
+ case ft_lstring:
1988
+ case ft_myvarbinary:
1989
+ return read<myVarBinaryStore, char, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1990
+ case ft_mywchar:
1991
+ return read<myWcharStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv,
1992
+ m_impl->trimPadChar);
1993
+ case ft_mywvarchar:
1994
+ return read<myWvarCharStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1995
+ case ft_mywvarbinary:
1996
+ return read<myWvarBinaryStore, WCHAR, char>(data, &m_impl->strBufs, fd, m_impl->cv);
1997
+ case ft_myblob:
1998
+ case ft_mytext: return readBlob<char>(data, &m_impl->strBufs, fd, m_impl->cv);
1999
+ }
2000
+ char* p = m_impl->strBufs.getPtrA(max(fd.len * 2, 50));
2001
+ switch (fd.type)
2002
+ {
2003
+ case ft_integer:
2004
+ case ft_bit:
2005
+ case ft_autoinc: _i64toa_s(getFV64(index), p, 50, 10);
2006
+ return p;
2007
+ case ft_logical:
2008
+ if (m_impl->logicalToString)
2009
+ {
2010
+ if (getFVlng(index))
2011
+ return "Yes";
2012
+ else
2013
+ return "No";
2014
+ }
2015
+ else
2016
+ _i64toa_s(getFV64(index), p, 50, 10);
2017
+ break;
2018
+ case ft_bfloat:
2019
+ case ft_float:
2020
+ case ft_currency:
2021
+ {
2022
+ sprintf(p, "%lf", getFVdbl(index));
2023
+ size_t k = strlen(p) - 1;
2024
+ while (1)
2025
+ {
2026
+ if (p[k] == '0')
2027
+ p[k] = 0x00;
2028
+ else if (p[k] == '.')
2029
+ {
2030
+ p[k] = 0x00;
2031
+ break;
2032
+ }
2033
+ else
2034
+ break;
2035
+ k--;
2036
+ }
2037
+ break;
2038
+ }
2039
+ case ft_date: return btrdtoa(getFVlng(index), p);
2040
+ case ft_time: return btrttoa(getFVlng(index), p);
2041
+ case ft_uinteger: sprintf(p, "%u", getFVlng(index));
2042
+ break;
2043
+
2044
+ case ft_mydate:
2045
+ {
2046
+ myDate d;
2047
+ d.setValue((int)getValue64(fd, (const uchar_td*)m_pdata));
2048
+ return d.toStr(p, m_impl->myDateTimeValueByBtrv);
2049
+ }
2050
+ case ft_mytime:
2051
+ {
2052
+ myTime t(fd.len);
2053
+ t.setValue(getValue64(fd, (const uchar_td*)m_pdata));
2054
+ return t.toStr(p);
2055
+ }
2056
+ case ft_mytimestamp:
2057
+ {
2058
+ myTimeStamp ts(fd.len);
2059
+ ts.setValue(getFV64(index));
2060
+ return ts.toStr(p);
2061
+ }
2062
+ case ft_mydatetime:
2063
+ {
2064
+ myDateTime t(fd.len);
2065
+ t.setValue(getFV64(index));
2066
+ return t.toStr(p);
2067
+ }
2068
+ case ft_decimal:
2069
+ case ft_money:
2070
+ case ft_numeric:
2071
+ case ft_numericsts:
2072
+ case ft_numericsa: _ltoa_s(fd.decimals, p, 50, 10);
2073
+ strcat(buf, p);
2074
+ strcat(buf, "lf");
2075
+ sprintf_s(p, 50, buf, getFVdbl(index));
2076
+ break;
2077
+ case ft_lvar: return NULL;
2078
+ case ft_timestamp: return btrTimeStamp(getFV64(index)).toString(p);
2079
+ default: p[0] = 0x00;
2080
+ }
2081
+ return p;
2082
+ }
2083
+
2084
+ int table::getFVint(short index) {return (int)getFVlng(index);}
2085
+
2086
+ int table::getFVint(const _TCHAR* FieldName)
2087
+ {
2088
+ short index = fieldNumByName(FieldName);
2089
+ return (int)getFVlng(index);
2090
+
2091
+ }
2092
+
2093
+ int table::getFVlng(const _TCHAR* FieldName)
2094
+ {
2095
+ short index = fieldNumByName(FieldName);
2096
+ return getFVlng(index);
2097
+ }
2098
+
2099
+ const char* table::getFVAstr(const _TCHAR* FieldName)
2100
+ {
2101
+ short index = fieldNumByName(FieldName);
2102
+ return getFVAstr(index);
2103
+ }
2104
+
2105
+ double table::getFVdbl(const _TCHAR* FieldName)
2106
+ {
2107
+ short index = fieldNumByName(FieldName);
2108
+ return getFVdbl(index);
2109
+ }
2110
+
2111
+ unsigned char table::getFVbyt(const _TCHAR* FieldName)
2112
+ {
2113
+ short index = fieldNumByName(FieldName);
2114
+ return getFVbyt(index);
2115
+ }
2116
+
2117
+ short table::getFVsht(const _TCHAR* FieldName)
2118
+ {
2119
+ short index = fieldNumByName(FieldName);
2120
+ return getFVsht(index);
2121
+ }
2122
+
2123
+ float table::getFVflt(const _TCHAR* FieldName)
2124
+ {
2125
+ short index = fieldNumByName(FieldName);
2126
+ return getFVflt(index);
2127
+ }
2128
+
2129
+ void table::setFV(const _TCHAR* FieldName, int data)
2130
+ {
2131
+ short index = fieldNumByName(FieldName);
2132
+ setFV(index, data);
2133
+ }
2134
+
2135
+ void table::setFVA(const _TCHAR* FieldName, const char* data)
2136
+ {
2137
+ short index = fieldNumByName(FieldName);
2138
+ setFVA(index, data);
2139
+ }
2140
+
2141
+ void table::setFV(const _TCHAR* FieldName, double data)
2142
+ {
2143
+ short index = fieldNumByName(FieldName);
2144
+ setFV(index, data);
2145
+ }
2146
+
2147
+ void table::setFV(const _TCHAR* FieldName, float data)
2148
+ {
2149
+ short index = fieldNumByName(FieldName);
2150
+ setFV(index, data);
2151
+ }
2152
+
2153
+ void table::setFV(const _TCHAR* FieldName, unsigned char data)
2154
+ {
2155
+ short index = fieldNumByName(FieldName);
2156
+ setFV(index, data);
2157
+ }
2158
+
2159
+ void table::setFV(const _TCHAR* FieldName, short data)
2160
+ {
2161
+ short index = fieldNumByName(FieldName);
2162
+ setFV(index, data);
2163
+ }
2164
+
2165
+ __int64 table::getFV64(const _TCHAR* FieldName)
2166
+ {
2167
+ short index = fieldNumByName(FieldName);
2168
+ return getFV64(index);
2169
+ }
2170
+
2171
+ void table::setFV(const _TCHAR* FieldName, __int64 data)
2172
+ {
2173
+ short index = fieldNumByName(FieldName);
2174
+ setFV(index, data);
2175
+ }
2176
+
2177
+ __int64 table::getFV64(short index)
2178
+ {
2179
+ if (checkIndex(index) == false)
2180
+ return 0;
2181
+ fielddef& fd = m_tableDef->fieldDefs[index];
2182
+
2183
+ switch (fd.len)
2184
+ {
2185
+ case 8:
2186
+ switch (fd.type)
2187
+ {
2188
+ case ft_uinteger:
2189
+ case ft_integer:
2190
+ case ft_logical:
2191
+ case ft_autoinc:
2192
+ case ft_bit:
2193
+ case ft_currency:
2194
+ case ft_timestamp:
2195
+ case ft_mydatetime:
2196
+ case ft_mytimestamp: return (__int64) *((__int64*)((char*)m_pdata + fd.pos));
2197
+ }
2198
+ return 0;
2199
+ case 7:
2200
+ case 6:
2201
+ case 5:
2202
+ switch (fd.type)
2203
+ {
2204
+ case ft_mytime:
2205
+ case ft_mydatetime:
2206
+ case ft_mytimestamp:
2207
+ {
2208
+ __int64 v = 0;
2209
+ memcpy(&v, (char*)m_pdata + fd.pos, fd.len);
2210
+ return v;
2211
+ }
2212
+ }
2213
+ return 0;
2214
+ default:
2215
+
2216
+ return (__int64) getFVlng(index);
2217
+ }
2218
+
2219
+ }
2220
+
2221
+ void table::setFV(short index, __int64 data)
2222
+ {
2223
+ if (checkIndex(index) == false)
2224
+ return;
2225
+
2226
+ fielddef& fd = m_tableDef->fieldDefs[index];
2227
+ switch (fd.len)
2228
+ {
2229
+ case 8:
2230
+ switch (fd.type)
2231
+ {
2232
+ case ft_uinteger:
2233
+ case ft_integer:
2234
+ case ft_logical:
2235
+ case ft_autoinc:
2236
+ case ft_bit:
2237
+ case ft_currency:
2238
+ case ft_mydatetime:
2239
+ case ft_mytimestamp: *((__int64*)((char*)m_pdata + fd.pos)) = data;
2240
+ break;
2241
+ case ft_timestamp:
2242
+ {
2243
+ btrDate d;
2244
+ d.i = getNowDate();
2245
+ btrTime t;
2246
+ t.i = getNowTime();
2247
+ *((__int64*)((char*)m_pdata + fd.pos)) = btrTimeStamp(d, t).i64;
2248
+ break;
2249
+ }
2250
+ case ft_float:
2251
+ {
2252
+ double d = (double)data;
2253
+ setFV(index, d);
2254
+ break;
2255
+ }
2256
+ }
2257
+ break;
2258
+ case 7:
2259
+ case 6:
2260
+ case 5:
2261
+ switch (fd.type)
2262
+ {
2263
+ case ft_mytime:
2264
+ case ft_mydatetime:
2265
+ case ft_mytimestamp: memcpy((char*)m_pdata + fd.pos, &data, fd.len);
2266
+ break;
2267
+ default: break;
2268
+ }
2269
+ break;
2270
+ default:
2271
+ {
2272
+ int value = (int)data;
2273
+ setFV(index, value);
2274
+ break;
2275
+ }
2276
+ }
2277
+ }
2278
+
2279
+ void table::setFV(const _TCHAR* FieldName, const void* data, uint_td size)
2280
+ {
2281
+ short index = fieldNumByName(FieldName);
2282
+ setFV(index, data, size);
2283
+ }
2284
+
2285
+ /* if blob and text ,set binary data that is only set pointer. it is not copied.
2286
+ * Caller must hold data until it sends to the server.
2287
+ */
2288
+ void table::setFV(short index, const void* data, uint_td size)
2289
+ {
2290
+ if (checkIndex(index) == false)
2291
+ return;
2292
+
2293
+ fielddef& fd = m_tableDef->fieldDefs[index];
2294
+
2295
+ switch (fd.type)
2296
+ {
2297
+ case ft_myvarbinary:
2298
+ case ft_myvarchar:
2299
+ case ft_mywvarbinary:
2300
+ case ft_mywvarchar:
2301
+ case ft_lstring:
2302
+ {
2303
+ int sizeByte = fd.varLenBytes();
2304
+ size = std::min<uint_td>((uint_td)(fd.len - sizeByte), size);
2305
+ memset((char*)m_pdata + fd.pos, 0, fd.len);
2306
+ memcpy((char*)m_pdata + fd.pos, &size, sizeByte);
2307
+ memcpy((char*)m_pdata + fd.pos + sizeByte, data, size);
2308
+ break;
2309
+ }
2310
+ case ft_myblob:
2311
+ case ft_mytext:
2312
+ {
2313
+ int sizeByte = fd.len - 8;
2314
+ memset((char*)m_pdata + fd.pos, 0, fd.len);
2315
+ memcpy((char*)m_pdata + fd.pos, &size, sizeByte);
2316
+ memcpy((char*)m_pdata + fd.pos + sizeByte, &data, sizeof(char*));
2317
+ break;
2318
+
2319
+ }
2320
+ default: m_stat = STATUS_FIELDTYPE_NOTSUPPORT; // this field type is not supported.
2321
+ }
2322
+ }
2323
+
2324
+ void* table::getFVbin(const _TCHAR* FieldName, uint_td& size)
2325
+ {
2326
+ short index = fieldNumByName(FieldName);
2327
+ return getFVbin(index, size);
2328
+ }
2329
+
2330
+ /* offset is writen at data that is first address of data
2331
+ * text is not converted to unicode form stored charset.
2332
+ */
2333
+ void* table::getFVbin(short index, uint_td& size)
2334
+ {
2335
+ if (checkIndex(index) == false)
2336
+ return NULL;
2337
+
2338
+ fielddef& fd = m_tableDef->fieldDefs[index];
2339
+
2340
+ switch (fd.type)
2341
+ {
2342
+ case ft_myvarbinary:
2343
+ case ft_myvarchar:
2344
+ case ft_mywvarbinary:
2345
+ case ft_mywvarchar:
2346
+ case ft_lstring:
2347
+ {
2348
+ int sizeByte = fd.varLenBytes();
2349
+ size = 0;
2350
+ memcpy(&size, (char*)m_pdata + fd.pos, sizeByte);
2351
+ return (void*)((char*)m_pdata + fd.pos + sizeByte);
2352
+ }
2353
+ case ft_myblob:
2354
+ case ft_mytext:
2355
+ {
2356
+ int sizeByte = fd.len - 8;
2357
+ size = 0;
2358
+ memcpy(&size, (char*)m_pdata + fd.pos, sizeByte);
2359
+ char** ptr = (char**)((char*)m_pdata + fd.pos + sizeByte);
2360
+ return (void*)*ptr;
2361
+ }
2362
+ }
2363
+ return NULL;
2364
+ }
2365
+
2366
+ bool table::checkIndex(short index)
2367
+ {
2368
+ if ((index >= m_tableDef->fieldCount) || (index < 0))
2369
+ {
2370
+ m_stat = STATUS_INVARID_FIELD_IDX;
2371
+ return false;
2372
+ }
2373
+ return true;
2374
+ }
2375
+
2376
+ double table::getFVDecimal(short index)
2377
+ {
2378
+ unsigned char buf[20] = {0x00};
2379
+ char result[30] = {0x00};
2380
+ char n[10];
2381
+ int i;
2382
+ char* t;
2383
+ unsigned char sign;
2384
+ int len = m_tableDef->fieldDefs[index].len;
2385
+ result[0] = '+';
2386
+ memcpy(buf, (void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), len);
2387
+ sign = (unsigned char)(buf[len - 1] & 0x0F);
2388
+ buf[len - 1] = (unsigned char)(buf[len - 1] & 0xF0);
2389
+ for (i = 0; i < len; i++)
2390
+ {
2391
+ sprintf_s(n, 50, "%02x", buf[i]);
2392
+ strcat(result, n);
2393
+ }
2394
+ i = (int)strlen(result);
2395
+
2396
+ if (sign == 13)
2397
+ result[0] = '-';
2398
+ result[i - 1] = 0x00;
2399
+
2400
+
2401
+ t = result + (m_tableDef->fieldDefs[index].len * 2) - m_tableDef->fieldDefs[index].decimals;
2402
+ strcpy((char*)buf, t);
2403
+ *t = '.';
2404
+ strcpy(t + 1, (char*)buf);
2405
+ return atof(result);
2406
+ }
2407
+
2408
+ double table::getFVnumeric(short index)
2409
+ {
2410
+ char* t;
2411
+ char dp[] = "{ABCDEFGHI}JKLMNOPQR";
2412
+ char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
2413
+ char* pdp = NULL;
2414
+ char i;
2415
+ char buf[20] = {0x00};
2416
+ char dummy[20];
2417
+
2418
+ buf[0] = '+';
2419
+ strncpy(buf + 1, (char*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos),
2420
+ m_tableDef->fieldDefs[index].len);
2421
+
2422
+ t = &(buf[m_tableDef->fieldDefs[index].len]);
2423
+
2424
+ switch (m_tableDef->fieldDefs[index].type)
2425
+ {
2426
+ case ft_numeric: pdp = dp;
2427
+ break;
2428
+ case ft_numericsa: pdp = dpsa;
2429
+ break;
2430
+ case ft_numericsts: buf[0] = *t;
2431
+ *t = 0x00;
2432
+ break;
2433
+ }
2434
+
2435
+ if (pdp)
2436
+ {
2437
+ for (i = 0; i < 21; i++)
2438
+ {
2439
+ if (*t == pdp[i])
2440
+ {
2441
+ if (i > 10)
2442
+ {
2443
+ buf[0] = '-';
2444
+ *t = (char)(i + 38);
2445
+ }
2446
+ else
2447
+ *t = (char)(i + 48);
2448
+ break;
2449
+ }
2450
+ }
2451
+ }
2452
+
2453
+ t = buf + strlen(buf) - m_tableDef->fieldDefs[index].decimals;
2454
+ strcpy(dummy, t);
2455
+ *t = '.';
2456
+ strcpy(t + 1, dummy);
2457
+ return atof(buf);
2458
+ }
2459
+
2460
+ void table::setFVDecimal(short index, double data)
2461
+ { // Double -> Decimal
2462
+ char buf[30] = "%+0";
2463
+ char dummy[30];
2464
+ int point;
2465
+ bool sign = false;
2466
+ unsigned char n;
2467
+ int i, k;
2468
+ int strl;
2469
+ bool offset = false; ;
2470
+ point = (m_tableDef->fieldDefs[index].len) * 2;
2471
+ _ltoa_s(point, dummy, 30, 10);
2472
+ strcat(buf, dummy);
2473
+ strcat(buf, ".");
2474
+ _ltoa_s(m_tableDef->fieldDefs[index].decimals, dummy, 30, 10);
2475
+ strcat(buf, dummy);
2476
+ strcat(buf, "lf");
2477
+ sprintf(dummy, buf, data);
2478
+ if (dummy[0] == '-')
2479
+ sign = true;
2480
+
2481
+ strl = (int)strlen(dummy + 1) - 1;
2482
+ if (strl % 2 == 1)
2483
+ strl = strl / 2;
2484
+ else
2485
+ {
2486
+ strl = strl / 2 + 1;
2487
+ offset = true;
2488
+ }
2489
+ memset(buf, 0, 30);
2490
+ k = 0;
2491
+ n = 0;
2492
+ point = (int)strlen(dummy + 1);
2493
+ if (strl <= m_tableDef->fieldDefs[index].len)
2494
+ {
2495
+ for (i = 1; i <= point; i++)
2496
+ {
2497
+ if ((dummy[i] == '-') || (dummy[i] == '.'));
2498
+ else
2499
+ {
2500
+ if (offset)
2501
+ {
2502
+ n = (unsigned char)(n + dummy[i] - 48);
2503
+ buf[k] = n;
2504
+ offset = false;
2505
+ k++;
2506
+ }
2507
+ else
2508
+ {
2509
+ n = (unsigned char)(dummy[i] - 48);
2510
+ n = (unsigned char)(n << 4);
2511
+ offset = true; ;
2512
+ }
2513
+ }
2514
+ }
2515
+ if (sign)
2516
+ buf[k] += ((unsigned char)(n + 13));
2517
+ else
2518
+ buf[k] += ((unsigned char)(n + 12));
2519
+ }
2520
+ memcpy((void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), buf,
2521
+ m_tableDef->fieldDefs[index].len);
2522
+
2523
+ }
2524
+
2525
+ void table::setFVNumeric(short index, double data)
2526
+ { // Double -> Numeric
2527
+ char buf[30] = "%+0";
2528
+ char dummy[30];
2529
+ int point;
2530
+ int n;
2531
+ char dp[] = "{ABCDEFGHI}JKLMNOPQR";
2532
+ char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
2533
+ bool sign = false;
2534
+ char* t;
2535
+
2536
+ point = m_tableDef->fieldDefs[index].len + 1;
2537
+
2538
+ _ltoa_s(point, dummy, 30, 10);
2539
+ strcat(buf, dummy);
2540
+ strcat(buf, ".");
2541
+ _ltoa_s(m_tableDef->fieldDefs[index].decimals, dummy, 30, 10);
2542
+ strcat(buf, dummy);
2543
+ strcat(buf, "lf");
2544
+ sprintf(dummy, buf, data);
2545
+ if (dummy[0] == '-')
2546
+ sign = true;
2547
+
2548
+
2549
+ strcpy(buf, &dummy[point - m_tableDef->fieldDefs[index].decimals] + 1);
2550
+ dummy[point - m_tableDef->fieldDefs[index].decimals] = 0x00;
2551
+ strcat(dummy, buf);
2552
+
2553
+ n = atol(&dummy[m_tableDef->fieldDefs[index].len]);
2554
+ if (sign)
2555
+ n += 10;
2556
+ t = dummy + 1;
2557
+ switch (m_tableDef->fieldDefs[index].type)
2558
+ {
2559
+ case ft_numeric: dummy[m_tableDef->fieldDefs[index].len] = dp[n];
2560
+ break;
2561
+ case ft_numericsa: dummy[m_tableDef->fieldDefs[index].len] = dpsa[n];
2562
+ break;
2563
+ case ft_numericsts:
2564
+ if (sign)
2565
+ strcat(dummy, "-");
2566
+ else
2567
+ strcat(dummy, "+");
2568
+ t += 1;
2569
+ break;
2570
+ }
2571
+
2572
+ memcpy((void*)((char*)m_pdata + m_tableDef->fieldDefs[index].pos), t,
2573
+ m_tableDef->fieldDefs[index].len);
2574
+ }
2575
+
2576
+ unsigned int table::getRecordHash()
2577
+ {
2578
+ return hash((const char*)fieldPtr(0), datalen());
2579
+ }
2580
+
2581
+
2582
+
2583
+
2584
+
2585
+ int table::bookMarksCount() const
2586
+ {
2587
+ int ret;
2588
+ ret = m_impl->maxBookMarkedCount;
2589
+ return ret;
2590
+ }
2591
+
2592
+ void table::moveBookmarksId(long id)
2593
+ {
2594
+ long Point = (id - 1) * 6 + 2;
2595
+
2596
+ if ((id <= m_impl->maxBookMarkedCount) && (m_impl->bookMarks))
2597
+ seekByBookmark(*((bookmark_td*)((char*)m_impl->bookMarks + Point)));
2598
+ else
2599
+ seekByBookmark(0);
2600
+ }
2601
+
2602
+ short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
2603
+ {
2604
+ return nstable::tdapErr(hWnd, m_stat, m_tableDef->tableName(), retbuf);
2605
+ }
2606
+
2607
+
2608
+
2609
+ }// namespace client
2610
+ }// namespace tdap
2611
+ }// namespace protocol
2612
+ }// namespace db
2613
+ }// namespace bzs