transactd 3.5.0 → 3.6.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 (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
  3. data/bin/common/tdclc_64_3_6.dll +0 -0
  4. data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
  5. data/build/swig/tdcl.i +5 -0
  6. data/build/tdclc/tdclc.cbproj +1 -1
  7. data/build/tdclc/tdclc.rc +4 -4
  8. data/build/tdclcpp/tdclcpp.rc +4 -4
  9. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  10. data/build/tdclrb/tdclrb.rc +4 -4
  11. data/source/bzs/db/engine/mysql/database.cpp +210 -184
  12. data/source/bzs/db/engine/mysql/database.h +276 -105
  13. data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
  14. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
  15. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
  16. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  17. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  18. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
  19. data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
  20. data/source/bzs/db/protocol/tdap/client/database.h +6 -1
  21. data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
  22. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
  23. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  24. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
  25. data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
  26. data/source/bzs/db/protocol/tdap/client/field.h +3 -1
  27. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
  28. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
  30. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
  31. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
  32. data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
  33. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
  34. data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
  35. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
  36. data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
  38. data/source/bzs/db/protocol/tdap/client/request.h +46 -38
  39. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
  40. data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
  41. data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
  42. data/source/bzs/db/protocol/tdap/client/table.h +4 -1
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
  44. data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
  45. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
  50. data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
  52. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  53. data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
  54. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
  55. data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
  56. data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
  57. data/source/bzs/example/ormap_c.cpp +2 -2
  58. data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
  59. data/source/bzs/test/tdclatl/test_v3.js +48 -1
  60. data/source/bzs/test/tdclphp/bench.php +89 -76
  61. data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
  62. data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
  63. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
  64. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
  65. data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
  66. data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
  67. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
  68. data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
  69. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
  70. data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
  71. data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
  72. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
  73. data/source/bzs/test/trdclengn/testField.h +522 -1
  74. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
  75. data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
  76. data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
  77. data/source/global/tdclatl/RecordsetQuery.h +1 -1
  78. data/source/global/tdclatl/Table.cpp +17 -0
  79. data/source/global/tdclatl/Table.h +3 -1
  80. data/source/global/tdclatl/tdclatl.idl +7 -2
  81. data/transactd.gemspec +1 -1
  82. metadata +7 -5
  83. data/bin/common/tdclc_64_3_5.dll +0 -0
@@ -64,6 +64,7 @@ namespace client {class table;}
64
64
  #define P_MASK_PB_BOOKMARK 512 // posblk bookmark writen
65
65
  #define P_MASK_PB_ERASE_BM 1024 // posblk bookmark erase command
66
66
  #define P_MASK_PB_LOCKED 2048 // posblk row locked
67
+ #define P_MASK_DB_AINC_VAL 4096 // databuf autoinc value, packed_pos 2, size 2 value
67
68
 
68
69
 
69
70
  #define P_MASK_ALL \
@@ -132,6 +133,16 @@ struct clientID
132
133
  ushort_td id;
133
134
  };
134
135
 
136
+
137
+ struct autoIncPackInfo
138
+ {
139
+ unsigned short pos;
140
+ unsigned short len;
141
+ __int64 value;
142
+
143
+ autoIncPackInfo() : pos(0), len(0), value(0){}
144
+ };
145
+
135
146
  #pragma pack(pop)
136
147
  pragma_pop;
137
148
 
@@ -24,11 +24,32 @@
24
24
  #include <bzs/db/protocol/tdap/mysql/characterset.h>
25
25
  #ifdef _WIN32
26
26
  #include <windows.h>
27
- #endif
27
+ size_t mbcconv(const char* from, size_t fsize, char* to, size_t tsize, int fromCodePage, int toCodePage)
28
+ {
29
+ assert(tsize < 511);
30
+ size_t size = 0;
31
+ WCHAR ws[512]={NULL};
32
+ size = MultiByteToWideChar(fromCodePage, (fromCodePage == CP_UTF8) ? 0 : MB_PRECOMPOSED,
33
+ from, -1, ws, (int)511);
34
+ to[tsize - 1] = 0x00;
35
+ size = WideCharToMultiByte(toCodePage, (toCodePage == CP_UTF8) ? 0 : WC_COMPOSITECHECK,
36
+ ws, -1, to, (int)tsize, NULL, NULL);
37
+ if (size == 0)
38
+ size = tsize - (to[tsize - 1] ? 0 : 1);
39
+ return size;
40
+ }
41
+ #endif //_WIN32
28
42
 
29
43
  #ifdef LINUX
30
44
  #include <bzs/env/mbcswchrLinux.h>
31
45
  using namespace bzs::env;
46
+ inline size_t mbcconv(const char* from, size_t fsize, char* to, size_t tsize, int fromCodePage, int toCodePage)
47
+ {
48
+ if (fromCodePage == CP_UTF8)
49
+ return bzs::env::u8tombc(from, fsize, to, tsize);
50
+ else
51
+ return bzs::env::mbctou8(from, fsize, to, tsize);
52
+ }
32
53
  #endif
33
54
  #pragma package(smart_init)
34
55
 
@@ -181,39 +202,39 @@ void tabledef::setTableName(const wchar_t* s)
181
202
 
182
203
  const char* fielddef::name() const
183
204
  {
184
- #ifdef LINUX
205
+ /*#ifndef _UNICODE
185
206
  if (m_schemaCodePage != CP_UTF8)
186
207
  {
187
208
  char* p = namebufA();
188
- mbctou8(m_name, strlen(m_name), p, MYSQL_FDNAME_SIZE);
209
+ mbcconv(m_name, strlen(m_name), p, MYSQL_FDNAME_SIZE, m_schemaCodePage, CP_UTF8); //mbctou8(m_name, strlen(m_name), p, MYSQL_FDNAME_SIZE);
189
210
  return p;
190
211
  }
191
- #endif
212
+ #endif*/
192
213
  return m_name;
193
214
  }
194
215
 
195
216
  const char* fielddef::name(char* buf) const
196
217
  {
197
- #ifdef LINUX
218
+ /*#ifndef _UNICODE
198
219
  if (m_schemaCodePage != CP_UTF8)
199
220
  {
200
- mbctou8(m_name, strlen(m_name), buf, MYSQL_FDNAME_SIZE);
221
+ mbcconv(m_name, strlen(m_name), buf, MYSQL_FDNAME_SIZE, m_schemaCodePage, CP_UTF8); //mbctou8(m_name, strlen(m_name), buf, MYSQL_FDNAME_SIZE);
201
222
  return buf;
202
223
  }
203
- #endif
224
+ #endif*/
204
225
  return m_name;
205
226
  }
206
227
 
207
228
  const char* fielddef::chainChar() const
208
229
  {
209
- #ifdef LINUX
230
+ /*#ifndef _UNICODE
210
231
  if (m_schemaCodePage != CP_UTF8)
211
232
  {
212
233
  char* p = namebufA();
213
- mbctou8(m_chainChar, strlen(m_chainChar), p, 2);
234
+ mbcconv(m_chainChar, strlen(m_chainChar), p, 2, m_schemaCodePage, CP_UTF8); //mbctou8(m_chainChar, strlen(m_chainChar), p, 2);
214
235
  return p;
215
236
  }
216
- #endif
237
+ #endif*/
217
238
  return m_chainChar;
218
239
  }
219
240
 
@@ -225,79 +246,80 @@ const char* fielddef::defaultValue_str() const
225
246
 
226
247
  void fielddef::setName(const char* s)
227
248
  {
228
- #ifdef LINUX
249
+ /*#ifndef _UNICODE
229
250
  if (m_schemaCodePage != CP_UTF8)
230
- u8tombc(s, strlen(s), m_name, FIELD_NAME_SIZE);
251
+ mbcconv(s, strlen(s), m_name, FIELD_NAME_SIZE, CP_UTF8, m_schemaCodePage); //u8tombc(s, strlen(s), m_name, FIELD_NAME_SIZE);
231
252
  else
232
- #endif
253
+ #endif*/
233
254
  strncpy_s(m_name, FIELD_NAME_SIZE, s, sizeof(m_name) - 1);
234
255
  }
235
256
 
236
257
  void fielddef::setChainChar(const char* s)
237
258
  {
238
- #ifdef LINUX
259
+ /*#ifndef _UNICODE
239
260
  if (m_schemaCodePage != CP_UTF8)
240
- u8tombc(s, strlen(s), m_chainChar, 2);
261
+ mbcconv(s, strlen(s), m_chainChar, 2, CP_UTF8, m_schemaCodePage); //u8tombc(s, strlen(s), m_chainChar, 2);
241
262
  else
242
- #endif
263
+ #endif*/
243
264
  strncpy_s(m_chainChar, 2, s, sizeof(m_chainChar) - 1);
244
265
  }
245
266
 
246
267
  const char* tabledef::fileName() const
247
268
  {
248
- #ifdef LINUX
269
+ /*#ifndef _UNICODE
249
270
  if (schemaCodePage != CP_UTF8)
250
271
  {
251
272
  char* p = namebufA();
252
- mbctou8(m_fileName, strlen(m_fileName), p, FILE_NAME_SIZE);
273
+ mbcconv(m_fileName, strlen(m_fileName), p, FILE_NAME_SIZE, schemaCodePage, CP_UTF8); //mbctou8(m_fileName, strlen(m_fileName), p, FILE_NAME_SIZE);
253
274
  return p;
254
275
  }
255
- #endif
276
+ #endif*/
256
277
  return m_fileName;
257
278
  }
258
279
 
259
280
  const char* tabledef::tableName() const
260
281
  {
261
- #ifdef LINUX
282
+ /*#ifndef _UNICODE
262
283
  if (schemaCodePage != CP_UTF8)
263
284
  {
264
285
  char* p = namebufA();
265
- mbctou8(m_tableName, strlen(m_tableName), p, TABLE_NAME_SIZE);
286
+ mbcconv(m_tableName, strlen(m_tableName), p, TABLE_NAME_SIZE, schemaCodePage, CP_UTF8); //mbctou8(m_tableName, strlen(m_tableName), p, TABLE_NAME_SIZE);
266
287
  return p;
267
288
  }
268
- #endif
289
+ #endif*/
269
290
  return m_tableName;
270
291
  }
271
292
 
272
293
  void tabledef::setFileName(const char* s)
273
294
  {
274
- #ifdef LINUX
295
+ /*#ifndef _UNICODE
275
296
  if (schemaCodePage != CP_UTF8)
276
- u8tombc(s, strlen(s), m_fileName, FILE_NAME_SIZE);
297
+ mbcconv(s, strlen(s), m_fileName, FILE_NAME_SIZE, CP_UTF8, schemaCodePage); //u8tombc(s, strlen(s), m_fileName, FILE_NAME_SIZE);
277
298
  else
278
- #endif
299
+ #endif*/
279
300
  setFileNameA(s);
280
301
  }
281
302
 
282
303
  void tabledef::setTableName(const char* s)
283
304
  {
284
- #ifdef LINUX
305
+ /*#ifndef _UNICODE
285
306
  if (schemaCodePage != CP_UTF8)
286
- u8tombc(s, strlen(s), m_tableName, TABLE_NAME_SIZE);
307
+ mbcconv(s, strlen(s), m_tableName, TABLE_NAME_SIZE, CP_UTF8, schemaCodePage); //u8tombc(s, strlen(s), m_tableName, TABLE_NAME_SIZE);
287
308
  else
288
- #endif
309
+ #endif*/
289
310
  setTableNameA(s);
290
311
  }
291
312
 
292
313
  const char* tabledef::toChar(char* buf, const char* s, int size) const
293
314
  {
294
- #ifdef LINUX
315
+ /*#ifndef _UNICODE
295
316
  if (schemaCodePage != CP_UTF8)
296
317
  {
297
- u8tombc(s, strlen(s), buf, size);
318
+ //u8tombc(s, strlen(s), buf, size);
319
+ mbcconv(s, strlen(s), buf, size, CP_UTF8, schemaCodePage);
298
320
  return buf;
299
321
  }
300
- #endif
322
+ #endif*/
301
323
  strncpy_s(buf, size, s, size - 1);
302
324
  return buf;
303
325
  }
@@ -651,7 +673,7 @@ bool isCompatibleType(uchar_td l, uchar_td r, ushort_td rlen, uchar_td rchar)
651
673
  }
652
674
 
653
675
  short fielddef::synchronize(const fielddef* fd)
654
- {
676
+ { // this is server. fd is current
655
677
  viewNum = fd->viewNum;
656
678
  viewWidth = fd->viewWidth;
657
679
  max = fd->max;
@@ -669,15 +691,16 @@ short fielddef::synchronize(const fielddef* fd)
669
691
  lookDBNum = fd->lookDBNum;
670
692
  uchar_td nullable = m_options & FIELD_OPTION_NULLABLE;
671
693
  m_options = fd->m_options;
694
+ m_options &= ~FIELD_OPTION_NULLABLE;
672
695
  m_options |= nullable;
673
696
  bool defaultNull = enableFlags.bitF;
674
- enableFlags = fd->enableFlags;
697
+ enableFlags.all = fd->enableFlags.all;
675
698
  enableFlags.bitF = defaultNull;
676
699
  if (type == ft_mychar || type == ft_string || type == ft_mywchar || type == ft_wstring)
677
700
  m_padCharOptions = fd->m_padCharOptions;
678
701
  if (fd->type == ft_myfixedbinary && len - 2 == fd->len)
679
702
  {
680
- len = fd->len ;
703
+ len = fd->len;
681
704
  type = fd->type;
682
705
  }
683
706
  if (len == fd->len && isCompatibleType(type, fd->type, fd->len, fd->m_charsetIndex))
@@ -784,6 +807,7 @@ bool tabledef::operator==(const tabledef& r) const
784
807
  (keyCount == r.keyCount) &&
785
808
  (version == r.version) &&
786
809
  (charsetIndex == r.charsetIndex) &&
810
+ (m_utimeFieldNum == r.m_utimeFieldNum) &&
787
811
  (flags.all == r.flags.all) &&
788
812
  (primaryKeyNum == r.primaryKeyNum) &&
789
813
  (parentKeyNum == r.parentKeyNum) &&
@@ -918,6 +942,9 @@ void tabledef::calcReclordlen(bool force)
918
942
  else if (defaultValue && fd.isBlob())
919
943
  fd.setDefaultValue(0.0f);
920
944
 
945
+ if (m_utimeFieldNum == 0xffff && fd.isTimeStampOnUpdate())
946
+ m_utimeFieldNum = i;
947
+
921
948
  if (m_srvMajorVer)
922
949
  {
923
950
  if (isLegacyTimeFormat(fd))
@@ -1107,6 +1134,7 @@ short tabledef::synchronize(const tabledef* td)
1107
1134
  version = td->version;
1108
1135
  m_inUse = td->m_inUse;
1109
1136
  m_mysqlNullMode = td->m_mysqlNullMode;
1137
+ m_utimeFieldNum = td->m_utimeFieldNum;
1110
1138
  parentKeyNum = td->parentKeyNum;
1111
1139
  replicaKeyNum = td->replicaKeyNum;
1112
1140
  optionFlags = td->optionFlags;
@@ -1135,6 +1163,27 @@ short tabledef::synchronize(const tabledef* td)
1135
1163
  return 0;
1136
1164
  }
1137
1165
 
1166
+ void tabledef::convertToUtf8Schema()
1167
+ {
1168
+ if (schemaCodePage != CP_UTF8)
1169
+ {
1170
+ char* p = namebufA();
1171
+ mbcconv(m_tableName, strlen(m_tableName), p, TABLE_NAME_SIZE, schemaCodePage, CP_UTF8);
1172
+ strcpy_s(m_tableName, TABLE_NAME_SIZE, p);
1173
+ mbcconv(m_fileName, strlen(m_fileName), p, FILE_NAME_SIZE, schemaCodePage, CP_UTF8);
1174
+ strcpy_s(m_fileName, FILE_NAME_SIZE, p);
1175
+ for (int i = 0;i < fieldCount; ++i)
1176
+ {
1177
+ fielddef* fd = &fieldDefs[i];
1178
+ mbcconv(fd->m_name, strlen(fd->m_name), p, FIELD_NAME_SIZE, schemaCodePage, CP_UTF8);
1179
+ strcpy_s(fd->m_name, FIELD_NAME_SIZE, p);
1180
+ mbcconv(fd->m_chainChar, strlen(fd->m_chainChar), p, 2, schemaCodePage, CP_UTF8);
1181
+ strcpy_s(fd->m_chainChar, 2, p);
1182
+ }
1183
+ schemaCodePage = CP_UTF8;
1184
+ }
1185
+ }
1186
+
1138
1187
  ushort_td lenByCharnum(uchar_td type, uchar_td charsetIndex, ushort_td charnum)
1139
1188
  {
1140
1189
  ushort_td len = charnum;
@@ -1069,6 +1069,7 @@ struct PACKAGE tabledef
1069
1069
  {
1070
1070
  memset(this, 0, sizeof(tabledef));
1071
1071
  formatVersion = FORMAT_VERSON_CURRENT;
1072
+ m_utimeFieldNum = -1;
1072
1073
  primaryKeyNum = -1;
1073
1074
  parentKeyNum = -1;
1074
1075
  replicaKeyNum = -1;
@@ -1084,6 +1085,7 @@ struct PACKAGE tabledef
1084
1085
  const wchar_t* tableName() const; // table name
1085
1086
  void setFileName(const wchar_t* s);
1086
1087
  void setTableName(const wchar_t* s);
1088
+ void convertToUtf8Schema();
1087
1089
  private:
1088
1090
  const char* toChar(char* buf, const wchar_t* s, int size) const;
1089
1091
  #else
@@ -1107,6 +1109,7 @@ private:
1107
1109
  const char* tableName() const;
1108
1110
  void setFileName(const char* s);
1109
1111
  void setTableName(const char* s);
1112
+ void convertToUtf8Schema();
1110
1113
  private:
1111
1114
  const char* toChar(char* buf, const char* s, int size) const;
1112
1115
  #endif // MYSQL_DYNAMIC_PLUGIN
@@ -1229,7 +1232,8 @@ private:
1229
1232
  bool m_useInMariadb ; // use in mariadb
1230
1233
  uchar_td m_srvMajorVer; // server major version;
1231
1234
  uchar_td m_srvMinorVer; // server minor version;
1232
- uchar_td m_filler0[10]; // reserved
1235
+ ushort_td m_utimeFieldNum; // uodate timestamp field number
1236
+ uchar_td m_filler0[8]; // reserved
1233
1237
  public:
1234
1238
  FLAGS flags; // file flags
1235
1239
  uchar_td primaryKeyNum; // Primary key number. -1 is no primary.
@@ -187,8 +187,10 @@ typedef void (__STDCALL* REGISTER_RESOLVER_PTR)(HANAME_RESOLVER_PTR func);
187
187
 
188
188
  /** TD_GET_SCHEMA sub operations
189
189
  */
190
+ #define SC_SUBOP_TABLEDEF 0
190
191
  #define SC_SUBOP_BY_SQL -1
191
192
  #define SC_SUBOP_VIEW_BY_SQL -2
193
+ #define SC_SUBOP_TABLEDEF_BIN_STR -3
192
194
 
193
195
  /** TD_GET_STASTISTICS sub operations
194
196
  */
@@ -387,12 +389,14 @@ enum combineType
387
389
  #define TD_OPEN_MASK_MYSQL_NULL -16
388
390
  #define TD_OPEN_MASK_GETSHCHEMA -32
389
391
  #define TD_OPEN_MASK_GETDEFAULTIMAGE -64
392
+ #define TD_OPEN_MASK_BIN_STR -128
390
393
 
391
394
  #define IS_MODE_READONLY(mode) (((0 - mode) & 2) != 0)
392
395
  #define IS_MODE_EXCLUSIVE(mode) (((0 - mode) & 4) != 0)
393
396
  #define IS_MODE_MYSQL_NULL(mode) (((0 - mode) & 16) != 0)
394
397
  #define IS_MODE_GETSCHEMA(mode) (((0 - mode) & 32) != 0)
395
398
  #define IS_MODE_GETDEFAULTIMAGE(mode) (((0 - mode) & 64) != 0)
399
+ #define IS_MODE_BIN_STR(mode) (((0 - mode) & 128) != 0)
396
400
  /** @endcond */
397
401
 
398
402
  /** field algin
@@ -665,7 +669,7 @@ struct handshale_t
665
669
  If you change this version then you need change The ($TargetName) project options too.
666
670
  */
667
671
  #define C_INTERFACE_VER_MAJOR "3"//##1 Build marker! Don't remove
668
- #define C_INTERFACE_VER_MINOR "5"//##2 Build marker! Don't remove
672
+ #define C_INTERFACE_VER_MINOR "6"//##2 Build marker! Don't remove
669
673
  #define C_INTERFACE_VER_RELEASE "0"//##3 Build marker! Don't remove
670
674
 
671
675
  /* dnamic load library name.
@@ -729,7 +733,7 @@ struct handshale_t
729
733
  */
730
734
 
731
735
  #define CPP_INTERFACE_VER_MAJOR "3"//##4 Build marker! Don't remove
732
- #define CPP_INTERFACE_VER_MINOR "5"//##5 Build marker! Don't remove
736
+ #define CPP_INTERFACE_VER_MINOR "6"//##5 Build marker! Don't remove
733
737
  #define CPP_INTERFACE_VER_RELEASE "0"//##6 Build marker! Don't remove
734
738
 
735
739
  /* use autolink tdclcpp */
@@ -766,7 +770,7 @@ struct handshale_t
766
770
 
767
771
 
768
772
  #define TRANSACTD_VER_MAJOR 3//##7 Build marker! Don't remove
769
- #define TRANSACTD_VER_MINOR 5//##8 Build marker! Don't remove
773
+ #define TRANSACTD_VER_MINOR 6//##8 Build marker! Don't remove
770
774
  #define TRANSACTD_VER_RELEASE 0//##9 Build marker! Don't remove
771
775
 
772
776
  #endif // BZS_DB_PROTOCOL_TDAP_TDAPCAPI_H
@@ -1,5 +1,5 @@
1
1
  /*=================================================================
2
- Copyright (C) 2014 BizStation Corp All rights reserved.
2
+ Copyright (C) 2014,2016 BizStation Corp All rights reserved.
3
3
 
4
4
  This program is free software; you can redistribute it and/or
5
5
  modify it under the terms of the GNU General Public License
@@ -522,7 +522,7 @@ void readUsers(databaseManager& db, std::vector<user_ptr>& users)
522
522
  users_orm users_hdr(m);
523
523
  ut.readMap(users_hdr, q);
524
524
 
525
- /* Using clrient filter exsample.
525
+ /* Using client filter exsample.
526
526
  Set a client filter function or function object to read method.
527
527
  */
528
528
  ut.index(keynum_group).keyValue(find_group_id).read(users, q, isMatch);
@@ -29,6 +29,9 @@
29
29
  #include <boost/enable_shared_from_this.hpp>
30
30
  #include "IAppModule.h"
31
31
  #include <bzs/rtl/exception.h>
32
+ #include <windows.h>
33
+ #include <stdio.h>
34
+
32
35
 
33
36
  using namespace boost;
34
37
  using namespace boost::asio;
@@ -166,10 +169,41 @@ class exitCheckHnadler : public IExitCheckHandler
166
169
  bool m_cancel;
167
170
  IAppModule* m_module;
168
171
 
172
+ /*
173
+ Enable Privilege of SE_DEBUG_NAME for system process. ex IIS
174
+ */
175
+ BOOL setPrivilege()
176
+ {
177
+ HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, GetCurrentProcessId());
178
+ HANDLE hToken;
179
+ OpenProcessToken(hProc, TOKEN_ADJUST_PRIVILEGES, &hToken);
180
+ CloseHandle(hProc);
181
+ TOKEN_PRIVILEGES tp;
182
+ LUID luid;
183
+
184
+ if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
185
+ {
186
+ CloseHandle(hToken);
187
+ return FALSE;
188
+ }
189
+ tp.PrivilegeCount = 1;
190
+ tp.Privileges[0].Luid = luid;
191
+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
192
+
193
+ BOOL ret = AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),
194
+ (PTOKEN_PRIVILEGES) NULL, (PDWORD) NULL);
195
+ CloseHandle(hToken);
196
+ if (!ret) return FALSE;
197
+ return (GetLastError() != ERROR_NOT_ALL_ASSIGNED);
198
+ }
199
+
169
200
  public:
170
201
  exitCheckHnadler(DWORD procId) : m_cancel(false), m_module(NULL)
171
202
  {
203
+ setPrivilege();
172
204
  m_procHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, procId);
205
+ if (!m_procHandle)
206
+ server::erh->printError("Pipe client process handle access denied");
173
207
  }
174
208
 
175
209
  ~exitCheckHnadler()
@@ -188,7 +222,7 @@ public:
188
222
  if (m_procHandle && GetExitCodeProcess(m_procHandle, &ExitCode))
189
223
  {
190
224
  if (STILL_ACTIVE != ExitCode)
191
- return true;
225
+ return true;
192
226
  }
193
227
  if (m_module && m_module->isShutDown())
194
228
  return true;
@@ -197,6 +197,7 @@ var joinWhereFields = 2;
197
197
 
198
198
  var CMP_MODE_MYSQL_NULL = 1;
199
199
  var CMP_MODE_OLD_NULL = 0;
200
+ var CMP_MODE_BINFD_DEFAULT_STR = 2;
200
201
 
201
202
  var clearNull = 0;
202
203
  var defaultNull = 1;
@@ -864,6 +865,47 @@ function testConnMgr(uri)
864
865
  }
865
866
 
866
867
 
868
+ function testUTCC(db)
869
+ {
870
+ var tb = db.OpenTable("user", OPEN_NORMAL);
871
+ checkEqual(db.Stat, 0, "OpenTable user");
872
+
873
+ var tb2 = db.OpenTable("user", OPEN_NORMAL);
874
+ checkEqual(db.Stat, 0, "OpenTable user");
875
+
876
+ db.beginTrn();
877
+ tb.seekFirst();
878
+ checkEqual(tb.Stat, 0, "seekFirst");
879
+
880
+ tb2.seekFirst();
881
+ checkEqual(tb2.Stat, 0, "seekFirst2");
882
+
883
+ tb2.SetFV(1, "ABC");
884
+ tb2.Update();
885
+ checkEqual(tb2.Stat, 0, "seekFirst2");
886
+
887
+ checkEqual(tb.updateConflictCheck, false, "updateConflictCheck");
888
+ var ret = tb.SetUpdateConflictCheck(true);
889
+ checkEqual(ret, true, "SetUpdateConflictCheck");
890
+ checkEqual(tb.updateConflictCheck, true, "updateConflictCheck");
891
+
892
+ tb.SetFV(1, "EFG");
893
+ tb.Update();
894
+ checkEqual(tb.Stat, STATUS_CHANGE_CONFLICT, "Update UTCC");
895
+ db.abortTrn();
896
+ }
897
+
898
+
899
+ function tesAlias(db)
900
+ {
901
+ var tb = db.OpenTable("user", OPEN_NORMAL);
902
+ checkEqual(db.Stat, 0, "OpenTable user");
903
+ tb.setAlias("���O", "name");
904
+ tb.SetFV("name", "EFG");
905
+ checkEqual(tb.Stat, 0, "Alias");
906
+ tb.close();
907
+ }
908
+
867
909
  /*--------------------------------------------------------------------------------*/
868
910
  function test(atu, ate, db)
869
911
  {
@@ -953,7 +995,7 @@ function test(atu, ate, db)
953
995
  // getSqlStringForCreateTable
954
996
  var sql = db.GetSqlStringForCreateTable("extention");
955
997
  checkEqual(db.Stat, 0, "GetSqlStringForCreateTable");
956
- checkEqual(sql, 'CREATE TABLE `extention` (`id` INT NOT NULL ,`comment` VARCHAR(60) binary NULL DEFAULT NULL,`bits` BIGINT NOT NULL , UNIQUE key0(`id`)) ENGINE=InnoDB default charset=cp932',
998
+ checkEqual(sql, 'CREATE TABLE `extention` (`id` INT NOT NULL ,`comment` VARCHAR(60) binary NULL DEFAULT NULL,`bits` BIGINT NOT NULL , PRIMARY KEY(`id`)) ENGINE=InnoDB default charset=cp932',
957
999
  "GetSqlStringForCreateTable");
958
1000
 
959
1001
  // setValidationTarget(bool isMariadb, uchar_td srvMinorVersion)
@@ -1171,6 +1213,11 @@ function test(atu, ate, db)
1171
1213
  // connMgr
1172
1214
  testConnMgr(db.uri);
1173
1215
 
1216
+ // UTCC
1217
+ testUTCC(db);
1218
+
1219
+ //Alias
1220
+ tesAlias(db);
1174
1221
  //WScript.Echo(" -- End Test -- ");
1175
1222
  }
1176
1223
  /*--------------------------------------------------------------------------------*/