transactd 2.4.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +1 -1
  3. data/README-JA.md +52 -529
  4. data/README.md +52 -523
  5. data/bin/common/tdclc_32_3_0.dll +0 -0
  6. data/bin/common/tdclc_64_3_0.dll +0 -0
  7. data/build/common/system.cmake +2 -1
  8. data/build/common/transactd_cl_common.cmake +3 -6
  9. data/build/swig/ruby/ruby.swg +85 -28
  10. data/build/swig/ruby/tdclrb_wrap.cpp +3195 -1578
  11. data/build/swig/tdcl.i +161 -5
  12. data/build/tdclc/CMakeLists.txt +1 -0
  13. data/build/tdclc/tdclc.cbproj +7 -1
  14. data/build/tdclc/tdclc.rc +4 -4
  15. data/build/tdclcpp/tdclcpp.rc +4 -4
  16. data/build/tdclcpp/tdclcpp_bc.cbproj +2 -5
  17. data/build/tdclrb/tdclrb.rc +4 -4
  18. data/source/bzs/db/blobStructs.h +1 -1
  19. data/source/bzs/db/engine/mysql/database.cpp +199 -74
  20. data/source/bzs/db/engine/mysql/database.h +47 -18
  21. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -0
  22. data/source/bzs/db/engine/mysql/mysqlInternal.h +32 -8
  23. data/source/bzs/db/protocol/tdap/btrDate.cpp +110 -75
  24. data/source/bzs/db/protocol/tdap/btrDate.h +46 -21
  25. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +18 -18
  26. data/source/bzs/db/protocol/tdap/client/activeTable.h +25 -25
  27. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  28. data/source/bzs/db/protocol/tdap/client/client.cpp +6 -5
  29. data/source/bzs/db/protocol/tdap/client/client.h +82 -15
  30. data/source/bzs/db/protocol/tdap/client/database.cpp +531 -142
  31. data/source/bzs/db/protocol/tdap/client/database.h +19 -6
  32. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +461 -408
  33. data/source/bzs/db/protocol/tdap/client/dbDef.h +11 -17
  34. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +61 -13
  35. data/source/bzs/db/protocol/tdap/client/field.cpp +1592 -1398
  36. data/source/bzs/db/protocol/tdap/client/field.h +110 -121
  37. data/source/bzs/db/protocol/tdap/client/fields.h +40 -10
  38. data/source/bzs/db/protocol/tdap/client/filter.h +69 -55
  39. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +296 -164
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.h +77 -25
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +31 -13
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +31 -21
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +4 -1
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +69 -24
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +3 -1
  47. data/source/bzs/db/protocol/tdap/client/recordset.cpp +1 -0
  48. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +46 -27
  49. data/source/bzs/db/protocol/tdap/client/request.h +2 -1
  50. data/source/bzs/db/protocol/tdap/client/serializer.cpp +44 -9
  51. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -1
  52. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +182 -76
  53. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +23 -12
  54. data/source/bzs/db/protocol/tdap/client/stringConverter.h +8 -10
  55. data/source/bzs/db/protocol/tdap/client/table.cpp +172 -93
  56. data/source/bzs/db/protocol/tdap/client/table.h +112 -37
  57. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +17 -0
  58. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +0 -1
  59. data/source/bzs/db/protocol/tdap/client/trdclcppautolink.h +0 -2
  60. data/source/bzs/db/protocol/tdap/client/trdormapi.h +1 -1
  61. data/source/bzs/db/protocol/tdap/fieldComp.h +698 -14
  62. data/source/bzs/db/protocol/tdap/myDateTime.cpp +723 -307
  63. data/source/bzs/db/protocol/tdap/myDateTime.h +294 -0
  64. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +164 -54
  65. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +6 -3
  66. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +133 -550
  67. data/source/bzs/db/protocol/tdap/mysql/request.h +6 -5
  68. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +217 -82
  69. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +1 -1
  70. data/source/bzs/db/protocol/tdap/tdapRequest.h +4 -9
  71. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +808 -17
  72. data/source/bzs/db/protocol/tdap/tdapSchema.h +656 -164
  73. data/source/bzs/db/protocol/tdap/tdapcapi.h +130 -28
  74. data/source/bzs/db/protocol/tdap/uri.h +40 -32
  75. data/source/bzs/db/transactd/connManager.cpp +1 -1
  76. data/source/bzs/db/transactd/transactd.cpp +7 -0
  77. data/source/bzs/env/compiler.h +107 -94
  78. data/source/bzs/env/crosscompile.cpp +24 -12
  79. data/source/bzs/env/crosscompile.h +75 -6
  80. data/source/bzs/env/mbcswchrLinux.cpp +2 -2
  81. data/source/bzs/env/tcharMinGW.h +4 -0
  82. data/source/bzs/example/changeSchema.cpp +22 -17
  83. data/source/bzs/example/queryData.cpp +4 -0
  84. data/source/bzs/netsvc/client/iconnection.h +3 -1
  85. data/source/bzs/netsvc/client/tcpClient.h +10 -3
  86. data/source/bzs/rtl/stringBuffers.cpp +7 -0
  87. data/source/bzs/test/tdclatl/bench_query_atl.js +6 -0
  88. data/source/bzs/test/tdclatl/bench_tdclatl.js +8 -1
  89. data/source/bzs/test/tdclatl/test_query_atl.js +22 -2
  90. data/source/bzs/test/tdclatl/test_v3.js +1017 -0
  91. data/source/bzs/test/tdclphp/transactd_Test.php +55 -21
  92. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +0 -5
  93. data/source/bzs/test/tdclphp/transactd_pool_Test.php +2 -0
  94. data/source/bzs/test/tdclphp/transactd_v3_Test.php +743 -0
  95. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +0 -5
  96. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +2 -0
  97. data/source/bzs/test/tdclrb/transactd_spec.rb +39 -16
  98. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +748 -0
  99. data/source/bzs/test/transactdBench/transactdBench.cpp +55 -58
  100. data/source/bzs/test/transactdBench/transactdBench2.cpp +1 -3
  101. data/source/bzs/test/trdclengn/testField.h +3305 -0
  102. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +1050 -0
  103. data/source/bzs/test/trdclengn/test_trdclengn.cpp +112 -190
  104. data/source/bzs/test/trdclengn/testbase.h +137 -0
  105. data/source/global/ormsrcgen/srcgen.cpp +23 -12
  106. data/source/global/ormsrcgen/template/ormDataClass_template.h +2 -0
  107. data/source/global/querystmts/querystmts.cpp +2 -3
  108. data/source/global/tdclatl/Bitset.cpp +38 -0
  109. data/source/global/tdclatl/Bitset.h +63 -0
  110. data/source/global/tdclatl/Database.cpp +59 -18
  111. data/source/global/tdclatl/Database.h +7 -4
  112. data/source/global/tdclatl/DbDef.cpp +6 -6
  113. data/source/global/tdclatl/DbDef.h +2 -1
  114. data/source/global/tdclatl/Field.cpp +112 -0
  115. data/source/global/tdclatl/Field.h +19 -5
  116. data/source/global/tdclatl/FieldDef.cpp +137 -16
  117. data/source/global/tdclatl/FieldDef.h +18 -2
  118. data/source/global/tdclatl/FieldDefs.cpp +54 -1
  119. data/source/global/tdclatl/FieldDefs.h +3 -0
  120. data/source/global/tdclatl/GroupQuery.cpp +8 -8
  121. data/source/global/tdclatl/QueryBase.cpp +65 -0
  122. data/source/global/tdclatl/QueryBase.h +10 -0
  123. data/source/global/tdclatl/Record.cpp +33 -2
  124. data/source/global/tdclatl/Record.h +3 -1
  125. data/source/global/tdclatl/RecordsetQuery.cpp +42 -0
  126. data/source/global/tdclatl/RecordsetQuery.h +8 -0
  127. data/source/global/tdclatl/Table.cpp +127 -3
  128. data/source/global/tdclatl/Table.h +10 -1
  129. data/source/global/tdclatl/TableDef.cpp +41 -8
  130. data/source/global/tdclatl/TableDef.h +7 -2
  131. data/source/global/tdclatl/activeTable.cpp +40 -71
  132. data/source/global/tdclatl/resource.h +0 -0
  133. data/source/global/tdclatl/tdclatl.idl +222 -28
  134. data/source/linux/tchar.h +100 -96
  135. data/transactd.gemspec +2 -2
  136. metadata +13 -11
  137. data/BUILD_UNIX-JA.md +0 -161
  138. data/BUILD_WIN-JA.md +0 -326
  139. data/README_ORMSRCGEN-JA.md +0 -115
  140. data/README_ORMSRCGEN.md +0 -118
  141. data/RELEASE_NOTE-JA.md +0 -356
  142. data/RELEASE_NOTE.md +0 -360
  143. data/bin/common/tdclc_32_2_4.dll +0 -0
  144. data/bin/common/tdclc_64_2_4.dll +0 -0
  145. data/source/bzs/test/trdclengn/test_blob.cpp +0 -375
@@ -22,7 +22,6 @@
22
22
 
23
23
  #include <bzs/db/protocol/tdap/tdapSchema.h>
24
24
  #include <bzs/db/protocol/tdap/mysql/characterset.h>
25
- #include <stdio.h>
26
25
  #ifdef _WIN32
27
26
  #include <windows.h>
28
27
  #endif
@@ -100,6 +99,18 @@ const wchar_t* fielddef::chainChar() const
100
99
  return p;
101
100
  }
102
101
 
102
+ const wchar_t* fielddef::defaultValue_str() const
103
+ {
104
+ char tmp[MYSQL_FDNAME_SIZE];
105
+ const char* src = defaultValue_strA(tmp, MYSQL_FDNAME_SIZE);
106
+ wchar_t* p = namebuf();
107
+ MultiByteToWideChar(m_schemaCodePage,
108
+ (m_schemaCodePage == CP_UTF8) ? 0 : MB_PRECOMPOSED,
109
+ src, -1, p, MYSQL_FDNAME_SIZE);
110
+ return p;
111
+ }
112
+
113
+
103
114
  void fielddef::setName(const wchar_t* s)
104
115
  {
105
116
  WideCharToMultiByte(m_schemaCodePage,
@@ -114,6 +125,19 @@ void fielddef::setChainChar(const wchar_t* s)
114
125
  s, -1, m_chainChar, 2, NULL, NULL);
115
126
  }
116
127
 
128
+ void fielddef::setDefaultValue(const wchar_t* s)
129
+ {
130
+ int size = WideCharToMultiByte(m_schemaCodePage,
131
+ (m_schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK,
132
+ s, -1, NULL, 0, NULL, NULL);
133
+ char* p = new char[size + 1];
134
+ WideCharToMultiByte(m_schemaCodePage,
135
+ (m_schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK,
136
+ s, -1, p, size + 1, NULL, NULL);
137
+ setDefaultValue(p);
138
+ delete [] p;
139
+ }
140
+
117
141
  const wchar_t* tabledef::fileName() const
118
142
  {
119
143
  wchar_t* p = namebuf();
@@ -132,7 +156,7 @@ const wchar_t* tabledef::tableName() const
132
156
  return p;
133
157
  }
134
158
 
135
- const char* tabledef::toChar(char* buf, const wchar_t* s, int size)
159
+ const char* tabledef::toChar(char* buf, const wchar_t* s, int size) const
136
160
  {
137
161
  WideCharToMultiByte(schemaCodePage,
138
162
  (schemaCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK, s,
@@ -193,6 +217,12 @@ const char* fielddef::chainChar() const
193
217
  return m_chainChar;
194
218
  }
195
219
 
220
+ const char* fielddef::defaultValue_str() const
221
+ {
222
+ char* p = (char*)namebuf();
223
+ return defaultValue_strA(p, MYSQL_FDNAME_SIZE);
224
+ }
225
+
196
226
  void fielddef::setName(const char* s)
197
227
  {
198
228
  #ifdef LINUX
@@ -259,7 +289,7 @@ void tabledef::setTableName(const char* s)
259
289
  setTableNameA(s);
260
290
  }
261
291
 
262
- const char* tabledef::toChar(char* buf, const char* s, int size)
292
+ const char* tabledef::toChar(char* buf, const char* s, int size) const
263
293
  {
264
294
  #ifdef LINUX
265
295
  if (schemaCodePage != CP_UTF8)
@@ -275,13 +305,253 @@ const char* tabledef::toChar(char* buf, const char* s, int size)
275
305
  #endif // NOT _UNICODE
276
306
 
277
307
 
308
+ //--------------------------------------------------------------------
309
+ // struct keydef
310
+ //--------------------------------------------------------------------
311
+ short keydef::synchronize(const keydef* kd)
312
+ {
313
+ for (int i = 0; i < kd->segmentCount; ++i)
314
+ {
315
+ if (i < segmentCount)
316
+ {
317
+ if (segments[i].fieldNum == kd->segments[i].fieldNum)
318
+ {
319
+ const FLAGS f = kd->segments[i].flags;
320
+ segments[i].flags.bit1 = f.bit1;
321
+ segments[i].flags.bit2 = f.bit2;
322
+ segments[i].flags.bit3 = f.bit3;
323
+ segments[i].flags.bit7 = f.bit7;
324
+ segments[i].flags.bit8 = f.bit8;
325
+ segments[i].flags.bit9 = f.bit9;
326
+ }
327
+ }
328
+ }
329
+ keyNumber = kd->keyNumber;
330
+ return 0;
331
+ }
332
+
333
+ //--------------------------------------------------------------------
334
+ // struct fielddef
335
+ //--------------------------------------------------------------------
336
+ void fielddef::setDefaultValue(const char* s)
337
+ {
338
+ if (isBlob())
339
+ {
340
+ memset(m_defValue, 0, DEFAULT_VALUE_SIZE);
341
+ return;
342
+ }
343
+
344
+ enableFlags.bitF = false;
345
+ __int64 i64 = 0;
346
+ switch(type)
347
+ {
348
+ case ft_time:
349
+ case ft_mytime:
350
+ {
351
+ myDateTime dt(7, true);
352
+ dt.setTime(s);
353
+ i64 = dt.getValue();
354
+ memcpy(m_defValue, &i64, 7);
355
+ return;
356
+ }
357
+ case ft_date:
358
+ case ft_mydate:
359
+ case ft_datetime:
360
+ case ft_mytimestamp:
361
+ case ft_mydatetime:
362
+ i64 = str_to_64<myDateTime, char>(7, true, s);
363
+ memcpy(m_defValue, &i64, 7);
364
+ return;
365
+ case ft_integer:
366
+ case ft_autoinc:
367
+ {
368
+ *((__int64*)m_defValue) = _atoi64(s);
369
+ return;
370
+ }
371
+ case ft_uinteger:
372
+ case ft_logical:
373
+ case ft_set:
374
+ case ft_bit:
375
+ case ft_enum:
376
+ case ft_autoIncUnsigned:
377
+ case ft_myyear:
378
+ {
379
+ *((unsigned __int64*)m_defValue) = strtoull(s, NULL, 10);
380
+ return;
381
+ }
382
+ }
383
+
384
+ if (isNumericType())
385
+ {
386
+ *((double*)m_defValue) = atof(s);
387
+ return;
388
+ }
389
+ m_defValue[7] = 0x00;
390
+ #ifdef LINUX
391
+ if (m_schemaCodePage != CP_UTF8)
392
+ u8tombc(s, strlen(s), m_defValue, 8);
393
+ else
394
+ #endif
395
+ strncpy_s(m_defValue, 8, s, sizeof(m_defValue) - 1);
396
+
397
+ }
398
+
399
+ void fielddef::setDefaultValue(__int64 v)
400
+ {
401
+ if ((v == DFV_TIMESTAMP_DEFAULT) &&
402
+ ((type == ft_mytimestamp) || (type == ft_mytimestamp)))
403
+ {
404
+ *((__int64*)m_defValue) = v;
405
+ return;
406
+ }
407
+ char tmp[100];
408
+ sprintf_s(tmp, 100, "%lld", v);
409
+ setDefaultValue(tmp);
410
+ }
278
411
 
279
- bool fielddef::isStringType() const
412
+ void fielddef::setDefaultValue(double v)
280
413
  {
281
- return tdap::isStringType(type);
414
+ if ((v == DFV_TIMESTAMP_DEFAULT) &&
415
+ ((type == ft_mytimestamp) || (type == ft_mytimestamp)))
416
+ {
417
+ *((__int64*)m_defValue) = (__int64)v;
418
+ return;
419
+ }
420
+ char tmp[100];
421
+ sprintf_s(tmp, 100, "%.*lf", decimals, v);
422
+ setDefaultValue(tmp);
282
423
  }
283
424
 
284
- unsigned int fielddef::charNum(/* int index */) const
425
+ const char* fielddef::defaultValue_strA(char* p, size_t size) const
426
+ {
427
+ if (*((__int64*)m_defValue) == 0) return "";
428
+ //char* p = namebufA();
429
+ if (isStringTypeForIndex(type))
430
+ {
431
+ #ifdef LINUX
432
+ if (m_schemaCodePage != CP_UTF8)
433
+ {
434
+ char* p = namebufA();
435
+ mbctou8(m_defValue, strlen(m_defValue), p, size);
436
+ return p;
437
+ }
438
+ #endif
439
+ return m_defValue;
440
+ }
441
+
442
+ if (isDateTimeType())
443
+ {
444
+ bool tsu = isTimeStampOnUpdate();
445
+ *(const_cast<char*>(m_defValue) + 7) = 0x00;
446
+ __int64 i64 = *((__int64*)m_defValue);
447
+ myDateTime dt(4, true);
448
+ dt.setValue(i64); // i64 not equal dt.internalValue();
449
+ p[0] = 0x00;
450
+
451
+ switch(type)
452
+ {
453
+ case ft_date:
454
+ case ft_mydate:
455
+ if (dt.internalValue())
456
+ dt.dateStr(p, size);
457
+ break;
458
+ case ft_time:
459
+ case ft_mytime:
460
+ if (dt.internalValue())
461
+ dt.timeStr(p, size);
462
+ break;
463
+ case ft_datetime:
464
+ case ft_timestamp:
465
+ if (dt.internalValue())
466
+ dt.toString(p, size);
467
+ break;
468
+ case ft_mydatetime:
469
+ case ft_mytimestamp:
470
+ {
471
+ if (i64 == DFV_TIMESTAMP_DEFAULT)
472
+ {
473
+ *(const_cast<char*>(m_defValue) + 7) = tsu ? 1: 0;
474
+ return DFV_TIMESTAMP_DEFAULT_ASTR;
475
+ }
476
+ else if (dt.internalValue())
477
+ dt.toString(p, size);
478
+ break;
479
+ }
480
+ default:
481
+ assert(0);
482
+ }
483
+ //restore
484
+ *(const_cast<char*>(m_defValue) + 7) = tsu ? 1: 0;
485
+ }else if (isIntegerType())
486
+ {
487
+ __int64 *v = (__int64*)m_defValue;
488
+ if ((type == ft_integer) || (type == ft_autoinc))
489
+ _i64toa_s(*v, p, size, 10);
490
+ else
491
+ _ui64toa_s((unsigned __int64)(*v), p, size, 10);
492
+ }else
493
+ sprintf_s(p, size, "%.*lf", decimals, *((double*)m_defValue));
494
+
495
+ return p;
496
+ }
497
+
498
+ void fielddef::setDecimalDigits(int dig, int dec)
499
+ {
500
+ assert(sizeof(int) == 4);
501
+ if (type == ft_mydecimal)
502
+ {
503
+ decimals = (uchar_td)dec;
504
+ digits = dig;
505
+ int intdeg = digits - dec;
506
+ len = (ushort_td) (((intdeg / DIGITS_INT32) * sizeof(int)) +
507
+ decimalBytesBySurplus[intdeg % DIGITS_INT32]) +
508
+ (ushort_td) (((dec / DIGITS_INT32) * sizeof(int)) +
509
+ decimalBytesBySurplus[dec % DIGITS_INT32]) ;
510
+ }
511
+ }
512
+
513
+ bool fielddef::operator==(const fielddef& r) const
514
+ {
515
+ //ignore m_nullbit m_nullbytes
516
+ if (this == &r) return true;
517
+ if (isStringType() && (m_charsetIndex != r.m_charsetIndex))
518
+ if (isPadCharType() &&
519
+ ((isUsePadChar() != r.isUsePadChar()) || (isTrimPadChar() != r.isTrimPadChar())))
520
+ return false;
521
+
522
+ if (type != ft_float && (decimals != r.decimals))
523
+ return false;
524
+
525
+ _TCHAR tmp[256];
526
+ _tcscpy_s(tmp, 256, r.defaultValue_str());
527
+ bool ret = _tcscmp(defaultValue_str(), tmp) == 0;
528
+ return (ret &&
529
+ _tcscmp(name(), r.name(tmp)) == 0) &&
530
+ (type == r.type) &&
531
+ (len == r.len) &&
532
+ (viewNum == r.viewNum) &&
533
+ (viewWidth == r.viewWidth) &&
534
+ (max == r.max) &&
535
+ (min == r.min) &&
536
+ (lookTable == r.lookTable) &&
537
+ (lookField == r.lookField) &&
538
+ (memcmp(lookFields, r.lookFields, 3) == 0) &&
539
+ (pos == r.pos) &&
540
+ (m_nullbit == r.m_nullbit) &&
541
+ (m_nullbytes == r.m_nullbytes) &&
542
+ (memcmp(m_chainChar, r.m_chainChar, 2) == 0) &&
543
+ (ddfid == r.ddfid) &&
544
+ (filterId == r.filterId) &&
545
+ (filterKeynum == r.filterKeynum) &&
546
+ (nullValue == r.nullValue) &&
547
+ (userOption == r.userOption) &&
548
+ (lookDBNum == r.lookDBNum) &&
549
+ (keylen == r.keylen) &&
550
+ ((m_options & ~FIELD_OPTION_MARIADB) == (r.m_options & ~FIELD_OPTION_MARIADB)) &&
551
+ (enableFlags.all == r.enableFlags.all);
552
+ }
553
+
554
+ unsigned int fielddef::charNum() const
285
555
  {
286
556
  if (type == ft_mychar)
287
557
  return (unsigned int)len / mysql::charsize(m_charsetIndex);
@@ -296,38 +566,453 @@ unsigned int fielddef::charNum(/* int index */) const
296
566
  return len;
297
567
  }
298
568
 
569
+ bool fielddef::isValidCharNum() const
570
+ {
571
+ unsigned int num = charNum();
572
+ if (type == ft_mychar)
573
+ return ((unsigned int)len == num * mysql::charsize(m_charsetIndex));
574
+ else if (type == ft_mywchar)
575
+ return ((unsigned int)len == num * mysql::charsize(CHARSET_UTF16LE));
576
+ else if (type == ft_myvarchar)
577
+ return ((unsigned int)(len - varLenBytes()) == num * mysql::charsize(m_charsetIndex));
578
+ else if (type == ft_mywvarchar)
579
+ return ((unsigned int)(len - varLenBytes()) == num * mysql::charsize(CHARSET_UTF16LE));
580
+ return true;
581
+ }
582
+
583
+ void fielddef::fixCharnum_bug()
584
+ {
585
+ unsigned int num = charNum();
586
+ if (type == ft_mychar)
587
+ len = num * mysql::charsize(m_charsetIndex);
588
+ else if (type == ft_mywchar)
589
+ len = num * mysql::charsize(CHARSET_UTF16LE);
590
+ else if (type == ft_myvarchar)
591
+ len = num * mysql::charsize(m_charsetIndex) + varLenBytes();
592
+ else if (type == ft_mywvarchar)
593
+ len = num * mysql::charsize(CHARSET_UTF16LE) + varLenBytes();
594
+ }
595
+
596
+ bool isCompatibleType(uchar_td l, uchar_td r, ushort_td rlen, uchar_td rchar)
597
+ {
598
+ if (l == ft_integer)
599
+ {
600
+ if ((r == ft_currency) && (rlen == 8)) return true;
601
+ if ((r == ft_currency) && (rlen == 8)) return true;
602
+ if ((r == ft_date) && (rlen == 4)) return true;
603
+ if ((r == ft_time) && (rlen == 4)) return true;
604
+ if ((r == ft_datetime) && (rlen == 8)) return true;
605
+ if ((r == ft_timestamp) && (rlen == 8)) return true;
606
+ }
607
+ else if (l == ft_uinteger)
608
+ {
609
+ if ((r == ft_logical) && (rlen <= 2)) return true;
610
+ if ((r == ft_bit) && (rlen <= 8)) return true;
611
+ if ((r == ft_enum) && (rlen <= 8)) return true;
612
+ if ((r == ft_set) && (rlen <= 8)) return true;
613
+ }
614
+
615
+
616
+ // mywchar --> mywchar OK!
617
+ // string --> string OK!
618
+ // mychar --> mychar OK!
619
+ // mywchar --> mywchar OK!
620
+
621
+ if (l == ft_myvarbinary)
622
+ {
623
+ if (r == ft_myvarbinary) return true;
624
+ if (r == ft_mywvarbinary && rchar == CHARSET_UTF16LE) return true;
625
+ if (r == ft_lstring) return true;
626
+ if (r == ft_lvar) return true;
627
+ if (r == ft_note) return true;
628
+ if (r == ft_myfixedbinary) return true;
629
+ }
630
+ else if (l == ft_string)
631
+ {
632
+ if (r == ft_string) return true;
633
+
634
+ // zstring --> string
635
+ if ((r == ft_zstring) && (rchar != CHARSET_UTF16LE)) return true;
636
+
637
+ // wzstring --> string
638
+ if ((r == ft_wzstring) && (rchar == CHARSET_UTF16LE)) return true;
639
+
640
+ // wstring --> string
641
+ if ((r == ft_wstring) && (rchar == CHARSET_UTF16LE)) return true;
642
+ if (r == ft_decimal) return true;
643
+ if (r == ft_money) return true;
644
+ if (r == ft_numeric) return true;
645
+ if (r == ft_bfloat) return true;
646
+ if (r == ft_numericsts) return true;
647
+ if (r == ft_numericsa) return true;
648
+ if (r == ft_guid) return true;
649
+ }
650
+ return false;
651
+ }
652
+
653
+ short fielddef::synchronize(const fielddef* fd)
654
+ {
655
+ viewNum = fd->viewNum;
656
+ viewWidth = fd->viewWidth;
657
+ max = fd->max;
658
+ min = fd->min;
659
+ lookTable = fd->lookTable;
660
+ lookField = fd->lookField;
661
+ memcpy(lookFields, fd->lookFields, sizeof(uchar_td) * 3);
662
+ m_chainChar[0] = fd->m_chainChar[0];
663
+ m_chainChar[1] = fd->m_chainChar[1];
664
+ ddfid = fd->ddfid;
665
+ filterId = fd->filterId;
666
+ filterKeynum = fd->filterKeynum;
667
+ nullValue = fd->nullValue;
668
+ userOption = fd->userOption;
669
+ lookDBNum = fd->lookDBNum;
670
+ uchar_td nullable = m_options & FIELD_OPTION_NULLABLE;
671
+ m_options = fd->m_options;
672
+ m_options |= nullable;
673
+ bool defaultNull = enableFlags.bitF;
674
+ enableFlags = fd->enableFlags;
675
+ enableFlags.bitF = defaultNull;
676
+ if (type == ft_mychar || type == ft_string || type == ft_mywchar || type == ft_wstring)
677
+ m_padCharOptions = fd->m_padCharOptions;
678
+ if (fd->type == ft_myfixedbinary && len - 2 == fd->len)
679
+ {
680
+ len = fd->len ;
681
+ type = fd->type;
682
+ }
683
+ if (len == fd->len && isCompatibleType(type, fd->type, fd->len, fd->m_charsetIndex))
684
+ {
685
+ type = fd->type;
686
+ m_charsetIndex = fd->m_charsetIndex;
687
+ }
688
+ if (type == ft_lvar || type == ft_myfixedbinary)
689
+ setDefaultValue(0.0f);
690
+
691
+ if (type == ft_float)
692
+ decimals = fd->decimals;
693
+ return 0;
694
+ }
695
+
696
+
697
+ #pragma warn -8056
698
+
699
+ #define CASE_DOUBLE_TYPE \
700
+ case ft_float: \
701
+ case ft_decimal: \
702
+ case ft_bfloat: \
703
+ case ft_numeric: \
704
+ case ft_money: \
705
+ case ft_currency: \
706
+ case ft_numericsts: \
707
+ case ft_numericsa: \
708
+ case ft_mydecimal:
709
+
710
+ #define CASE_INT_TYPE \
711
+ case ft_integer: \
712
+ case ft_autoinc: \
713
+ case ft_uinteger: \
714
+ case ft_logical: \
715
+ case ft_set: \
716
+ case ft_bit: \
717
+ case ft_enum: \
718
+ case ft_autoIncUnsigned: \
719
+ case ft_myyear:
720
+
721
+ double fielddef::defaultValue() const
722
+ {
723
+ assert(sizeof(double) == 8);
724
+ if (isDateTimeType())
725
+ return (double)(*((__int64*)m_defValue) & (0x00FFFFFFFFFFFFFFLL));
726
+ switch(type)
727
+ {
728
+ CASE_INT_TYPE
729
+ return (double)*((__int64*)m_defValue);
730
+ CASE_DOUBLE_TYPE
731
+ return *((double*)m_defValue);
732
+ }
733
+ if (isStringType())
734
+ return atof(m_defValue);
735
+ return 0;
736
+ }
737
+
738
+ __int64 fielddef::defaultValue64() const
739
+ {
740
+ assert(sizeof(__int64) == 8);
741
+
742
+ if (isDateTimeType())
743
+ return (*((__int64*)m_defValue) & (0x00FFFFFFFFFFFFFFLL));
744
+ switch(type)
745
+ {
746
+ CASE_INT_TYPE
747
+ return *((__int64*)m_defValue);
748
+ CASE_DOUBLE_TYPE
749
+ return (__int64)*((double*)m_defValue);
750
+ }
751
+ if (isStringType())
752
+ return _atoi64(m_defValue);
753
+ return 0;
754
+ }
755
+ #pragma warn .8056
756
+
757
+ //--------------------------------------------------------------------
758
+ // struvt tabledef
759
+ //--------------------------------------------------------------------
760
+ bool tabledef::operator==(const tabledef& r) const
761
+ {
762
+ if (this == &r) return true;
763
+ // remove file extention
764
+ _TCHAR tmp[256];
765
+ _TCHAR tmp2[256];
766
+ _tcscpy_s(tmp, 256, r.fileName());
767
+ _tcscpy_s(tmp2, 256, fileName());
768
+ _tcslwr_s(tmp, 256);
769
+ _tcslwr_s(tmp2, 256);
770
+ _TCHAR* p = _tcsrchr(tmp, _T('.'));
771
+ _TCHAR* p2 = _tcsrchr(tmp2, _T('.'));
772
+ if (p && !p2) *p = 0x00;
773
+ if( !p && p2) *p2 = 0x00;
774
+
775
+ bool ret = _tcscmp(tmp2, tmp) == 0;
776
+ if (!ret) return ret;
777
+ _tcscpy_s(tmp, 256, r.tableName());
778
+ ret = _tcscmp(tableName(), tmp) == 0;
779
+
780
+ return (ret) &&
781
+ (varSize == r.varSize) &&
782
+ (preAlloc == r.preAlloc) &&
783
+ (fieldCount == r.fieldCount) &&
784
+ (keyCount == r.keyCount) &&
785
+ (version == r.version) &&
786
+ (charsetIndex == r.charsetIndex) &&
787
+ (m_nullfields == r.m_nullfields) &&
788
+ (m_nullbytes == r.m_nullbytes) &&
789
+ (flags.all == r.flags.all) &&
790
+ (primaryKeyNum == r.primaryKeyNum) &&
791
+ (parentKeyNum == r.parentKeyNum) &&
792
+ (replicaKeyNum == r.replicaKeyNum) &&
793
+ (optionFlags.all == r.optionFlags.all) &&
794
+ (convertFileNum == r.convertFileNum) &&
795
+ (treeIndex == r.treeIndex) &&
796
+ (iconIndex == r.iconIndex) &&
797
+ (ddfid == r.ddfid) &&
798
+ (iconIndex2 == r.iconIndex2) &&
799
+ (iconIndex3 == r.iconIndex3) &&
800
+ (formatVersion == r.formatVersion) &&
801
+ (varSize == r.varSize) ;
802
+ }
803
+
804
+ bool tabledef::isNullKey(const keydef& key) const
805
+ {
806
+ if (key.segments[0].flags.bit3 || key.segments[0].flags.bit9)
807
+ {
808
+ for (int j=0;j < key.segmentCount; ++j)
809
+ {
810
+ const fielddef& fd = fieldDefs[key.segments[j].fieldNum];
811
+ if (fd.nullValue != 0x00)
812
+ return false;
813
+ }
814
+ return true;
815
+ }
816
+ return false;
817
+ }
818
+
819
+ bool tabledef::isNeedNis(const keydef& key) const
820
+ {
821
+ /* bit3 all segment NULL key
822
+ bit9 part segment NULL key
823
+ if fd.nullValue != 0x00 then this field is type of not null.
824
+ */
825
+ if (!isNULLFieldFirstKeySegField(key))
826
+ return isNullKey(key);
827
+ return false;
828
+ }
829
+
830
+ bool tabledef::isNULLFieldFirstKeySegField(const keydef& key) const
831
+ {
832
+ // logical 1 byte and segmentCount = 1 and nullValue = 0x00
833
+ if ((key.segments[0].flags.bit3 || key.segments[0].flags.bit9) && key.segmentCount == 1)
834
+ {
835
+ const fielddef& fd = fieldDefs[key.segments[0].fieldNum];
836
+ return ((fd.len == 1) && (fd.type == ft_logical) && fd.nullValue == 0x00);
837
+ }
838
+ return false;
839
+ }
840
+
841
+ void tabledef::setMysqlNullMode(bool v)
842
+ {
843
+ if (m_mysqlNullMode != v)
844
+ {
845
+ m_mysqlNullMode = v;
846
+ calcReclordlen();
847
+ }
848
+ }
849
+
850
+ void tabledef::calcReclordlen(bool force)
851
+ {
852
+ if (m_inUse == 0 || force)
853
+ {
854
+ if (force) m_inUse = 0;
855
+ if (charsetIndex == 0)
856
+ charsetIndex = mysql::charsetIndex(GetACP());
857
+
858
+ int nisFieldNum = 0;
859
+ bool firstTimeStamp = true;
860
+ m_nullfields = 0;
861
+ m_nullbytes = 0;
862
+ m_maxRecordLen = 0;
863
+
864
+ // Check Null Key
865
+ for (int i = 0; i < keyCount; i++)
866
+ {
867
+ keydef& kd = keyDefs[i];
868
+ if (isNullKey(kd))
869
+ {
870
+ if (m_mysqlNullMode)
871
+ nisFieldNum += (isNeedNis(kd) ? 1 : 0);
872
+ if (isNULLFieldFirstKeySegField(kd))
873
+ {
874
+ fielddef& fd = fieldDefs[kd.segments[0].fieldNum];
875
+ fd.setNullable(true, true);
876
+ }
877
+ }
878
+ }
879
+
880
+ for (int i = 0; i < fieldCount; i++)
881
+ {
882
+ fielddef& fd = fieldDefs[i];
883
+ if (fd.charsetIndex() == 0)
884
+ fd.setCharsetIndex(charsetIndex);
885
+ fd.setSchemaCodePage(schemaCodePage);
886
+
887
+ fd.m_nullbytes = 0;
888
+ fd.m_nullbit = 0;
889
+ if (fd.isNullable())
890
+ {
891
+ fd.m_nullbit = m_nullfields;
892
+ if (m_mysqlNullMode)
893
+ ++m_nullfields;
894
+ }
895
+ double defaultValue = fd.defaultValue();
896
+ if (fd.type == ft_mytimestamp && fd.isNullable() == false &&
897
+ (defaultValue == 0 || defaultValue == DFV_TIMESTAMP_DEFAULT) && firstTimeStamp)
898
+ {
899
+ fd.setDefaultValue(DFV_TIMESTAMP_DEFAULT);
900
+ fd.setTimeStampOnUpdate(true);
901
+ firstTimeStamp = false;
902
+ }
903
+ if (fd.type == ft_mydatetime || fd.type == ft_mytime || fd.type == ft_mytimestamp)
904
+ {
905
+ if (isMariaTimeFormat())
906
+ fd.m_options |= FIELD_OPTION_MARIADB;
907
+ else
908
+ fd.m_options &= ~FIELD_OPTION_MARIADB;
909
+ }
910
+
911
+ if (fd.type == ft_mytimestamp && fd.decimals == 0)
912
+ fd.decimals = (fd.len - 4) * 2;
913
+ else if (fd.type == ft_mydatetime)
914
+ {
915
+ // datetime decimals is different by server version
916
+ if (fd.decimals == 0 && !isLegacyTimeFormat(fd))
917
+ fd.decimals = (fd.len - 5) * 2;
918
+ }
919
+ else if (fd.type == ft_mytime && fd.decimals == 0)
920
+ fd.decimals = (fd.len - 3) * 2;
921
+ else if (defaultValue && fd.isBlob())
922
+ fd.setDefaultValue(0.0f);
923
+
924
+ if (m_srvMajorVer)
925
+ {
926
+ if (isLegacyTimeFormat(fd))
927
+ {
928
+ fd.m_options |= FIELD_OPTION_REGACY_TIME;
929
+ fd.decimals = 0;
930
+ if (fd.type == ft_mydatetime)
931
+ fd.len = 8;
932
+ else if (fd.type == ft_mytime)
933
+ fd.len = 3;
934
+ else if (fd.type == ft_mytimestamp)
935
+ fd.len = 4;
936
+ }
937
+ else
938
+ fd.m_options &= ~FIELD_OPTION_REGACY_TIME;
939
+ }
940
+ fd.pos = m_maxRecordLen;
941
+ fd.fixCharnum_bug();
942
+ m_maxRecordLen += fd.len;
943
+ }
944
+
945
+ m_nullfields += nisFieldNum;
946
+
947
+ if (m_nullfields)
948
+ {
949
+ m_nullbytes = (m_nullfields + 7) / 8;
950
+ for (int i = 0; i < fieldCount; i++)
951
+ fieldDefs[i].m_nullbytes = m_nullbytes;
952
+ }
953
+ m_maxRecordLen += m_nullbytes;
954
+ // If valible length then specifing fixed length.
955
+ if ((fixedRecordLen == 0) || (flags.bit0 == false))
956
+ fixedRecordLen = m_maxRecordLen;
957
+ }else
958
+ ;//assert(0);
959
+ }
960
+
299
961
  uint_td tabledef::unPack(char* ptr, size_t size) const
300
962
  {
301
- char* pos = ptr;
963
+ char* pos = ptr + m_nullbytes;
302
964
  const char* end = pos + size;
303
- const char* max = pos + maxRecordLen;
965
+ const char* max = pos + m_maxRecordLen;
304
966
  int movelen;
967
+
968
+ // if null then not recieved field data
969
+ unsigned char null_bit = 1;
970
+ unsigned char* null_ptr = (unsigned char*)ptr;
971
+
305
972
  for (int i = 0; i < fieldCount; i++)
306
973
  {
307
974
  fielddef& fd = fieldDefs[i];
975
+ bool isNull = false;
976
+ if (fd.isNullable() && m_nullbytes)
977
+ {
978
+ isNull = (*null_ptr & null_bit) != 0;
979
+ if (null_bit == (unsigned char)128)
980
+ {
981
+ ++null_ptr;
982
+ null_bit = 1;
983
+ }else
984
+ null_bit = null_bit << 1;
985
+ }
986
+
308
987
  if (fd.type == ft_myfixedbinary)
309
988
  {
310
989
  int dl = *((unsigned short*)(pos));
311
990
  memmove(pos, pos + 2, dl);
312
991
  pos += fd.len - 2;
313
992
  *((unsigned short*)(pos)) = 0x00;
314
- ;
315
993
  pos += 2;
316
994
  }
317
995
  else
318
996
  {
319
997
  int blen = fd.varLenBytes();
320
998
  int dl = fd.len; // length
321
- if (blen == 1)
322
- dl = *((unsigned char*)(pos)) + blen;
323
- else if (blen == 2)
324
- dl = *((unsigned short*)(pos)) + blen;
999
+ if (isNull)
1000
+ dl = 0;
1001
+ else if (blen)
1002
+ {
1003
+ if (blen == 1)
1004
+ dl = *((unsigned char*)(pos)) + blen;
1005
+ else if (blen == 2)
1006
+ dl = *((unsigned short*)(pos)) + blen;
1007
+ }
1008
+
325
1009
  if ((movelen = fd.len - dl) != 0)
326
1010
  {
327
1011
  if (max < end + movelen)
328
1012
  return 0;
329
1013
  char* src = pos + dl;
330
- memmove(pos + fd.len, src, end - src);
1014
+ if (end > src)
1015
+ memmove(pos + fd.len, src, end - src);
331
1016
  memset(src, 0, movelen);
332
1017
  end += movelen;
333
1018
  }
@@ -339,12 +1024,28 @@ uint_td tabledef::unPack(char* ptr, size_t size) const
339
1024
 
340
1025
  uint_td tabledef::pack(char* ptr, size_t size) const
341
1026
  {
342
- char* pos = ptr;
1027
+ char* pos = ptr + m_nullbytes;
343
1028
  char* end = pos + size;
344
1029
  int movelen;
1030
+
1031
+ // if null then not copy field image (field length move)
1032
+ unsigned char null_bit = 1;
1033
+ unsigned char* null_ptr = (unsigned char*)ptr;
345
1034
  for (int i = 0; i < fieldCount; i++)
346
1035
  {
347
1036
  fielddef& fd = fieldDefs[i];
1037
+ bool isNull = false;
1038
+ if (fd.isNullable() && m_nullbytes)
1039
+ {
1040
+ isNull = (*null_ptr & null_bit) != 0;
1041
+ if (null_bit == (unsigned char)128)
1042
+ {
1043
+ ++null_ptr;
1044
+ null_bit = 1;
1045
+ }else
1046
+ null_bit = null_bit << 1;
1047
+ }
1048
+
348
1049
  if (fd.type == ft_myfixedbinary)
349
1050
  {
350
1051
  memmove(pos + 2, pos, fd.len - 2); // move as size pace in the field
@@ -359,17 +1060,88 @@ uint_td tabledef::pack(char* ptr, size_t size) const
359
1060
  dl = *((unsigned char*)(pos)) + blen;
360
1061
  else if (blen == 2)
361
1062
  dl = *((unsigned short*)(pos)) + blen;
362
- pos += dl;
1063
+ if (isNull)
1064
+ dl = 0;
1065
+ else
1066
+ pos += dl;
363
1067
  if ((movelen = fd.len - dl) != 0)
364
1068
  {
365
1069
  end -= movelen;
366
1070
  memmove(pos, pos + movelen, end - pos);
367
1071
  }
368
1072
  }
1073
+
369
1074
  }
370
1075
  return (uint_td)(pos - ptr);
371
1076
  }
372
1077
 
1078
+ int tabledef::size() const
1079
+ {
1080
+ int len = (int)(sizeof(tabledef) + (sizeof(fielddef) * fieldCount) +
1081
+ (sizeof(keydef) * keyCount));
1082
+ const ushort_td* p = &varSize;
1083
+ *(const_cast<ushort_td*>(p)) = len - 4;
1084
+ return len;
1085
+ }
1086
+
1087
+ short tabledef::fieldNumByName(const _TCHAR* name) const
1088
+ {
1089
+ char buf[74];
1090
+ const char* p = toChar(buf, name, 74);
1091
+ for (short i = 0; i < fieldCount; i++)
1092
+ {
1093
+ if (strcmp(fieldDefs[i].nameA(), p) == 0)
1094
+ return i;
1095
+ }
1096
+ return -1;
1097
+ }
1098
+
1099
+ short tabledef::findKeynumByFieldNum(short fieldNum) const
1100
+ {
1101
+ for (short i = 0; i < keyCount; i++)
1102
+ {
1103
+ if (keyDefs[i].segments[0].fieldNum == fieldNum)
1104
+ return i;
1105
+ }
1106
+ return -1;
1107
+ }
1108
+
1109
+ short tabledef::synchronize(const tabledef* td)
1110
+ {
1111
+ id = td->id;
1112
+ setTableName(td->tableName());
1113
+ preAlloc = td->preAlloc;
1114
+ version = td->version;
1115
+ m_inUse = td->m_inUse;
1116
+ m_mysqlNullMode = td->m_mysqlNullMode;
1117
+ parentKeyNum = td->parentKeyNum;
1118
+ replicaKeyNum = td->replicaKeyNum;
1119
+ optionFlags = td->optionFlags;
1120
+ convertFileNum = td->convertFileNum;
1121
+ treeIndex = td->treeIndex;
1122
+ iconIndex = td->iconIndex;
1123
+ ddfid = td->ddfid;
1124
+ autoIncExSpace = td->autoIncExSpace;
1125
+ iconIndex2 = td->iconIndex2;
1126
+ iconIndex3 = td->iconIndex3;
1127
+ formatVersion = td->formatVersion;
1128
+ parent = td->parent;
1129
+ flags = td->flags;
1130
+ for (int i=0;i<td->fieldCount; ++i)
1131
+ {
1132
+ fielddef* fd = &td->fieldDefs[i];
1133
+ short index = fieldNumByName(fd->name());
1134
+ if (index != -1)
1135
+ fieldDefs[index].synchronize(fd);
1136
+ }
1137
+ for (int i=0;i<td->keyCount; ++i)
1138
+ {
1139
+ if (i < keyCount)
1140
+ keyDefs[i].synchronize(&td->keyDefs[i]);
1141
+ }
1142
+ return 0;
1143
+ }
1144
+
373
1145
  ushort_td lenByCharnum(uchar_td type, uchar_td charsetIndex, ushort_td charnum)
374
1146
  {
375
1147
  ushort_td len = charnum;
@@ -424,6 +1196,10 @@ const _TCHAR* getTypeName(short type)
424
1196
  return _T("AutoIncrement");
425
1197
  case ft_bit:
426
1198
  return _T("Bit");
1199
+ case ft_enum:
1200
+ return _T("Enum");
1201
+ case ft_set:
1202
+ return _T("Set");
427
1203
  case ft_numericsts:
428
1204
  return _T("Numericsts");
429
1205
  case ft_numericsa:
@@ -454,6 +1230,8 @@ const _TCHAR* getTypeName(short type)
454
1230
  return _T("myChar");
455
1231
  case ft_mywchar:
456
1232
  return _T("myWChar");
1233
+ case ft_myyear:
1234
+ return _T("myYear");
457
1235
  case ft_mydate:
458
1236
  return _T("myDate");
459
1237
  case ft_mytime:
@@ -466,10 +1244,16 @@ const _TCHAR* getTypeName(short type)
466
1244
  return _T("myText");
467
1245
  case ft_myblob:
468
1246
  return _T("myBlob");
1247
+ case ft_mygeometry:
1248
+ return _T("myGeometry");
1249
+ case ft_myjson:
1250
+ return _T("myJson");
469
1251
  case ft_autoIncUnsigned:
470
1252
  return _T("AutoIncUnsigned");
471
1253
  case ft_myfixedbinary:
472
1254
  return _T("myFixedBinary");
1255
+ case ft_mydecimal:
1256
+ return _T("myDecimal");
473
1257
  case ft_nullindicator:
474
1258
  return _T("Nullindicator");
475
1259
  default:
@@ -496,11 +1280,14 @@ int getTypeAlign(short type)
496
1280
  case ft_mywchar:
497
1281
  case ft_mywvarchar:
498
1282
  case ft_mywvarbinary:
1283
+ case ft_myyear:
499
1284
  case ft_mydate:
500
1285
  case ft_mytime:
501
1286
  case ft_mydatetime:
502
1287
  case ft_mytimestamp:
503
1288
  case ft_myblob:
1289
+ case ft_mygeometry:
1290
+ case ft_myjson:
504
1291
  case ft_myfixedbinary:
505
1292
  case ft_mytext:
506
1293
  return BT_AL_LEFT;
@@ -610,7 +1397,11 @@ PACKAGE uchar_td getFilterLogicTypeCode(const _TCHAR* cmpstr)
610
1397
  return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
611
1398
  else if (_tcscmp(cmpstr, _T("<=i")) == 0)
612
1399
  return (uchar_td)eLessEq | CMPLOGICAL_CASEINSENSITIVE;
613
- return 255;
1400
+ else if (_tcscmp(cmpstr, _T("<==>")) == 0)
1401
+ return (uchar_td)eIsNull;
1402
+ else if (_tcscmp(cmpstr, _T("<!=>")) == 0)
1403
+ return (uchar_td)eIsNotNull;
1404
+ return 255;
614
1405
  }
615
1406
 
616
1407
  } // namespace tdap