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
@@ -111,26 +111,26 @@ public:
111
111
 
112
112
  writableRecord& getWritableRecord();
113
113
 
114
- activeTable& join(recordset& rs, queryBase& q, const _TCHAR* name1,
114
+ recordset& join(recordset& rs, queryBase& q, const _TCHAR* name1,
115
115
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
116
116
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
117
117
  const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
118
118
  const _TCHAR* name8 = NULL);
119
119
 
120
- activeTable&
120
+ recordset&
121
121
  outerJoin(recordset& rs, queryBase& q, const _TCHAR* name1,
122
122
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
123
123
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
124
124
  const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
125
125
  const _TCHAR* name8 = NULL);
126
126
 
127
- activeTable& join(recordset& rs, pq_handle& q, const _TCHAR* name1,
127
+ recordset& join(recordset& rs, pq_handle& q, const _TCHAR* name1,
128
128
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
129
129
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
130
130
  const _TCHAR* name6 = NULL, const _TCHAR* name7 = NULL,
131
131
  const _TCHAR* name8 = NULL);
132
132
 
133
- activeTable&
133
+ recordset&
134
134
  outerJoin(recordset& rs, pq_handle& q, const _TCHAR* name1,
135
135
  const _TCHAR* name2 = NULL, const _TCHAR* name3 = NULL,
136
136
  const _TCHAR* name4 = NULL, const _TCHAR* name5 = NULL,
@@ -141,42 +141,42 @@ public:
141
141
  table_ptr table() const;
142
142
  activeTable& option(int v);
143
143
  pq_handle prepare(queryBase& q, bool serverPrepare = false);
144
- activeTable& read(recordset& rs, queryBase& q);
145
- activeTable& read(recordset& rs, queryBase& q, validationFunc func);
146
- activeTable& read(recordset& rs, pq_handle& q);
147
- activeTable& read(recordset& rs, pq_handle& q, validationFunc func);
148
- activeTable& readMore(recordset& rs);
144
+ recordset& read(recordset& rs, queryBase& q);
145
+ recordset& read(recordset& rs, queryBase& q, validationFunc func);
146
+ recordset& read(recordset& rs, pq_handle& q);
147
+ recordset& read(recordset& rs, pq_handle& q, validationFunc func);
148
+ recordset& readMore(recordset& rs);
149
149
  /** @cond INTERNAL */
150
150
  template<class T0>
151
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0)
151
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0)
152
152
  {
153
153
  _supplyValue(q, 0, v0);
154
154
  read(rs, q);
155
- return *this;
155
+ return rs;
156
156
  }
157
157
 
158
158
  template<class T0, class T1>
159
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1)
159
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1)
160
160
  {
161
161
  _supplyValue(q, 0, v0);
162
162
  _supplyValue(q, 1, v1);
163
163
  read(rs, q);
164
- return *this;
164
+ return rs;
165
165
  }
166
166
 
167
167
  template<class T0, class T1, class T2>
168
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
168
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
169
169
  const T2 v2)
170
170
  {
171
171
  _supplyValue(q, 0, v0);
172
172
  _supplyValue(q, 1, v1);
173
173
  _supplyValue(q, 2, v2);
174
174
  read(rs, q);
175
- return *this;
175
+ return rs;
176
176
  }
177
177
 
178
178
  template<class T0, class T1, class T2, class T3>
179
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
179
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
180
180
  const T2 v2, const T3 v3)
181
181
  {
182
182
  _supplyValue(q, 0, v0);
@@ -184,11 +184,11 @@ public:
184
184
  _supplyValue(q, 2, v2);
185
185
  _supplyValue(q, 3, v3);
186
186
  read(rs, q);
187
- return *this;
187
+ return rs;
188
188
  }
189
189
 
190
190
  template<class T0, class T1, class T2, class T3, class T4>
191
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
191
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
192
192
  const T2 v2, const T3 v3, const T4 v4)
193
193
  {
194
194
  _supplyValue(q, 0, v0);
@@ -197,11 +197,11 @@ public:
197
197
  _supplyValue(q, 3, v3);
198
198
  _supplyValue(q, 4, v4);
199
199
  read(rs, q);
200
- return *this;
200
+ return rs;
201
201
  }
202
202
 
203
203
  template<class T0, class T1, class T2, class T3, class T4, class T5>
204
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
204
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
205
205
  const T2 v2, const T3 v3, const T4 v4, const T5 v5)
206
206
  {
207
207
  _supplyValue(q, 0, v0);
@@ -211,11 +211,11 @@ public:
211
211
  _supplyValue(q, 4, v4);
212
212
  _supplyValue(q, 5, v5);
213
213
  read(rs, q);
214
- return *this;
214
+ return rs;
215
215
  }
216
216
 
217
217
  template<class T0, class T1, class T2, class T3, class T4, class T5, class T6>
218
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
218
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
219
219
  const T2 v2, const T3 v3, const T4 v4, const T5 v5,
220
220
  const T6 v6)
221
221
  {
@@ -227,12 +227,12 @@ public:
227
227
  _supplyValue(q, 5, v5);
228
228
  _supplyValue(q, 6, v6);
229
229
  read(rs, q);
230
- return *this;
230
+ return rs;
231
231
  }
232
232
 
233
233
  template<class T0, class T1, class T2, class T3, class T4, class T5, class T6,
234
234
  class T7>
235
- activeTable& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
235
+ recordset& read(recordset& rs, pq_handle& q, const T0 v0, const T1 v1,
236
236
  const T2 v2, const T3 v3, const T4 v4, const T5 v5,
237
237
  const T6 v6, const T7 v7)
238
238
  {
@@ -245,7 +245,7 @@ public:
245
245
  _supplyValue(q, 6, v6);
246
246
  _supplyValue(q, 7, v7);
247
247
  read(rs, q);
248
- return *this;
248
+ return rs;
249
249
  }
250
250
  /** @endcond */
251
251
 
@@ -234,7 +234,8 @@ class activeTableImple : public activeObject<map_orm>
234
234
  }
235
235
  else if (joinFields[i].type == JOIN_KEYVALUE_TYPE_PTR)
236
236
  {
237
- ptr[i] = (const uchar_td*)mdl[fieldIndexes[i]].ptr();
237
+ ptr[i] = (mdl[fieldIndexes[i]].isNull()) ? NULL :
238
+ (const uchar_td*)mdl[fieldIndexes[i]].ptr();
238
239
  len[i] = joinFields[i].len;
239
240
  }
240
241
  else
@@ -242,10 +243,15 @@ class activeTableImple : public activeObject<map_orm>
242
243
  // if target field type is different then we need convrt type
243
244
  const fielddef& f = td->fieldDefs[kd->segments[i].fieldNum];
244
245
  field fd(buf_ptr - f.pos, f, fds);
245
- fd = mdl[fieldIndexes[i]].c_str();
246
- ptr[i] = buf_ptr;
247
246
  len[i] = f.isStringType() ? 0xff : f.len;
248
- buf_ptr += f.len;
247
+ if (mdl[fieldIndexes[i]].isNull())
248
+ ptr[i] = NULL;
249
+ else
250
+ {
251
+ fd = mdl[fieldIndexes[i]].c_str();// operator=(const _TCHAR* p)
252
+ ptr[i] = buf_ptr;
253
+ buf_ptr += f.len;
254
+ }
249
255
  }
250
256
  }
251
257
 
@@ -63,6 +63,7 @@ short errorCode(const boost::system::error_code& e)
63
63
  case 32: //write:brokn pipe
64
64
  case 111: //connect: Connection refused
65
65
  case 10061:
66
+ case 10053:
66
67
  ret = ERROR_TD_CONNECTION_FAILURE;
67
68
  break;
68
69
  case 104: //write: Connection reset by peer
@@ -95,15 +96,15 @@ int client::getServerCharsetIndex()
95
96
 
96
97
  request req = m_req;
97
98
  req.paramMask = P_MASK_POSBLK | P_MASK_DATA | P_MASK_DATALEN;
98
- trdVersiton ver;
99
- memset(&ver, 0, sizeof(trdVersiton));
100
- ver.cherserServer[0] = 0x00;
99
+ trdVersiton vers;
100
+ memset(&vers, 0, sizeof(trdVersiton));
101
+ clsrv_ver& ver = vers.desc;
101
102
  ver.clMajor = (ushort_td)atoi(C_INTERFACE_VER_MAJOR);
102
103
  ver.clMinor = (ushort_td)atoi(C_INTERFACE_VER_MINOR);
103
104
  ver.clRelease = (ushort_td)atoi(C_INTERFACE_VER_RELEASE);
104
105
  uint_td len = sizeof(trdVersiton);
105
106
  req.op = TD_GETSERVER_CHARSET;
106
- req.data = &ver;
107
+ req.data = &vers;
107
108
  req.datalen = &len;
108
109
 
109
110
  mutex::scoped_lock lck(m_mutex);
@@ -117,7 +118,7 @@ int client::getServerCharsetIndex()
117
118
  {
118
119
  if (!checkVersion(ver))
119
120
  return -1;
120
- c->setCharsetServer(mysql::charsetIndex(ver.cherserServer));
121
+ c->setCharsetServer(mysql::charsetIndex(vers.cherserServer));
121
122
  return c->charsetServer();
122
123
  }
123
124
  }
@@ -82,7 +82,7 @@ class client
82
82
 
83
83
  std::vector<char> m_sendbuf;
84
84
 
85
- bool checkVersion(trdVersiton& ver)
85
+ bool checkVersion(clsrv_ver& ver)
86
86
  {
87
87
  if ((ver.srvMajor < 2) || ((ver.srvMajor == 2) && (ver.srvMinor < 3)))
88
88
  return false;
@@ -150,13 +150,16 @@ class client
150
150
  handshale_t* hst = (handshale_t*)c->read();
151
151
  if (c->error()) return false;
152
152
  bool auth = (hst->size == sizeof(handshale_t));
153
- bool min = (hst->size == (sizeof(handshale_t)
154
- - sizeof(hst->scramble)));
155
-
153
+ bool min = (hst->size == (sizeof(handshale_t) - sizeof(hst->scramble)));
154
+ memcpy(c->versions(), &hst->ver.desc, sizeof(clsrv_ver));
155
+
156
156
  if (min || auth)
157
157
  {
158
- if (!checkVersion(hst->ver))
158
+ if (!checkVersion(hst->ver.desc))
159
+ {
160
+ m_preResult = SERVER_CLIENT_NOT_COMPATIBLE;
159
161
  return false;
162
+ }
160
163
  c->setCharsetServer(mysql::charsetIndex(hst->ver.cherserServer));
161
164
  m_req.cid->lock_wait_timeout = hst->lock_wait_timeout;
162
165
  m_req.cid->transaction_isolation = hst->transaction_isolation;
@@ -190,7 +193,10 @@ class client
190
193
  }
191
194
 
192
195
  public:
193
- client() : m_cryptPwd(NULL), m_disconnected(true), m_connecting(false) {}
196
+ client() : m_cryptPwd(NULL), m_disconnected(false), m_connecting(false)
197
+ {
198
+ }
199
+
194
200
  ~client()
195
201
  {
196
202
  if (m_cryptPwd)
@@ -216,6 +222,23 @@ public:
216
222
 
217
223
  inline request& req() { return m_req; }
218
224
 
225
+ inline const clsrv_ver* ver()
226
+ {
227
+ if (m_req.cid->con)
228
+ return (clsrv_ver*)m_req.cid->con->versions();
229
+ return NULL;
230
+ }
231
+ inline bool isSupportFunction(short op)
232
+ {
233
+ if (op == TD_GET_SCHEMA)
234
+ {
235
+ const clsrv_ver* v = ver();
236
+ if (!v) return false;
237
+ return (v->srvMajor > 2) || ((v->srvMajor == 2) && (v->srvMinor >= 6));
238
+ }
239
+ return false;
240
+ }
241
+
219
242
  inline void setParam(ushort_td op, posblk* pbk, void_td* data,
220
243
  uint_td* datalen, void_td* keybuf, keylen_td keylen,
221
244
  char_td keyNum, clientID* cid)
@@ -253,6 +276,7 @@ public:
253
276
  {
254
277
  if (!m_req.cid->con)
255
278
  {
279
+ m_preResult = 0;
256
280
  endpoint_t ep;
257
281
  endPoint((const char*)m_req.keybuf, &ep);
258
282
  if (ep.host[0] == 0x00)
@@ -264,7 +288,7 @@ public:
264
288
  setCon(c);
265
289
  m_connecting = true;
266
290
  }
267
- else
291
+ else if (m_preResult == 0)
268
292
  m_preResult = ERROR_TD_HOSTNAME_NOT_FOUND;
269
293
  }
270
294
  m_disconnected = !m_req.cid->con;
@@ -272,19 +296,47 @@ public:
272
296
 
273
297
  inline void createIndex()
274
298
  {
299
+ if (!ver())
300
+ {
301
+ m_preResult = ERROR_TD_NOT_CONNECTED;
302
+ return;
303
+ }
275
304
  m_req.paramMask = P_MASK_NOKEYBUF;
276
305
  int charsetIndexServer = getServerCharsetIndex();
277
306
  unsigned char keynum = m_req.keyNum;
278
307
  bool specifyKeyNum = (keynum >= 0x80);
279
308
  if (keynum >= 0x80)
280
309
  keynum -= 0x80;
281
- m_sql = sqlCreateIndex((tabledef*)m_req.data, keynum,
282
- specifyKeyNum, charsetIndexServer);
310
+ m_sql = sqlBuilder::sqlCreateIndex((tabledef*)m_req.data, keynum,
311
+ specifyKeyNum, charsetIndexServer, ver());
283
312
  m_req.data = (ushort_td*)m_sql.c_str();
284
313
  m_tmplen = (uint_td)(m_sql.size() + 1);
285
314
  m_req.datalen = &m_tmplen;
286
315
  }
287
316
 
317
+ inline void getSqlCreate()
318
+ {
319
+ if (!ver())
320
+ {
321
+ m_req.result = ERROR_TD_NOT_CONNECTED;
322
+ return;
323
+ }
324
+ _TCHAR tmp[MAX_PATH*2]={0};
325
+ stripAuth((const char*)m_req.keybuf, tmp, MAX_PATH);
326
+ std::string name = getTableName(tmp);
327
+ int charsetIndexServer = getServerCharsetIndex();
328
+ std::string sql = sqlBuilder::sqlCreateTable(name.c_str(), (tabledef*)m_req.data,
329
+ charsetIndexServer, ver());
330
+ uint_td datalen = *m_req.datalen;
331
+ *m_req.datalen = (uint_td)(sql.size() + 1);
332
+ if (datalen <= sql.size())
333
+ {
334
+ m_req.result = STATUS_BUFFERTOOSMALL;
335
+ return;
336
+ }
337
+ strcpy_s((char*)m_req.data, *m_req.datalen, sql.c_str());
338
+ }
339
+
288
340
  inline void create()
289
341
  {
290
342
  m_req.paramMask = P_MASK_ALL;
@@ -298,15 +350,27 @@ public:
298
350
  m_req.paramMask &= ~P_MASK_POSBLK;
299
351
  std::string name = getTableName(tmp);
300
352
  int charsetIndexServer = getServerCharsetIndex();
301
- if ((m_req.keyNum == 1) || (m_req.keyNum == 2)) // make by tabledef
353
+ if (!ver())
354
+ {
355
+ m_preResult = ERROR_TD_NOT_CONNECTED;
356
+ return;
357
+ }
358
+ if ((m_req.keyNum == CR_SUBOP_BY_TABLEDEF) ||
359
+ (m_req.keyNum == CR_SUBOP_BY_TABLEDEF_NOCKECK)) // make by tabledef
302
360
  {
303
- m_sql = sqlCreateTable(name.c_str(), (tabledef*)m_req.data,
304
- charsetIndexServer);
305
- m_req.keyNum -= 2; // 1= exists check 2 = no exists check
361
+ m_sql = sqlBuilder::sqlCreateTable(name.c_str(), (tabledef*)m_req.data,
362
+ charsetIndexServer, ver());
363
+ m_req.keyNum -= 2; // -1= exists check 0 = no exists check
364
+ }
365
+ else if ((m_req.keyNum == CR_SUBOP_BY_SQL) ||
366
+ (m_req.keyNum == CR_SUBOP_BY_SQL_NOCKECK)) // make by sql
367
+ {
368
+ m_sql = (char*)m_req.data;
369
+ m_req.keyNum -= 4; // -1= exists check 0 = no exists check
306
370
  }
307
371
  else
308
- m_sql = sqlCreateTable(name.c_str(), (fileSpec*)m_req.data,
309
- charsetIndexServer);
372
+ m_sql = sqlBuilder::sqlCreateTable(name.c_str(), (fileSpec*)m_req.data,
373
+ charsetIndexServer, ver());
310
374
  m_req.data = (ushort_td*)m_sql.c_str();
311
375
  m_tmplen = (uint_td)(m_sql.size() + 1);
312
376
  m_req.datalen = &m_tmplen;
@@ -379,7 +443,10 @@ public:
379
443
  m_preResult = SERVER_CLIENT_NOT_COMPATIBLE;
380
444
  }
381
445
  else
446
+ {
382
447
  buildDualChasetKeybuf();
448
+ m_disconnected = false;
449
+ }
383
450
  }
384
451
  else
385
452
  m_preResult = errorCode(m_cons->connectError());