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
@@ -71,10 +71,8 @@ char g_buf[TMP_BUFSIZE];
71
71
  #define NOTE_TYPE 12
72
72
  #define VAR_TYPE 13
73
73
 
74
- #define NIS_FD_KEYSEG_LIMIT 1
75
-
76
- const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
77
- const char* charsetName)
74
+ const char* getFieldTypeName(const fielddef& fd, int size, bool nobinary,
75
+ const char* charsetName, int decimals)
78
76
  {
79
77
  const char* bin_ptr = nobinary ? "" : "binary";
80
78
  char charsetString[128] = { " CHARACTER SET " };
@@ -82,47 +80,68 @@ const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
82
80
  strcat_s(charsetString, 128, charsetName);
83
81
  else
84
82
  charsetString[0] = 0x00;
85
-
86
- switch (fieldType)
83
+ switch (fd.type)
87
84
  {
88
-
89
85
  case ft_integer:
90
86
  case ft_autoinc:
91
87
  case ft_currency:
92
88
  case ft_date:
93
89
  case ft_time:
90
+ case ft_datetime:
94
91
  case ft_timestamp:
95
92
  if (size == 1)
96
93
  return "TINYINT";
97
94
  if (size == 2)
98
95
  return "SMALLINT";
96
+ if (size == 3)
97
+ return "MEDIUMINT";
99
98
  if (size == 4)
100
99
  return "INT";
101
100
  if (size == 8)
102
101
  return "BIGINT";
102
+ case ft_bit:
103
+ sprintf_s(g_buf, TMP_BUFSIZE, "BIT(%d)", size * 8);
104
+ return g_buf;
105
+ case ft_enum:
106
+ case ft_set:
103
107
  case ft_uinteger:
104
108
  case ft_autoIncUnsigned:
105
109
  if (size == 1)
106
110
  return "TINYINT UNSIGNED";
107
111
  if (size == 2)
108
112
  return "SMALLINT UNSIGNED";
113
+ if (size == 3)
114
+ return "MEDIUMINT UNSIGNED";
109
115
  if (size == 4)
110
116
  return "INT UNSIGNED";
111
117
  if (size == 8)
112
118
  return "BIGINT UNSIGNED";
113
119
  case ft_logical:
114
- return "TINYINT UNSIGNED";
120
+ if (size == 1)
121
+ return "TINYINT UNSIGNED";
122
+ if (size == 2)
123
+ return "SMALLINT UNSIGNED";
124
+ case ft_myyear:
125
+ return "YEAR";
115
126
  case ft_mydate:
116
127
  return "DATE";
117
128
  case ft_mytime:
118
- sprintf_s(g_buf, TMP_BUFSIZE, "TIME(%d)", (size - 3) * 2);
129
+ if(fd.isLegacyTimeFormat())
130
+ sprintf_s(g_buf, TMP_BUFSIZE, "TIME");
131
+ else
132
+ sprintf_s(g_buf, TMP_BUFSIZE, "TIME(%d)", decimals);
119
133
  return g_buf;
120
134
  case ft_mydatetime:
121
- sprintf_s(g_buf, TMP_BUFSIZE, "DATETIME(%d)", (size - 5) * 2);
135
+ if(fd.isLegacyTimeFormat())
136
+ sprintf_s(g_buf, TMP_BUFSIZE, "DATETIME");
137
+ else
138
+ sprintf_s(g_buf, TMP_BUFSIZE, "DATETIME(%d)", decimals);
122
139
  return g_buf;
123
140
  case ft_mytimestamp:
124
-
125
- sprintf_s(g_buf, TMP_BUFSIZE, "TIMESTAMP(%d)", (size - 4) * 2);
141
+ if(fd.isLegacyTimeFormat())
142
+ sprintf_s(g_buf, TMP_BUFSIZE, "TIMESTAMP");
143
+ else
144
+ sprintf_s(g_buf, TMP_BUFSIZE, "TIMESTAMP(%d)", decimals);
126
145
  return g_buf;
127
146
  case ft_mytext:
128
147
  if (size - 8 == 4)
@@ -140,11 +159,18 @@ const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
140
159
  else if (size - 8 == 2)
141
160
  return "BLOB";
142
161
  return "TINYBLOB";
162
+ case ft_myjson:
163
+ return "JSON";
164
+ case ft_mygeometry:
165
+ return "GEOMETRY";
143
166
  case ft_float:
144
167
  if (size == 4)
145
168
  return "FLOAT";
146
169
  if (size == 8)
147
170
  return "DOUBLE";
171
+ case ft_mydecimal:
172
+ sprintf_s(g_buf, TMP_BUFSIZE, "DECIMAL(%d, %d)", fd.digits, decimals);
173
+ return g_buf;
148
174
  case ft_string:
149
175
  case ft_wstring:
150
176
  sprintf_s(g_buf, TMP_BUFSIZE, "BINARY(%d)", size);
@@ -157,6 +183,7 @@ const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
157
183
  case ft_lvar: // var
158
184
  sprintf_s(g_buf, TMP_BUFSIZE, "VARBINARY(%d)", size);
159
185
  return g_buf;
186
+ case ft_lstring:
160
187
  case ft_myvarbinary:
161
188
  case ft_myfixedbinary:
162
189
  sprintf_s(g_buf, TMP_BUFSIZE, "VARBINARY(%d)", size);
@@ -164,7 +191,6 @@ const char* getFieldTypeName(uchar_td fieldType, int size, bool nobinary,
164
191
  case ft_mywvarbinary:
165
192
  sprintf_s(g_buf, TMP_BUFSIZE, "VARBINARY(%d)", size);
166
193
  return g_buf;
167
-
168
194
  case ft_mywvarchar:
169
195
  sprintf_s(g_buf, TMP_BUFSIZE, "VARCHAR(%d) %s CHARACTER SET utf16le",
170
196
  size, bin_ptr);
@@ -220,36 +246,34 @@ bool isNumericFieldName(const char* name)
220
246
  return false;
221
247
  }
222
248
 
223
- bool isNULLKeySegment(const tabledef* table, short fieldIndex)
249
+ char* removeTimeStampOptionDecimal(const char* s, char* buf, size_t size)
224
250
  {
225
- bool ret = 0;
226
- for (int i = 0; i < table->keyCount; i++)
251
+ strcpy_s(buf, size, s);
252
+ char* p = strrchr(buf, '(');
253
+ if (p)
254
+ *p = 0x00;
255
+ return buf;
256
+ }
257
+
258
+ char* getBitDefalutValue(char* buf, size_t size, unsigned __int64 v)
259
+ {
260
+ char* p = buf;
261
+ for (int i = 0; i< 64;++i)
227
262
  {
228
- const keydef& key = table->keyDefs[i];
229
- for (int j = 0; j < key.segmentCount; j++)
230
- {
231
- if (key.segments[j].fieldNum == fieldIndex)
232
- {
233
- // bit3 all segment NULL key
234
- // bit9 part segment NULL key
235
- // if fd.nullValue != 0x00 then this field is type of not null .
236
- const fielddef& fd = table->fieldDefs[fieldIndex];
237
- if (((key.segments[j].flags.bit3 ||
238
- key.segments[j].flags.bit9)) &&
239
- (fd.nullValue == 0x00))
240
- ret = true;
241
- else
242
- return false;
243
- }
244
- }
263
+ if (v & (1ULL << (63 - i)))
264
+ *(p++) = '1';
265
+ else if (p != buf)
266
+ *(p++) = '0';
245
267
  }
246
- return ret;
268
+ *p = 0x00;
269
+ return buf;
247
270
  }
248
271
 
249
- std::string getFiledList(const tabledef* table, std::vector<std::string>& fdl)
272
+ std::string sqlBuilder::getFieldList(const tabledef* table, std::vector<std::string>& fdl, const clsrv_ver* ver)
250
273
  {
251
274
  std::string s;
252
275
  int len;
276
+ char timestamp_tmp[64];
253
277
  for (int i = 0; i < table->fieldCount; i++)
254
278
  {
255
279
  const fielddef& fd = table->fieldDefs[i];
@@ -274,11 +298,101 @@ std::string getFiledList(const tabledef* table, std::vector<std::string>& fdl)
274
298
  if (fd.charsetIndex() != table->charsetIndex)
275
299
  charsetName = mysql::charsetName(fd.charsetIndex());
276
300
 
277
- s += getFieldTypeName(fd.type, len, f.bitA, charsetName);
278
- if (isNULLKeySegment(table, i))
279
- s += " NULL";
301
+ s += getFieldTypeName(fd, len, f.bitA, charsetName, fd.decimals);
302
+ const char* p = fd.defaultValue_str();
303
+ if ((fd.defaultValue() == DFV_TIMESTAMP_DEFAULT) &&
304
+ ((fd.type == ft_mytimestamp) || (fd.type == ft_mydatetime)))
305
+ p = timeStampDefaultStr(fd, timestamp_tmp, 64);
306
+ if (fd.isNullable())
307
+ {
308
+ if (fd.isDefaultNull())
309
+ s += " NULL DEFAULT NULL";
310
+ else if (p[0])
311
+ {
312
+ if ((fd.type == ft_mytimestamp) ||
313
+ (fd.type == ft_mydatetime))
314
+ {
315
+ s += " NULL DEFAULT ";
316
+ if (!ver->isSupportDateTimeTimeStamp())
317
+ {
318
+ char tmp[100];
319
+ s += removeTimeStampOptionDecimal(p, tmp, 100);
320
+ }
321
+ else
322
+ s += p;
323
+ }else if (fd.type == ft_bit)
324
+ {
325
+ s += " NULL DEFAULT b'";
326
+ char tmp[100] = {NULL};
327
+ s += getBitDefalutValue(tmp, 100, (unsigned __int64)fd.defaultValue64());
328
+ s += "'";
329
+ }
330
+ else
331
+ {
332
+ s += " NULL DEFAULT '";
333
+ s += p;
334
+ s += "'";
335
+ }
336
+ }else
337
+ {
338
+ if (isStringTypeForIndex(fd.type))
339
+ s += " NULL DEFAULT ''";
340
+ else if (fd.type == ft_mydatetime || fd.type == ft_mytimestamp)
341
+ s += " NULL DEFAULT '0000-00-00 00:00:00'";
342
+ else if (fd.type == ft_mydate)
343
+ s += " NULL DEFAULT '0000-00-00'";
344
+ else if (fd.type == ft_mytime)
345
+ s += " NULL DEFAULT '00:00:00'";
346
+ else if (fd.isNumericType() || fd.isDateTimeType()/*P.SQL date time*/ )
347
+ s += " NULL DEFAULT '0'";
348
+ else
349
+ s += " NULL";
350
+ }
351
+ }
280
352
  else
281
- s += " NOT NULL";
353
+ {
354
+ s += " NOT NULL ";
355
+ if (p[0])
356
+ {
357
+ if ((fd.type == ft_mytimestamp) ||
358
+ (fd.type == ft_mydatetime))
359
+ {
360
+ s += "DEFAULT ";
361
+ if (!ver->isSupportDateTimeTimeStamp())
362
+ {
363
+ char tmp[100];
364
+ s += removeTimeStampOptionDecimal(p, tmp, 100);
365
+ }
366
+ else
367
+ s += p;
368
+ }else if (fd.type == ft_bit)
369
+ {
370
+ s += "DEFAULT b'";
371
+ char tmp[100] = {NULL};
372
+ s += getBitDefalutValue(tmp, 100, (unsigned __int64)fd.defaultValue());
373
+ s += "'";
374
+ }
375
+ else
376
+ {
377
+ s += "DEFAULT '";
378
+ s += p;
379
+ s += "'";
380
+ }
381
+ }
382
+ }
383
+ if (fd.isTimeStampOnUpdate())
384
+ {
385
+ char buf[64];
386
+ updateTimeStampStr(&fd, buf, 64);
387
+ if (!ver->isSupportDateTimeTimeStamp())
388
+ {
389
+ char tmp[100];
390
+ s += removeTimeStampOptionDecimal(buf, tmp, 100);
391
+ }
392
+ else
393
+ s += buf;
394
+ }
395
+
282
396
  if ((fd.type == ft_autoinc) || (fd.type == ft_autoIncUnsigned))
283
397
  s += " AUTO_INCREMENT";
284
398
  s += ",";
@@ -286,50 +400,42 @@ std::string getFiledList(const tabledef* table, std::vector<std::string>& fdl)
286
400
  return s;
287
401
  }
288
402
 
289
- bool isNeedNis(const tabledef* table, const keydef& key)
290
- {
291
- if (key.segmentCount > NIS_FD_KEYSEG_LIMIT)
292
- {
293
- // If a first segment is not 1 byte of Logical
294
- const fielddef& fd = table->fieldDefs[key.segments[0].fieldNum];
295
- return (!((fd.len == 1) && (fd.type == ft_logical)));
296
- }
297
- return false;
298
- }
299
-
300
- void insertNisFields(const tabledef* table, std::vector<std::string>& fdl,
403
+ void sqlBuilder::insertNisFields(const tabledef* td, std::vector<std::string>& fdl,
301
404
  std::string& s)
302
405
  {
303
406
  char buf[20];
304
- for (int i = 0; i < table->keyCount; i++)
407
+ for (int i = 0; i < td->keyCount; i++)
305
408
  {
306
409
  _ltoa_s(i, buf, 20, 10);
307
410
  std::string fddef = "";
308
- const keydef& key = table->keyDefs[i];
309
- if (isNeedNis(table, key))
411
+ const keydef& key = td->keyDefs[i];
412
+ if (td->isNullKey(key))
310
413
  {
311
- if (key.segments[0].flags.bit9)
312
- fddef = std::string("`") + "$nfn" + buf +
313
- "` TINYINT UNSIGNED NULL,";
314
- else if (key.segments[0].flags.bit3)
315
- fddef = std::string("`") + "$nfa" + buf +
316
- "` TINYINT UNSIGNED NULL,";
414
+ if (td->isNeedNis(key))
415
+ {
416
+ if (key.segments[0].flags.bit9)
417
+ fddef = std::string("`") + "$nfn" + buf +
418
+ "` TINYINT UNSIGNED NULL,";
419
+ else if (key.segments[0].flags.bit3)
420
+ fddef = std::string("`") + "$nfa" + buf +
421
+ "` TINYINT UNSIGNED NULL,";
422
+ }
317
423
  }
318
424
  if (fddef != "")
319
425
  s += fddef;
320
426
  }
321
427
  }
322
428
 
323
- std::string& getKey(const tabledef* table, std::vector<std::string>& fdl,
324
- int index, std::string& s, bool specifyKeyNum=false)
429
+ std::string& sqlBuilder::getKey(const tabledef* td, std::vector<std::string>& fdl,
430
+ int index, std::string& s, bool specifyKeyNum)
325
431
  {
326
432
  char buf[20];
327
- const keydef& key = table->keyDefs[index];
433
+ const keydef& key = td->keyDefs[index];
328
434
  if (specifyKeyNum)
329
435
  _ltoa_s(key.keyNumber, buf, 20, 10);
330
436
  else
331
437
  _ltoa_s(index, buf, 20, 10);
332
- if ((table->primaryKeyNum == index) &&
438
+ if ((td->primaryKeyNum == index) &&
333
439
  (fdl[key.segments[0].fieldNum] == "auto_id_field"))
334
440
  s += " PRIMARY KEY ";
335
441
  else
@@ -345,7 +451,7 @@ std::string& getKey(const tabledef* table, std::vector<std::string>& fdl,
345
451
  s += "(";
346
452
 
347
453
  // "nf" segment is added to a head.
348
- if (isNeedNis(table, key))
454
+ if (td->isNeedNis(key))
349
455
  {
350
456
  if (key.segments[0].flags.bit9)
351
457
  s += std::string("`") + "$nfn" + buf + "`,";
@@ -359,7 +465,7 @@ std::string& getKey(const tabledef* table, std::vector<std::string>& fdl,
359
465
  s += "`";
360
466
 
361
467
  // part key
362
- const fielddef& fd = table->fieldDefs[key.segments[j].fieldNum];
468
+ const fielddef& fd = td->fieldDefs[key.segments[j].fieldNum];
363
469
  if (fd.keylen && ((fd.keylen != fd.len) || fd.blobLenBytes()))
364
470
  {
365
471
  sprintf_s(buf, 20, "(%d)", fd.keylen);
@@ -375,7 +481,7 @@ std::string& getKey(const tabledef* table, std::vector<std::string>& fdl,
375
481
  return s;
376
482
  }
377
483
 
378
- std::string getKeyList(const tabledef* table, std::vector<std::string>& fdl)
484
+ std::string sqlBuilder::getKeyList(const tabledef* table, std::vector<std::string>& fdl)
379
485
  {
380
486
  std::string s;
381
487
  for (int i = 0; i < table->keyCount; i++)
@@ -420,8 +526,8 @@ void makeSuffixNamesList(const tabledef* table, std::vector<std::string>& fds)
420
526
  }
421
527
  }
422
528
 
423
- std::string sqlCreateTable(const char* name /* utf8 */, tabledef* table,
424
- uchar_td charsetIndexServer)
529
+ std::string sqlBuilder::sqlCreateTable(const char* name /* utf8 */, tabledef* table,
530
+ uchar_td charsetIndexServer, const clsrv_ver* ver)
425
531
  {
426
532
  // Duplication of a name is inspected and, in duplication, _1 is added.
427
533
  // It does not correspond to two or more duplications.
@@ -441,7 +547,7 @@ std::string sqlCreateTable(const char* name /* utf8 */, tabledef* table,
441
547
  }
442
548
  else
443
549
  s += getFileName(table->fileNameA()) + "` (";
444
- s += getFiledList(table, fds);
550
+ s += getFieldList(table, fds, ver);
445
551
  insertNisFields(table, fds, s);
446
552
  s += getKeyList(table, fds);
447
553
  if (s[s.size() - 1] == ',')
@@ -457,15 +563,15 @@ std::string sqlCreateTable(const char* name /* utf8 */, tabledef* table,
457
563
  return s;
458
564
  }
459
565
 
460
- std::string sqlCreateIndex(const tabledef* table, int keyNum,
461
- bool specifyKeyNum, uchar_td charsetIndexServer)
566
+ std::string sqlBuilder::sqlCreateIndex(const tabledef* table, int keyNum,
567
+ bool specifyKeyNum, uchar_td charsetIndexServer, const clsrv_ver* ver)
462
568
  {
463
569
  std::string s;
464
570
  std::vector<std::string> fds;// suffix added names list
465
571
  makeSuffixNamesList(table, fds);
466
572
  uint_td schemaCodePage =
467
573
  table->schemaCodePage ? table->schemaCodePage : GetACP();
468
- s += getFiledList(table, fds);
574
+ s += getFieldList(table, fds, ver);
469
575
  insertNisFields(table, fds, s);
470
576
  s = "`";
471
577
  s+= getFileName(table->fileNameA());
@@ -616,8 +722,8 @@ void makeTableDef(tabledef* TableDef, fileSpec* fs, std::vector<fielddef>& fds)
616
722
  TableDef->fieldCount = (ushort_td)fds.size();
617
723
  }
618
724
 
619
- std::string sqlCreateTable(const char* fileName, fileSpec* fs,
620
- uchar_td charsetIndexServer)
725
+ std::string sqlBuilder::sqlCreateTable(const char* fileName, fileSpec* fs,
726
+ uchar_td charsetIndexServer, const clsrv_ver* ver)
621
727
  {
622
728
  tabledef table;
623
729
  memset(&table, 0, sizeof(tabledef));
@@ -632,7 +738,7 @@ std::string sqlCreateTable(const char* fileName, fileSpec* fs,
632
738
  table.keyDefs = &kds[0];
633
739
  makeTableDef(&table, fs, fds);
634
740
 
635
- return sqlCreateTable(fileName, &table, charsetIndexServer);
741
+ return sqlCreateTable(fileName, &table, charsetIndexServer, ver);
636
742
  }
637
743
 
638
744
  } // namespace client
@@ -20,6 +20,7 @@
20
20
  ================================================================= */
21
21
  #include <bzs/db/protocol/tdap/tdapSchema.h>
22
22
  #include <string>
23
+ #include <vector>
23
24
 
24
25
  namespace bzs
25
26
  {
@@ -32,18 +33,28 @@ namespace tdap
32
33
  namespace client
33
34
  {
34
35
 
35
- /** create statement charset must be server default charset.
36
- * server default charset writen in my.cnf.
37
- *
38
- * @param charsetIndexServer server default charset
39
- */
40
- std::string sqlCreateTable(const char* name, tabledef* table,
41
- uchar_td charsetIndexServer);
42
- std::string sqlCreateTable(const char* fileName, fileSpec* fs,
43
- uchar_td charsetIndexServer);
44
-
45
- std::string sqlCreateIndex(const tabledef* table, int keyNum,
46
- bool specifyKeyNum, uchar_td charsetIndexServer);
36
+ class sqlBuilder
37
+ {
38
+ static std::string getFieldList(const tabledef* table, std::vector<std::string>& fdl, const clsrv_ver* ver);
39
+ static void insertNisFields(const tabledef* td, std::vector<std::string>& fdl, std::string& s);
40
+ static std::string& getKey(const tabledef* td, std::vector<std::string>& fdl,
41
+ int index, std::string& s, bool specifyKeyNum=false);
42
+ static std::string getKeyList(const tabledef* table, std::vector<std::string>& fdl);
43
+
44
+ public:
45
+ /** create statement charset must be server default charset.
46
+ * server default charset writen in my.cnf.
47
+ *
48
+ * @param charsetIndexServer server default charset
49
+ */
50
+ static std::string sqlCreateTable(const char* name, tabledef* table,
51
+ uchar_td charsetIndexServer, const clsrv_ver* ver);
52
+ static std::string sqlCreateTable(const char* fileName, fileSpec* fs,
53
+ uchar_td charsetIndexServer, const clsrv_ver* ver);
54
+
55
+ static std::string sqlCreateIndex(const tabledef* table, int keyNum,
56
+ bool specifyKeyNum, uchar_td charsetIndexServer, const clsrv_ver* ver);
57
+ };
47
58
 
48
59
  } // namespace client
49
60
  } // namespace tdap
@@ -448,7 +448,7 @@ public:
448
448
 
449
449
  inline size_t maxStoreBytes() const { return m_fd.len - 1; };
450
450
 
451
- inline int padChar() const { return 0; };
451
+ inline int padChar() const { return -1; };
452
452
 
453
453
  inline int storeOffsetBytes() const { return 0; };
454
454
 
@@ -466,7 +466,7 @@ public:
466
466
 
467
467
  inline size_t maxStoreBytes() const { return m_fd.len - sizeof(short); };
468
468
 
469
- inline int padChar() const { return 0; };
469
+ inline int padChar() const { return -1; };
470
470
 
471
471
  inline int storeOffsetBytes() const { return 0; };
472
472
 
@@ -527,8 +527,7 @@ inline WCHAR* memset_t(WCHAR* dest, int c, size_t count)
527
527
  }
528
528
 
529
529
  template <typename _SF, typename store_type, typename T>
530
- void store(char* ptr, const T* data, const fielddef& fd, stringConverter* cv,
531
- bool usePad = true)
530
+ void store(char* ptr, const T* data, const fielddef& fd, stringConverter* cv)
532
531
  {
533
532
  _SF sf(fd);
534
533
 
@@ -551,8 +550,7 @@ void store(char* ptr, const T* data, const fielddef& fd, stringConverter* cv,
551
550
  memcpy_t(strPtr, data, len);
552
551
  }
553
552
  }
554
- int fc = usePad ? sf.padChar() : -1;
555
-
553
+ int fc = sf.padChar();
556
554
  // Trim by max charctor number (not char type length) and invalid mbc lead
557
555
  // byte.
558
556
  int maxCharnum = sf.maxCharNum();
@@ -600,7 +598,7 @@ const T* read(char* ptr, ::bzs::rtl::stringBuffer* strBufs, const fielddef& fd,
600
598
  if ((typeid(T) != typeid(store_type)) ||
601
599
  (cv->isNeedConvert() && (typeid(T) == typeid(char))))
602
600
  {
603
- len = fd.dataLen((const uchar_td*)ptr) / sizeof(store_type);
601
+ len = dataLen(fd, (const uchar_td*)ptr) / sizeof(store_type);
604
602
  size_t olen =
605
603
  len * 2 * sizeof(store_type) + 1; // utf8�ւ�2�{�̉”\��������
606
604
  result = strBufs->getPtr<T>(olen);
@@ -608,7 +606,7 @@ const T* read(char* ptr, ::bzs::rtl::stringBuffer* strBufs, const fielddef& fd,
608
606
  }
609
607
  else if (sf.isNeedReadCopy())
610
608
  {
611
- len = fd.dataLen((const uchar_td*)ptr);
609
+ len = dataLen(fd, (const uchar_td*)ptr);
612
610
  if (len == sf.maxStoreBytes())
613
611
  {
614
612
  result = (T*)strBufs->getPtrA(len + 2);
@@ -665,8 +663,8 @@ template <typename T>
665
663
  const T* readBlob(char* ptr, ::bzs::rtl::stringBuffer* strBufs,
666
664
  const fielddef& fd, stringConverter* cv)
667
665
  {
668
- int offset = fd.blobLenBytes();
669
- size_t len = fd.blobDataLen((const uchar_td*)ptr);
666
+ int offset = blobLenBytes(fd);
667
+ size_t len = blobDataLen(fd, (const uchar_td*)ptr);
670
668
  T* result;
671
669
  if (len)
672
670
  {