transactd 2.4.5 → 3.0.0
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.
- checksums.yaml +4 -4
- data/CMakeLists.txt +1 -1
- data/README-JA.md +52 -529
- data/README.md +52 -523
- data/bin/common/tdclc_32_3_0.dll +0 -0
- data/bin/common/tdclc_64_3_0.dll +0 -0
- data/build/common/system.cmake +2 -1
- data/build/common/transactd_cl_common.cmake +3 -6
- data/build/swig/ruby/ruby.swg +85 -28
- data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
- data/build/swig/tdcl.i +161 -5
- data/build/tdclc/CMakeLists.txt +1 -0
- data/build/tdclc/tdclc.cbproj +7 -1
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/blobStructs.h +1 -1
- data/source/bzs/db/engine/mysql/database.cpp +199 -74
- data/source/bzs/db/engine/mysql/database.h +47 -18
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
- data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
- data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
- data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
- data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
- data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
- data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
- data/source/bzs/db/protocol/tdap/client/client.h +82 -15
- data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
- data/source/bzs/db/protocol/tdap/client/database.h +19 -6
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
- data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
- data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
- data/source/bzs/db/protocol/tdap/client/field.h +110 -121
- data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
- data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
- data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
- data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
- data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
- data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
- data/source/bzs/db/protocol/tdap/client/request.h +2 -1
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
- data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
- data/source/bzs/db/protocol/tdap/client/table.h +112 -37
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
- data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
- data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
- data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
- data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
- data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
- data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
- data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
- data/source/bzs/db/protocol/tdap/uri.h +40 -32
- data/source/bzs/db/transactd/connManager.cpp +1 -1
- data/source/bzs/db/transactd/transactd.cpp +7 -0
- data/source/bzs/env/compiler.h +107 -94
- data/source/bzs/env/crosscompile.cpp +24 -12
- data/source/bzs/env/crosscompile.h +75 -6
- data/source/bzs/env/mbcswchrLinux.cpp +2 -2
- data/source/bzs/env/tcharMinGW.h +4 -0
- data/source/bzs/example/changeSchema.cpp +22 -17
- data/source/bzs/example/queryData.cpp +4 -0
- data/source/bzs/netsvc/client/iconnection.h +3 -1
- data/source/bzs/netsvc/client/tcpClient.h +10 -3
- data/source/bzs/rtl/stringBuffers.cpp +7 -0
- data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
- data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
- data/source/bzs/test/tdclatl/test_v3.js +1017 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
- data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
- data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
- data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
- data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
- data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
- data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
- data/source/bzs/test/trdclengn/testField.h +3305 -0
- data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
- data/source/bzs/test/trdclengn/testbase.h +137 -0
- data/source/global/ormsrcgen/srcgen.cpp +23 -12
- data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
- data/source/global/querystmts/querystmts.cpp +2 -3
- data/source/global/tdclatl/Bitset.cpp +38 -0
- data/source/global/tdclatl/Bitset.h +63 -0
- data/source/global/tdclatl/Database.cpp +59 -18
- data/source/global/tdclatl/Database.h +7 -4
- data/source/global/tdclatl/DbDef.cpp +6 -6
- data/source/global/tdclatl/DbDef.h +2 -1
- data/source/global/tdclatl/Field.cpp +112 -0
- data/source/global/tdclatl/Field.h +19 -5
- data/source/global/tdclatl/FieldDef.cpp +137 -16
- data/source/global/tdclatl/FieldDef.h +18 -2
- data/source/global/tdclatl/FieldDefs.cpp +54 -1
- data/source/global/tdclatl/FieldDefs.h +3 -0
- data/source/global/tdclatl/GroupQuery.cpp +8 -8
- data/source/global/tdclatl/QueryBase.cpp +65 -0
- data/source/global/tdclatl/QueryBase.h +10 -0
- data/source/global/tdclatl/Record.cpp +33 -2
- data/source/global/tdclatl/Record.h +3 -1
- data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
- data/source/global/tdclatl/RecordsetQuery.h +8 -0
- data/source/global/tdclatl/Table.cpp +127 -3
- data/source/global/tdclatl/Table.h +10 -1
- data/source/global/tdclatl/TableDef.cpp +41 -8
- data/source/global/tdclatl/TableDef.h +7 -2
- data/source/global/tdclatl/activeTable.cpp +40 -71
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +222 -28
- data/source/linux/tchar.h +100 -96
- data/transactd.gemspec +2 -2
- metadata +13 -11
- data/BUILD_UNIX-JA.md +0 -161
- data/BUILD_WIN-JA.md +0 -326
- data/README_ORMSRCGEN-JA.md +0 -115
- data/README_ORMSRCGEN.md +0 -118
- data/RELEASE_NOTE-JA.md +0 -356
- data/RELEASE_NOTE.md +0 -360
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
#include "field.h"
|
|
20
20
|
#include "fields.h"
|
|
21
21
|
#include "nsDatabase.h"
|
|
22
|
-
#include <bzs/db/protocol/tdap/
|
|
22
|
+
#include <bzs/db/protocol/tdap/btrDate.h>
|
|
23
|
+
#include <bzs/db/protocol/tdap/myDateTime.h>
|
|
23
24
|
#include <bzs/db/protocol/tdap/fieldComp.h>
|
|
24
25
|
#include "stringConverter.h"
|
|
25
26
|
#include <bzs/rtl/stringBuffers.h>
|
|
@@ -45,6 +46,270 @@ namespace tdap
|
|
|
45
46
|
{
|
|
46
47
|
namespace client
|
|
47
48
|
{
|
|
49
|
+
typedef int int32;
|
|
50
|
+
class myDecimal
|
|
51
|
+
{
|
|
52
|
+
int32 m_data[8];
|
|
53
|
+
int32 m_sign;
|
|
54
|
+
uchar_td m_digit;
|
|
55
|
+
uchar_td m_dec;
|
|
56
|
+
uchar_td m_intBytes;
|
|
57
|
+
uchar_td m_decBytes;
|
|
58
|
+
uchar_td m_intSurplusBytes;
|
|
59
|
+
uchar_td m_decSurplusBytes;
|
|
60
|
+
uchar_td m_error;
|
|
61
|
+
|
|
62
|
+
int32 changeEndian(int32 v, int len)
|
|
63
|
+
{
|
|
64
|
+
int32 ret = 0;
|
|
65
|
+
char* l = (char*)&ret;
|
|
66
|
+
char* r = (char*)&v;
|
|
67
|
+
if (len == 4) {
|
|
68
|
+
l[0] = r[3]; l[1] = r[2]; l[2] = r[1]; l[3] = r[0];
|
|
69
|
+
}else if (len == 3) {
|
|
70
|
+
l[0] = r[2]; l[1] = r[1]; l[2] = r[0];
|
|
71
|
+
}else if (len == 2) {
|
|
72
|
+
l[0] = r[1]; l[1] = r[0];
|
|
73
|
+
}else if (len == 1)
|
|
74
|
+
ret = v;
|
|
75
|
+
return ret;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
int32 readInt32One(const char* ptr, int len)
|
|
79
|
+
{
|
|
80
|
+
int32 v = *((int32*)ptr);
|
|
81
|
+
return changeEndian(v ^ m_sign, len) ;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
int32 readSurplus(const char* ptr, int len)
|
|
85
|
+
{
|
|
86
|
+
assert(len <= 4);
|
|
87
|
+
int32 v = 0;
|
|
88
|
+
switch(len)
|
|
89
|
+
{
|
|
90
|
+
case 1: v = *((char*)ptr); break;
|
|
91
|
+
case 2: v = *((short*)ptr); break;
|
|
92
|
+
case 3: v = (*((int32*)ptr) & 0x00FFFFFF); break;
|
|
93
|
+
case 4: v = *((int32*)ptr); break;
|
|
94
|
+
}
|
|
95
|
+
return readInt32One((const char*)&v, len);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
char* write(char* ptr, int len, int32 v)
|
|
99
|
+
{
|
|
100
|
+
v = changeEndian(v, len) ^ m_sign;
|
|
101
|
+
memcpy(ptr, &v , len);
|
|
102
|
+
return ptr + len;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
int32 fromString(const char* p, size_t len)
|
|
106
|
+
{
|
|
107
|
+
assert(len <= 9);
|
|
108
|
+
char tmp[10]={0};
|
|
109
|
+
strncpy(tmp, p, len);
|
|
110
|
+
return atoi(tmp);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public:
|
|
114
|
+
myDecimal(uchar_td digit, uchar_td dec) : m_sign(0), m_digit(digit), m_dec(dec), m_error(0)
|
|
115
|
+
{
|
|
116
|
+
assert(sizeof(int32) == 4);
|
|
117
|
+
assert(digit > 0);
|
|
118
|
+
assert(m_digit <= 65);
|
|
119
|
+
assert(m_dec <= 30);
|
|
120
|
+
|
|
121
|
+
// integer part
|
|
122
|
+
int dig = digit - dec;
|
|
123
|
+
m_intSurplusBytes = (uchar_td)decimalBytesBySurplus[dig % DIGITS_INT32];
|
|
124
|
+
m_intBytes = (uchar_td)((dig / DIGITS_INT32) * sizeof(int32));
|
|
125
|
+
|
|
126
|
+
// dec part
|
|
127
|
+
m_decSurplusBytes = (uchar_td)(decimalBytesBySurplus[dec % DIGITS_INT32]);
|
|
128
|
+
m_decBytes = (uchar_td)((dec / DIGITS_INT32) * sizeof(int32));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
void store(char* ptr)
|
|
132
|
+
{
|
|
133
|
+
int32* data = m_data;
|
|
134
|
+
char* p = ptr;
|
|
135
|
+
if (m_intSurplusBytes)
|
|
136
|
+
p = write(p, m_intSurplusBytes, *(data++));
|
|
137
|
+
for (int i = 0; i < (int)(m_intBytes/sizeof(int32)) ; ++i)
|
|
138
|
+
p = write(p, sizeof(int32), *(data++));
|
|
139
|
+
for (int i = 0; i < (int)(m_decBytes/sizeof(int32)) ; ++i)
|
|
140
|
+
p = write(p, sizeof(int32), *(data++));
|
|
141
|
+
if (m_decSurplusBytes)
|
|
142
|
+
write(p, m_decSurplusBytes, *data);
|
|
143
|
+
//reverse first bit
|
|
144
|
+
*(ptr) ^= 0x80;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
void read(const char* ptr)
|
|
148
|
+
{
|
|
149
|
+
m_sign = ((*ptr) & 0x80) ? 0 : -1;
|
|
150
|
+
int32* data = m_data;
|
|
151
|
+
const char* p = ptr;
|
|
152
|
+
//reverse first bit
|
|
153
|
+
*(const_cast<char*>(ptr)) ^= 0x80;
|
|
154
|
+
if (m_intSurplusBytes)
|
|
155
|
+
{
|
|
156
|
+
*(data++) = readSurplus(p, m_intSurplusBytes);
|
|
157
|
+
p += m_intSurplusBytes;
|
|
158
|
+
}
|
|
159
|
+
for (int i = 0; i < (int)(m_intBytes/sizeof(int32)) ; ++i)
|
|
160
|
+
{
|
|
161
|
+
*(data++) = readInt32One(p, sizeof(int32));
|
|
162
|
+
p += sizeof(int32);
|
|
163
|
+
}
|
|
164
|
+
for (int i = 0; i < (int)(m_decBytes/sizeof(int32)) ; ++i)
|
|
165
|
+
{
|
|
166
|
+
*(data++) = readInt32One(p, sizeof(int32));
|
|
167
|
+
p += sizeof(int32);
|
|
168
|
+
}
|
|
169
|
+
if (m_decSurplusBytes)
|
|
170
|
+
*data = readSurplus(p, m_decSurplusBytes);
|
|
171
|
+
//restore first bit
|
|
172
|
+
*(const_cast<char*>(ptr)) ^= 0x80;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
char* toString(char* ptr, size_t size)
|
|
176
|
+
{
|
|
177
|
+
// This function is internal use only.
|
|
178
|
+
assert(size >= (size_t)m_digit + 1);
|
|
179
|
+
|
|
180
|
+
char* p = ptr;
|
|
181
|
+
if (m_sign)
|
|
182
|
+
*(p++) = '-';
|
|
183
|
+
char* p_cache = p;
|
|
184
|
+
*p = '0';
|
|
185
|
+
int32* data = m_data;
|
|
186
|
+
if (m_intSurplusBytes)
|
|
187
|
+
{
|
|
188
|
+
if (*data)
|
|
189
|
+
p += sprintf(p, "%d", *data);
|
|
190
|
+
++data;
|
|
191
|
+
}
|
|
192
|
+
for (int i = 0; i < (int)(m_intBytes/sizeof(int32)) ; ++i)
|
|
193
|
+
{
|
|
194
|
+
if (*data || p != p_cache)
|
|
195
|
+
p += sprintf(p, p != p_cache ? "%09d" : "%d", *data);
|
|
196
|
+
++data;
|
|
197
|
+
}
|
|
198
|
+
if (p_cache == p) ++p;
|
|
199
|
+
if (m_dec)
|
|
200
|
+
{
|
|
201
|
+
int dec_n = m_dec;
|
|
202
|
+
*(p++) = '.';
|
|
203
|
+
for (int i = 0; i < (int)(m_decBytes/sizeof(int32)) ; ++i)
|
|
204
|
+
{
|
|
205
|
+
p += sprintf(p, "%09d", *(data++));
|
|
206
|
+
dec_n -= DIGITS_INT32;
|
|
207
|
+
}
|
|
208
|
+
if (m_decSurplusBytes)
|
|
209
|
+
p += sprintf(p, "%0*d", dec_n, *data);
|
|
210
|
+
}
|
|
211
|
+
return ptr;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
myDecimal& operator=(const char* p)
|
|
215
|
+
{
|
|
216
|
+
m_error = 0;
|
|
217
|
+
m_sign = (*p) == '-' ? -1 : 0;
|
|
218
|
+
if (m_sign) ++p;
|
|
219
|
+
const char* point = strchr(p, '.');
|
|
220
|
+
|
|
221
|
+
int32* data = m_data;
|
|
222
|
+
memset(m_data, 0, sizeof(m_data));
|
|
223
|
+
char tmp[67];
|
|
224
|
+
if (m_digit - m_dec)
|
|
225
|
+
{
|
|
226
|
+
size_t intchars = point ? (point - p) : strlen(p);
|
|
227
|
+
int offset = (m_digit - m_dec) - (int)intchars;
|
|
228
|
+
if (offset < 0 || (intchars + offset > 65))
|
|
229
|
+
{
|
|
230
|
+
m_error = STATUS_TOO_LARGE_VALUE;
|
|
231
|
+
return *this;
|
|
232
|
+
}
|
|
233
|
+
if (offset)
|
|
234
|
+
{
|
|
235
|
+
sprintf(tmp, "%0*d%s", offset, 0, p);
|
|
236
|
+
p = tmp;
|
|
237
|
+
}
|
|
238
|
+
int len = (m_digit - m_dec) % DIGITS_INT32;
|
|
239
|
+
*(data++) = fromString(p, len);
|
|
240
|
+
p += len;
|
|
241
|
+
for (int i = 0; i < (int)(m_intBytes/sizeof(int32)) ; ++i)
|
|
242
|
+
{
|
|
243
|
+
*(data++) = fromString(p, DIGITS_INT32);
|
|
244
|
+
p += DIGITS_INT32;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (point)
|
|
248
|
+
{
|
|
249
|
+
p = point + 1;
|
|
250
|
+
size_t len = strlen(p);
|
|
251
|
+
if (len < (size_t)m_dec)
|
|
252
|
+
{
|
|
253
|
+
sprintf(tmp, "%s000000000", p);
|
|
254
|
+
p = tmp;
|
|
255
|
+
}
|
|
256
|
+
const char* endp = len + p;
|
|
257
|
+
for (int i = 0; i < (int)(m_decBytes/sizeof(int32)) ; ++i)
|
|
258
|
+
{
|
|
259
|
+
*(data++) = fromString(p, DIGITS_INT32);
|
|
260
|
+
p += DIGITS_INT32;
|
|
261
|
+
if (p > endp) break;
|
|
262
|
+
}
|
|
263
|
+
if (p <= endp)
|
|
264
|
+
*data = fromString(p, endp - p + 1);
|
|
265
|
+
}
|
|
266
|
+
return *this;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
double d()
|
|
270
|
+
{
|
|
271
|
+
char tmp[100];
|
|
272
|
+
return atof(toString(tmp, 100));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
__int64 i64()
|
|
276
|
+
{
|
|
277
|
+
char tmp[100];
|
|
278
|
+
return _atoi64(toString(tmp, 100));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
#ifdef _WIN32
|
|
282
|
+
wchar_t* toString(wchar_t* ptr, int size)
|
|
283
|
+
{
|
|
284
|
+
char tmp[100];
|
|
285
|
+
toString(tmp, 100);
|
|
286
|
+
MultiByteToWideChar(CP_ACP, 0, tmp, -1, ptr, size);
|
|
287
|
+
return ptr;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
myDecimal& operator=(const wchar_t* p)
|
|
291
|
+
{
|
|
292
|
+
char tmp[100];
|
|
293
|
+
WideCharToMultiByte(CP_ACP, 0, p, -1, tmp, 100, NULL, NULL);
|
|
294
|
+
return operator=(tmp);
|
|
295
|
+
}
|
|
296
|
+
#endif
|
|
297
|
+
|
|
298
|
+
myDecimal& operator=(const double v)
|
|
299
|
+
{
|
|
300
|
+
char tmp[100];
|
|
301
|
+
sprintf_s(tmp, 100, "%.*lf", m_dec, v);
|
|
302
|
+
return operator=(tmp);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
myDecimal& operator=(const __int64 v)
|
|
306
|
+
{
|
|
307
|
+
char tmp[100];
|
|
308
|
+
sprintf_s(tmp, 100, "%lld", v);
|
|
309
|
+
return operator=(tmp);
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
|
|
48
313
|
|
|
49
314
|
//------------------------------------------------------------------------------
|
|
50
315
|
// class fieldShare
|
|
@@ -103,10 +368,10 @@ struct infoImple
|
|
|
103
368
|
std::vector<fielddef> fields;
|
|
104
369
|
boost::unordered_map<std::_tstring, int> map;
|
|
105
370
|
const aliasMap_type* aliasMap;
|
|
106
|
-
|
|
107
|
-
infoImple() : aliasMap(NULL) {}
|
|
371
|
+
int mysqlnullEnable;
|
|
372
|
+
infoImple() : aliasMap(NULL), mysqlnullEnable(0){}
|
|
108
373
|
infoImple(const infoImple& r)
|
|
109
|
-
: fields(r.fields), map(r.map), aliasMap(r.aliasMap){};
|
|
374
|
+
: fields(r.fields), map(r.map), aliasMap(r.aliasMap), mysqlnullEnable(r.mysqlnullEnable){};
|
|
110
375
|
};
|
|
111
376
|
|
|
112
377
|
fielddefs::fielddefs() : fieldShare(), m_imple(new infoImple)
|
|
@@ -123,9 +388,7 @@ fielddefs::fielddefs(const fielddefs& r)
|
|
|
123
388
|
fielddefs& fielddefs::operator=(const fielddefs& r)
|
|
124
389
|
{
|
|
125
390
|
if (this != &r)
|
|
126
|
-
{
|
|
127
391
|
*m_imple = *r.m_imple;
|
|
128
|
-
}
|
|
129
392
|
return *this;
|
|
130
393
|
}
|
|
131
394
|
|
|
@@ -155,18 +418,39 @@ void fielddefs::setAliases(const aliasMap_type* p)
|
|
|
155
418
|
m_imple->aliasMap = p;
|
|
156
419
|
}
|
|
157
420
|
|
|
158
|
-
|
|
421
|
+
/* calcFieldPos used by recordsetQuery::init()
|
|
422
|
+
Query values hold in a memoryRecord.
|
|
423
|
+
And used by this->addSelectedFields().
|
|
424
|
+
*/
|
|
425
|
+
void fielddefs::calcFieldPos(int startIndex, bool mysqlNull)
|
|
159
426
|
{
|
|
160
|
-
|
|
161
|
-
|
|
427
|
+
ushort_td pos = 0;
|
|
428
|
+
int nullfields = 0;
|
|
429
|
+
for (size_t i = startIndex;i < m_imple->fields.size(); ++i)
|
|
162
430
|
{
|
|
163
|
-
fielddef* fd = &
|
|
164
|
-
fd->
|
|
165
|
-
|
|
431
|
+
fielddef* fd = &m_imple->fields[i];
|
|
432
|
+
fd->pos = pos;
|
|
433
|
+
pos += fd->len;
|
|
434
|
+
fd->m_nullbytes = 0;
|
|
435
|
+
fd->m_nullbit = 0;
|
|
436
|
+
if (fd->isNullable())
|
|
437
|
+
{
|
|
438
|
+
fd->m_nullbit = nullfields;
|
|
439
|
+
if (mysqlNull)
|
|
440
|
+
++nullfields;
|
|
441
|
+
else
|
|
442
|
+
fd->setNullable(false);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (nullfields)
|
|
446
|
+
{
|
|
447
|
+
int nullbytes = (nullfields + 7) / 8;
|
|
448
|
+
for (size_t i = startIndex ;i < m_imple->fields.size(); ++i)
|
|
449
|
+
m_imple->fields[i].m_nullbytes = nullbytes;
|
|
166
450
|
}
|
|
167
451
|
}
|
|
168
452
|
|
|
169
|
-
void fielddefs::push_back(const fielddef* p
|
|
453
|
+
void fielddefs::push_back(const fielddef* p)
|
|
170
454
|
{
|
|
171
455
|
m_imple->fields.push_back(*p);
|
|
172
456
|
int index = (int)m_imple->fields.size() - 1;
|
|
@@ -175,17 +459,8 @@ void fielddefs::push_back(const fielddef* p, bool rePosition)
|
|
|
175
459
|
// convert field name of table charset to recordset schema charset.
|
|
176
460
|
_TCHAR tmp[FIELD_NAME_SIZE * 3];
|
|
177
461
|
pp->setName(p->name(tmp));
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
{
|
|
181
|
-
if (index == 0)
|
|
182
|
-
pp->pos = 0;
|
|
183
|
-
else
|
|
184
|
-
{
|
|
185
|
-
fielddef* bf = &m_imple->fields[index - 1];
|
|
186
|
-
pp->pos = bf->pos + bf->len;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
462
|
+
if (pp->isNullable() && pp->nullbytes())
|
|
463
|
+
++m_imple->mysqlnullEnable;
|
|
189
464
|
// reset update indicator
|
|
190
465
|
pp->enableFlags.bitE = false;
|
|
191
466
|
aliasing(pp);
|
|
@@ -215,6 +490,7 @@ void fielddefs::clear()
|
|
|
215
490
|
{
|
|
216
491
|
m_imple->fields.clear();
|
|
217
492
|
m_imple->map.clear();
|
|
493
|
+
m_imple->mysqlnullEnable = 0;
|
|
218
494
|
}
|
|
219
495
|
|
|
220
496
|
void fielddefs::resetUpdateIndicator()
|
|
@@ -265,27 +541,39 @@ size_t fielddefs::size() const
|
|
|
265
541
|
size_t fielddefs::totalFieldLen() const
|
|
266
542
|
{
|
|
267
543
|
const fielddef& fd = m_imple->fields[m_imple->fields.size() - 1];
|
|
268
|
-
return fd.pos + fd.len;
|
|
544
|
+
return fd.pos + fd.len + fd.nullbytes();
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
void fielddefs::addAllFileds(const tabledef* def)
|
|
548
|
+
{
|
|
549
|
+
m_imple->fields.clear();
|
|
550
|
+
m_imple->mysqlnullEnable = 0;
|
|
551
|
+
for (int i = 0; i < def->fieldCount; ++i)
|
|
552
|
+
{
|
|
553
|
+
const fielddef* fd = &def->fieldDefs[i];
|
|
554
|
+
push_back(fd);
|
|
555
|
+
m_imple->fields[m_imple->fields.size() - 1].setPadCharDefaultSettings();
|
|
556
|
+
}
|
|
269
557
|
}
|
|
270
558
|
|
|
271
|
-
void fielddefs::
|
|
559
|
+
void fielddefs::addSelectedFields(const table* tb)
|
|
272
560
|
{
|
|
273
561
|
int n = tb->getCurProcFieldCount();
|
|
274
562
|
m_imple->fields.reserve(n + size());
|
|
275
563
|
const tabledef* def = tb->tableDef();
|
|
276
|
-
int
|
|
564
|
+
int startIndex = (int)m_imple->fields.size();
|
|
277
565
|
for (int i = 0; i < n; ++i)
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
fd.pos = pos;
|
|
281
|
-
push_back(&fd);
|
|
282
|
-
pos += fd.len;
|
|
283
|
-
}
|
|
284
|
-
|
|
566
|
+
push_back(&def->fieldDefs[tb->getCurProcFieldIndex(i)]);
|
|
567
|
+
calcFieldPos(startIndex, (def->nullfields() != 0));
|
|
285
568
|
// Defalut field charset
|
|
286
569
|
cv()->setCodePage(mysql::codePage(def->charsetIndex));
|
|
287
570
|
}
|
|
288
571
|
|
|
572
|
+
bool fielddefs::mysqlnullEnable() const
|
|
573
|
+
{
|
|
574
|
+
return (m_imple->mysqlnullEnable != 0);
|
|
575
|
+
}
|
|
576
|
+
|
|
289
577
|
bool fielddefs::canUnion(const fielddefs& src) const
|
|
290
578
|
{
|
|
291
579
|
if (size() != src.size())
|
|
@@ -302,6 +590,8 @@ bool fielddefs::canUnion(const fielddefs& src) const
|
|
|
302
590
|
return false;
|
|
303
591
|
if (l.charsetIndex() != r.charsetIndex())
|
|
304
592
|
return false;
|
|
593
|
+
if (l.isNullable() != r.isNullable())
|
|
594
|
+
return false;
|
|
305
595
|
}
|
|
306
596
|
return true;
|
|
307
597
|
}
|
|
@@ -320,6 +610,7 @@ void fielddefs::release()
|
|
|
320
610
|
// class field
|
|
321
611
|
//------------------------------------------------------------------------------
|
|
322
612
|
static fielddef fdDummy;
|
|
613
|
+
#define NUMBUFSIZE 70
|
|
323
614
|
|
|
324
615
|
DLLLIB const fielddef& dummyFd()
|
|
325
616
|
{
|
|
@@ -330,152 +621,256 @@ DLLLIB const fielddef& dummyFd()
|
|
|
330
621
|
return fdDummy;
|
|
331
622
|
}
|
|
332
623
|
|
|
333
|
-
|
|
624
|
+
/*
|
|
625
|
+
For not string type
|
|
626
|
+
Cast is faster than memcopy.
|
|
334
627
|
|
|
335
|
-
|
|
628
|
+
Currency : if get by int64 pure value, if get by double 1/10000 value.
|
|
629
|
+
*/
|
|
630
|
+
__int64 field::readValue64() const
|
|
336
631
|
{
|
|
632
|
+
const uchar_td* ptr = (uchar_td*)m_ptr + m_fd->pos;
|
|
337
633
|
__int64 ret = 0;
|
|
338
|
-
|
|
634
|
+
switch (m_fd->type)
|
|
339
635
|
{
|
|
340
|
-
|
|
636
|
+
case ft_integer:
|
|
637
|
+
case ft_autoinc:
|
|
638
|
+
switch (m_fd->len)
|
|
341
639
|
{
|
|
342
|
-
case
|
|
343
|
-
|
|
344
|
-
switch (fd.len)
|
|
345
|
-
{
|
|
346
|
-
case 1:
|
|
347
|
-
ret = *((char*)(ptr + fd.pos));
|
|
348
|
-
break;
|
|
349
|
-
case 2:
|
|
350
|
-
ret = *((short*)(ptr + fd.pos));
|
|
351
|
-
break;
|
|
352
|
-
case 4:
|
|
353
|
-
ret = *((int*)(ptr + fd.pos));
|
|
354
|
-
break;
|
|
355
|
-
case 8:
|
|
356
|
-
ret = *((__int64*)(ptr + fd.pos));
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
case ft_autoIncUnsigned:
|
|
360
|
-
case ft_uinteger:
|
|
361
|
-
case ft_logical:
|
|
362
|
-
case ft_bit:
|
|
363
|
-
case ft_date:
|
|
364
|
-
case ft_time:
|
|
365
|
-
case ft_timestamp:
|
|
366
|
-
case ft_mydate:
|
|
367
|
-
case ft_mytime:
|
|
368
|
-
case ft_mydatetime:
|
|
369
|
-
case ft_mytimestamp:
|
|
370
|
-
switch (fd.len)
|
|
371
|
-
{
|
|
372
|
-
case 1:
|
|
373
|
-
ret = *((unsigned char*)(ptr + fd.pos));
|
|
374
|
-
break;
|
|
375
|
-
case 2:
|
|
376
|
-
ret = *((unsigned short*)(ptr + fd.pos));
|
|
377
|
-
break;
|
|
378
|
-
case 4:
|
|
379
|
-
ret = *((unsigned int*)(ptr + fd.pos));
|
|
380
|
-
break;
|
|
381
|
-
case 3:
|
|
382
|
-
case 5:
|
|
383
|
-
case 6:
|
|
384
|
-
case 7:
|
|
385
|
-
memcpy(&ret, ptr + fd.pos, fd.len);
|
|
386
|
-
break;
|
|
387
|
-
case 8:
|
|
388
|
-
ret = *((__int64*)(ptr + fd.pos));
|
|
389
|
-
break;
|
|
390
|
-
}
|
|
640
|
+
case 1:
|
|
641
|
+
ret = *((char*)ptr);
|
|
391
642
|
break;
|
|
392
|
-
case
|
|
393
|
-
ret =
|
|
643
|
+
case 2:
|
|
644
|
+
ret = *((short*)ptr);
|
|
394
645
|
break;
|
|
395
|
-
case
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
646
|
+
case 3:
|
|
647
|
+
ret = int24toInt((const char*)ptr);
|
|
648
|
+
break;
|
|
649
|
+
case 4:
|
|
650
|
+
ret = *((int*)ptr);
|
|
651
|
+
break;
|
|
652
|
+
case 8:
|
|
653
|
+
ret = *((__int64*)ptr);
|
|
654
|
+
break;
|
|
655
|
+
}
|
|
656
|
+
break;
|
|
657
|
+
case ft_autoIncUnsigned:
|
|
658
|
+
case ft_uinteger:
|
|
659
|
+
case ft_logical:
|
|
660
|
+
case ft_date:
|
|
661
|
+
case ft_time:
|
|
662
|
+
case ft_timestamp:
|
|
663
|
+
case ft_currency:
|
|
664
|
+
case ft_myyear:
|
|
665
|
+
case ft_enum: // 1 - 2 byte 0 - 65535
|
|
666
|
+
case ft_set: // 1 2 3 4 8 byte 64 item
|
|
667
|
+
case ft_bit: // 1 - 8 byte 64 item
|
|
668
|
+
switch (m_fd->len)
|
|
669
|
+
{
|
|
670
|
+
case 1:
|
|
671
|
+
ret = *((unsigned char*)ptr);
|
|
672
|
+
break;
|
|
673
|
+
case 2:
|
|
674
|
+
ret = *((unsigned short*)ptr);
|
|
675
|
+
break;
|
|
676
|
+
case 3:
|
|
677
|
+
ret = int24toUint((const char*)ptr);
|
|
678
|
+
break;
|
|
679
|
+
case 4:
|
|
680
|
+
ret = *((unsigned int*)ptr);
|
|
681
|
+
break;
|
|
682
|
+
case 8:
|
|
683
|
+
ret = *((__int64*)ptr);
|
|
684
|
+
break;
|
|
685
|
+
case 5:
|
|
686
|
+
case 6:
|
|
687
|
+
case 7:
|
|
688
|
+
memcpy(&ret, ptr, m_fd->len);// for bit
|
|
689
|
+
break;
|
|
690
|
+
}
|
|
691
|
+
break;
|
|
692
|
+
case ft_mydate:
|
|
693
|
+
case ft_mytime:
|
|
694
|
+
case ft_mydatetime:
|
|
695
|
+
case ft_mytimestamp:
|
|
696
|
+
//get big endian value
|
|
697
|
+
switch (m_fd->len)
|
|
698
|
+
{
|
|
699
|
+
case 3:
|
|
700
|
+
case 5:
|
|
701
|
+
case 6:
|
|
702
|
+
case 7:
|
|
703
|
+
memcpy(&ret, ptr, m_fd->len);
|
|
704
|
+
break;
|
|
705
|
+
case 4:
|
|
706
|
+
ret = *((unsigned int*)ptr);
|
|
707
|
+
break;
|
|
708
|
+
case 8:
|
|
709
|
+
ret = *((__int64*)ptr);
|
|
408
710
|
break;
|
|
711
|
+
default:
|
|
712
|
+
return ret;
|
|
409
713
|
}
|
|
714
|
+
break;
|
|
715
|
+
default:
|
|
716
|
+
assert(0);
|
|
410
717
|
}
|
|
411
718
|
return ret;
|
|
412
719
|
}
|
|
413
720
|
|
|
414
|
-
|
|
721
|
+
void field::storeValue64(__int64 value)
|
|
415
722
|
{
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
switch (fd.type)
|
|
723
|
+
uchar_td* ptr = (uchar_td*)m_ptr + m_fd->pos;
|
|
724
|
+
switch (m_fd->type)
|
|
419
725
|
{
|
|
420
726
|
case ft_integer:
|
|
421
727
|
case ft_autoinc:
|
|
422
728
|
{
|
|
423
|
-
switch (
|
|
729
|
+
switch (m_fd->len)
|
|
424
730
|
{
|
|
425
731
|
case 1:
|
|
426
|
-
*((char*)
|
|
732
|
+
*((char*)ptr) = (char)value;
|
|
427
733
|
break;
|
|
428
734
|
case 2:
|
|
429
|
-
*((short*)
|
|
735
|
+
*((short*)ptr) = (short)value;
|
|
736
|
+
break;
|
|
737
|
+
case 3:
|
|
738
|
+
storeInt24((int)value, (char*) ptr);
|
|
430
739
|
break;
|
|
431
740
|
case 4:
|
|
432
|
-
*((int*)
|
|
741
|
+
*((int*)ptr) = (int)value;
|
|
433
742
|
break;
|
|
434
743
|
case 8:
|
|
435
|
-
*((__int64*)
|
|
744
|
+
*((__int64*)ptr) = value;
|
|
436
745
|
break;
|
|
437
746
|
}
|
|
747
|
+
break;
|
|
438
748
|
}
|
|
439
749
|
case ft_autoIncUnsigned:
|
|
440
750
|
case ft_uinteger:
|
|
441
751
|
case ft_logical:
|
|
442
|
-
case ft_bit:
|
|
443
|
-
case ft_currency:
|
|
444
752
|
case ft_date:
|
|
445
753
|
case ft_time:
|
|
446
754
|
case ft_timestamp:
|
|
447
|
-
case
|
|
755
|
+
case ft_currency:
|
|
756
|
+
case ft_myyear:
|
|
757
|
+
case ft_enum: // 1 - 2 byte 0 - 65535
|
|
758
|
+
case ft_set: // 1 2 3 4 8 byte 64 item
|
|
759
|
+
case ft_bit: // 1 - 8 byte 64 item
|
|
760
|
+
{
|
|
761
|
+
switch (m_fd->len)
|
|
762
|
+
{
|
|
763
|
+
case 1:
|
|
764
|
+
*((char*)ptr) = (char)value;
|
|
765
|
+
break;
|
|
766
|
+
case 2:
|
|
767
|
+
*((unsigned short*)ptr) = (unsigned short)value;
|
|
768
|
+
break;
|
|
769
|
+
case 3:
|
|
770
|
+
storeUint24((int)value, (char*) ptr);
|
|
771
|
+
break;
|
|
772
|
+
case 4:
|
|
773
|
+
*((unsigned int*)ptr) = (unsigned int)value;
|
|
774
|
+
break;
|
|
775
|
+
case 8:
|
|
776
|
+
*((__int64*)ptr) = value;
|
|
777
|
+
break;
|
|
778
|
+
case 5:
|
|
779
|
+
case 6:
|
|
780
|
+
case 7:
|
|
781
|
+
memcpy(ptr, &value, m_fd->len); // for bit
|
|
782
|
+
break;
|
|
783
|
+
}
|
|
784
|
+
break;
|
|
785
|
+
}
|
|
448
786
|
case ft_mydate:
|
|
787
|
+
case ft_mytime:
|
|
449
788
|
case ft_mydatetime:
|
|
450
789
|
case ft_mytimestamp:
|
|
451
|
-
|
|
790
|
+
{
|
|
791
|
+
switch (m_fd->len)
|
|
792
|
+
{
|
|
793
|
+
case 3:
|
|
794
|
+
case 5:
|
|
795
|
+
case 6:
|
|
796
|
+
case 7:
|
|
797
|
+
memcpy(ptr, &value, m_fd->len);
|
|
798
|
+
break;
|
|
799
|
+
case 4:
|
|
800
|
+
*((unsigned int*)ptr) = (unsigned int)value;
|
|
801
|
+
break;
|
|
802
|
+
case 8:
|
|
803
|
+
*((__int64*)ptr) = value;
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
452
806
|
break;
|
|
453
807
|
}
|
|
808
|
+
default:
|
|
809
|
+
assert(0);
|
|
810
|
+
}
|
|
454
811
|
}
|
|
455
812
|
|
|
456
|
-
|
|
813
|
+
double field::readValueDbl() const
|
|
457
814
|
{
|
|
458
|
-
|
|
815
|
+
const uchar_td* ptr = (uchar_td*)m_ptr + m_fd->pos;
|
|
816
|
+
double ret = 0;
|
|
817
|
+
switch (m_fd->type)
|
|
818
|
+
{
|
|
819
|
+
case ft_bfloat:
|
|
820
|
+
case ft_float:
|
|
821
|
+
switch (m_fd->len)
|
|
822
|
+
{
|
|
823
|
+
case 4:
|
|
824
|
+
ret = (double)*((float*)ptr);
|
|
825
|
+
break;
|
|
826
|
+
case 8:
|
|
827
|
+
ret = (double)*((double*)ptr);
|
|
828
|
+
break;
|
|
829
|
+
case 10: // long double
|
|
830
|
+
ret = (double)*((long double*)ptr);
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
break;
|
|
834
|
+
default:
|
|
835
|
+
assert(0);
|
|
836
|
+
}
|
|
837
|
+
return ret;
|
|
459
838
|
}
|
|
460
839
|
|
|
461
|
-
void field::
|
|
840
|
+
void field::storeValueDbl(double value)
|
|
462
841
|
{
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
__int64 value;
|
|
466
|
-
double fltValue;
|
|
467
|
-
|
|
468
|
-
char* p = (char*)m_ptr + m_fd->pos;
|
|
469
|
-
if (data == NULL)
|
|
842
|
+
uchar_td* ptr = (uchar_td*)m_ptr + m_fd->pos;
|
|
843
|
+
switch (m_fd->type)
|
|
470
844
|
{
|
|
471
|
-
|
|
472
|
-
|
|
845
|
+
case ft_bfloat:
|
|
846
|
+
case ft_float:
|
|
847
|
+
{
|
|
848
|
+
switch (m_fd->len)
|
|
849
|
+
{
|
|
850
|
+
case 4:
|
|
851
|
+
*((float*)ptr) = (float)value;
|
|
852
|
+
break;
|
|
853
|
+
case 8:
|
|
854
|
+
*((double*)ptr) = (double)value;
|
|
855
|
+
break;
|
|
856
|
+
case 10: // long double
|
|
857
|
+
*((long double*)ptr) = (long double)value;
|
|
858
|
+
break;
|
|
859
|
+
}
|
|
860
|
+
break;
|
|
861
|
+
}
|
|
862
|
+
default:
|
|
863
|
+
assert(0);
|
|
473
864
|
}
|
|
865
|
+
}
|
|
474
866
|
|
|
867
|
+
void field::storeValueStrA(const char* data)
|
|
868
|
+
{
|
|
869
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
475
870
|
switch (m_fd->type)
|
|
476
871
|
{
|
|
477
872
|
case ft_string:
|
|
478
|
-
if (m_fd->
|
|
873
|
+
if (m_fd->isUsePadChar())
|
|
479
874
|
return store<stringStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
480
875
|
return store<binaryStore, char, char>(p, data, *m_fd, m_fds->cv());
|
|
481
876
|
case ft_note:
|
|
@@ -484,7 +879,7 @@ void field::setFVA(const char* data)
|
|
|
484
879
|
case ft_wzstring:
|
|
485
880
|
return store<wzstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
486
881
|
case ft_wstring:
|
|
487
|
-
if (m_fd->
|
|
882
|
+
if (m_fd->isUsePadChar())
|
|
488
883
|
return store<wstringStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
489
884
|
return store<wbinaryStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
490
885
|
case ft_mychar:
|
|
@@ -499,107 +894,73 @@ void field::setFVA(const char* data)
|
|
|
499
894
|
case ft_mywvarchar:
|
|
500
895
|
return store<myWvarCharStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
501
896
|
case ft_mywvarbinary:
|
|
502
|
-
return store<myWvarBinaryStore, WCHAR, char>(p, data, *m_fd,
|
|
503
|
-
m_fds->cv());
|
|
897
|
+
return store<myWvarBinaryStore, WCHAR, char>(p, data, *m_fd, m_fds->cv());
|
|
504
898
|
case ft_myblob:
|
|
505
899
|
case ft_mytext:
|
|
506
900
|
{
|
|
507
901
|
char* tmp = blobStore<char>(p, data, *m_fd, m_fds->cv());
|
|
508
902
|
const_cast<fielddefs*>(m_fds)->blobPushBack(tmp);
|
|
509
|
-
|
|
903
|
+
break;
|
|
510
904
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
case ft_numericsts:
|
|
516
|
-
case ft_numericsa:
|
|
517
|
-
case ft_currency: // currecy
|
|
518
|
-
case ft_float: // float double
|
|
519
|
-
fltValue = atof(data);
|
|
520
|
-
setFV(fltValue);
|
|
521
|
-
return;
|
|
522
|
-
case ft_lvar: // Lvar
|
|
523
|
-
return;
|
|
905
|
+
default:
|
|
906
|
+
assert(0);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
524
909
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
value = /*StrToBtrTime*/ atobtrt((const char*)data).i;
|
|
530
|
-
break;
|
|
531
|
-
case ft_autoIncUnsigned:
|
|
532
|
-
case ft_uinteger:
|
|
533
|
-
case ft_integer:
|
|
534
|
-
case ft_autoinc:
|
|
535
|
-
case ft_bit:
|
|
536
|
-
value = _atoi64(data);
|
|
537
|
-
break;
|
|
538
|
-
case ft_logical:
|
|
539
|
-
if (m_fds->logicalToString)
|
|
540
|
-
{
|
|
541
|
-
char tmp[5];
|
|
542
|
-
strncpy(tmp, data, 5);
|
|
543
|
-
if (strcmp(_strupr(tmp), "YES") == 0)
|
|
544
|
-
value = 1;
|
|
545
|
-
else
|
|
546
|
-
value = 0;
|
|
547
|
-
}
|
|
548
|
-
else
|
|
549
|
-
value = atol(data);
|
|
550
|
-
break;
|
|
551
|
-
case ft_timestamp:
|
|
552
|
-
case ft_mytimestamp:
|
|
553
|
-
value = 0;
|
|
554
|
-
break;
|
|
555
|
-
case ft_mydate:
|
|
556
|
-
{
|
|
557
|
-
myDate d;
|
|
558
|
-
d = data;
|
|
559
|
-
value = d.getValue();
|
|
560
|
-
break;
|
|
561
|
-
}
|
|
562
|
-
case ft_mytime:
|
|
563
|
-
{
|
|
564
|
-
myTime t(m_fd->len);
|
|
565
|
-
t = data;
|
|
566
|
-
value = t.getValue();
|
|
567
|
-
break;
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
case ft_mydatetime:
|
|
910
|
+
const char* field::readValueStrA() const
|
|
911
|
+
{
|
|
912
|
+
char* data = (char*)m_ptr + m_fd->pos;
|
|
913
|
+
switch (m_fd->type)
|
|
571
914
|
{
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
915
|
+
case ft_string:
|
|
916
|
+
return read<stringStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
917
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
918
|
+
case ft_note:
|
|
919
|
+
case ft_zstring:
|
|
920
|
+
return read<zstringStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
921
|
+
m_fds->cv());
|
|
922
|
+
case ft_wzstring:
|
|
923
|
+
return read<wzstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
924
|
+
m_fds->cv());
|
|
925
|
+
case ft_wstring:
|
|
926
|
+
return read<wstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
927
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
928
|
+
case ft_mychar:
|
|
929
|
+
return read<myCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
930
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
931
|
+
case ft_myvarchar:
|
|
932
|
+
return read<myVarCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
933
|
+
m_fds->cv());
|
|
934
|
+
case ft_lstring:
|
|
935
|
+
case ft_myvarbinary:
|
|
936
|
+
return read<myVarBinaryStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
937
|
+
m_fds->cv());
|
|
938
|
+
case ft_mywchar:
|
|
939
|
+
return read<myWcharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
940
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
941
|
+
case ft_mywvarchar:
|
|
942
|
+
return read<myWvarCharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
943
|
+
m_fds->cv());
|
|
944
|
+
case ft_mywvarbinary:
|
|
945
|
+
return read<myWvarBinaryStore, WCHAR, char>(data, m_fds->strBufs(),
|
|
946
|
+
*m_fd, m_fds->cv());
|
|
947
|
+
case ft_myblob:
|
|
948
|
+
case ft_mytext:
|
|
949
|
+
return readBlob<char>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
577
950
|
default:
|
|
578
|
-
|
|
951
|
+
assert(0);
|
|
952
|
+
return NULL;
|
|
579
953
|
}
|
|
580
|
-
setValue(*m_fd, (uchar_td*)m_ptr, value);
|
|
581
954
|
}
|
|
582
955
|
|
|
583
956
|
#ifdef _WIN32
|
|
584
|
-
|
|
585
|
-
void field::setFVW(const wchar_t* data)
|
|
957
|
+
void field::storeValueStrW(const WCHAR* data)
|
|
586
958
|
{
|
|
587
|
-
if (!m_ptr)
|
|
588
|
-
return;
|
|
589
|
-
int value;
|
|
590
|
-
double fltValue;
|
|
591
|
-
|
|
592
959
|
char* p = (char*)m_ptr + m_fd->pos;
|
|
593
|
-
if (data == NULL)
|
|
594
|
-
{
|
|
595
|
-
memset(p, 0, m_fd->len);
|
|
596
|
-
return;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
960
|
switch (m_fd->type)
|
|
600
961
|
{
|
|
601
962
|
case ft_string:
|
|
602
|
-
if (m_fd->
|
|
963
|
+
if (m_fd->isUsePadChar())
|
|
603
964
|
return store<stringStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
604
965
|
return store<binaryStore, char, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
605
966
|
case ft_note:
|
|
@@ -608,7 +969,7 @@ void field::setFVW(const wchar_t* data)
|
|
|
608
969
|
case ft_wzstring:
|
|
609
970
|
return store<wzstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
610
971
|
case ft_wstring:
|
|
611
|
-
if (m_fd->
|
|
972
|
+
if (m_fd->isUsePadChar())
|
|
612
973
|
return store<wstringStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
613
974
|
return store<wbinaryStore, WCHAR, WCHAR>(p, data, *m_fd, m_fds->cv());
|
|
614
975
|
case ft_mychar:
|
|
@@ -634,889 +995,714 @@ void field::setFVW(const wchar_t* data)
|
|
|
634
995
|
const_cast<fielddefs*>(m_fds)->blobPushBack(tmp);
|
|
635
996
|
return;
|
|
636
997
|
}
|
|
998
|
+
default:
|
|
999
|
+
assert(0);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
637
1002
|
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
case ft_time: // time hh:nn:ss
|
|
643
|
-
value = /*StrToBtrTime*/ atobtrt(data).i;
|
|
644
|
-
setFV(value);
|
|
645
|
-
return;
|
|
646
|
-
|
|
647
|
-
case ft_autoIncUnsigned:
|
|
648
|
-
case ft_uinteger:
|
|
649
|
-
case ft_integer:
|
|
650
|
-
case ft_autoinc:
|
|
651
|
-
case ft_bit:
|
|
1003
|
+
const WCHAR* field::readValueStrW() const
|
|
1004
|
+
{
|
|
1005
|
+
char* data = (char*)m_ptr + m_fd->pos;
|
|
1006
|
+
switch (m_fd->type)
|
|
652
1007
|
{
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
1008
|
+
case ft_string:
|
|
1009
|
+
return read<stringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1010
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
1011
|
+
case ft_note:
|
|
1012
|
+
case ft_zstring:
|
|
1013
|
+
return read<zstringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1014
|
+
m_fds->cv());
|
|
1015
|
+
case ft_wzstring:
|
|
1016
|
+
return read<wzstringStore, WCHAR, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1017
|
+
m_fds->cv());
|
|
1018
|
+
case ft_wstring:
|
|
1019
|
+
return read<wstringStore, WCHAR, WCHAR>(
|
|
1020
|
+
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->isTrimPadChar());
|
|
1021
|
+
case ft_mychar:
|
|
1022
|
+
return read<myCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1023
|
+
m_fds->cv(), m_fd->isTrimPadChar());
|
|
1024
|
+
case ft_myvarchar:
|
|
1025
|
+
return read<myVarCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1026
|
+
m_fds->cv());
|
|
1027
|
+
case ft_lstring:
|
|
1028
|
+
case ft_myvarbinary:
|
|
1029
|
+
return read<myVarBinaryStore, char, WCHAR>(data, m_fds->strBufs(),
|
|
1030
|
+
*m_fd, m_fds->cv());
|
|
1031
|
+
case ft_mywchar:
|
|
1032
|
+
return read<myWcharStore, WCHAR, WCHAR>(
|
|
1033
|
+
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->isTrimPadChar());
|
|
1034
|
+
case ft_mywvarchar:
|
|
1035
|
+
return read<myWvarCharStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1036
|
+
*m_fd, m_fds->cv());
|
|
1037
|
+
case ft_mywvarbinary:
|
|
1038
|
+
return read<myWvarBinaryStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1039
|
+
*m_fd, m_fds->cv());
|
|
1040
|
+
case ft_myblob:
|
|
1041
|
+
case ft_mytext:
|
|
1042
|
+
return readBlob<WCHAR>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
1043
|
+
default:
|
|
1044
|
+
assert(0);
|
|
1045
|
+
return NULL;
|
|
656
1046
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
{
|
|
660
|
-
wchar_t tmp[5];
|
|
661
|
-
wcsncpy(tmp, data, 5);
|
|
1047
|
+
}
|
|
1048
|
+
#endif //_WIN32
|
|
662
1049
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
1050
|
+
void field::storeValueNumeric(double data)
|
|
1051
|
+
{ // Double -> Numeric
|
|
1052
|
+
|
|
1053
|
+
char buf[NUMBUFSIZE] = "%+0";
|
|
1054
|
+
char dummy[NUMBUFSIZE];
|
|
1055
|
+
int point;
|
|
1056
|
+
int n;
|
|
1057
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1058
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1059
|
+
bool sign = false;
|
|
1060
|
+
char* t;
|
|
1061
|
+
|
|
1062
|
+
point = m_fd->len + 1;
|
|
1063
|
+
|
|
1064
|
+
_ltoa_s(point, dummy, NUMBUFSIZE, 10);
|
|
1065
|
+
strcat(buf, dummy);
|
|
1066
|
+
strcat(buf, ".");
|
|
1067
|
+
_ltoa_s(m_fd->decimals, dummy, NUMBUFSIZE, 10);
|
|
1068
|
+
strcat(buf, dummy);
|
|
1069
|
+
strcat(buf, "lf");
|
|
1070
|
+
sprintf_s(dummy, NUMBUFSIZE, buf, data);
|
|
1071
|
+
if (dummy[0] == '-')
|
|
1072
|
+
sign = true;
|
|
1073
|
+
|
|
1074
|
+
strcpy(buf, &dummy[point - m_fd->decimals] + 1);
|
|
1075
|
+
dummy[point - m_fd->decimals] = 0x00;
|
|
1076
|
+
strcat(dummy, buf);
|
|
672
1077
|
|
|
673
|
-
|
|
674
|
-
|
|
1078
|
+
n = atol(&dummy[m_fd->len]);
|
|
1079
|
+
if (sign)
|
|
1080
|
+
n += 10;
|
|
1081
|
+
t = dummy + 1;
|
|
1082
|
+
switch (m_fd->type)
|
|
1083
|
+
{
|
|
675
1084
|
case ft_numeric:
|
|
676
|
-
|
|
677
|
-
|
|
1085
|
+
dummy[m_fd->len] = dp[n];
|
|
1086
|
+
break;
|
|
678
1087
|
case ft_numericsa:
|
|
679
|
-
|
|
680
|
-
case ft_float:
|
|
681
|
-
fltValue = _wtof(data);
|
|
682
|
-
setFV(fltValue);
|
|
1088
|
+
dummy[m_fd->len] = dpsa[n];
|
|
683
1089
|
break;
|
|
684
|
-
case
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
case ft_mydate:
|
|
691
|
-
{
|
|
692
|
-
myDate d;
|
|
693
|
-
d = data;
|
|
694
|
-
setValue(*m_fd, (uchar_td*)m_ptr, d.getValue());
|
|
695
|
-
return;
|
|
696
|
-
}
|
|
697
|
-
case ft_mytime:
|
|
698
|
-
{
|
|
699
|
-
myTime t(m_fd->len);
|
|
700
|
-
t = data;
|
|
701
|
-
setValue(*m_fd, (uchar_td*)m_ptr, t.getValue());
|
|
702
|
-
return;
|
|
703
|
-
}
|
|
704
|
-
case ft_mydatetime:
|
|
705
|
-
{
|
|
706
|
-
myDateTime t(m_fd->len);
|
|
707
|
-
t = data;
|
|
708
|
-
setFV(t.getValue());
|
|
709
|
-
return;
|
|
710
|
-
}
|
|
711
|
-
case ft_mytimestamp:
|
|
712
|
-
case ft_lvar:
|
|
1090
|
+
case ft_numericsts:
|
|
1091
|
+
if (sign)
|
|
1092
|
+
strcat(dummy, "-");
|
|
1093
|
+
else
|
|
1094
|
+
strcat(dummy, "+");
|
|
1095
|
+
t += 1;
|
|
713
1096
|
break;
|
|
1097
|
+
default:
|
|
1098
|
+
assert(0);
|
|
714
1099
|
}
|
|
1100
|
+
memcpy((void*)((char*)m_ptr + m_fd->pos), t, m_fd->len);
|
|
715
1101
|
}
|
|
716
1102
|
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
void field::setFV(unsigned char data)
|
|
1103
|
+
double field::readValueNumeric() const
|
|
720
1104
|
{
|
|
1105
|
+
char* t;
|
|
1106
|
+
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1107
|
+
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1108
|
+
char* pdp = NULL;
|
|
1109
|
+
int i;
|
|
1110
|
+
char buf[NUMBUFSIZE] = { 0x00 };
|
|
1111
|
+
char dummy[NUMBUFSIZE];
|
|
721
1112
|
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
1113
|
+
buf[0] = '+';
|
|
1114
|
+
strncpy(buf + 1, (char*)((char*)m_ptr + m_fd->pos), m_fd->len);
|
|
1115
|
+
|
|
1116
|
+
t = &(buf[m_fd->len]);
|
|
725
1117
|
|
|
726
|
-
void field::setFV(int data)
|
|
727
|
-
{
|
|
728
|
-
if (!m_ptr)
|
|
729
|
-
return;
|
|
730
|
-
char buf[50];
|
|
731
|
-
double d;
|
|
732
|
-
int v = data;
|
|
733
1118
|
switch (m_fd->type)
|
|
734
1119
|
{
|
|
735
|
-
case
|
|
736
|
-
|
|
737
|
-
myDate myd;
|
|
738
|
-
myd.setValue(data, m_fds->myDateTimeValueByBtrv);
|
|
739
|
-
setValue(*m_fd, (uchar_td*)m_ptr, myd.getValue());
|
|
1120
|
+
case ft_numeric:
|
|
1121
|
+
pdp = dp;
|
|
740
1122
|
break;
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
{
|
|
744
|
-
myTime myt(m_fd->len);
|
|
745
|
-
myt.setValue(data, m_fds->myDateTimeValueByBtrv);
|
|
746
|
-
setValue(*m_fd, (uchar_td*)m_ptr, myt.getValue());
|
|
1123
|
+
case ft_numericsa:
|
|
1124
|
+
pdp = dpsa;
|
|
747
1125
|
break;
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
case ft_time:
|
|
752
|
-
case ft_autoIncUnsigned:
|
|
753
|
-
case ft_uinteger:
|
|
754
|
-
case ft_logical:
|
|
755
|
-
case ft_autoinc:
|
|
756
|
-
case ft_bit:
|
|
757
|
-
case ft_mydatetime:
|
|
758
|
-
switch (m_fd->len)
|
|
759
|
-
{
|
|
760
|
-
case 1:
|
|
761
|
-
*((char*)((char*)m_ptr + m_fd->pos)) = (char)v;
|
|
762
|
-
break;
|
|
763
|
-
case 2:
|
|
764
|
-
*((short*)((char*)m_ptr + m_fd->pos)) = (short)v;
|
|
765
|
-
break;
|
|
766
|
-
case 3:
|
|
767
|
-
memcpy((char*)m_ptr + m_fd->pos, &v, 3);
|
|
768
|
-
break;
|
|
769
|
-
case 4:
|
|
770
|
-
*((int*)((char*)m_ptr + m_fd->pos)) = v;
|
|
771
|
-
break;
|
|
772
|
-
case 8:
|
|
773
|
-
*((__int64*)((char*)m_ptr + m_fd->pos)) = v;
|
|
774
|
-
break;
|
|
775
|
-
}
|
|
1126
|
+
case ft_numericsts:
|
|
1127
|
+
buf[0] = *t;
|
|
1128
|
+
*t = 0x00;
|
|
776
1129
|
break;
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
{
|
|
780
|
-
__int64 v = 0;
|
|
781
|
-
setFV(v);
|
|
782
|
-
return;
|
|
1130
|
+
default:
|
|
1131
|
+
assert(0);
|
|
783
1132
|
}
|
|
784
|
-
case ft_decimal:
|
|
785
|
-
case ft_money:
|
|
786
|
-
case ft_numeric:
|
|
787
|
-
case ft_bfloat:
|
|
788
|
-
case ft_numericsts:
|
|
789
|
-
case ft_numericsa:
|
|
790
1133
|
|
|
791
|
-
|
|
792
|
-
case ft_float:
|
|
793
|
-
d = (double)data;
|
|
794
|
-
setFV(d);
|
|
795
|
-
break;
|
|
796
|
-
case ft_string:
|
|
797
|
-
case ft_zstring:
|
|
798
|
-
case ft_note:
|
|
799
|
-
case ft_myvarbinary:
|
|
800
|
-
case ft_myvarchar:
|
|
801
|
-
case ft_mychar:
|
|
802
|
-
if (data == 0)
|
|
803
|
-
setFVA("");
|
|
804
|
-
else
|
|
805
|
-
{
|
|
806
|
-
_ltoa_s(data, buf, 50, 10);
|
|
807
|
-
setFVA(buf);
|
|
808
|
-
}
|
|
809
|
-
break;
|
|
810
|
-
case ft_mywvarbinary:
|
|
811
|
-
case ft_mywvarchar:
|
|
812
|
-
case ft_mywchar:
|
|
813
|
-
case ft_wstring:
|
|
814
|
-
case ft_wzstring:
|
|
1134
|
+
if (pdp)
|
|
815
1135
|
{
|
|
816
|
-
|
|
817
|
-
setFV(_T(""));
|
|
818
|
-
else
|
|
1136
|
+
for (i = 0; i < 21; i++)
|
|
819
1137
|
{
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
1138
|
+
if (*t == pdp[i])
|
|
1139
|
+
{
|
|
1140
|
+
if (i > 10)
|
|
1141
|
+
{
|
|
1142
|
+
buf[0] = '-';
|
|
1143
|
+
*t = (char)(i + 38);
|
|
1144
|
+
}
|
|
1145
|
+
else
|
|
1146
|
+
*t = (char)(i + 48);
|
|
1147
|
+
break;
|
|
1148
|
+
}
|
|
823
1149
|
}
|
|
824
|
-
break;
|
|
825
|
-
}
|
|
826
|
-
case ft_lvar:
|
|
827
|
-
break;
|
|
828
1150
|
}
|
|
1151
|
+
|
|
1152
|
+
t = buf + strlen(buf) - m_fd->decimals;
|
|
1153
|
+
strcpy(dummy, t);
|
|
1154
|
+
*t = '.';
|
|
1155
|
+
strcpy(t + 1, dummy);
|
|
1156
|
+
return atof(buf);
|
|
829
1157
|
}
|
|
830
1158
|
|
|
831
|
-
void field::
|
|
832
|
-
{
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
char
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
default:
|
|
854
|
-
break;
|
|
855
|
-
}
|
|
856
|
-
break;
|
|
857
|
-
case ft_decimal:
|
|
858
|
-
case ft_money:
|
|
859
|
-
setFVDecimal(data);
|
|
860
|
-
break;
|
|
861
|
-
case ft_numeric:
|
|
862
|
-
case ft_numericsts:
|
|
863
|
-
case ft_numericsa:
|
|
864
|
-
setFVNumeric(data);
|
|
865
|
-
break;
|
|
1159
|
+
void field::storeValueDecimal(double data)
|
|
1160
|
+
{ // Double -> Decimal
|
|
1161
|
+
assert(m_fd->type == ft_decimal || m_fd->type == ft_money);
|
|
1162
|
+
char buf[NUMBUFSIZE] = "%+0";
|
|
1163
|
+
char dummy[NUMBUFSIZE];
|
|
1164
|
+
int point;
|
|
1165
|
+
bool sign = false;
|
|
1166
|
+
unsigned char n;
|
|
1167
|
+
int i, k;
|
|
1168
|
+
int strl;
|
|
1169
|
+
bool offset = false;
|
|
1170
|
+
|
|
1171
|
+
point = (m_fd->len) * 2;
|
|
1172
|
+
_ltoa_s(point, dummy, NUMBUFSIZE, 10);
|
|
1173
|
+
strcat(buf, dummy);
|
|
1174
|
+
strcat(buf, ".");
|
|
1175
|
+
_ltoa_s(m_fd->decimals, dummy, NUMBUFSIZE, 10);
|
|
1176
|
+
strcat(buf, dummy);
|
|
1177
|
+
strcat(buf, "lf");
|
|
1178
|
+
sprintf_s(dummy, NUMBUFSIZE, buf, data);
|
|
1179
|
+
if (dummy[0] == '-')
|
|
1180
|
+
sign = true;
|
|
866
1181
|
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
case ft_uinteger:
|
|
872
|
-
case ft_logical:
|
|
873
|
-
case ft_autoinc:
|
|
874
|
-
case ft_timestamp:
|
|
875
|
-
case ft_bit:
|
|
876
|
-
case ft_mydate:
|
|
877
|
-
case ft_mytime:
|
|
878
|
-
case ft_mydatetime:
|
|
879
|
-
case ft_mytimestamp:
|
|
880
|
-
i64 = (__int64)data;
|
|
881
|
-
setFV(i64);
|
|
882
|
-
break;
|
|
883
|
-
case ft_string:
|
|
884
|
-
case ft_zstring:
|
|
885
|
-
case ft_note:
|
|
886
|
-
case ft_myvarbinary:
|
|
887
|
-
case ft_myvarchar:
|
|
888
|
-
case ft_mychar:
|
|
889
|
-
if (data == 0)
|
|
890
|
-
setFVA("");
|
|
891
|
-
else
|
|
892
|
-
{
|
|
893
|
-
sprintf(buf, "%f", data);
|
|
894
|
-
setFVA(buf);
|
|
895
|
-
break;
|
|
896
|
-
}
|
|
897
|
-
case ft_lvar:
|
|
898
|
-
break;
|
|
899
|
-
case ft_mywvarbinary:
|
|
900
|
-
case ft_mywvarchar:
|
|
901
|
-
case ft_mywchar:
|
|
902
|
-
case ft_wstring:
|
|
903
|
-
case ft_wzstring:
|
|
1182
|
+
strl = (int)strlen(dummy + 1) - 1;
|
|
1183
|
+
if (strl % 2 == 1)
|
|
1184
|
+
strl = strl / 2;
|
|
1185
|
+
else
|
|
904
1186
|
{
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
1187
|
+
strl = strl / 2 + 1;
|
|
1188
|
+
offset = true;
|
|
1189
|
+
}
|
|
1190
|
+
memset(buf, 0, 30);
|
|
1191
|
+
k = 0;
|
|
1192
|
+
n = 0;
|
|
1193
|
+
point = (int)strlen(dummy + 1);
|
|
1194
|
+
if (strl <= m_fd->len)
|
|
1195
|
+
{
|
|
1196
|
+
for (i = 1; i <= point; i++)
|
|
908
1197
|
{
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
1198
|
+
if ((dummy[i] == '-') || (dummy[i] == '.'))
|
|
1199
|
+
;
|
|
1200
|
+
else
|
|
1201
|
+
{
|
|
1202
|
+
if (offset)
|
|
1203
|
+
{
|
|
1204
|
+
n = (unsigned char)(n + dummy[i] - 48);
|
|
1205
|
+
buf[k] = n;
|
|
1206
|
+
offset = false;
|
|
1207
|
+
k++;
|
|
1208
|
+
}
|
|
1209
|
+
else
|
|
1210
|
+
{
|
|
1211
|
+
n = (unsigned char)(dummy[i] - 48);
|
|
1212
|
+
n = (unsigned char)(n << 4);
|
|
1213
|
+
offset = true;
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
912
1216
|
}
|
|
913
|
-
|
|
914
|
-
|
|
1217
|
+
if (sign)
|
|
1218
|
+
buf[k] += ((unsigned char)(n + 13));
|
|
1219
|
+
else
|
|
1220
|
+
buf[k] += ((unsigned char)(n + 12));
|
|
915
1221
|
}
|
|
1222
|
+
memcpy((void*)((char*)m_ptr + m_fd->pos), buf, m_fd->len);
|
|
916
1223
|
}
|
|
917
1224
|
|
|
918
|
-
|
|
1225
|
+
double field::readValueDecimal() const
|
|
919
1226
|
{
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
}
|
|
1227
|
+
assert(m_fd->type == ft_decimal || m_fd->type == ft_money);
|
|
1228
|
+
unsigned char buf[20] = { 0x00 };
|
|
1229
|
+
char result[30] = { 0x00 };
|
|
1230
|
+
char n[10];
|
|
1231
|
+
int i;
|
|
1232
|
+
char* t;
|
|
1233
|
+
unsigned char sign;
|
|
1234
|
+
int len = m_fd->len;
|
|
1235
|
+
result[0] = '+';
|
|
1236
|
+
memcpy(buf, (void*)((char*)m_ptr + m_fd->pos), len);
|
|
1237
|
+
sign = (unsigned char)(buf[len - 1] & 0x0F);
|
|
1238
|
+
buf[len - 1] = (unsigned char)(buf[len - 1] & 0xF0);
|
|
1239
|
+
for (i = 0; i < len; i++)
|
|
1240
|
+
{
|
|
1241
|
+
sprintf_s(n, 10, "%02x", buf[i]);
|
|
1242
|
+
strcat(result, n);
|
|
1243
|
+
}
|
|
1244
|
+
i = (int)strlen(result);
|
|
923
1245
|
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
setFV(value);
|
|
928
|
-
}
|
|
1246
|
+
if (sign == 13)
|
|
1247
|
+
result[0] = '-';
|
|
1248
|
+
result[i - 1] = 0x00;
|
|
929
1249
|
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
1250
|
+
t = result + (m_fd->len * 2) - m_fd->decimals;
|
|
1251
|
+
strcpy((char*)buf, t);
|
|
1252
|
+
*t = '.';
|
|
1253
|
+
strcpy(t + 1, (char*)buf);
|
|
1254
|
+
return atof(result);
|
|
933
1255
|
}
|
|
934
1256
|
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
case
|
|
943
|
-
case
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
case
|
|
963
|
-
case
|
|
964
|
-
case
|
|
965
|
-
case ft_bit:
|
|
966
|
-
case ft_date:
|
|
967
|
-
case ft_time:
|
|
968
|
-
case ft_timestamp:
|
|
969
|
-
case ft_mydatetime:
|
|
970
|
-
case ft_mytimestamp:
|
|
971
|
-
switch (m_fd->len)
|
|
972
|
-
{
|
|
973
|
-
case 1:
|
|
974
|
-
ret = *((unsigned char*)((char*)m_ptr + m_fd->pos));
|
|
975
|
-
break;
|
|
976
|
-
case 2:
|
|
977
|
-
ret = *((unsigned short*)((char*)m_ptr + m_fd->pos));
|
|
978
|
-
break;
|
|
979
|
-
case 3:
|
|
980
|
-
memcpy(&ret, (char*)m_ptr + m_fd->pos, 3);
|
|
981
|
-
break;
|
|
982
|
-
case 8:
|
|
983
|
-
case 4:
|
|
984
|
-
ret = *((unsigned int*)((char*)m_ptr + m_fd->pos));
|
|
985
|
-
break;
|
|
986
|
-
}
|
|
987
|
-
break;
|
|
988
|
-
case ft_mydate:
|
|
989
|
-
{
|
|
990
|
-
myDate myd;
|
|
991
|
-
myd.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
992
|
-
ret = myd.getValue(m_fds->myDateTimeValueByBtrv);
|
|
993
|
-
break;
|
|
994
|
-
}
|
|
995
|
-
case ft_mytime:
|
|
996
|
-
{
|
|
997
|
-
myTime myt(m_fd->len);
|
|
998
|
-
myt.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
999
|
-
ret = (int)myt.getValue(m_fds->myDateTimeValueByBtrv);
|
|
1000
|
-
break;
|
|
1001
|
-
;
|
|
1002
|
-
}
|
|
1003
|
-
case ft_string:
|
|
1004
|
-
case ft_zstring:
|
|
1005
|
-
case ft_note:
|
|
1006
|
-
case ft_myvarbinary:
|
|
1007
|
-
case ft_myvarchar:
|
|
1008
|
-
case ft_mychar:
|
|
1009
|
-
ret = atol(getFVAstr());
|
|
1010
|
-
break;
|
|
1011
|
-
case ft_wstring:
|
|
1012
|
-
case ft_wzstring:
|
|
1257
|
+
//---------------------------------------------------------------------------
|
|
1258
|
+
#define CASE_TEXT case ft_string: \
|
|
1259
|
+
case ft_note: \
|
|
1260
|
+
case ft_zstring: \
|
|
1261
|
+
case ft_wzstring: \
|
|
1262
|
+
case ft_wstring: \
|
|
1263
|
+
case ft_mychar: \
|
|
1264
|
+
case ft_myvarchar: \
|
|
1265
|
+
case ft_lstring: \
|
|
1266
|
+
case ft_myvarbinary: \
|
|
1267
|
+
case ft_mywchar: \
|
|
1268
|
+
case ft_mywvarchar: \
|
|
1269
|
+
case ft_mywvarbinary: \
|
|
1270
|
+
case ft_myblob: \
|
|
1271
|
+
case ft_mytext:
|
|
1272
|
+
|
|
1273
|
+
#define CASE_TEXTA case ft_string: \
|
|
1274
|
+
case ft_note: \
|
|
1275
|
+
case ft_zstring: \
|
|
1276
|
+
case ft_mychar: \
|
|
1277
|
+
case ft_myvarchar: \
|
|
1278
|
+
case ft_lstring: \
|
|
1279
|
+
case ft_myvarbinary: \
|
|
1280
|
+
case ft_myblob: \
|
|
1281
|
+
case ft_mytext:
|
|
1282
|
+
|
|
1283
|
+
#define CASE_TEXTW case ft_wzstring: \
|
|
1284
|
+
case ft_wstring: \
|
|
1285
|
+
case ft_mywchar: \
|
|
1286
|
+
case ft_mywvarchar: \
|
|
1013
1287
|
case ft_mywvarbinary:
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
case
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
case
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
case ft_numeric:
|
|
1288
|
+
|
|
1289
|
+
#define CASE_INT case ft_integer: \
|
|
1290
|
+
case ft_autoinc:
|
|
1291
|
+
|
|
1292
|
+
#define CASE_UINT case ft_uinteger: \
|
|
1293
|
+
case ft_autoIncUnsigned: \
|
|
1294
|
+
case ft_set: \
|
|
1295
|
+
case ft_enum:
|
|
1296
|
+
|
|
1297
|
+
|
|
1298
|
+
#define CASE_FLOAT case ft_bfloat: \
|
|
1299
|
+
case ft_float:
|
|
1300
|
+
|
|
1301
|
+
#define CASE_NUMERIC case ft_numeric: \
|
|
1302
|
+
case ft_numericsa: \
|
|
1030
1303
|
case ft_numericsts:
|
|
1031
|
-
case ft_numericsa:
|
|
1032
|
-
ret = (long)getFVnumeric();
|
|
1033
|
-
break;
|
|
1034
1304
|
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1305
|
+
#define CASE_DECIMAL case ft_decimal: \
|
|
1306
|
+
case ft_money:
|
|
1307
|
+
|
|
1308
|
+
inline __int64 logical_str_to_64(bool logicalToString, const char* data)
|
|
1309
|
+
{
|
|
1310
|
+
if (logicalToString)
|
|
1311
|
+
{
|
|
1312
|
+
char tmp[5];
|
|
1313
|
+
strncpy(tmp, data, 5);
|
|
1314
|
+
if (strcmp(_strupr(tmp), "YES") == 0)
|
|
1315
|
+
return 1;
|
|
1316
|
+
else
|
|
1317
|
+
return 0;
|
|
1039
1318
|
}
|
|
1040
|
-
|
|
1319
|
+
else
|
|
1320
|
+
return atol(data);
|
|
1041
1321
|
}
|
|
1042
1322
|
|
|
1043
|
-
|
|
1323
|
+
#ifdef _WIN32
|
|
1324
|
+
inline __int64 logical_str_to_64(bool logicalToString, const wchar_t* data)
|
|
1044
1325
|
{
|
|
1045
|
-
|
|
1326
|
+
if (logicalToString)
|
|
1327
|
+
{
|
|
1328
|
+
WCHAR tmp[5];
|
|
1329
|
+
wcsncpy((wchar_t*)tmp, data, 5);
|
|
1330
|
+
if (wcscmp((const wchar_t*)_wcsupr(tmp), L"YES") == 0)
|
|
1331
|
+
return 1;
|
|
1332
|
+
else
|
|
1333
|
+
return 0;
|
|
1334
|
+
}
|
|
1335
|
+
else
|
|
1336
|
+
return _wtol(data);
|
|
1046
1337
|
}
|
|
1338
|
+
#endif
|
|
1047
1339
|
|
|
1048
|
-
|
|
1340
|
+
//---------------------------------------------------------------------------
|
|
1341
|
+
// set functions
|
|
1342
|
+
//---------------------------------------------------------------------------
|
|
1343
|
+
void field::setFVA(const char* data)
|
|
1049
1344
|
{
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1345
|
+
assert(m_ptr);
|
|
1346
|
+
|
|
1347
|
+
__int64 value;
|
|
1348
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
1349
|
+
if (data == NULL)
|
|
1054
1350
|
{
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1351
|
+
memset(p, 0, m_fd->len);
|
|
1352
|
+
setNull(true);
|
|
1353
|
+
return;
|
|
1354
|
+
}
|
|
1355
|
+
setNull(false);
|
|
1356
|
+
switch(m_fd->type)
|
|
1357
|
+
{
|
|
1358
|
+
CASE_TEXT
|
|
1359
|
+
storeValueStrA(data);
|
|
1360
|
+
return;
|
|
1361
|
+
CASE_FLOAT
|
|
1362
|
+
storeValueDbl(atof(data));
|
|
1363
|
+
return;
|
|
1364
|
+
CASE_NUMERIC
|
|
1365
|
+
storeValueNumeric(atof(data));
|
|
1366
|
+
return;
|
|
1367
|
+
CASE_DECIMAL
|
|
1368
|
+
storeValueDecimal(atof(data));
|
|
1369
|
+
return;
|
|
1370
|
+
case ft_mydecimal:
|
|
1371
|
+
{
|
|
1372
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1373
|
+
d = data;
|
|
1374
|
+
d.store(p);
|
|
1375
|
+
return;
|
|
1376
|
+
}
|
|
1377
|
+
CASE_INT
|
|
1378
|
+
value = _atoi64(data);
|
|
1058
1379
|
break;
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
case ft_timestamp:
|
|
1062
|
-
case ft_float:
|
|
1063
|
-
switch (m_fd->len)
|
|
1064
|
-
{
|
|
1065
|
-
case 4:
|
|
1066
|
-
ret = (double)*((float*)((char*)m_ptr + m_fd->pos));
|
|
1067
|
-
break;
|
|
1068
|
-
case 10: // long double
|
|
1069
|
-
case 8:
|
|
1070
|
-
ret = (double)*((double*)((char*)m_ptr + m_fd->pos));
|
|
1071
|
-
break;
|
|
1072
|
-
}
|
|
1380
|
+
CASE_UINT
|
|
1381
|
+
value = (__int64)strtoull(data, NULL, 10);
|
|
1073
1382
|
break;
|
|
1074
|
-
case
|
|
1075
|
-
|
|
1076
|
-
case ft_note:
|
|
1077
|
-
case ft_myvarbinary:
|
|
1078
|
-
case ft_myvarchar:
|
|
1079
|
-
case ft_mychar:
|
|
1080
|
-
ret = atof(getFVAstr());
|
|
1383
|
+
case ft_bit:
|
|
1384
|
+
value = changeEndian((__int64)strtoull(data, NULL, 10), m_fd->len);
|
|
1081
1385
|
break;
|
|
1082
|
-
case
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
case
|
|
1086
|
-
|
|
1087
|
-
ret = _ttof(getFVstr());
|
|
1386
|
+
case ft_logical:
|
|
1387
|
+
value = logical_str_to_64(m_fds->logicalToString, data);
|
|
1388
|
+
break;
|
|
1389
|
+
case ft_date:
|
|
1390
|
+
value = atobtrd((const char*)data).i;
|
|
1088
1391
|
break;
|
|
1089
|
-
case ft_integer:
|
|
1090
|
-
case ft_date:
|
|
1091
1392
|
case ft_time:
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
case
|
|
1095
|
-
|
|
1096
|
-
|
|
1393
|
+
value = atobtrt((const char*)data).i;
|
|
1394
|
+
break;
|
|
1395
|
+
case ft_datetime:
|
|
1396
|
+
value = atobtrs((const char*)data).i64;
|
|
1397
|
+
break;
|
|
1398
|
+
case ft_myyear:
|
|
1399
|
+
value = _atoi64(data);
|
|
1400
|
+
if (value > 1900) value -= 1900;
|
|
1401
|
+
break;
|
|
1097
1402
|
case ft_mydate:
|
|
1403
|
+
value = str_to_64<myDate, char>(m_fd->decimals, true, data);
|
|
1404
|
+
break;
|
|
1098
1405
|
case ft_mytime:
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1406
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1407
|
+
value = str_to_64<maTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1408
|
+
else
|
|
1409
|
+
value = str_to_64<myTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1102
1410
|
break;
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1411
|
+
case ft_mytimestamp:
|
|
1412
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1413
|
+
value = str_to_64<maTimeStamp, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1414
|
+
else
|
|
1415
|
+
value = str_to_64<myTimeStamp, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1107
1416
|
break;
|
|
1108
|
-
case
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1417
|
+
case ft_mydatetime:
|
|
1418
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1419
|
+
value = str_to_64<maDateTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1420
|
+
else
|
|
1421
|
+
value = str_to_64<myDateTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1112
1422
|
break;
|
|
1113
|
-
case
|
|
1423
|
+
case ft_currency:
|
|
1424
|
+
value = (__int64)(atof(data) * 10000);
|
|
1114
1425
|
break;
|
|
1115
|
-
default:
|
|
1116
|
-
return
|
|
1426
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
1427
|
+
return;
|
|
1117
1428
|
}
|
|
1118
|
-
|
|
1119
|
-
}
|
|
1120
|
-
|
|
1121
|
-
unsigned char field::getFVbyt() const
|
|
1122
|
-
{
|
|
1123
|
-
return (unsigned char)getFVlng();
|
|
1429
|
+
storeValue64(value);
|
|
1124
1430
|
}
|
|
1125
1431
|
|
|
1126
1432
|
#ifdef _WIN32
|
|
1127
|
-
|
|
1128
|
-
const wchar_t* field::getFVWstr() const
|
|
1433
|
+
void field::setFVW(const wchar_t* data)
|
|
1129
1434
|
{
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1435
|
+
assert(m_ptr);
|
|
1436
|
+
|
|
1437
|
+
__int64 value;
|
|
1438
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
1439
|
+
if (data == NULL)
|
|
1134
1440
|
{
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
case ft_note:
|
|
1139
|
-
case ft_zstring:
|
|
1140
|
-
return read<zstringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1141
|
-
m_fds->cv());
|
|
1142
|
-
case ft_wzstring:
|
|
1143
|
-
return read<wzstringStore, WCHAR, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1144
|
-
m_fds->cv());
|
|
1145
|
-
case ft_wstring:
|
|
1146
|
-
return read<wstringStore, WCHAR, WCHAR>(
|
|
1147
|
-
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->trimPadChar());
|
|
1148
|
-
case ft_mychar:
|
|
1149
|
-
return read<myCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1150
|
-
m_fds->cv(), m_fd->trimPadChar());
|
|
1151
|
-
case ft_myvarchar:
|
|
1152
|
-
return read<myVarCharStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
|
|
1153
|
-
m_fds->cv());
|
|
1154
|
-
case ft_lstring:
|
|
1155
|
-
case ft_myvarbinary:
|
|
1156
|
-
return read<myVarBinaryStore, char, WCHAR>(data, m_fds->strBufs(),
|
|
1157
|
-
*m_fd, m_fds->cv());
|
|
1158
|
-
case ft_mywchar:
|
|
1159
|
-
return read<myWcharStore, WCHAR, WCHAR>(
|
|
1160
|
-
data, m_fds->strBufs(), *m_fd, m_fds->cv(), m_fd->trimPadChar());
|
|
1161
|
-
case ft_mywvarchar:
|
|
1162
|
-
return read<myWvarCharStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1163
|
-
*m_fd, m_fds->cv());
|
|
1164
|
-
case ft_mywvarbinary:
|
|
1165
|
-
return read<myWvarBinaryStore, WCHAR, WCHAR>(data, m_fds->strBufs(),
|
|
1166
|
-
*m_fd, m_fds->cv());
|
|
1167
|
-
case ft_myblob:
|
|
1168
|
-
case ft_mytext:
|
|
1169
|
-
return readBlob<WCHAR>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
1441
|
+
memset(p, 0, m_fd->len);
|
|
1442
|
+
setNull(true);
|
|
1443
|
+
return;
|
|
1170
1444
|
}
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
wchar_t buf[10] = L"%0.";
|
|
1174
|
-
|
|
1175
|
-
switch (m_fd->type)
|
|
1445
|
+
setNull(false);
|
|
1446
|
+
switch(m_fd->type)
|
|
1176
1447
|
{
|
|
1177
|
-
|
|
1178
|
-
|
|
1448
|
+
CASE_TEXT
|
|
1449
|
+
storeValueStrW(data);
|
|
1450
|
+
return;
|
|
1451
|
+
CASE_FLOAT
|
|
1452
|
+
storeValueDbl(_wtof(data));
|
|
1453
|
+
return;
|
|
1454
|
+
CASE_NUMERIC
|
|
1455
|
+
storeValueNumeric(_wtof(data));
|
|
1456
|
+
return;
|
|
1457
|
+
CASE_DECIMAL
|
|
1458
|
+
storeValueDecimal(_wtof(data));
|
|
1459
|
+
return;
|
|
1460
|
+
case ft_mydecimal:
|
|
1461
|
+
{
|
|
1462
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1463
|
+
d = data;
|
|
1464
|
+
d.store(p);
|
|
1465
|
+
return;
|
|
1466
|
+
}
|
|
1467
|
+
CASE_INT
|
|
1468
|
+
value = _wtoi64(data);
|
|
1469
|
+
break;
|
|
1470
|
+
CASE_UINT
|
|
1471
|
+
value = (__int64)wcstoull(data, NULL, 10);
|
|
1472
|
+
break;
|
|
1179
1473
|
case ft_bit:
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
return p;
|
|
1474
|
+
value = changeEndian((__int64)wcstoull(data, NULL, 10), m_fd->len);
|
|
1475
|
+
break;
|
|
1183
1476
|
case ft_logical:
|
|
1184
|
-
|
|
1185
|
-
{
|
|
1186
|
-
if (getFVlng())
|
|
1187
|
-
return L"Yes";
|
|
1188
|
-
else
|
|
1189
|
-
return L"No";
|
|
1190
|
-
}
|
|
1191
|
-
else
|
|
1192
|
-
_i64tow_s(getFV64(), p, 50, 10);
|
|
1193
|
-
|
|
1194
|
-
case ft_bfloat:
|
|
1195
|
-
case ft_float:
|
|
1196
|
-
case ft_currency:
|
|
1197
|
-
{
|
|
1198
|
-
|
|
1199
|
-
swprintf_s(p, 50, L"%lf", getFVdbl());
|
|
1200
|
-
int k = (int)wcslen(p) - 1;
|
|
1201
|
-
while (k >= 0)
|
|
1202
|
-
{
|
|
1203
|
-
if (p[k] == L'0')
|
|
1204
|
-
p[k] = 0x00;
|
|
1205
|
-
else if (p[k] == L'.')
|
|
1206
|
-
{
|
|
1207
|
-
p[k] = 0x00;
|
|
1208
|
-
break;
|
|
1209
|
-
}
|
|
1210
|
-
else
|
|
1211
|
-
break;
|
|
1212
|
-
k--;
|
|
1213
|
-
}
|
|
1477
|
+
value = logical_str_to_64(m_fds->logicalToString, data);
|
|
1214
1478
|
break;
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
case ft_uinteger:
|
|
1218
|
-
swprintf_s(p, 50, L"%lu", getFV64());
|
|
1479
|
+
case ft_date:
|
|
1480
|
+
value = atobtrd(data).i;
|
|
1219
1481
|
break;
|
|
1220
|
-
case ft_date:
|
|
1221
|
-
return btrdtoa(getFVlng(), p);
|
|
1222
1482
|
case ft_time:
|
|
1223
|
-
|
|
1483
|
+
value = atobtrt(data).i;
|
|
1484
|
+
break;
|
|
1485
|
+
case ft_datetime:
|
|
1486
|
+
value = atobtrs(data).i64;
|
|
1487
|
+
break;
|
|
1488
|
+
case ft_myyear:
|
|
1489
|
+
value = _wtoi64(data);
|
|
1490
|
+
if (value > 1900) value -= 1900;
|
|
1491
|
+
break;
|
|
1224
1492
|
case ft_mydate:
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
d.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1228
|
-
return d.toStr(p, m_fds->myDateTimeValueByBtrv);
|
|
1229
|
-
}
|
|
1493
|
+
value = str_to_64<myDate, wchar_t>(m_fd->decimals, true, data);
|
|
1494
|
+
break;
|
|
1230
1495
|
case ft_mytime:
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
}
|
|
1237
|
-
case ft_mydatetime:
|
|
1238
|
-
{
|
|
1239
|
-
myDateTime t(m_fd->len);
|
|
1240
|
-
t.setValue(getFV64());
|
|
1241
|
-
return t.toStr(p);
|
|
1242
|
-
}
|
|
1496
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1497
|
+
value = str_to_64<maTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1498
|
+
else
|
|
1499
|
+
value = str_to_64<myTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1500
|
+
break;
|
|
1243
1501
|
case ft_mytimestamp:
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
}
|
|
1249
|
-
case ft_decimal:
|
|
1250
|
-
case ft_money:
|
|
1251
|
-
case ft_numeric:
|
|
1252
|
-
case ft_numericsts:
|
|
1253
|
-
case ft_numericsa:
|
|
1254
|
-
_ltow_s(m_fd->decimals, p, 50, 10);
|
|
1255
|
-
wcscat(buf, p);
|
|
1256
|
-
wcscat(buf, L"lf");
|
|
1257
|
-
swprintf(p, 50, buf, getFVdbl());
|
|
1502
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1503
|
+
value = str_to_64<maTimeStamp, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1504
|
+
else
|
|
1505
|
+
value = str_to_64<myTimeStamp, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1258
1506
|
break;
|
|
1259
|
-
case
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1507
|
+
case ft_mydatetime:
|
|
1508
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1509
|
+
value = str_to_64<maDateTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1510
|
+
else
|
|
1511
|
+
value = str_to_64<myDateTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), data);
|
|
1512
|
+
break;
|
|
1513
|
+
case ft_currency:
|
|
1514
|
+
value = (__int64)(_wtof(data) * 10000);
|
|
1515
|
+
break;
|
|
1516
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
1517
|
+
return;
|
|
1265
1518
|
}
|
|
1266
|
-
|
|
1519
|
+
storeValue64(value);
|
|
1267
1520
|
}
|
|
1268
|
-
|
|
1269
1521
|
#endif //_WIN32
|
|
1270
1522
|
|
|
1271
|
-
|
|
1523
|
+
void field::setFV(__int64 data)
|
|
1272
1524
|
{
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
char buf[10] = "%0.";
|
|
1525
|
+
assert(m_ptr);
|
|
1526
|
+
setNull(false);
|
|
1277
1527
|
|
|
1278
|
-
|
|
1279
|
-
switch (m_fd->type)
|
|
1528
|
+
switch(m_fd->type)
|
|
1280
1529
|
{
|
|
1281
|
-
|
|
1282
|
-
case
|
|
1283
|
-
|
|
1284
|
-
m_fds->cv(), m_fd->trimPadChar());
|
|
1285
|
-
case ft_note:
|
|
1286
|
-
case ft_zstring:
|
|
1287
|
-
return read<zstringStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1288
|
-
m_fds->cv());
|
|
1289
|
-
case ft_wzstring:
|
|
1290
|
-
return read<wzstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1291
|
-
m_fds->cv());
|
|
1292
|
-
case ft_wstring:
|
|
1293
|
-
return read<wstringStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1294
|
-
m_fds->cv(), m_fd->trimPadChar());
|
|
1295
|
-
case ft_mychar:
|
|
1296
|
-
return read<myCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1297
|
-
m_fds->cv(), m_fd->trimPadChar());
|
|
1298
|
-
case ft_myvarchar:
|
|
1299
|
-
return read<myVarCharStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1300
|
-
m_fds->cv());
|
|
1301
|
-
case ft_lstring:
|
|
1302
|
-
case ft_myvarbinary:
|
|
1303
|
-
return read<myVarBinaryStore, char, char>(data, m_fds->strBufs(), *m_fd,
|
|
1304
|
-
m_fds->cv());
|
|
1305
|
-
case ft_mywchar:
|
|
1306
|
-
return read<myWcharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1307
|
-
m_fds->cv(), m_fd->trimPadChar());
|
|
1308
|
-
case ft_mywvarchar:
|
|
1309
|
-
return read<myWvarCharStore, WCHAR, char>(data, m_fds->strBufs(), *m_fd,
|
|
1310
|
-
m_fds->cv());
|
|
1311
|
-
case ft_mywvarbinary:
|
|
1312
|
-
return read<myWvarBinaryStore, WCHAR, char>(data, m_fds->strBufs(),
|
|
1313
|
-
*m_fd, m_fds->cv());
|
|
1314
|
-
case ft_myblob:
|
|
1315
|
-
case ft_mytext:
|
|
1316
|
-
return readBlob<char>(data, m_fds->strBufs(), *m_fd, m_fds->cv());
|
|
1317
|
-
}
|
|
1318
|
-
char* p = m_fds->strBufs()->getPtrA(max(m_fd->len * 2, 50));
|
|
1319
|
-
switch (m_fd->type)
|
|
1530
|
+
case ft_mytime:
|
|
1531
|
+
case ft_mydatetime:
|
|
1532
|
+
case ft_mytimestamp:
|
|
1320
1533
|
{
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
_i64toa_s(getFV64(), p, 50, 10);
|
|
1325
|
-
return p;
|
|
1326
|
-
case ft_logical:
|
|
1327
|
-
if (m_fds->logicalToString)
|
|
1534
|
+
//Convert big endian
|
|
1535
|
+
bool bigendian = !m_fd->isLegacyTimeFormat();
|
|
1536
|
+
if (m_fd->type == ft_mydatetime)
|
|
1328
1537
|
{
|
|
1329
|
-
if (
|
|
1330
|
-
|
|
1538
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1539
|
+
data = getStoreValue<maDateTime>(m_fd->decimals, bigendian, data);
|
|
1331
1540
|
else
|
|
1332
|
-
|
|
1541
|
+
data = getStoreValue<myDateTime>(m_fd->decimals, bigendian, data);
|
|
1333
1542
|
}
|
|
1334
|
-
else
|
|
1335
|
-
_i64toa_s(getFV64(), p, 50, 10);
|
|
1336
|
-
break;
|
|
1337
|
-
case ft_bfloat:
|
|
1338
|
-
case ft_float:
|
|
1339
|
-
case ft_currency:
|
|
1340
|
-
{
|
|
1341
|
-
sprintf(p, "%lf", getFVdbl());
|
|
1342
|
-
size_t k = strlen(p) - 1;
|
|
1343
|
-
while (1)
|
|
1543
|
+
else if (m_fd->type == ft_mytimestamp)
|
|
1344
1544
|
{
|
|
1345
|
-
if (
|
|
1346
|
-
|
|
1347
|
-
else if (p[k] == '.')
|
|
1348
|
-
{
|
|
1349
|
-
p[k] = 0x00;
|
|
1350
|
-
break;
|
|
1351
|
-
}
|
|
1545
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1546
|
+
data = getStoreValue<maTimeStamp>(m_fd->decimals, bigendian, data);
|
|
1352
1547
|
else
|
|
1353
|
-
|
|
1354
|
-
k--;
|
|
1548
|
+
data = getStoreValue<myTimeStamp>(m_fd->decimals, bigendian, data);
|
|
1355
1549
|
}
|
|
1356
|
-
|
|
1550
|
+
else if(m_fd->type == ft_mytime)
|
|
1551
|
+
{
|
|
1552
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1553
|
+
data = getStoreValue<maTime>(m_fd->decimals, bigendian, data);
|
|
1554
|
+
else
|
|
1555
|
+
data = getStoreValue<myTime>(m_fd->decimals, bigendian, data);
|
|
1556
|
+
}
|
|
1557
|
+
//fall through
|
|
1357
1558
|
}
|
|
1358
1559
|
case ft_date:
|
|
1359
|
-
return btrdtoa(getFVlng(), p);
|
|
1360
1560
|
case ft_time:
|
|
1361
|
-
|
|
1362
|
-
case ft_autoIncUnsigned:
|
|
1363
|
-
case ft_uinteger:
|
|
1364
|
-
sprintf_s(p, 50, "%llu", (unsigned __int64)getFV64());
|
|
1365
|
-
break;
|
|
1366
|
-
|
|
1561
|
+
case ft_datetime:
|
|
1367
1562
|
case ft_mydate:
|
|
1563
|
+
case ft_currency:
|
|
1564
|
+
case ft_logical:
|
|
1565
|
+
CASE_INT
|
|
1566
|
+
CASE_UINT
|
|
1567
|
+
storeValue64(data);
|
|
1568
|
+
break;
|
|
1569
|
+
case ft_bit:
|
|
1570
|
+
storeValue64(changeEndian(data, m_fd->len));
|
|
1571
|
+
break;
|
|
1572
|
+
case ft_myyear:
|
|
1573
|
+
if (data > 1900) data -= 1900;
|
|
1574
|
+
storeValue64(data);
|
|
1575
|
+
break;
|
|
1576
|
+
CASE_FLOAT
|
|
1577
|
+
storeValueDbl((double)data);
|
|
1578
|
+
break;
|
|
1579
|
+
CASE_NUMERIC
|
|
1580
|
+
storeValueNumeric((double)data);
|
|
1581
|
+
break;
|
|
1582
|
+
CASE_DECIMAL
|
|
1583
|
+
storeValueDecimal((double)data);
|
|
1584
|
+
break;
|
|
1585
|
+
case ft_mydecimal:
|
|
1368
1586
|
{
|
|
1369
|
-
|
|
1370
|
-
d
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
case ft_mytime:
|
|
1374
|
-
{
|
|
1375
|
-
myTime t(m_fd->len);
|
|
1376
|
-
t.setValue(getValue64(*m_fd, (const uchar_td*)m_ptr));
|
|
1377
|
-
return t.toStr(p);
|
|
1587
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1588
|
+
d = data;
|
|
1589
|
+
d.store((char*)m_ptr + m_fd->pos);
|
|
1590
|
+
break;
|
|
1378
1591
|
}
|
|
1379
|
-
|
|
1592
|
+
#ifdef LINUX
|
|
1593
|
+
CASE_TEXTW
|
|
1594
|
+
#endif
|
|
1595
|
+
CASE_TEXTA
|
|
1380
1596
|
{
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1597
|
+
char buf[NUMBUFSIZE];
|
|
1598
|
+
_i64toa_s(data, buf, NUMBUFSIZE, 10);
|
|
1599
|
+
storeValueStrA(buf);
|
|
1600
|
+
break;
|
|
1384
1601
|
}
|
|
1385
|
-
|
|
1602
|
+
#ifndef LINUX
|
|
1603
|
+
CASE_TEXTW
|
|
1386
1604
|
{
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
}
|
|
1391
|
-
case ft_decimal:
|
|
1392
|
-
case ft_money:
|
|
1393
|
-
case ft_numeric:
|
|
1394
|
-
case ft_numericsts:
|
|
1395
|
-
case ft_numericsa:
|
|
1396
|
-
_ltoa_s(m_fd->decimals, p, 50, 10);
|
|
1397
|
-
strcat(buf, p);
|
|
1398
|
-
strcat(buf, "lf");
|
|
1399
|
-
sprintf_s(p, 50, buf, getFVdbl());
|
|
1605
|
+
WCHAR buf[NUMBUFSIZE];
|
|
1606
|
+
_i64tow_s(data, buf, NUMBUFSIZE, 10);
|
|
1607
|
+
storeValueStrW(buf);
|
|
1400
1608
|
break;
|
|
1401
|
-
case ft_lvar:
|
|
1402
|
-
return NULL;
|
|
1403
|
-
case ft_timestamp:
|
|
1404
|
-
return btrTimeStamp(getFV64()).toString(p);
|
|
1405
|
-
default:
|
|
1406
|
-
p[0] = 0x00;
|
|
1407
1609
|
}
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
int field::getFVint() const
|
|
1412
|
-
{
|
|
1413
|
-
return (int)getFVlng();
|
|
1414
|
-
}
|
|
1415
|
-
|
|
1416
|
-
__int64 field::getFV64() const
|
|
1417
|
-
{
|
|
1418
|
-
if (!m_ptr)
|
|
1419
|
-
return 0;
|
|
1420
|
-
|
|
1421
|
-
switch (m_fd->len)
|
|
1422
|
-
{
|
|
1423
|
-
case 8:
|
|
1424
|
-
switch (m_fd->type)
|
|
1425
|
-
{
|
|
1426
|
-
case ft_autoIncUnsigned:
|
|
1427
|
-
case ft_uinteger:
|
|
1428
|
-
case ft_integer:
|
|
1429
|
-
case ft_logical:
|
|
1430
|
-
case ft_autoinc:
|
|
1431
|
-
case ft_bit:
|
|
1432
|
-
case ft_currency:
|
|
1433
|
-
case ft_timestamp:
|
|
1434
|
-
case ft_mydatetime:
|
|
1435
|
-
case ft_mytimestamp:
|
|
1436
|
-
return (__int64) * ((__int64*)((char*)m_ptr + m_fd->pos));
|
|
1437
|
-
case ft_float:
|
|
1438
|
-
return (__int64) *((double*)((char*)m_ptr + m_fd->pos));
|
|
1439
|
-
}
|
|
1440
|
-
return 0;
|
|
1441
|
-
case 7:
|
|
1442
|
-
case 6:
|
|
1443
|
-
case 5:
|
|
1444
|
-
switch (m_fd->type)
|
|
1445
|
-
{
|
|
1446
|
-
case ft_mytime:
|
|
1447
|
-
case ft_mydatetime:
|
|
1448
|
-
case ft_mytimestamp:
|
|
1449
|
-
{
|
|
1450
|
-
__int64 v = 0;
|
|
1451
|
-
memcpy(&v, (char*)m_ptr + m_fd->pos, m_fd->len);
|
|
1452
|
-
return v;
|
|
1453
|
-
}
|
|
1454
|
-
}
|
|
1455
|
-
return 0;
|
|
1456
|
-
default:
|
|
1457
|
-
|
|
1458
|
-
return (__int64)getFVlng();
|
|
1610
|
+
#endif
|
|
1611
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
1612
|
+
break;
|
|
1459
1613
|
}
|
|
1460
1614
|
}
|
|
1461
1615
|
|
|
1462
|
-
void field::setFV(
|
|
1616
|
+
void field::setFV(double data)
|
|
1463
1617
|
{
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
switch (m_fd->
|
|
1618
|
+
assert(m_ptr);
|
|
1619
|
+
setNull(false);
|
|
1620
|
+
__int64 i64 = (__int64)data;
|
|
1621
|
+
switch (m_fd->type)
|
|
1468
1622
|
{
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
case ft_mytimestamp:
|
|
1481
|
-
*((__int64*)((char*)m_ptr + m_fd->pos)) = data;
|
|
1482
|
-
break;
|
|
1483
|
-
case ft_timestamp:
|
|
1623
|
+
CASE_FLOAT
|
|
1624
|
+
storeValueDbl(data);
|
|
1625
|
+
break;
|
|
1626
|
+
case ft_mytime:
|
|
1627
|
+
case ft_mydatetime:
|
|
1628
|
+
case ft_mytimestamp:
|
|
1629
|
+
case ft_currency:
|
|
1630
|
+
{
|
|
1631
|
+
//Convert big endian
|
|
1632
|
+
bool bigendian = !m_fd->isLegacyTimeFormat();
|
|
1633
|
+
if (m_fd->type == ft_mydatetime)
|
|
1484
1634
|
{
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
*((__int64*)((char*)m_ptr + m_fd->pos)) = btrTimeStamp(d, t).i64;
|
|
1490
|
-
break;
|
|
1635
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1636
|
+
i64 = getStoreValue<maDateTime>(m_fd->decimals, bigendian, i64);
|
|
1637
|
+
else
|
|
1638
|
+
i64 = getStoreValue<myDateTime>(m_fd->decimals, bigendian, i64);
|
|
1491
1639
|
}
|
|
1492
|
-
|
|
1640
|
+
else if (m_fd->type == ft_mytimestamp)
|
|
1641
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1642
|
+
i64 = getStoreValue<maTimeStamp>(m_fd->decimals, bigendian, i64);
|
|
1643
|
+
else
|
|
1644
|
+
i64 = getStoreValue<myTimeStamp>(m_fd->decimals, bigendian, i64);
|
|
1645
|
+
else if(m_fd->type == ft_mytime)
|
|
1493
1646
|
{
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1647
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1648
|
+
i64 = getStoreValue<maTime>(m_fd->decimals, bigendian, i64);
|
|
1649
|
+
else
|
|
1650
|
+
i64 = getStoreValue<myTime>(m_fd->decimals, bigendian, i64);
|
|
1498
1651
|
}
|
|
1652
|
+
else if(m_fd->type == ft_currency)
|
|
1653
|
+
i64 = (__int64)(data * 10000 + 0.5);
|
|
1654
|
+
//fall through
|
|
1655
|
+
}
|
|
1656
|
+
case ft_date:
|
|
1657
|
+
case ft_time:
|
|
1658
|
+
case ft_datetime:
|
|
1659
|
+
case ft_mydate:
|
|
1660
|
+
case ft_logical:
|
|
1661
|
+
CASE_INT
|
|
1662
|
+
CASE_UINT
|
|
1663
|
+
storeValue64(i64);
|
|
1499
1664
|
break;
|
|
1500
|
-
case
|
|
1501
|
-
|
|
1502
|
-
case 5:
|
|
1503
|
-
switch (m_fd->type)
|
|
1504
|
-
{
|
|
1505
|
-
case ft_mytime:
|
|
1506
|
-
case ft_mydatetime:
|
|
1507
|
-
case ft_mytimestamp:
|
|
1508
|
-
memcpy((char*)m_ptr + m_fd->pos, &data, m_fd->len);
|
|
1509
|
-
break;
|
|
1510
|
-
default:
|
|
1511
|
-
break;
|
|
1512
|
-
}
|
|
1665
|
+
case ft_bit:
|
|
1666
|
+
storeValue64(changeEndian(i64, m_fd->len));
|
|
1513
1667
|
break;
|
|
1514
|
-
|
|
1668
|
+
case ft_myyear:
|
|
1669
|
+
if (i64 > 1900) i64 -= 1900;
|
|
1670
|
+
storeValue64(i64);
|
|
1671
|
+
break;
|
|
1672
|
+
CASE_NUMERIC
|
|
1673
|
+
storeValueNumeric(data);
|
|
1674
|
+
break;
|
|
1675
|
+
CASE_DECIMAL
|
|
1676
|
+
storeValueDecimal(data);
|
|
1677
|
+
break;
|
|
1678
|
+
case ft_mydecimal:
|
|
1679
|
+
{
|
|
1680
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1681
|
+
d = data;
|
|
1682
|
+
d.store((char*)m_ptr + m_fd->pos);
|
|
1683
|
+
break;
|
|
1684
|
+
}
|
|
1685
|
+
#ifdef LINUX
|
|
1686
|
+
CASE_TEXTW
|
|
1687
|
+
#endif
|
|
1688
|
+
CASE_TEXTA
|
|
1689
|
+
{
|
|
1690
|
+
char buf[NUMBUFSIZE];
|
|
1691
|
+
sprintf_s(buf, NUMBUFSIZE, "%lf", data);
|
|
1692
|
+
storeValueStrA(buf);
|
|
1693
|
+
break;
|
|
1694
|
+
}
|
|
1695
|
+
#ifndef LINUX
|
|
1696
|
+
CASE_TEXTW
|
|
1515
1697
|
{
|
|
1516
|
-
|
|
1517
|
-
|
|
1698
|
+
WCHAR buf[NUMBUFSIZE];
|
|
1699
|
+
swprintf_s((wchar_t*)buf, NUMBUFSIZE, L"%lf", data);
|
|
1700
|
+
storeValueStrW(buf);
|
|
1518
1701
|
break;
|
|
1519
1702
|
}
|
|
1703
|
+
#endif
|
|
1704
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
1705
|
+
break;
|
|
1520
1706
|
}
|
|
1521
1707
|
}
|
|
1522
1708
|
|
|
@@ -1525,9 +1711,15 @@ void field::setFV(__int64 data)
|
|
|
1525
1711
|
*/
|
|
1526
1712
|
void field::setFV(const void* data, uint_td size)
|
|
1527
1713
|
{
|
|
1528
|
-
|
|
1529
|
-
return;
|
|
1714
|
+
assert(m_ptr);
|
|
1530
1715
|
char* p = (char*)m_ptr + m_fd->pos;
|
|
1716
|
+
if (data == NULL)
|
|
1717
|
+
{
|
|
1718
|
+
memset(p, 0, m_fd->len);
|
|
1719
|
+
setNull(true);
|
|
1720
|
+
return;
|
|
1721
|
+
}
|
|
1722
|
+
setNull(false);
|
|
1531
1723
|
switch (m_fd->type)
|
|
1532
1724
|
{
|
|
1533
1725
|
case ft_myvarbinary:
|
|
@@ -1543,6 +1735,8 @@ void field::setFV(const void* data, uint_td size)
|
|
|
1543
1735
|
memcpy(p + sizeByte, data, size);
|
|
1544
1736
|
break;
|
|
1545
1737
|
}
|
|
1738
|
+
case ft_myjson:
|
|
1739
|
+
case ft_mygeometry:
|
|
1546
1740
|
case ft_myblob:
|
|
1547
1741
|
case ft_mytext:
|
|
1548
1742
|
{
|
|
@@ -1568,476 +1762,483 @@ void field::setFV(const void* data, uint_td size)
|
|
|
1568
1762
|
}
|
|
1569
1763
|
}
|
|
1570
1764
|
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
void* field::getFVbin(uint_td& size) const
|
|
1575
|
-
{
|
|
1576
|
-
if (!m_ptr)
|
|
1577
|
-
return 0;
|
|
1578
|
-
|
|
1579
|
-
char* p = (char*)m_ptr + m_fd->pos;
|
|
1580
|
-
switch (m_fd->type)
|
|
1581
|
-
{
|
|
1582
|
-
case ft_myvarbinary:
|
|
1583
|
-
case ft_myvarchar:
|
|
1584
|
-
case ft_mywvarbinary:
|
|
1585
|
-
case ft_mywvarchar:
|
|
1586
|
-
case ft_lstring:
|
|
1587
|
-
{
|
|
1588
|
-
int sizeByte = m_fd->varLenBytes();
|
|
1589
|
-
size = 0;
|
|
1590
|
-
memcpy(&size, p, sizeByte);
|
|
1591
|
-
return (void*)(p + sizeByte);
|
|
1592
|
-
}
|
|
1593
|
-
case ft_myblob:
|
|
1594
|
-
case ft_mytext:
|
|
1595
|
-
{
|
|
1596
|
-
int sizeByte = m_fd->len - 8;
|
|
1597
|
-
size = 0;
|
|
1598
|
-
memcpy(&size, p, sizeByte);
|
|
1599
|
-
if (size)
|
|
1600
|
-
{
|
|
1601
|
-
char** ptr = (char**)(p + sizeByte);
|
|
1602
|
-
return (void*)*ptr;
|
|
1603
|
-
}
|
|
1604
|
-
return NULL;
|
|
1605
|
-
}
|
|
1606
|
-
case ft_lvar:
|
|
1607
|
-
{
|
|
1608
|
-
int sizeByte = 2;
|
|
1609
|
-
size = 0;
|
|
1610
|
-
memcpy(&size, p, sizeByte);
|
|
1611
|
-
return (void*)(p + sizeByte);
|
|
1612
|
-
}
|
|
1613
|
-
default:
|
|
1614
|
-
size = m_fd->len;
|
|
1615
|
-
return (void*)(p);
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1765
|
+
//---------------------------------------------------------------------------
|
|
1766
|
+
// getFV functions
|
|
1767
|
+
//---------------------------------------------------------------------------
|
|
1618
1768
|
|
|
1619
|
-
|
|
1769
|
+
const char* field::getFVAstr() const
|
|
1620
1770
|
{
|
|
1621
|
-
if (!m_ptr)
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
unsigned char buf[20] = { 0x00 };
|
|
1625
|
-
char result[30] = { 0x00 };
|
|
1626
|
-
char n[10];
|
|
1627
|
-
int i;
|
|
1628
|
-
char* t;
|
|
1629
|
-
unsigned char sign;
|
|
1630
|
-
int len = m_fd->len;
|
|
1631
|
-
result[0] = '+';
|
|
1632
|
-
memcpy(buf, (void*)((char*)m_ptr + m_fd->pos), len);
|
|
1633
|
-
sign = (unsigned char)(buf[len - 1] & 0x0F);
|
|
1634
|
-
buf[len - 1] = (unsigned char)(buf[len - 1] & 0xF0);
|
|
1635
|
-
for (i = 0; i < len; i++)
|
|
1771
|
+
if (!m_ptr) return "";
|
|
1772
|
+
|
|
1773
|
+
switch (m_fd->type)
|
|
1636
1774
|
{
|
|
1637
|
-
|
|
1638
|
-
|
|
1775
|
+
CASE_TEXT
|
|
1776
|
+
return readValueStrA();
|
|
1639
1777
|
}
|
|
1640
|
-
i = (int)strlen(result);
|
|
1641
|
-
|
|
1642
|
-
if (sign == 13)
|
|
1643
|
-
result[0] = '-';
|
|
1644
|
-
result[i - 1] = 0x00;
|
|
1645
|
-
|
|
1646
|
-
t = result + (m_fd->len * 2) - m_fd->decimals;
|
|
1647
|
-
strcpy((char*)buf, t);
|
|
1648
|
-
*t = '.';
|
|
1649
|
-
strcpy(t + 1, (char*)buf);
|
|
1650
|
-
return atof(result);
|
|
1651
|
-
}
|
|
1652
|
-
|
|
1653
|
-
double field::getFVnumeric() const
|
|
1654
|
-
{
|
|
1655
|
-
if (!m_ptr)
|
|
1656
|
-
return 0;
|
|
1657
|
-
|
|
1658
|
-
char* t;
|
|
1659
|
-
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1660
|
-
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1661
|
-
char* pdp = NULL;
|
|
1662
|
-
int i;
|
|
1663
|
-
char buf[20] = { 0x00 };
|
|
1664
|
-
char dummy[20];
|
|
1665
|
-
|
|
1666
|
-
buf[0] = '+';
|
|
1667
|
-
strncpy(buf + 1, (char*)((char*)m_ptr + m_fd->pos), m_fd->len);
|
|
1668
|
-
|
|
1669
|
-
t = &(buf[m_fd->len]);
|
|
1670
1778
|
|
|
1779
|
+
char* p = m_fds->strBufs()->getPtrA(max(m_fd->len * 2, NUMBUFSIZE));
|
|
1671
1780
|
switch (m_fd->type)
|
|
1672
1781
|
{
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
case
|
|
1680
|
-
|
|
1681
|
-
*t = 0x00;
|
|
1782
|
+
CASE_INT
|
|
1783
|
+
_i64toa_s(readValue64(), p, NUMBUFSIZE, 10);
|
|
1784
|
+
return p;
|
|
1785
|
+
CASE_UINT
|
|
1786
|
+
_ui64toa_s(readValue64(), p, NUMBUFSIZE, 10);
|
|
1787
|
+
return p;
|
|
1788
|
+
case ft_bit:
|
|
1789
|
+
_ui64toa_s(changeEndian(readValue64(), m_fd->len), p, NUMBUFSIZE, 10);
|
|
1682
1790
|
break;
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
if (pdp)
|
|
1686
|
-
{
|
|
1687
|
-
for (i = 0; i < 21; i++)
|
|
1688
|
-
{
|
|
1689
|
-
if (*t == pdp[i])
|
|
1690
|
-
{
|
|
1691
|
-
if (i > 10)
|
|
1692
|
-
{
|
|
1693
|
-
buf[0] = '-';
|
|
1694
|
-
*t = (char)(i + 38);
|
|
1695
|
-
}
|
|
1696
|
-
else
|
|
1697
|
-
*t = (char)(i + 48);
|
|
1698
|
-
break;
|
|
1699
|
-
}
|
|
1700
|
-
}
|
|
1701
|
-
}
|
|
1702
|
-
|
|
1703
|
-
t = buf + strlen(buf) - m_fd->decimals;
|
|
1704
|
-
strcpy(dummy, t);
|
|
1705
|
-
*t = '.';
|
|
1706
|
-
strcpy(t + 1, dummy);
|
|
1707
|
-
return atof(buf);
|
|
1708
|
-
}
|
|
1709
|
-
|
|
1710
|
-
void field::setFVDecimal(double data)
|
|
1711
|
-
{ // Double -> Decimal
|
|
1712
|
-
if (!m_ptr)
|
|
1713
|
-
return;
|
|
1714
|
-
|
|
1715
|
-
char buf[30] = "%+0";
|
|
1716
|
-
char dummy[30];
|
|
1717
|
-
int point;
|
|
1718
|
-
bool sign = false;
|
|
1719
|
-
unsigned char n;
|
|
1720
|
-
int i, k;
|
|
1721
|
-
int strl;
|
|
1722
|
-
bool offset = false;
|
|
1723
|
-
;
|
|
1724
|
-
point = (m_fd->len) * 2;
|
|
1725
|
-
_ltoa_s(point, dummy, 30, 10);
|
|
1726
|
-
strcat(buf, dummy);
|
|
1727
|
-
strcat(buf, ".");
|
|
1728
|
-
_ltoa_s(m_fd->decimals, dummy, 30, 10);
|
|
1729
|
-
strcat(buf, dummy);
|
|
1730
|
-
strcat(buf, "lf");
|
|
1731
|
-
sprintf(dummy, buf, data);
|
|
1732
|
-
if (dummy[0] == '-')
|
|
1733
|
-
sign = true;
|
|
1734
|
-
|
|
1735
|
-
strl = (int)strlen(dummy + 1) - 1;
|
|
1736
|
-
if (strl % 2 == 1)
|
|
1737
|
-
strl = strl / 2;
|
|
1738
|
-
else
|
|
1739
|
-
{
|
|
1740
|
-
strl = strl / 2 + 1;
|
|
1741
|
-
offset = true;
|
|
1742
|
-
}
|
|
1743
|
-
memset(buf, 0, 30);
|
|
1744
|
-
k = 0;
|
|
1745
|
-
n = 0;
|
|
1746
|
-
point = (int)strlen(dummy + 1);
|
|
1747
|
-
if (strl <= m_fd->len)
|
|
1791
|
+
case ft_myyear:
|
|
1748
1792
|
{
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1761
|
-
|
|
1762
|
-
|
|
1763
|
-
|
|
1764
|
-
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1793
|
+
__int64 v = readValue64();
|
|
1794
|
+
if (v) v += 1900;
|
|
1795
|
+
_i64toa_s(v , p, NUMBUFSIZE, 10);
|
|
1796
|
+
return p;
|
|
1797
|
+
}
|
|
1798
|
+
case ft_logical:
|
|
1799
|
+
{
|
|
1800
|
+
int v = (int)readValue64();
|
|
1801
|
+
if (m_fds->logicalToString)
|
|
1802
|
+
return v ? "Yes": "No";
|
|
1803
|
+
else
|
|
1804
|
+
_ltoa_s(v, p, NUMBUFSIZE, 10);
|
|
1805
|
+
return p;
|
|
1806
|
+
}
|
|
1807
|
+
case ft_date:
|
|
1808
|
+
return btrdtoa((int)readValue64(), p);
|
|
1809
|
+
case ft_time:
|
|
1810
|
+
return btrttoa((int)readValue64(), p);
|
|
1811
|
+
case ft_datetime:
|
|
1812
|
+
return btrstoa(readValue64(), p);
|
|
1813
|
+
case ft_timestamp:
|
|
1814
|
+
return btrTimeStamp(readValue64()).toString(p);
|
|
1815
|
+
case ft_mydate:
|
|
1816
|
+
return date_time_str<myDate, char>(m_fd->len, true, readValue64(), p, NUMBUFSIZE);
|
|
1817
|
+
case ft_mytime:
|
|
1818
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1819
|
+
return date_time_str<maTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1820
|
+
else
|
|
1821
|
+
return date_time_str<myTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1822
|
+
case ft_mydatetime:
|
|
1823
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1824
|
+
return date_time_str<maDateTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1825
|
+
else
|
|
1826
|
+
return date_time_str<myDateTime, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1827
|
+
case ft_mytimestamp:
|
|
1828
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1829
|
+
return date_time_str<maTimeStamp, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1830
|
+
else
|
|
1831
|
+
return date_time_str<myTimeStamp, char>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1832
|
+
case ft_mygeometry:
|
|
1833
|
+
case ft_myjson:
|
|
1834
|
+
return "";
|
|
1835
|
+
case ft_mydecimal:
|
|
1836
|
+
{
|
|
1837
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1838
|
+
d.read((char*)m_ptr + m_fd->pos);
|
|
1839
|
+
return d.toString(p, NUMBUFSIZE);
|
|
1840
|
+
}
|
|
1775
1841
|
}
|
|
1776
|
-
memcpy((void*)((char*)m_ptr + m_fd->pos), buf, m_fd->len);
|
|
1777
|
-
}
|
|
1778
|
-
|
|
1779
|
-
void field::setFVNumeric(double data)
|
|
1780
|
-
{ // Double -> Numeric
|
|
1781
|
-
if (!m_ptr)
|
|
1782
|
-
return;
|
|
1783
|
-
|
|
1784
|
-
char buf[30] = "%+0";
|
|
1785
|
-
char dummy[30];
|
|
1786
|
-
int point;
|
|
1787
|
-
int n;
|
|
1788
|
-
char dp[] = "{ABCDEFGHI}JKLMNOPQR";
|
|
1789
|
-
char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
|
|
1790
|
-
bool sign = false;
|
|
1791
|
-
char* t;
|
|
1792
|
-
|
|
1793
|
-
point = m_fd->len + 1;
|
|
1794
|
-
|
|
1795
|
-
_ltoa_s(point, dummy, 30, 10);
|
|
1796
|
-
strcat(buf, dummy);
|
|
1797
|
-
strcat(buf, ".");
|
|
1798
|
-
_ltoa_s(m_fd->decimals, dummy, 30, 10);
|
|
1799
|
-
strcat(buf, dummy);
|
|
1800
|
-
strcat(buf, "lf");
|
|
1801
|
-
sprintf(dummy, buf, data);
|
|
1802
|
-
if (dummy[0] == '-')
|
|
1803
|
-
sign = true;
|
|
1804
|
-
|
|
1805
|
-
strcpy(buf, &dummy[point - m_fd->decimals] + 1);
|
|
1806
|
-
dummy[point - m_fd->decimals] = 0x00;
|
|
1807
|
-
strcat(dummy, buf);
|
|
1808
1842
|
|
|
1809
|
-
|
|
1810
|
-
if (sign)
|
|
1811
|
-
n += 10;
|
|
1812
|
-
t = dummy + 1;
|
|
1843
|
+
double v = 0;
|
|
1813
1844
|
switch (m_fd->type)
|
|
1814
1845
|
{
|
|
1815
|
-
case
|
|
1816
|
-
|
|
1846
|
+
case ft_currency:
|
|
1847
|
+
v = readValue64() / (double)10000;
|
|
1817
1848
|
break;
|
|
1818
|
-
|
|
1819
|
-
|
|
1849
|
+
CASE_FLOAT
|
|
1850
|
+
v = readValueDbl();
|
|
1820
1851
|
break;
|
|
1821
|
-
|
|
1822
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
t += 1;
|
|
1852
|
+
CASE_NUMERIC
|
|
1853
|
+
v = readValueNumeric();
|
|
1854
|
+
break;
|
|
1855
|
+
CASE_DECIMAL
|
|
1856
|
+
v = readValueDecimal();
|
|
1827
1857
|
break;
|
|
1828
|
-
}
|
|
1829
1858
|
|
|
1830
|
-
|
|
1859
|
+
}
|
|
1860
|
+
sprintf_s(p, NUMBUFSIZE, "%.*lf", m_fd->decimals, v);
|
|
1861
|
+
return p;
|
|
1831
1862
|
}
|
|
1832
1863
|
|
|
1833
|
-
|
|
1834
|
-
|
|
1864
|
+
#ifdef _WIN32
|
|
1865
|
+
const wchar_t* field::getFVWstr() const
|
|
1835
1866
|
{
|
|
1836
|
-
|
|
1837
|
-
}
|
|
1867
|
+
if (!m_ptr) return L"";
|
|
1838
1868
|
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
}
|
|
1869
|
+
switch (m_fd->type)
|
|
1870
|
+
{
|
|
1871
|
+
CASE_TEXT
|
|
1872
|
+
return readValueStrW();
|
|
1873
|
+
}
|
|
1844
1874
|
|
|
1845
|
-
|
|
1846
|
-
|
|
1875
|
+
wchar_t* p = (wchar_t*)m_fds->strBufs()->getPtrW(max(m_fd->len * 2, NUMBUFSIZE));
|
|
1876
|
+
switch (m_fd->type)
|
|
1877
|
+
{
|
|
1878
|
+
CASE_INT
|
|
1879
|
+
_i64tow_s(readValue64(), p, NUMBUFSIZE, 10);
|
|
1880
|
+
return p;
|
|
1881
|
+
CASE_UINT
|
|
1882
|
+
_ui64tow_s(readValue64(), p, NUMBUFSIZE, 10);
|
|
1883
|
+
return p;
|
|
1884
|
+
case ft_bit:
|
|
1885
|
+
_ui64tow_s(changeEndian(readValue64(), m_fd->len), p, NUMBUFSIZE, 10);
|
|
1886
|
+
break;
|
|
1887
|
+
case ft_myyear:
|
|
1888
|
+
{
|
|
1889
|
+
__int64 v = readValue64();
|
|
1890
|
+
if (v) v += 1900;
|
|
1891
|
+
_i64tow_s(v, p, NUMBUFSIZE, 10);
|
|
1892
|
+
return p;
|
|
1893
|
+
}
|
|
1894
|
+
case ft_logical:
|
|
1895
|
+
{
|
|
1896
|
+
int v = (int)readValue64();
|
|
1897
|
+
if (m_fds->logicalToString)
|
|
1898
|
+
return v ? L"Yes": L"No";
|
|
1899
|
+
else
|
|
1900
|
+
_ltow_s(v, p, NUMBUFSIZE, 10);
|
|
1901
|
+
return p;
|
|
1902
|
+
}
|
|
1903
|
+
case ft_date:
|
|
1904
|
+
return btrdtoa((int)readValue64(), p);
|
|
1905
|
+
case ft_time:
|
|
1906
|
+
return btrttoa((int)readValue64(), p);
|
|
1907
|
+
case ft_datetime:
|
|
1908
|
+
return btrstoa(readValue64(), p);
|
|
1909
|
+
case ft_timestamp:
|
|
1910
|
+
return btrTimeStamp(readValue64()).toString(p);
|
|
1911
|
+
case ft_mydate:
|
|
1912
|
+
return date_time_str<myDate, wchar_t>(m_fd->decimals, true, readValue64(), p, NUMBUFSIZE);
|
|
1913
|
+
case ft_mytime:
|
|
1914
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1915
|
+
return date_time_str<maTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1916
|
+
else
|
|
1917
|
+
return date_time_str<myTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1918
|
+
case ft_mydatetime:
|
|
1919
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1920
|
+
return date_time_str<maDateTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1921
|
+
else
|
|
1922
|
+
return date_time_str<myDateTime, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1923
|
+
case ft_mytimestamp:
|
|
1924
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
1925
|
+
return date_time_str<maTimeStamp, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1926
|
+
else
|
|
1927
|
+
return date_time_str<myTimeStamp, wchar_t>(m_fd->decimals, !m_fd->isLegacyTimeFormat(), readValue64(), p, NUMBUFSIZE);
|
|
1928
|
+
case ft_mygeometry:
|
|
1929
|
+
case ft_myjson:
|
|
1930
|
+
return L"";
|
|
1931
|
+
case ft_mydecimal:
|
|
1932
|
+
{
|
|
1933
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1934
|
+
d.read((char*)m_ptr + m_fd->pos);
|
|
1935
|
+
return d.toString(p, NUMBUFSIZE);
|
|
1936
|
+
}
|
|
1937
|
+
}
|
|
1847
1938
|
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1939
|
+
double v = 0;
|
|
1940
|
+
switch (m_fd->type)
|
|
1941
|
+
{
|
|
1942
|
+
case ft_currency:
|
|
1943
|
+
v = readValue64() / (double)10000;
|
|
1944
|
+
break;
|
|
1945
|
+
CASE_FLOAT
|
|
1946
|
+
v = readValueDbl();
|
|
1947
|
+
break;
|
|
1948
|
+
CASE_NUMERIC
|
|
1949
|
+
v = readValueNumeric();
|
|
1950
|
+
break;
|
|
1951
|
+
CASE_DECIMAL
|
|
1952
|
+
v = readValueDecimal();
|
|
1953
|
+
break;
|
|
1954
|
+
}
|
|
1955
|
+
swprintf_s(p, NUMBUFSIZE, L"%.*lf",m_fd->decimals, v);
|
|
1852
1956
|
|
|
1853
|
-
|
|
1854
|
-
{
|
|
1855
|
-
return compareInt24((const char*)l.ptr(), (const char*)r.ptr());
|
|
1957
|
+
return p;
|
|
1856
1958
|
}
|
|
1959
|
+
#endif //_WIN32
|
|
1857
1960
|
|
|
1858
|
-
|
|
1961
|
+
double field::getFVdbl() const
|
|
1859
1962
|
{
|
|
1860
|
-
|
|
1963
|
+
if (!m_ptr) return 0;
|
|
1964
|
+
double ret = 0;
|
|
1965
|
+
switch (m_fd->type)
|
|
1966
|
+
{
|
|
1967
|
+
CASE_FLOAT
|
|
1968
|
+
case ft_timestamp:
|
|
1969
|
+
return (double)readValueDbl();
|
|
1970
|
+
CASE_NUMERIC
|
|
1971
|
+
return (double)readValueNumeric();
|
|
1972
|
+
CASE_DECIMAL
|
|
1973
|
+
return (double)readValueDecimal();
|
|
1974
|
+
case ft_mydecimal:
|
|
1975
|
+
{
|
|
1976
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
1977
|
+
d.read((char*)m_ptr + m_fd->pos);
|
|
1978
|
+
return d.d();
|
|
1979
|
+
}
|
|
1980
|
+
CASE_INT
|
|
1981
|
+
return (double)readValue64();
|
|
1982
|
+
case ft_myyear:
|
|
1983
|
+
{
|
|
1984
|
+
__int64 v = readValue64();
|
|
1985
|
+
if (v) v += 1900;
|
|
1986
|
+
return (double)(v);
|
|
1987
|
+
}
|
|
1988
|
+
case ft_currency:
|
|
1989
|
+
return ((double)readValue64() / (double)10000);
|
|
1990
|
+
CASE_UINT
|
|
1991
|
+
case ft_mydate:
|
|
1992
|
+
case ft_time:
|
|
1993
|
+
case ft_date:
|
|
1994
|
+
case ft_datetime:
|
|
1995
|
+
case ft_logical:
|
|
1996
|
+
return (double)((unsigned __int64)readValue64());
|
|
1997
|
+
case ft_bit:
|
|
1998
|
+
return (double)((unsigned __int64)changeEndian(readValue64(), m_fd->len));
|
|
1999
|
+
case ft_mytime:
|
|
2000
|
+
case ft_mydatetime:
|
|
2001
|
+
case ft_mytimestamp:
|
|
2002
|
+
{
|
|
2003
|
+
__int64 v = readValue64();
|
|
2004
|
+
bool bigendian = !m_fd->isLegacyTimeFormat();
|
|
2005
|
+
if (m_fd->type == ft_mytime)
|
|
2006
|
+
{
|
|
2007
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2008
|
+
return (double)((unsigned __int64)getInternalValue<maTime>(m_fd->decimals, bigendian, v));
|
|
2009
|
+
else
|
|
2010
|
+
return (double)((unsigned __int64)getInternalValue<myTime>(m_fd->decimals, bigendian, v));
|
|
2011
|
+
}
|
|
2012
|
+
else if (m_fd->type == ft_mydatetime)
|
|
2013
|
+
{
|
|
2014
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2015
|
+
return (double)((unsigned __int64)getInternalValue<maDateTime>(m_fd->decimals, bigendian, v));
|
|
2016
|
+
else
|
|
2017
|
+
return (double)((unsigned __int64)getInternalValue<myDateTime>(m_fd->decimals, bigendian, v));
|
|
2018
|
+
}
|
|
2019
|
+
else if (m_fd->type == ft_mytimestamp)
|
|
2020
|
+
{
|
|
2021
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2022
|
+
return (double)((unsigned __int64)getInternalValue<maTimeStamp>(m_fd->decimals, bigendian, v));
|
|
2023
|
+
else
|
|
2024
|
+
return (double)((unsigned __int64)getInternalValue<myTimeStamp>(m_fd->decimals, bigendian, v));
|
|
2025
|
+
}
|
|
2026
|
+
assert(0);
|
|
2027
|
+
}
|
|
2028
|
+
#ifdef LINUX
|
|
2029
|
+
CASE_TEXTW
|
|
2030
|
+
#endif
|
|
2031
|
+
CASE_TEXTA
|
|
2032
|
+
return atof(readValueStrA());
|
|
2033
|
+
#ifndef LINUX
|
|
2034
|
+
CASE_TEXTW
|
|
2035
|
+
return _wtof((const wchar_t*)readValueStrW());
|
|
2036
|
+
#endif
|
|
2037
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
2038
|
+
break;
|
|
2039
|
+
}
|
|
2040
|
+
return ret;
|
|
1861
2041
|
}
|
|
1862
2042
|
|
|
1863
|
-
|
|
2043
|
+
__int64 field::getFV64() const
|
|
1864
2044
|
{
|
|
1865
|
-
|
|
2045
|
+
if (!m_ptr) return 0;
|
|
2046
|
+
switch (m_fd->type)
|
|
2047
|
+
{
|
|
2048
|
+
CASE_INT
|
|
2049
|
+
CASE_UINT
|
|
2050
|
+
case ft_mydate:
|
|
2051
|
+
case ft_time:
|
|
2052
|
+
case ft_date:
|
|
2053
|
+
case ft_datetime:
|
|
2054
|
+
case ft_logical:
|
|
2055
|
+
case ft_currency:
|
|
2056
|
+
return readValue64();
|
|
2057
|
+
case ft_bit:
|
|
2058
|
+
return changeEndian(readValue64(), m_fd->len);
|
|
2059
|
+
case ft_myyear:
|
|
2060
|
+
{
|
|
2061
|
+
__int64 v = readValue64();
|
|
2062
|
+
if (v) v += 1900;
|
|
2063
|
+
return v;
|
|
2064
|
+
}
|
|
2065
|
+
case ft_mytime:
|
|
2066
|
+
case ft_mydatetime:
|
|
2067
|
+
case ft_mytimestamp:
|
|
2068
|
+
{
|
|
2069
|
+
__int64 v = readValue64();
|
|
2070
|
+
bool bigendian = !m_fd->isLegacyTimeFormat();
|
|
2071
|
+
if (m_fd->type == ft_mytime)
|
|
2072
|
+
{
|
|
2073
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2074
|
+
return getInternalValue<maTime>(m_fd->decimals, bigendian, v);
|
|
2075
|
+
else
|
|
2076
|
+
return getInternalValue<myTime>(m_fd->decimals, bigendian, v);
|
|
2077
|
+
}
|
|
2078
|
+
else if (m_fd->type == ft_mydatetime)
|
|
2079
|
+
{
|
|
2080
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2081
|
+
return getInternalValue<maDateTime>(m_fd->decimals, bigendian, v);
|
|
2082
|
+
else
|
|
2083
|
+
return getInternalValue<myDateTime>(m_fd->decimals, bigendian, v);
|
|
2084
|
+
}
|
|
2085
|
+
else if (m_fd->type == ft_mytimestamp)
|
|
2086
|
+
{
|
|
2087
|
+
if (m_fd->m_options & FIELD_OPTION_MARIADB)
|
|
2088
|
+
return getInternalValue<maTimeStamp>(m_fd->decimals, bigendian, v);
|
|
2089
|
+
else
|
|
2090
|
+
return getInternalValue<myTimeStamp>(m_fd->decimals, bigendian, v);
|
|
2091
|
+
}
|
|
2092
|
+
assert(0);
|
|
2093
|
+
}
|
|
2094
|
+
CASE_FLOAT
|
|
2095
|
+
case ft_timestamp:
|
|
2096
|
+
return (__int64)readValueDbl();
|
|
2097
|
+
CASE_NUMERIC
|
|
2098
|
+
return (__int64)readValueNumeric();
|
|
2099
|
+
CASE_DECIMAL
|
|
2100
|
+
return (__int64)readValueDecimal();
|
|
2101
|
+
case ft_mydecimal:
|
|
2102
|
+
{
|
|
2103
|
+
myDecimal d((uchar_td)m_fd->digits, m_fd->decimals);
|
|
2104
|
+
d.read((char*)m_ptr + m_fd->pos);
|
|
2105
|
+
return d.i64();
|
|
2106
|
+
}
|
|
2107
|
+
#ifdef LINUX
|
|
2108
|
+
CASE_TEXTW
|
|
2109
|
+
#endif
|
|
2110
|
+
CASE_TEXTA
|
|
2111
|
+
return _atoi64(readValueStrA());
|
|
2112
|
+
#ifndef LINUX
|
|
2113
|
+
CASE_TEXTW
|
|
2114
|
+
return _wtoi64(readValueStrW());
|
|
2115
|
+
#endif
|
|
2116
|
+
default: // ft_lvar ft_mygeometry ft_myjson
|
|
2117
|
+
break;
|
|
2118
|
+
}
|
|
2119
|
+
return 0;
|
|
1866
2120
|
}
|
|
1867
2121
|
|
|
1868
|
-
|
|
2122
|
+
/* offset is writen at data that is first address of data
|
|
2123
|
+
* text is not converted to unicode form stored charset.
|
|
2124
|
+
*/
|
|
2125
|
+
void* field::getFVbin(uint_td& size) const
|
|
1869
2126
|
{
|
|
1870
|
-
|
|
2127
|
+
if (!m_ptr) return 0;
|
|
2128
|
+
|
|
2129
|
+
char* p = (char*)m_ptr + m_fd->pos;
|
|
2130
|
+
switch (m_fd->type)
|
|
2131
|
+
{
|
|
2132
|
+
case ft_myvarbinary:
|
|
2133
|
+
case ft_myvarchar:
|
|
2134
|
+
case ft_mywvarbinary:
|
|
2135
|
+
case ft_mywvarchar:
|
|
2136
|
+
case ft_lstring:
|
|
2137
|
+
{
|
|
2138
|
+
int sizeByte = m_fd->varLenBytes();
|
|
2139
|
+
size = 0;
|
|
2140
|
+
memcpy(&size, p, sizeByte);
|
|
2141
|
+
return (void*)(p + sizeByte);
|
|
2142
|
+
}
|
|
2143
|
+
case ft_myjson:
|
|
2144
|
+
case ft_mygeometry:
|
|
2145
|
+
case ft_myblob:
|
|
2146
|
+
case ft_mytext:
|
|
2147
|
+
{
|
|
2148
|
+
int sizeByte = m_fd->len - 8;
|
|
2149
|
+
size = 0;
|
|
2150
|
+
memcpy(&size, p, sizeByte);
|
|
2151
|
+
if (size)
|
|
2152
|
+
{
|
|
2153
|
+
char** ptr = (char**)(p + sizeByte);
|
|
2154
|
+
return (void*)*ptr;
|
|
2155
|
+
}
|
|
2156
|
+
return NULL;
|
|
2157
|
+
}
|
|
2158
|
+
case ft_lvar:
|
|
2159
|
+
{
|
|
2160
|
+
int sizeByte = 2;
|
|
2161
|
+
size = 0;
|
|
2162
|
+
memcpy(&size, p, sizeByte);
|
|
2163
|
+
return (void*)(p + sizeByte);
|
|
2164
|
+
}
|
|
2165
|
+
default:
|
|
2166
|
+
size = m_fd->len;
|
|
2167
|
+
return (void*)(p);
|
|
2168
|
+
}
|
|
1871
2169
|
}
|
|
1872
2170
|
|
|
1873
|
-
|
|
2171
|
+
void* field::ptr() const
|
|
1874
2172
|
{
|
|
1875
|
-
return
|
|
2173
|
+
return m_ptr + m_fd->pos;
|
|
1876
2174
|
}
|
|
1877
2175
|
|
|
1878
|
-
|
|
2176
|
+
void* field::nullPtr() const
|
|
1879
2177
|
{
|
|
1880
|
-
return
|
|
2178
|
+
return m_ptr - m_fd->nullbytes();
|
|
1881
2179
|
}
|
|
1882
2180
|
|
|
1883
|
-
|
|
2181
|
+
void field::nullPtrCache() const
|
|
1884
2182
|
{
|
|
1885
|
-
|
|
2183
|
+
if (m_nullbit == 0 && m_fd->isNullable() && m_fd->nullbytes())
|
|
2184
|
+
{
|
|
2185
|
+
m_cachedNullPtr = (unsigned char*)nullPtr();
|
|
2186
|
+
m_cachedNullPtr += (m_fd->nullbit() / 8);
|
|
2187
|
+
m_nullbit = (1L << (m_fd->nullbit() % 8));
|
|
2188
|
+
}
|
|
1886
2189
|
}
|
|
1887
2190
|
|
|
1888
|
-
|
|
1889
|
-
inline int compVarString(const field& l, const field& r, char logType)
|
|
2191
|
+
bool field::isNull() const
|
|
1890
2192
|
{
|
|
1891
|
-
|
|
1892
|
-
|
|
2193
|
+
nullPtrCache();
|
|
2194
|
+
if (m_nullbit)
|
|
2195
|
+
return (*m_cachedNullPtr & m_nullbit) != 0;
|
|
2196
|
+
return false;
|
|
1893
2197
|
}
|
|
1894
2198
|
|
|
1895
|
-
|
|
1896
|
-
inline int compWVarString(const field& l, const field& r, char logType)
|
|
2199
|
+
void field::setNull(bool v)
|
|
1897
2200
|
{
|
|
1898
|
-
|
|
1899
|
-
|
|
2201
|
+
nullPtrCache();
|
|
2202
|
+
if (m_nullbit && m_cachedNullPtr != &m_nullSign)
|
|
2203
|
+
{
|
|
2204
|
+
if (v)
|
|
2205
|
+
(*m_cachedNullPtr) |= (unsigned char)m_nullbit;
|
|
2206
|
+
else
|
|
2207
|
+
(*m_cachedNullPtr) &= (unsigned char)~m_nullbit;
|
|
2208
|
+
m_fd->enableFlags.bitE = true;
|
|
2209
|
+
}
|
|
1900
2210
|
}
|
|
1901
2211
|
|
|
1902
|
-
|
|
2212
|
+
int field::nullComp(char log) const
|
|
1903
2213
|
{
|
|
1904
|
-
|
|
1905
|
-
|
|
1906
|
-
|
|
2214
|
+
bool rnull = (log == eIsNull) || (log == eIsNotNull);
|
|
2215
|
+
bool lnull = isNull();
|
|
2216
|
+
return ::nullComp(lnull, rnull, log);
|
|
2217
|
+
}
|
|
1907
2218
|
|
|
1908
|
-
|
|
2219
|
+
int field::nullComp(const field& r, char log) const
|
|
1909
2220
|
{
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
case ft_integer:
|
|
1913
|
-
case ft_autoinc:
|
|
1914
|
-
case ft_currency:
|
|
1915
|
-
{
|
|
1916
|
-
if (logType & eBitAnd)
|
|
1917
|
-
{
|
|
2221
|
+
if ((log == eIsNull) || (log == eIsNotNull))
|
|
2222
|
+
return nullComp(log);
|
|
1918
2223
|
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
return &compBitAnd<char>;
|
|
1923
|
-
case 2:
|
|
1924
|
-
return &compBitAnd<short>;
|
|
1925
|
-
case 3:
|
|
1926
|
-
return &compBitAnd24;
|
|
1927
|
-
case 4:
|
|
1928
|
-
return &compBitAnd<int>;
|
|
1929
|
-
case 8:
|
|
1930
|
-
return &compBitAnd<__int64>;
|
|
1931
|
-
}
|
|
1932
|
-
}else
|
|
1933
|
-
{
|
|
1934
|
-
switch (m_fd->len)
|
|
1935
|
-
{
|
|
1936
|
-
case 1:
|
|
1937
|
-
return &compNumber<char>;
|
|
1938
|
-
case 2:
|
|
1939
|
-
return &compNumber<short>;
|
|
1940
|
-
case 3:
|
|
1941
|
-
return &compNumber24;
|
|
1942
|
-
case 4:
|
|
1943
|
-
return &compNumber<int>;
|
|
1944
|
-
case 8:
|
|
1945
|
-
return &compNumber<__int64>;
|
|
1946
|
-
}
|
|
1947
|
-
}
|
|
1948
|
-
}
|
|
1949
|
-
case ft_mychar:
|
|
1950
|
-
case ft_string:
|
|
1951
|
-
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
1952
|
-
return &compiString;
|
|
1953
|
-
return &compMem;
|
|
1954
|
-
case ft_zstring:
|
|
1955
|
-
case ft_note:
|
|
1956
|
-
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
1957
|
-
return &compiString;
|
|
1958
|
-
return &compString;
|
|
1959
|
-
case ft_logical:
|
|
1960
|
-
case ft_uinteger:
|
|
1961
|
-
case ft_autoIncUnsigned:
|
|
1962
|
-
case ft_date:
|
|
1963
|
-
case ft_time:
|
|
1964
|
-
case ft_timestamp:
|
|
1965
|
-
case ft_mydate:
|
|
2224
|
+
bool lnull = isNull();
|
|
2225
|
+
bool rnull = r.isNull();
|
|
2226
|
+
if (lnull || rnull)
|
|
1966
2227
|
{
|
|
1967
|
-
if (
|
|
1968
|
-
|
|
1969
|
-
|
|
1970
|
-
{
|
|
1971
|
-
case 1:
|
|
1972
|
-
return &compBitAnd<unsigned char>;
|
|
1973
|
-
case 2:
|
|
1974
|
-
return &compBitAnd<unsigned short>;
|
|
1975
|
-
case 3:
|
|
1976
|
-
return &compBitAnd24;
|
|
1977
|
-
case 4:
|
|
1978
|
-
return &compBitAnd<unsigned int>;
|
|
1979
|
-
case 8:
|
|
1980
|
-
return &compBitAnd<unsigned __int64>;
|
|
1981
|
-
}
|
|
1982
|
-
}else
|
|
1983
|
-
{
|
|
1984
|
-
switch (m_fd->len)
|
|
1985
|
-
{
|
|
1986
|
-
case 1:
|
|
1987
|
-
return &compNumber<unsigned char>;
|
|
1988
|
-
case 2:
|
|
1989
|
-
return &compNumber<unsigned short>;
|
|
1990
|
-
case 3:
|
|
1991
|
-
return &compNumberU24;
|
|
1992
|
-
case 4:
|
|
1993
|
-
return &compNumber<unsigned int>;
|
|
1994
|
-
case 8:
|
|
1995
|
-
return &compNumber<unsigned __int64>;
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
}
|
|
1999
|
-
case ft_mytime:
|
|
2000
|
-
case ft_mydatetime:
|
|
2001
|
-
case ft_mytimestamp:
|
|
2002
|
-
return &compMem;
|
|
2003
|
-
case ft_float:
|
|
2004
|
-
switch (m_fd->len)
|
|
2005
|
-
{
|
|
2006
|
-
case 4:
|
|
2007
|
-
return &compNumber<float>;
|
|
2008
|
-
case 8:
|
|
2009
|
-
return &compNumber<double>;
|
|
2010
|
-
}
|
|
2011
|
-
case ft_mywchar:
|
|
2012
|
-
case ft_wstring:
|
|
2013
|
-
case ft_wzstring:
|
|
2014
|
-
if (logType & CMPLOGICAL_CASEINSENSITIVE)
|
|
2015
|
-
return &compiWString;
|
|
2016
|
-
if ((m_fd->type == ft_wstring) || (m_fd->type == ft_mywchar))
|
|
2017
|
-
return &compMem;
|
|
2018
|
-
return &compWString;
|
|
2019
|
-
case ft_lstring:
|
|
2020
|
-
case ft_myvarchar:
|
|
2021
|
-
case ft_myvarbinary:
|
|
2022
|
-
if (m_fd->varLenBytes() == 1)
|
|
2023
|
-
return &compVarString<unsigned char>;
|
|
2024
|
-
return &compVarString<unsigned short>;
|
|
2025
|
-
case ft_mywvarchar:
|
|
2026
|
-
case ft_mywvarbinary:
|
|
2027
|
-
if (m_fd->varLenBytes() == 1)
|
|
2028
|
-
return &compWVarString<unsigned char>;
|
|
2029
|
-
return &compWVarString<unsigned short>;
|
|
2030
|
-
case ft_mytext:
|
|
2031
|
-
case ft_myblob:
|
|
2032
|
-
return &compBlob;
|
|
2228
|
+
if (lnull > rnull) return -1;
|
|
2229
|
+
if (lnull < rnull) return 1;
|
|
2230
|
+
return 0;
|
|
2033
2231
|
}
|
|
2034
|
-
return
|
|
2232
|
+
return 2;
|
|
2035
2233
|
}
|
|
2036
2234
|
|
|
2037
|
-
int field::comp(const field& r, char
|
|
2235
|
+
int field::comp(const field& r, char log) const
|
|
2038
2236
|
{
|
|
2039
|
-
|
|
2040
|
-
|
|
2237
|
+
int ret = nullComp(r, log & 0xf);
|
|
2238
|
+
if (ret < 2)
|
|
2239
|
+
return ret;
|
|
2240
|
+
comp1Func f = getCompFunc(m_fd->type, m_fd->len, log, m_fd->varLenBytes() + m_fd->blobLenBytes());
|
|
2241
|
+
return f((const char*)ptr(), (const char*)r.ptr(), r.len());
|
|
2041
2242
|
}
|
|
2042
2243
|
|
|
2043
2244
|
bool field::isCompPartAndMakeValue()
|
|
@@ -2046,11 +2247,6 @@ bool field::isCompPartAndMakeValue()
|
|
|
2046
2247
|
if (m_fd->isStringType())
|
|
2047
2248
|
{
|
|
2048
2249
|
m_fd->setPadCharSettings(false, true);
|
|
2049
|
-
/*bool trim = m_fd->trimPadChar();
|
|
2050
|
-
bool use = m_fd->usePadChar();
|
|
2051
|
-
bool sp = (!trim || use);
|
|
2052
|
-
if (sp)
|
|
2053
|
-
m_fd->setPadCharSettings(false, true);*/
|
|
2054
2250
|
_TCHAR* p = (_TCHAR*)getFVstr();
|
|
2055
2251
|
if (p)
|
|
2056
2252
|
{
|
|
@@ -2073,8 +2269,6 @@ bool field::isCompPartAndMakeValue()
|
|
|
2073
2269
|
}
|
|
2074
2270
|
else
|
|
2075
2271
|
setFV(_T(""));
|
|
2076
|
-
/*if (sp)
|
|
2077
|
-
m_fd->setPadCharSettings(use, trim); */
|
|
2078
2272
|
}
|
|
2079
2273
|
return ret;
|
|
2080
2274
|
}
|