transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. 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/myDateTime.cpp>
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
- void fielddefs::addAllFileds(tabledef* def)
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
- m_imple->fields.clear();
161
- for (int i = 0; i < def->fieldCount; ++i)
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 = &def->fieldDefs[i];
164
- fd->setPadCharDefaultSettings();
165
- push_back(fd);
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, bool rePosition)
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
- if (rePosition)
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::copyFrom(const table* tb)
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 pos = 0;
564
+ int startIndex = (int)m_imple->fields.size();
277
565
  for (int i = 0; i < n; ++i)
278
- {
279
- fielddef fd = def->fieldDefs[tb->getCurProcFieldIndex(i)];
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
- // const field fieldDummy(NULL, initDummy(), NULL);
624
+ /*
625
+ For not string type
626
+ Cast is faster than memcopy.
334
627
 
335
- inline __int64 getValue64(const fielddef& fd, const uchar_td* ptr)
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
- if (ptr)
634
+ switch (m_fd->type)
339
635
  {
340
- switch (fd.type)
636
+ case ft_integer:
637
+ case ft_autoinc:
638
+ switch (m_fd->len)
341
639
  {
342
- case ft_integer:
343
- case ft_autoinc:
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 ft_currency:
393
- ret = (*((__int64*)((char*)ptr + fd.pos)) / 10000);
643
+ case 2:
644
+ ret = *((short*)ptr);
394
645
  break;
395
- case ft_bfloat:
396
- case ft_float:
397
- switch (fd.len)
398
- {
399
- case 4:
400
- ret = (__int64)*((float*)((char*)ptr + fd.pos));
401
- break;
402
- case 8:
403
- ret = (__int64)*((double*)((char*)ptr + fd.pos));
404
- case 10: // long double
405
- ret = (__int64)*((long double*)((char*)ptr + fd.pos));
406
- break;
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
- inline void setValue(const fielddef& fd, uchar_td* ptr, __int64 value)
721
+ void field::storeValue64(__int64 value)
415
722
  {
416
- if (!ptr)
417
- return;
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 (fd.len)
729
+ switch (m_fd->len)
424
730
  {
425
731
  case 1:
426
- *((char*)(ptr + fd.pos)) = (char)value;
732
+ *((char*)ptr) = (char)value;
427
733
  break;
428
734
  case 2:
429
- *((short*)(ptr + fd.pos)) = (short)value;
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*)(ptr + fd.pos)) = (int)value;
741
+ *((int*)ptr) = (int)value;
433
742
  break;
434
743
  case 8:
435
- *((__int64*)(ptr + fd.pos)) = value;
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 ft_mytime:
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
- memcpy(ptr + fd.pos, &value, fd.len);
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
- void* field::ptr() const
813
+ double field::readValueDbl() const
457
814
  {
458
- return m_ptr + m_fd->pos;
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::setFVA(const char* data)
840
+ void field::storeValueDbl(double value)
462
841
  {
463
- if (!m_ptr)
464
- return;
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
- memset(p, 0, m_fd->len);
472
- return;
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->usePadChar())
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->usePadChar())
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
- return;
903
+ break;
510
904
  }
511
- case ft_decimal:
512
- case ft_money:
513
- case ft_numeric:
514
- case ft_bfloat:
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
- case ft_date: // date mm/dd/yy
526
- value = /*StrToBtrDate*/ atobtrd((const char*)data).i;
527
- break;
528
- case ft_time: // time hh:nn:ss
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
- myDateTime t(m_fd->len);
573
- t = data;
574
- value = t.getValue();
575
- break;
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
- return;
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->usePadChar())
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->usePadChar())
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
- case ft_date: // date mm/dd/yy
639
- value = /*StrToBtrDate*/ atobtrd(data).i;
640
- setFV(value);
641
- break;
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
- __int64 v = _wtoi64(data);
654
- setFV(v);
655
- break;
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
- case ft_logical:
658
- if (m_fds->logicalToString)
659
- {
660
- wchar_t tmp[5];
661
- wcsncpy(tmp, data, 5);
1047
+ }
1048
+ #endif //_WIN32
662
1049
 
663
- if (wcscmp(_wcsupr(tmp), L"YES") == 0)
664
- value = 1;
665
- else
666
- value = 0;
667
- }
668
- else
669
- value = _wtol(data);
670
- setFV(value);
671
- break;
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
- case ft_decimal:
674
- case ft_money:
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
- case ft_bfloat:
677
- case ft_numericsts:
1085
+ dummy[m_fd->len] = dp[n];
1086
+ break;
678
1087
  case ft_numericsa:
679
- case ft_currency:
680
- case ft_float:
681
- fltValue = _wtof(data);
682
- setFV(fltValue);
1088
+ dummy[m_fd->len] = dpsa[n];
683
1089
  break;
684
- case ft_timestamp:
685
- {
686
- __int64 v = 0;
687
- setFV(v);
688
- return;
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
- #endif //_WIN32
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
- int value = (int)data;
723
- setFV(value);
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 ft_mydate:
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
- case ft_mytime:
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
- case ft_integer:
750
- case ft_date:
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
- case ft_timestamp:
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
- case ft_currency:
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
- if (data == 0)
817
- setFV(_T(""));
818
- else
1136
+ for (i = 0; i < 21; i++)
819
1137
  {
820
- _TCHAR buf[50];
821
- _ltot_s(data, buf, 50, 10);
822
- setFV(buf);
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::setFV(double data)
832
- {
833
- if (!m_ptr)
834
- return;
835
- char buf[50];
836
- __int64 i64;
837
- switch (m_fd->type)
838
- {
839
- case ft_currency: // currency
840
- i64 = (__int64)(data * 10000 + 0.5);
841
- setFV(i64);
842
- break;
843
- case ft_bfloat: // bfloat
844
- case ft_float:
845
- switch (m_fd->len)
846
- {
847
- case 4:
848
- *((float*)((char*)m_ptr + m_fd->pos)) = (float)data;
849
- break;
850
- case 8:
851
- *((double*)((char*)m_ptr + m_fd->pos)) = data;
852
- break;
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
- case ft_integer:
868
- case ft_date:
869
- case ft_time:
870
- case ft_autoIncUnsigned:
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
- if (data == 0)
906
- setFV(_T(""));
907
- else
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
- _TCHAR buf[50];
910
- _stprintf_s(buf, 50, _T("%f"), data);
911
- setFV(buf);
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
- break;
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
- void field::setFV(short data)
1225
+ double field::readValueDecimal() const
919
1226
  {
920
- int value = (int)data;
921
- setFV(value);
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
- void field::setFV(float data)
925
- {
926
- double value = (double)data;
927
- setFV(value);
928
- }
1246
+ if (sign == 13)
1247
+ result[0] = '-';
1248
+ result[i - 1] = 0x00;
929
1249
 
930
- short field::getFVsht() const
931
- {
932
- return (short)getFVlng();
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
- int field::getFVlng() const
936
- {
937
- if (!m_ptr)
938
- return 0;
939
- int ret = 0;
940
- switch (m_fd->type)
941
- {
942
- case ft_integer:
943
- case ft_autoinc:
944
- switch (m_fd->len)
945
- {
946
- case 1:
947
- ret = *(((char*)m_ptr + m_fd->pos));
948
- break;
949
- case 2:
950
- ret = *((short*)((char*)m_ptr + m_fd->pos));
951
- break;
952
- case 3:
953
- memcpy(&ret, (char*)m_ptr + m_fd->pos, 3);
954
- ret = ((ret & 0xFFFFFF) << 8) / 0x100;
955
- break;
956
- case 8:
957
- case 4:
958
- ret = *((int*)((char*)m_ptr + m_fd->pos));
959
- break;
960
- }
961
- break;
962
- case ft_autoIncUnsigned:
963
- case ft_uinteger:
964
- case ft_logical:
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
- case ft_mywvarchar:
1015
- case ft_mywchar:
1016
- ret = _ttol(getFVstr());
1017
- break;
1018
- case ft_currency:
1019
- ret = (long)(*((__int64*)((char*)m_ptr + m_fd->pos)) / 10000);
1020
- break;
1021
- case ft_bfloat:
1022
- case ft_float:
1023
- ret = (long)getFVdbl();
1024
- break;
1025
- case ft_decimal:
1026
- case ft_money:
1027
- ret = (long)getFVDecimal();
1028
- break;
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
- case ft_lvar:
1036
- break;
1037
- default:
1038
- return 0;
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
- return ret;
1319
+ else
1320
+ return atol(data);
1041
1321
  }
1042
1322
 
1043
- float field::getFVflt() const
1323
+ #ifdef _WIN32
1324
+ inline __int64 logical_str_to_64(bool logicalToString, const wchar_t* data)
1044
1325
  {
1045
- return (float)getFVdbl();
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
- double field::getFVdbl() const
1340
+ //---------------------------------------------------------------------------
1341
+ // set functions
1342
+ //---------------------------------------------------------------------------
1343
+ void field::setFVA(const char* data)
1049
1344
  {
1050
- if (!m_ptr)
1051
- return 0;
1052
- double ret = 0;
1053
- switch (m_fd->type)
1345
+ assert(m_ptr);
1346
+
1347
+ __int64 value;
1348
+ char* p = (char*)m_ptr + m_fd->pos;
1349
+ if (data == NULL)
1054
1350
  {
1055
- case ft_currency:
1056
- ret = (double)*((__int64*)((char*)m_ptr + m_fd->pos));
1057
- ret = ret / 10000;
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
- case ft_bfloat:
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 ft_string:
1075
- case ft_zstring:
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 ft_wstring:
1083
- case ft_wzstring:
1084
- case ft_mywvarbinary:
1085
- case ft_mywvarchar:
1086
- case ft_mywchar:
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
- case ft_autoIncUnsigned:
1093
- case ft_uinteger:
1094
- case ft_logical:
1095
- case ft_autoinc:
1096
- case ft_bit:
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
- case ft_mydatetime:
1100
- case ft_mytimestamp:
1101
- ret = (double)getFV64();
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
- case ft_decimal:
1105
- case ft_money:
1106
- ret = getFVDecimal();
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 ft_numeric:
1109
- case ft_numericsts:
1110
- case ft_numericsa:
1111
- ret = getFVnumeric();
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 ft_lvar:
1423
+ case ft_currency:
1424
+ value = (__int64)(atof(data) * 10000);
1114
1425
  break;
1115
- default:
1116
- return 0;
1426
+ default: // ft_lvar ft_mygeometry ft_myjson
1427
+ return;
1117
1428
  }
1118
- return ret;
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
- if (!m_ptr)
1131
- return L"";
1132
- char* data = (char*)m_ptr + m_fd->pos;
1133
- switch (m_fd->type)
1435
+ assert(m_ptr);
1436
+
1437
+ __int64 value;
1438
+ char* p = (char*)m_ptr + m_fd->pos;
1439
+ if (data == NULL)
1134
1440
  {
1135
- case ft_string:
1136
- return read<stringStore, char, WCHAR>(data, m_fds->strBufs(), *m_fd,
1137
- m_fds->cv(), m_fd->trimPadChar());
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
- wchar_t* p = (wchar_t*)m_fds->strBufs()->getPtrW(max(m_fd->len * 2, 50));
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
- case ft_integer:
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
- case ft_autoinc:
1181
- _i64tow_s(getFV64(), p, 50, 10);
1182
- return p;
1474
+ value = changeEndian((__int64)wcstoull(data, NULL, 10), m_fd->len);
1475
+ break;
1183
1476
  case ft_logical:
1184
- if (m_fds->logicalToString)
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
- case ft_autoIncUnsigned:
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
- return btrttoa(getFVlng(), p);
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
- myDate d;
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
- myTime t(m_fd->len);
1234
- t.setValue(getValue64(*m_fd, (const uchar_td*)m_ptr));
1235
- return t.toStr(p);
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
- myTimeStamp ts(m_fd->len);
1246
- ts.setValue(getFV64());
1247
- return ts.toStr(p);
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 ft_lvar:
1260
- return NULL;
1261
- case ft_timestamp:
1262
- return btrTimeStamp(getFV64()).toString(p);
1263
- default:
1264
- p[0] = 0x00;
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
- return p;
1519
+ storeValue64(value);
1267
1520
  }
1268
-
1269
1521
  #endif //_WIN32
1270
1522
 
1271
- const char* field::getFVAstr() const
1523
+ void field::setFV(__int64 data)
1272
1524
  {
1273
- if (!m_ptr)
1274
- return "";
1275
-
1276
- char buf[10] = "%0.";
1525
+ assert(m_ptr);
1526
+ setNull(false);
1277
1527
 
1278
- char* data = (char*)m_ptr + m_fd->pos;
1279
- switch (m_fd->type)
1528
+ switch(m_fd->type)
1280
1529
  {
1281
-
1282
- case ft_string:
1283
- return read<stringStore, char, char>(data, m_fds->strBufs(), *m_fd,
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
- case ft_integer:
1322
- case ft_bit:
1323
- case ft_autoinc:
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 (getFVlng())
1330
- return "Yes";
1538
+ if (m_fd->m_options & FIELD_OPTION_MARIADB)
1539
+ data = getStoreValue<maDateTime>(m_fd->decimals, bigendian, data);
1331
1540
  else
1332
- return "No";
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 (p[k] == '0')
1346
- p[k] = 0x00;
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
- break;
1354
- k--;
1548
+ data = getStoreValue<myTimeStamp>(m_fd->decimals, bigendian, data);
1355
1549
  }
1356
- break;
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
- return btrttoa(getFVlng(), p);
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
- myDate d;
1370
- d.setValue((int)getValue64(*m_fd, (const uchar_td*)m_ptr));
1371
- return d.toStr(p, m_fds->myDateTimeValueByBtrv);
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
- case ft_mytimestamp:
1592
+ #ifdef LINUX
1593
+ CASE_TEXTW
1594
+ #endif
1595
+ CASE_TEXTA
1380
1596
  {
1381
- myTimeStamp ts(m_fd->len);
1382
- ts.setValue(getFV64());
1383
- return ts.toStr(p);
1597
+ char buf[NUMBUFSIZE];
1598
+ _i64toa_s(data, buf, NUMBUFSIZE, 10);
1599
+ storeValueStrA(buf);
1600
+ break;
1384
1601
  }
1385
- case ft_mydatetime:
1602
+ #ifndef LINUX
1603
+ CASE_TEXTW
1386
1604
  {
1387
- myDateTime t(m_fd->len);
1388
- t.setValue(getFV64());
1389
- return t.toStr(p);
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
- return p;
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(__int64 data)
1616
+ void field::setFV(double data)
1463
1617
  {
1464
- if (!m_ptr)
1465
- return;
1466
-
1467
- switch (m_fd->len)
1618
+ assert(m_ptr);
1619
+ setNull(false);
1620
+ __int64 i64 = (__int64)data;
1621
+ switch (m_fd->type)
1468
1622
  {
1469
- case 8:
1470
- switch (m_fd->type)
1471
- {
1472
- case ft_autoIncUnsigned:
1473
- case ft_uinteger:
1474
- case ft_integer:
1475
- case ft_logical:
1476
- case ft_autoinc:
1477
- case ft_bit:
1478
- case ft_currency:
1479
- case ft_mydatetime:
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
- btrDate d;
1486
- d.i = getNowDate();
1487
- btrTime t;
1488
- t.i = getNowTime();
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
- case ft_float:
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
- double d = (double)data;
1495
- setFV(d);
1496
- break;
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 7:
1501
- case 6:
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
- default:
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
- int value = (int)data;
1517
- setFV(value);
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
- if (!m_ptr)
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
- /* offset is writen at data that is first address of data
1572
- * text is not converted to unicode form stored charset.
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
- double field::getFVDecimal() const
1769
+ const char* field::getFVAstr() const
1620
1770
  {
1621
- if (!m_ptr)
1622
- return 0;
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
- sprintf_s(n, 10, "%02x", buf[i]);
1638
- strcat(result, n);
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
- case ft_numeric:
1674
- pdp = dp;
1675
- break;
1676
- case ft_numericsa:
1677
- pdp = dpsa;
1678
- break;
1679
- case ft_numericsts:
1680
- buf[0] = *t;
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
- for (i = 1; i <= point; i++)
1750
- {
1751
- if ((dummy[i] == '-') || (dummy[i] == '.'))
1752
- ;
1753
- else
1754
- {
1755
- if (offset)
1756
- {
1757
- n = (unsigned char)(n + dummy[i] - 48);
1758
- buf[k] = n;
1759
- offset = false;
1760
- k++;
1761
- }
1762
- else
1763
- {
1764
- n = (unsigned char)(dummy[i] - 48);
1765
- n = (unsigned char)(n << 4);
1766
- offset = true;
1767
- ;
1768
- }
1769
- }
1770
- }
1771
- if (sign)
1772
- buf[k] += ((unsigned char)(n + 13));
1773
- else
1774
- buf[k] += ((unsigned char)(n + 12));
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
- n = atol(&dummy[m_fd->len]);
1810
- if (sign)
1811
- n += 10;
1812
- t = dummy + 1;
1843
+ double v = 0;
1813
1844
  switch (m_fd->type)
1814
1845
  {
1815
- case ft_numeric:
1816
- dummy[m_fd->len] = dp[n];
1846
+ case ft_currency:
1847
+ v = readValue64() / (double)10000;
1817
1848
  break;
1818
- case ft_numericsa:
1819
- dummy[m_fd->len] = dpsa[n];
1849
+ CASE_FLOAT
1850
+ v = readValueDbl();
1820
1851
  break;
1821
- case ft_numericsts:
1822
- if (sign)
1823
- strcat(dummy, "-");
1824
- else
1825
- strcat(dummy, "+");
1826
- t += 1;
1852
+ CASE_NUMERIC
1853
+ v = readValueNumeric();
1854
+ break;
1855
+ CASE_DECIMAL
1856
+ v = readValueDecimal();
1827
1857
  break;
1828
- }
1829
1858
 
1830
- memcpy((void*)((char*)m_ptr + m_fd->pos), t, m_fd->len);
1859
+ }
1860
+ sprintf_s(p, NUMBUFSIZE, "%.*lf", m_fd->decimals, v);
1861
+ return p;
1831
1862
  }
1832
1863
 
1833
- template <class T>
1834
- inline int compNumber(const field& l, const field& r, char logType)
1864
+ #ifdef _WIN32
1865
+ const wchar_t* field::getFVWstr() const
1835
1866
  {
1836
- return compare<T>((const char*)l.ptr(), (const char*)r.ptr());
1837
- }
1867
+ if (!m_ptr) return L"";
1838
1868
 
1839
- template <class T>
1840
- inline int compBitAnd(const field& l, const field& r, char logType)
1841
- {
1842
- return bitMask<T>((const char*)l.ptr(), (const char*)r.ptr());
1843
- }
1869
+ switch (m_fd->type)
1870
+ {
1871
+ CASE_TEXT
1872
+ return readValueStrW();
1873
+ }
1844
1874
 
1845
- inline int compBitAnd24(const field& l, const field& r, char logType)
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
- int lv = ((*((int*)(const char*)l.ptr()) & 0xFFFFFF) << 8) / 0x100;
1849
- int rv = ((*((int*)(const char*)r.ptr()) & 0xFFFFFF) << 8) / 0x100;
1850
- return bitMask<int>((const char*)&lv, (const char*)&rv);
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
- inline int compNumber24(const field& l, const field& r, char logType)
1854
- {
1855
- return compareInt24((const char*)l.ptr(), (const char*)r.ptr());
1957
+ return p;
1856
1958
  }
1959
+ #endif //_WIN32
1857
1960
 
1858
- inline int compNumberU24(const field& l, const field& r, char logType)
1961
+ double field::getFVdbl() const
1859
1962
  {
1860
- return compareUint24((const char*)l.ptr(), (const char*)r.ptr());
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
- inline int compMem(const field& l, const field& r, char logType)
2043
+ __int64 field::getFV64() const
1864
2044
  {
1865
- return memcmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
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
- inline int compString(const field& l, const field& r, char logType)
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
- return strncmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
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
- inline int compiString(const field& l, const field& r, char logType)
2171
+ void* field::ptr() const
1874
2172
  {
1875
- return _strnicmp((const char*)l.ptr(), (const char*)r.ptr(), r.len());
2173
+ return m_ptr + m_fd->pos;
1876
2174
  }
1877
2175
 
1878
- int compWString(const field& l, const field& r, char logType)
2176
+ void* field::nullPtr() const
1879
2177
  {
1880
- return wcsncmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), r.len());
2178
+ return m_ptr - m_fd->nullbytes();
1881
2179
  }
1882
2180
 
1883
- int compiWString(const field& l, const field& r, char logType)
2181
+ void field::nullPtrCache() const
1884
2182
  {
1885
- return wcsnicmp16((char16_t*)l.ptr(), (char16_t*)r.ptr(), r.len());
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
- template <class T>
1889
- inline int compVarString(const field& l, const field& r, char logType)
2191
+ bool field::isNull() const
1890
2192
  {
1891
- return compareVartype<T>((const char*)l.ptr(), (const char*)r.ptr(),
1892
- l.type() == ft_myvarbinary, logType);
2193
+ nullPtrCache();
2194
+ if (m_nullbit)
2195
+ return (*m_cachedNullPtr & m_nullbit) != 0;
2196
+ return false;
1893
2197
  }
1894
2198
 
1895
- template <class T>
1896
- inline int compWVarString(const field& l, const field& r, char logType)
2199
+ void field::setNull(bool v)
1897
2200
  {
1898
- return compareWvartype<T>((const char*)l.ptr(), (const char*)r.ptr(),
1899
- l.type() == ft_mywvarbinary, logType);
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
- inline int compBlob(const field& l, const field& r, char logType)
2212
+ int field::nullComp(char log) const
1903
2213
  {
1904
- return compareBlobType((const char*)l.ptr(), (const char*)r.ptr(),
1905
- l.type() == ft_myblob, logType, l.blobLenBytes());
1906
- }
2214
+ bool rnull = (log == eIsNull) || (log == eIsNotNull);
2215
+ bool lnull = isNull();
2216
+ return ::nullComp(lnull, rnull, log);
2217
+ }
1907
2218
 
1908
- compFieldFunc field::getCompFunc(char logType) const
2219
+ int field::nullComp(const field& r, char log) const
1909
2220
  {
1910
- switch (m_fd->type)
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
- switch (m_fd->len)
1920
- {
1921
- case 1:
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 (logType & eBitAnd)
1968
- {
1969
- switch (m_fd->len)
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 NULL;
2232
+ return 2;
2035
2233
  }
2036
2234
 
2037
- int field::comp(const field& r, char logType) const
2235
+ int field::comp(const field& r, char log) const
2038
2236
  {
2039
- compFieldFunc f = getCompFunc(logType);
2040
- return f(*this, r, logType);
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
  }