transactd 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
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
  /*--------------------------------------------------------------------------------*/