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