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,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