transactd 3.1.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/tdclc_32_3_2.dll +0 -0
  3. data/bin/common/{tdclc_64_3_1.dll → tdclc_64_3_2.dll} +0 -0
  4. data/build/swig/ruby/ruby.swg +3 -0
  5. data/build/swig/ruby/tdclrb_wrap.cpp +2413 -126
  6. data/build/swig/tdcl.i +120 -9
  7. data/build/tdclc/tdclc.cbproj +4 -1
  8. data/build/tdclc/tdclc.rc +4 -4
  9. data/build/tdclcpp/tdclcpp.rc +4 -4
  10. data/build/tdclcpp/tdclcpp_bc.cbproj +8 -1
  11. data/build/tdclrb/tdclrb.rc +4 -4
  12. data/source/bzs/db/engine/mysql/database.cpp +138 -130
  13. data/source/bzs/db/engine/mysql/database.h +43 -48
  14. data/source/bzs/db/engine/mysql/dbManager.cpp +81 -96
  15. data/source/bzs/db/engine/mysql/dbManager.h +13 -22
  16. data/source/bzs/db/engine/mysql/mysqlInternal.h +157 -291
  17. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +425 -0
  18. data/source/bzs/db/engine/mysql/mysqlProtocol.h +72 -0
  19. data/source/bzs/db/engine/mysql/mysqlThd.cpp +8 -6
  20. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +7 -3
  21. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +1 -0
  22. data/source/bzs/db/protocol/tdap/client/client.h +22 -8
  23. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +225 -21
  24. data/source/bzs/db/protocol/tdap/client/connMgr.h +42 -16
  25. data/source/bzs/db/protocol/tdap/client/database.cpp +58 -15
  26. data/source/bzs/db/protocol/tdap/client/database.h +3 -3
  27. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +93 -85
  28. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -2
  29. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +9 -5
  30. data/source/bzs/db/protocol/tdap/client/filter.h +2 -2
  31. data/source/bzs/db/protocol/tdap/client/groupComp.h +2 -2
  32. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +1 -1
  33. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +71 -12
  34. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +7 -1
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +35 -2
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -1
  38. data/source/bzs/db/protocol/tdap/client/recordset.h +15 -0
  39. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +21 -16
  40. data/source/bzs/db/protocol/tdap/client/serializer.cpp +32 -11
  41. data/source/bzs/db/protocol/tdap/client/serializer.h +4 -1
  42. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +3 -2
  43. data/source/bzs/db/protocol/tdap/client/sqlBuilder.h +3 -0
  44. data/source/bzs/db/protocol/tdap/client/table.cpp +18 -14
  45. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +8 -3
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.cpp +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +83 -43
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +3 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +7 -7
  50. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +247 -137
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +9 -9
  52. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -4
  53. data/source/bzs/db/protocol/tdap/tdapSchema.h +3 -7
  54. data/source/bzs/db/protocol/tdap/tdapcapi.h +23 -3
  55. data/source/bzs/db/protocol/tdap/uri.h +40 -0
  56. data/source/bzs/db/transactd/appModule.cpp +14 -5
  57. data/source/bzs/db/transactd/appModule.h +10 -1
  58. data/source/bzs/db/transactd/connManager.cpp +93 -48
  59. data/source/bzs/db/transactd/connManager.h +10 -7
  60. data/source/bzs/db/transactd/connectionRecord.h +114 -19
  61. data/source/bzs/env/tstring.h +2 -0
  62. data/source/bzs/example/changeSchema.cpp +1 -1
  63. data/source/bzs/example/changeSchema_c.cpp +1 -1
  64. data/source/bzs/example/insertRecords.cpp +2 -1
  65. data/source/bzs/example/insertRecords_c.cpp +2 -1
  66. data/source/bzs/example/queryData.cpp +5 -2
  67. data/source/bzs/netsvc/server/IAppModule.h +6 -0
  68. data/source/bzs/test/tdclatl/test_v3.js +75 -0
  69. data/source/bzs/test/tdclphp/transactd_v3_Test.php +104 -7
  70. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +84 -0
  71. data/source/bzs/test/trdclengn/testField.h +66 -6
  72. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +10 -1
  73. data/source/bzs/test/trdclengn/test_trdclengn.cpp +85 -0
  74. data/source/bzs/test/trdclengn/testbase.h +1 -1
  75. data/source/global/tdclatl/BinlogPos.cpp +64 -0
  76. data/source/global/tdclatl/BinlogPos.h +84 -0
  77. data/source/global/tdclatl/ConnMgr.cpp +285 -0
  78. data/source/global/tdclatl/ConnMgr.h +83 -0
  79. data/source/global/tdclatl/ConnRecord.cpp +123 -0
  80. data/source/global/tdclatl/ConnRecord.h +69 -0
  81. data/source/global/tdclatl/ConnRecords.cpp +57 -0
  82. data/source/global/tdclatl/ConnRecords.h +55 -0
  83. data/source/global/tdclatl/Database.cpp +36 -0
  84. data/source/global/tdclatl/Database.h +4 -0
  85. data/source/global/tdclatl/Table.cpp +14 -1
  86. data/source/global/tdclatl/Table.h +1 -0
  87. data/source/global/tdclatl/resource.h +0 -0
  88. data/source/global/tdclatl/tdclatl.idl +148 -4
  89. metadata +14 -4
  90. data/bin/common/tdclc_32_3_1.dll +0 -0
@@ -117,7 +117,7 @@ uchar_td convFieldType(enum enum_field_types type, uint flags, bool binary,
117
117
  case MYSQL_TYPE_BLOB:
118
118
  case MYSQL_TYPE_LONG_BLOB:
119
119
  case MYSQL_TYPE_MEDIUM_BLOB:
120
- if (flags & BINARY_FLAG)
120
+ if (binary)
121
121
  return ft_myblob;
122
122
  return ft_mytext;
123
123
  case MYSQL_TYPE_GEOMETRY:
@@ -200,19 +200,19 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
200
200
  String str;
201
201
  for (int i = 0; i < src->fields(); ++i)
202
202
  {
203
- if (isNisField(src->fieldName(i)))
203
+ Field* f = src->field(i);
204
+ if (isNisField(f->field_name))
204
205
  --td.fieldCount;
205
206
  else
206
207
  {
207
208
  fielddef fd;
208
- Field* f = src->field(i);
209
209
  memset(&fd, 0, sizeof(fd));
210
- fd.setName(src->fieldName(i));
211
- fd.len = src->fieldLen(i); // filed->pack_length();
210
+ fd.setName(f->field_name);
211
+ fd.len = f->pack_length();
212
212
  fd.pos = pos;
213
- fd.type = convFieldType(src->fieldRealType(i), src->fieldFlags(i),
214
- isBinary(src->fieldCharset(i)),
215
- isUnicode(src->fieldCharset(i)));
213
+ fd.type = convFieldType(f->real_type(), f->flags,
214
+ isBinary(*(f->charset())),
215
+ isUnicode(*(f->charset())));
216
216
  if ((fd.type == ft_mytime) || (fd.type == ft_mydatetime) || (fd.type == ft_mytimestamp))
217
217
  {
218
218
  if (src->isLegacyTimeFormat(i))
@@ -226,14 +226,12 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
226
226
  }
227
227
 
228
228
  if (fd.type == ft_mydecimal)
229
- {
230
229
  fd.digits = my_decimal_length_to_precision(f->field_length, f->decimals(),
231
230
  (f->flags & UNSIGNED_FLAG) != 0);
232
- }
233
231
 
234
232
  fd.setPadCharSettings(false, true);
235
- if (fd.isStringType())
236
- fd.setCharsetIndex(charsetIndex(src->fieldCharset(i).csname));
233
+ if (f->has_charset())
234
+ fd.setCharsetIndex(charsetIndex(f->charset()->csname));
237
235
 
238
236
  if ((fd.type == ft_mydatetime || fd.type == ft_mytimestamp) && (f->val_real() == 0))
239
237
  {// No constant value
@@ -297,15 +295,11 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
297
295
  if (nouseNullkey == false)
298
296
  sg.flags.bit9 = ks.null_bit ? 1 : 0; // null key
299
297
  allNullkey = allNullkey & sg.flags.bit9;
300
- if (isStringTypeForIndex(convFieldType(
301
- src->fieldType(sg.fieldNum),
302
- src->fieldFlags(sg.fieldNum),
303
- isBinary(src->fieldCharset(i)),
304
- isUnicode(src->fieldCharset(sg.fieldNum)))))
305
- sg.flags.bitA =
306
- !(src->fieldFlags(sg.fieldNum) & BINARY_FLAG);// case in-sencitive
307
-
308
298
  Field* f = src->field(sg.fieldNum);
299
+ if (isStringTypeForIndex(convFieldType(f->type(), f->flags, isBinary(*(f->charset())),
300
+ isUnicode(*(f->charset())))))
301
+ sg.flags.bitA = !(f->flags & BINARY_FLAG);// case in-sencitive
302
+
309
303
  if (f->pack_length() != ks.length + var_bytes_if(f))
310
304
  td.fieldDefs[sg.fieldNum].keylen = ks.length ; // suppot prefix key
311
305
  ++segNum;
@@ -331,7 +325,7 @@ tabledef* schemaBuilder::getTabledef(engine::mysql::table* src, int id,
331
325
 
332
326
  tabledef* schemaBuilder::getTabledef(database* db, const char* tablename, uchar* rec, size_t size)
333
327
  {
334
- table* tb = db->openTable(tablename, TD_OPEN_READONLY, NULL);
328
+ table* tb = db->openTable(tablename, TD_OPEN_READONLY, NULL, "");
335
329
  if (db->stat())
336
330
  {
337
331
  m_stat = db->stat();
@@ -367,7 +361,36 @@ bool isFrmFile(const std::string& name, bool notschema=true)
367
361
  return false;
368
362
  }
369
363
 
370
- void schemaBuilder::listSchemaTable(database* db, std::vector<std::string>& shcemaNames)
364
+
365
+ int isView(database* db, const char *name)
366
+ {
367
+ int ret = -1;
368
+ #ifndef NO_LOCK_OPEN
369
+ safe_mysql_mutex_lock lck(&LOCK_open);
370
+ #endif
371
+ TABLE_SHARE* s = cp_get_cached_table_share(db->thd(), db->name().c_str(), name);
372
+ if (s)
373
+ {
374
+ ret = (int)s->is_view;
375
+ #ifdef NO_LOCK_OPEN
376
+ cp_tdc_release_share(s);
377
+ #endif
378
+ }
379
+ return ret;
380
+ }
381
+
382
+ table* getTable(database* db, const char *name)
383
+ {
384
+ table* tb = NULL;
385
+ try
386
+ {
387
+ tb = db->openTable(name, TD_OPEN_READONLY, NULL, "");
388
+ }
389
+ catch(...){}
390
+ return tb;
391
+ }
392
+
393
+ void schemaBuilder::listTable(database* db, std::vector<std::string>& tables, int type)
371
394
  {
372
395
  char path[FN_REFLEN + 1];
373
396
  build_table_filename(path, sizeof(path) - 1, db->name().c_str(), "", "", 0);
@@ -375,35 +398,52 @@ void schemaBuilder::listSchemaTable(database* db, std::vector<std::string>& shce
375
398
  fs::path p = s;
376
399
  fs::directory_iterator it(p);
377
400
  fs::directory_iterator end;
378
- shcemaNames.clear();
379
-
401
+ tables.clear();
402
+
380
403
  for (fs::directory_iterator it(p); it != end; ++it)
381
404
  {
382
405
  if (!is_directory(*it))
383
406
  {
384
- std::string s = it->path().filename().string();
385
- if (isFrmFile(s, false))
407
+ std::string s = it->path().string(); // fullpath
408
+ if (isFrmFile(it->path().filename().string(), false)) // filename
386
409
  {
387
- filename_to_tablename(it->path().stem().string().c_str(), path,
388
- FN_REFLEN);
389
- table* tb = NULL;
390
- try
410
+ enum legacy_db_type not_used;
411
+
412
+ frm_type_enum ftype = dd_frm_type(db->thd(), (char*)s.c_str(), &not_used);
413
+ filename_to_tablename(it->path().stem().string().c_str(), path, FN_REFLEN);
414
+ std::string tablename = path;
415
+
416
+ if (((type & TABLE_TYPE_VIEW) && (ftype == FRMTYPE_VIEW)) ||
417
+ ((type & TABLE_TYPE_NORMAL_TABLE) && (ftype == FRMTYPE_TABLE)))
418
+ tables.push_back(tablename);
419
+ else if ((ftype == FRMTYPE_TABLE) && type == TABLE_TYPE_TD_SCHEMA)
391
420
  {
392
- tb = db->openTable(path, TD_OPEN_READONLY, NULL);
393
- }
394
- catch(...){}
395
- if (!tb) break;
396
- if (!tb->isView())
397
- {
398
- LEX_STRING& comment = tb->internalTable()->s->comment;
399
- const char* p = comment.str;
400
- if ((comment.length > 8) && strstr(p,"%@%02.000") &&
401
- (tb->fields() == 2) && (tb->keys() == 1))
402
421
  {
403
- shcemaNames.push_back(tb->name());
422
+ #ifndef NO_LOCK_OPEN
423
+ safe_mysql_mutex_lock lck(&LOCK_open);
424
+ #endif
425
+ TABLE_SHARE* s = cp_get_cached_table_share(db->thd(), db->name().c_str(), tablename.c_str());
426
+ if (s)
427
+ {
428
+ LEX_STRING* comment = &s->comment;
429
+ if (comment && (comment->length > 8) && strstr(comment->str,"%@%02.000"))
430
+ tables.push_back(tablename);
431
+ #ifdef NO_LOCK_OPEN
432
+ cp_tdc_release_share(s);
433
+ #endif
434
+ continue;
435
+ }
436
+ }
437
+
438
+ {
439
+ table* tb = getTable(db, tablename.c_str());
440
+ if (!tb) break;
441
+ LEX_STRING* comment = &tb->internalTable()->s->comment;
442
+ if (comment && (comment->length > 8) && strstr(comment->str,"%@%02.000"))
443
+ tables.push_back(tablename);
444
+ if (tb) tb->close();
404
445
  }
405
446
  }
406
- db->closeTable(tb);
407
447
  }
408
448
  }
409
449
  }
@@ -431,7 +471,7 @@ short schemaBuilder::execute(database* db, table* mtb, bool nouseNullkey)
431
471
  {
432
472
  filename_to_tablename(it->path().stem().string().c_str(), path,
433
473
  FN_REFLEN);
434
- table* tb = db->openTable(path, TD_OPEN_READONLY, NULL);
474
+ table* tb = db->openTable(path, TD_OPEN_READONLY, NULL, "");
435
475
  if (!tb) break;
436
476
  if (!tb->isView())
437
477
  tables.push_back(tb);
@@ -56,9 +56,11 @@ public:
56
56
  tabledef* getTabledef(engine::mysql::table* src, int id, bool nouseNullkey, uchar* rec, size_t size);
57
57
  tabledef* getTabledef(engine::mysql::database* db, const char* tablename, uchar* rec, size_t size);
58
58
  short execute(engine::mysql::database* db, engine::mysql::table* mtb, bool nouseNullkey);
59
- static void listSchemaTable(engine::mysql::database* db, std::vector<std::string>& shcemaNames);
59
+ static void listTable(engine::mysql::database* db, std::vector<std::string>& tables, int type);
60
60
  };
61
61
 
62
+
63
+
62
64
  } // namespace mysql
63
65
  } // namespace protocol
64
66
  } // namespace db
@@ -70,10 +70,10 @@ public:
70
70
  }
71
71
  int getFieldNumByPos(unsigned short pos) const
72
72
  {
73
+ char* start = (char*)m_tb->field(0)->ptr;
73
74
  for (int i = 0; i < m_tb->fields(); i++)
74
75
  {
75
- char* start = m_tb->fieldPos(0);
76
- if (m_tb->fieldPos(i) - start == pos)
76
+ if ((char*)m_tb->field(i)->ptr - start == pos)
77
77
  return i;
78
78
  }
79
79
  return -1;
@@ -93,7 +93,7 @@ public:
93
93
  {
94
94
  Field* fd = m_tb->field(index);
95
95
  unsigned char* null_ptr = (unsigned char*)cp_null_ptr(fd, (unsigned char*)m_tb->internalTable()->record[0]);
96
- return (unsigned char)((unsigned char*)m_tb->fieldPos(0) - null_ptr);
96
+ return (unsigned char)((unsigned char*)m_tb->field(0)->ptr - null_ptr);
97
97
  }
98
98
 
99
99
  bool isLegacyTimeFormat(int fieldNum) const
@@ -136,12 +136,12 @@ inline void position::setTable(engine::mysql::table* tb)
136
136
 
137
137
  inline char* position::fieldPtr(const resultField* rf) const
138
138
  {
139
- return m_tb->fieldPos(rf->fieldNum);
139
+ return (char*)m_tb->field(rf->fieldNum)->ptr;
140
140
  }
141
141
 
142
142
  inline bool position::isBlobField(const resultField* rf) const
143
143
  {
144
- return db::engine::mysql::isBlobType(m_tb->fieldType(rf->fieldNum));
144
+ return db::engine::mysql::isBlobType(m_tb->field(rf->fieldNum)->type());
145
145
  }
146
146
 
147
147
  /** return data length as real rength.
@@ -486,10 +486,10 @@ public:
486
486
  }
487
487
  if (key)
488
488
  {
489
+ // Sort between first to before first "or";
489
490
  std::vector<fieldAdapter>::iterator begin = m_fields.begin();
490
491
  std::vector<fieldAdapter>::iterator cur = m_fields.begin();
491
492
  std::vector<fieldAdapter>::iterator end = begin + lastIndex;
492
-
493
493
  char tmpOpr = (lastIndex != req.logicalCount) ? end->m_fd->opr : 0;
494
494
  std::sort(begin, end);
495
495
  bool flag = true;
@@ -855,7 +855,7 @@ public:
855
855
  bm.setReadBitmap(num);
856
856
  if (m_position.isBlobField(&fd))
857
857
  ++blobs;
858
- if (m_position.isNullable(num))
858
+ if (m_position.isNullable(num) && m_position.isMysqlNull())
859
859
  ++nullfields;
860
860
 
861
861
  }