transactd 2.4.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
  }