transactd 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/{BUILD_UNIX-JA → BUILD_UNIX-JA.md} +6 -6
  3. data/CMakeLists.txt +20 -15
  4. data/{README-JA → README-JA.md} +23 -23
  5. data/{README → README.md} +22 -24
  6. data/RELEASE_NOTE +120 -0
  7. data/RELEASE_NOTE-JA +110 -0
  8. data/bin/common/tdclc_32_2_4.dll +0 -0
  9. data/bin/common/tdclc_64_2_4.dll +0 -0
  10. data/build/common/get_ruby_path.cmake +1 -1
  11. data/build/swig/ruby/tdclrb_wrap.cpp +1319 -830
  12. data/build/swig/tdcl.i +22 -2
  13. data/build/tdclc/tdclc.cbproj +1 -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 -1
  17. data/build/tdclrb/CMakeLists.txt +6 -1
  18. data/build/tdclrb/bldgem/extconf.rb +5 -1
  19. data/build/tdclrb/tdclrb.rc +4 -4
  20. data/source/bzs/db/engine/mysql/database.cpp +44 -40
  21. data/source/bzs/db/engine/mysql/database.h +28 -8
  22. data/source/bzs/db/engine/mysql/dbManager.cpp +2 -0
  23. data/source/bzs/db/engine/mysql/dbManager.h +2 -7
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +79 -7
  25. data/source/bzs/db/protocol/hs/hsCommandExecuter.h +5 -1
  26. data/source/bzs/db/protocol/tdap/client/activeTable.cpp +32 -8
  27. data/source/bzs/db/protocol/tdap/client/activeTable.h +17 -4
  28. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +10 -4
  29. data/source/bzs/db/protocol/tdap/client/client.cpp +51 -6
  30. data/source/bzs/db/protocol/tdap/client/client.h +41 -11
  31. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +51 -15
  32. data/source/bzs/db/protocol/tdap/client/connMgr.h +6 -1
  33. data/source/bzs/db/protocol/tdap/client/database.cpp +26 -5
  34. data/source/bzs/db/protocol/tdap/client/database.h +3 -2
  35. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +38 -28
  36. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  37. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +2 -32
  38. data/source/bzs/db/protocol/tdap/client/field.cpp +0 -1
  39. data/source/bzs/db/protocol/tdap/client/filter.h +60 -33
  40. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +2 -5
  41. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +9 -0
  42. data/source/bzs/db/protocol/tdap/client/memRecord.h +1 -0
  43. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +99 -48
  44. data/source/bzs/db/protocol/tdap/client/nsDatabase.h +5 -2
  45. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +76 -26
  46. data/source/bzs/db/protocol/tdap/client/nsTable.h +6 -4
  47. data/source/bzs/db/protocol/tdap/client/request.h +28 -11
  48. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +19 -11
  49. data/source/bzs/db/protocol/tdap/client/table.cpp +157 -70
  50. data/source/bzs/db/protocol/tdap/client/table.h +20 -5
  51. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +57 -4
  52. data/source/bzs/db/protocol/tdap/client/trdormapi.h +55 -20
  53. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +65 -31
  54. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -0
  55. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +24 -36
  56. data/source/bzs/db/protocol/tdap/mysql/request.h +1 -1
  57. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +98 -18
  58. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +12 -7
  59. data/source/bzs/db/protocol/tdap/tdapRequest.h +3 -8
  60. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +1 -9
  61. data/source/bzs/db/protocol/tdap/tdapSchema.h +31 -1
  62. data/source/bzs/db/protocol/tdap/tdapcapi.h +49 -6
  63. data/source/bzs/db/protocol/tdap/uri.h +41 -6
  64. data/source/bzs/db/transactd/appModule.cpp +0 -1
  65. data/source/bzs/db/transactd/appModule.h +0 -2
  66. data/source/bzs/db/transactd/connManager.cpp +202 -33
  67. data/source/bzs/db/transactd/connManager.h +11 -4
  68. data/source/bzs/db/transactd/connectionRecord.h +19 -5
  69. data/source/bzs/db/transactd/transactd.cpp +39 -8
  70. data/source/bzs/env/crosscompile.cpp +1 -1
  71. data/source/bzs/example/queryData.cpp +1 -1
  72. data/source/bzs/netsvc/client/iconnection.h +2 -0
  73. data/source/bzs/netsvc/client/tcpClient.cpp +48 -26
  74. data/source/bzs/netsvc/client/tcpClient.h +171 -106
  75. data/source/bzs/netsvc/server/IAppModule.h +0 -1
  76. data/source/bzs/netsvc/server/serverPipe.cpp +5 -1
  77. data/source/bzs/netsvc/server/serverPipe.h +2 -1
  78. data/source/bzs/test/tdclatl/test_query_atl.js +105 -0
  79. data/source/bzs/test/tdclphp/transactd_Test.php +129 -11
  80. data/source/bzs/test/tdclrb/transactd_spec.rb +74 -2
  81. data/source/bzs/test/transactdBench/scaling_bench.cpp +1 -1
  82. data/source/bzs/test/trdclengn/test_trdclengn.cpp +45 -20
  83. data/source/global/tdclatl/Bookmark.cpp +28 -0
  84. data/source/global/tdclatl/Bookmark.h +65 -0
  85. data/source/global/tdclatl/Database.cpp +2 -2
  86. data/source/global/tdclatl/Database.h +1 -3
  87. data/source/global/tdclatl/DbDef.cpp +6 -0
  88. data/source/global/tdclatl/DbDef.h +1 -0
  89. data/source/global/tdclatl/QueryBase.cpp +29 -0
  90. data/source/global/tdclatl/QueryBase.h +4 -0
  91. data/source/global/tdclatl/Record.cpp +14 -2
  92. data/source/global/tdclatl/Record.h +1 -1
  93. data/source/global/tdclatl/Table.cpp +80 -16
  94. data/source/global/tdclatl/Table.h +23 -8
  95. data/source/global/tdclatl/_IDatabaseEvents_CP.h +39 -0
  96. data/source/global/tdclatl/activeTable.cpp +2 -2
  97. data/source/global/tdclatl/activeTable.h +1 -1
  98. data/source/global/tdclatl/tdclatl.idl +64 -14
  99. metadata +12 -12
  100. data/bin/common/tdclc_32_2_3.dll +0 -0
  101. data/bin/common/tdclc_64_2_3.dll +0 -0
  102. data/build/tdclcpp/BUILDNUMBER.txt +0 -1
  103. data/build/tdclrb/BUILDNUMBER.txt +0 -1
  104. /data/{BUILD_WIN-JA → BUILD_WIN-JA.md} +0 -0
  105. /data/{README_ORMSRCGEN-JA → README_ORMSRCGEN-JA.md} +0 -0
  106. /data/{README_ORMSRCGEN → README_ORMSRCGEN.md} +0 -0
@@ -878,9 +878,13 @@ template <class Database_Ptr> inline void dropDatabase(Database_Ptr db)
878
878
  }
879
879
 
880
880
  template <class Database_Ptr>
881
- inline table_ptr openTable(Database_Ptr db, const _TCHAR* name, short mode = TD_OPEN_NORMAL)
881
+ inline table_ptr openTable(Database_Ptr db, const _TCHAR* name,
882
+ short mode = TD_OPEN_NORMAL,
883
+ bool autoCreate = true, const _TCHAR* ownerName = NULL,
884
+ const _TCHAR* uri = NULL)
882
885
  {
883
- table_ptr p(db->openTable(name, mode), releaseTable);
886
+ table_ptr p(db->openTable(name, mode, autoCreate, ownerName, uri),
887
+ releaseTable);
884
888
  if (db->stat())
885
889
  nstable::throwError((std::_tstring(_T("Open table ")) + name).c_str(),
886
890
  db->stat());
@@ -888,9 +892,14 @@ inline table_ptr openTable(Database_Ptr db, const _TCHAR* name, short mode = TD_
888
892
  }
889
893
 
890
894
  template <class Database_Ptr>
891
- inline table_ptr openTable(Database_Ptr db, short tableid, short mode = TD_OPEN_NORMAL)
895
+ inline table_ptr openTable(Database_Ptr db, short tableid,
896
+ short mode = TD_OPEN_NORMAL,
897
+ bool autoCreate = true, const _TCHAR* ownerName = NULL,
898
+ const _TCHAR* uri = NULL)
892
899
  {
893
- table_ptr p(db->openTable(tableid, mode), releaseTable);
900
+ table_ptr p(db->openTable(tableid, mode, autoCreate, ownerName, uri),
901
+ releaseTable);
902
+
894
903
  if (db->stat())
895
904
  {
896
905
  _TCHAR buf[50];
@@ -952,6 +961,23 @@ inline void insertTable(dbdef* def, short id, const _TCHAR* name,
952
961
  def->stat());
953
962
  }
954
963
 
964
+ inline void deleteTable(dbdef* def, short id)
965
+ {
966
+ def->deleteTable(id);
967
+ if (def->stat() != 0)
968
+ nstable::throwError(_T("Delete tabledef "), def->stat());
969
+
970
+ }
971
+
972
+
973
+ inline void renumberTable(dbdef* def, short id, short newid)
974
+ {
975
+ def->renumberTable(id, newid);
976
+ if (def->stat() != 0)
977
+ nstable::throwError(_T("Renumber table id "), def->stat());
978
+
979
+ }
980
+
955
981
  inline fielddef* insertField(dbdef* def, short tableid, short fieldNum,
956
982
  const _TCHAR* name, uchar_td type, ushort_td len)
957
983
  {
@@ -967,6 +993,13 @@ inline fielddef* insertField(dbdef* def, short tableid, short fieldNum,
967
993
  return fd;
968
994
  }
969
995
 
996
+ inline void deleteField(dbdef* def, short tableid, short fieldNum)
997
+ {
998
+ def->deleteField(tableid, fieldNum);
999
+ if (def->stat() != 0)
1000
+ nstable::throwError(_T("Delete fielddef "), def->stat());
1001
+ }
1002
+
970
1003
  inline keydef* insertKey(dbdef* def, short tableid, short insertIndex)
971
1004
  {
972
1005
  keydef* kd = def->insertKey(tableid, insertIndex);
@@ -976,6 +1009,26 @@ inline keydef* insertKey(dbdef* def, short tableid, short insertIndex)
976
1009
  return kd;
977
1010
  }
978
1011
 
1012
+ inline void deleteKey(dbdef* def, short tableid, short keynum)
1013
+ {
1014
+ def->deleteKey(tableid, keynum);
1015
+ if (def->stat() != 0)
1016
+ nstable::throwError(_T("Delete keydef "), def->stat());
1017
+ }
1018
+
1019
+ inline void validateTableDef(dbdef* def, short tableid)
1020
+ {
1021
+ def->validateTableDef(tableid);
1022
+ if (def->stat() != 0)
1023
+ {
1024
+ std::_tstring s;
1025
+ if (def->tableDefs(tableid))
1026
+ s = def->tableDefs(tableid)->tableName();
1027
+ nstable::throwError((std::_tstring(_T("Validate tabledef ")) + s).c_str(),
1028
+ def->stat());
1029
+ }
1030
+ }
1031
+
979
1032
  inline void updateTableDef(dbdef* def, short tableid)
980
1033
  {
981
1034
  def->updateTableDef(tableid);
@@ -323,13 +323,31 @@ class activeObject : boost::noncopyable
323
323
  m_tb = mgr->table(name);
324
324
  }
325
325
 
326
- void init(database_ptr& db, const _TCHAR* name)
326
+ void init(database_ptr& db, const _TCHAR* name, short mode)
327
327
  {
328
- m_tb = openTable(db, name);
328
+ m_tb = openTable(db, name, mode);
329
+ }
330
+
331
+ void init(database* db, const _TCHAR* name, short mode)
332
+ {
333
+ m_tb = openTable(db, name, mode);
334
+ }
335
+
336
+ /*void init(idatabaseManager* mgr, short tableindex)
337
+ {
338
+ m_tb = mgr->table(tableindex);
339
+ }*/
340
+
341
+ void init(database_ptr& db, short tableindex, short mode)
342
+ {
343
+ m_tb = openTable(db, tableindex, mode);
344
+ }
345
+
346
+ void init(database* db, short tableindex, short mode)
347
+ {
348
+ m_tb = openTable(db, tableindex, mode);
329
349
  }
330
350
 
331
- void init(database* db, const _TCHAR* name) { m_tb = openTable(db, name); }
332
-
333
351
  void prepare(const pq_handle& q)
334
352
  {
335
353
  m_tb->setPrepare(q);
@@ -353,10 +371,10 @@ public:
353
371
  initFdi(m_fdi, m_tb.get());
354
372
  }
355
373
 
356
- explicit activeObject(database_ptr& db)
374
+ explicit activeObject(database_ptr& db, short mode = TD_OPEN_NORMAL)
357
375
  : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
358
376
  {
359
- init(db, m_map.getTableName());
377
+ init(db, m_map.getTableName(), mode);
360
378
  if (table() && m_fdi)
361
379
  initFdi(m_fdi, m_tb.get());
362
380
  }
@@ -369,29 +387,46 @@ public:
369
387
  initFdi(m_fdi, m_tb.get());
370
388
  }
371
389
 
372
- /*explicit activeObject(dbmanager_ptr& mgr, const _TCHAR* tableName)
373
- :m_option(0)
374
- ,m_fdi(createFdi(m_fdi))
375
- ,m_map(*m_fdi)
376
- {
377
- init(mgr, tableName);
378
- if (table() && m_fdi)
379
- initFdi(m_fdi, m_tb.get());
380
- }
381
- */
390
+ /*explicit activeObject(idatabaseManager* mgr, short tableIndex)
391
+ : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
392
+ {
393
+ init(mgr, tableIndex);
394
+ if (table() && m_fdi)
395
+ initFdi(m_fdi, m_tb.get());
396
+ }*/
397
+
398
+ explicit activeObject(database_ptr& db, const _TCHAR* tableName,
399
+ short mode = TD_OPEN_NORMAL)
400
+ : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
401
+ {
402
+ init(db, tableName, mode);
403
+ if (table() && m_fdi)
404
+ initFdi(m_fdi, m_tb.get());
405
+ }
406
+
407
+ explicit activeObject(database* db, const _TCHAR* tableName,
408
+ short mode = TD_OPEN_NORMAL)
409
+ : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
410
+ {
411
+ init(db, tableName, mode);
412
+ if (table() && m_fdi)
413
+ initFdi(m_fdi, m_tb.get());
414
+ }
382
415
 
383
- explicit activeObject(database_ptr& db, const _TCHAR* tableName)
416
+ explicit activeObject(database_ptr& db, short tableIndex,
417
+ short mode = TD_OPEN_NORMAL)
384
418
  : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
385
419
  {
386
- init(db, tableName);
420
+ init(db, tableIndex, mode);
387
421
  if (table() && m_fdi)
388
422
  initFdi(m_fdi, m_tb.get());
389
423
  }
390
424
 
391
- explicit activeObject(database* db, const _TCHAR* tableName)
425
+ explicit activeObject(database* db, short tableIndex,
426
+ short mode = TD_OPEN_NORMAL)
392
427
  : m_fdi(createFdi((FDI*)0)), m_map(*m_fdi), m_option(0)
393
428
  {
394
- init(db, tableName);
429
+ init(db, tableIndex, mode);
395
430
  if (table() && m_fdi)
396
431
  initFdi(m_fdi, m_tb.get());
397
432
  }
@@ -66,26 +66,6 @@ uint_td copyToRecordImage(uchar* rec, void* p, uint_td size, uint_td offset)
66
66
  return offset + size;
67
67
  }
68
68
 
69
- bool isStringType(char type)
70
- {
71
- switch (type)
72
- {
73
- case ft_zstring:
74
- case ft_string:
75
- case ft_mychar:
76
- case ft_myvarchar:
77
- case ft_myvarbinary:
78
- case ft_wzstring:
79
- case ft_wstring:
80
- case ft_mywchar:
81
- case ft_mywvarchar:
82
- case ft_mywvarbinary:
83
- return true;
84
- default:
85
- return false;
86
- }
87
- }
88
-
89
69
  uchar_td convFieldType(enum enum_field_types type, uint flags, bool binary,
90
70
  bool unicode)
91
71
  {
@@ -226,7 +206,7 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id)
226
206
  sg.flags.bit4 = (j != kd.segmentCount - 1); // segment
227
207
  sg.flags.bit8 = 1; // extend key type
228
208
  sg.flags.bit9 = ks.null_bit ? 1 : 0; // null key
229
- if (isStringType(convFieldType(
209
+ if (isStringTypeForIndex(convFieldType(
230
210
  src->fieldType(sg.fieldNum),
231
211
  src->fieldFlags(sg.fieldNum),
232
212
  isBinary(src->fieldCharset(i)),
@@ -252,10 +232,10 @@ short schemaBuilder::insertMetaRecord(table* mtb, table* src, int id)
252
232
  return mtb->stat();
253
233
  }
254
234
 
255
- bool isFrmFile(const std::string& name)
235
+ bool isFrmFile(const std::string& name, bool notschema=true)
256
236
  {
257
237
  size_t pos = name.find(TRANSACTD_SCHEMANAME);
258
- if (pos != std::string::npos)
238
+ if (pos != std::string::npos && notschema)
259
239
  return false;
260
240
  // First of name is '#' that is alter table temp file.
261
241
  if (name.size() && name[0] == '#')
@@ -266,6 +246,48 @@ bool isFrmFile(const std::string& name)
266
246
  return false;
267
247
  }
268
248
 
249
+ void schemaBuilder::listSchemaTable(database* db, std::vector<std::string>& shcemaNames)
250
+ {
251
+ char path[FN_REFLEN + 1];
252
+ build_table_filename(path, sizeof(path) - 1, db->name().c_str(), "", "", 0);
253
+ std::string s = path;
254
+ fs::path p = s;
255
+ fs::directory_iterator it(p);
256
+ fs::directory_iterator end;
257
+ shcemaNames.clear();
258
+
259
+ for (fs::directory_iterator it(p); it != end; ++it)
260
+ {
261
+ if (!is_directory(*it))
262
+ {
263
+ std::string s = it->path().filename().string();
264
+ if (isFrmFile(s, false))
265
+ {
266
+ filename_to_tablename(it->path().stem().string().c_str(), path,
267
+ FN_REFLEN);
268
+ table* tb = NULL;
269
+ try
270
+ {
271
+ tb = db->openTable(path, TD_OPEN_READONLY, NULL);
272
+ }
273
+ catch(...){}
274
+ if (!tb) break;
275
+ if (!tb->isView())
276
+ {
277
+ LEX_STRING& comment = tb->internalTable()->s->comment;
278
+ const char* p = comment.str;
279
+ if ((comment.length > 8) && strstr(p,"%@%02.000") &&
280
+ (tb->fields() == 2) && (tb->keys() == 1))
281
+ {
282
+ shcemaNames.push_back(tb->name());
283
+ }
284
+ }
285
+ db->closeTable(tb);
286
+ }
287
+ }
288
+ }
289
+ }
290
+
269
291
  short schemaBuilder::execute(database* db, table* mtb)
270
292
  {
271
293
  char path[FN_REFLEN + 1];
@@ -277,7 +299,8 @@ short schemaBuilder::execute(database* db, table* mtb)
277
299
  fs::directory_iterator end;
278
300
  int id = 0;
279
301
  short stat = 0;
280
- smartTransction trn(db);
302
+ std::vector<table*> tables;
303
+
281
304
  for (fs::directory_iterator it(p); it != end; ++it)
282
305
  {
283
306
  if (!is_directory(*it))
@@ -288,17 +311,28 @@ short schemaBuilder::execute(database* db, table* mtb)
288
311
  filename_to_tablename(it->path().stem().string().c_str(), path,
289
312
  FN_REFLEN);
290
313
  table* tb = db->openTable(path, TD_OPEN_READONLY, NULL);
291
- if (!tb)
292
- return db->stat();
314
+ if (!tb) break;
293
315
  if (!tb->isView())
294
- {
295
- if ((stat = insertMetaRecord(mtb, tb, ++id)) != 0)
296
- return stat;
297
- }
316
+ tables.push_back(tb);
317
+ else
318
+ db->closeTable(tb);
298
319
  }
299
320
  }
300
321
  }
301
- trn.end();
322
+ if (db->stat()) return db->stat();
323
+
324
+ {
325
+ smartTransction trn(db);
326
+ for (size_t i = 0; i < tables.size(); ++i)
327
+ {
328
+ if ((stat = insertMetaRecord(mtb, tables[i], ++id)) != 0)
329
+ break;
330
+ }
331
+ if (stat == 0) trn.end();
332
+
333
+ }
334
+ for (size_t i = 0; i < tables.size(); ++i)
335
+ db->closeTable(tables[i]);
302
336
  return stat;
303
337
  }
304
338
 
@@ -21,6 +21,7 @@
21
21
 
22
22
  #include <bzs/db/protocol/tdap/tdapSchema.h>
23
23
  #include <string>
24
+ #include <vector>
24
25
 
25
26
  namespace bzs
26
27
  {
@@ -52,6 +53,7 @@ public:
52
53
  schemaBuilder();
53
54
  ~schemaBuilder();
54
55
  short execute(engine::mysql::database* db, engine::mysql::table* mtb);
56
+ static void listSchemaTable(engine::mysql::database* db, std::vector<std::string>& shcemaNames);
55
57
  };
56
58
 
57
59
  } // namespace mysql
@@ -691,9 +691,10 @@ public:
691
691
  bool valid = !(forword ? gt : le);
692
692
 
693
693
  // case in-sencitive, Index judge need clinet and server are same option.
694
- bool is_cl = ((fd->logType & CMPLOGICAL_CASEINSENSITIVE) != 0);
695
- bool is_srv = ((key->key_part[segmentIndex].field->flags & BINARY_FLAG) == 0);
696
- if (valid && (is_cl == is_srv))
694
+ bool is_cl_casein = ((fd->logType & CMPLOGICAL_CASEINSENSITIVE) != 0);
695
+ bool is_srv_casein = ((key->key_part[segmentIndex].field->flags & BINARY_FLAG) == 0) &&
696
+ isStringType(fd->type);
697
+ if (valid && (is_cl_casein == is_srv_casein))
697
698
  {
698
699
  m_keySeg = (unsigned char)segmentIndex + 1;
699
700
  m_judgeType = (comp == eEqual) ? 2 : 1;
@@ -950,7 +951,7 @@ class resultWriter
950
951
  const extResultDef* m_def;
951
952
  bool m_noBookmark;
952
953
 
953
- short doWrite(position* pos, unsigned int bookmark)
954
+ short doWrite(position* pos, const unsigned char* bookmark, int bmlen)
954
955
  {
955
956
  // write recLength space;
956
957
  unsigned short recLen = 0;
@@ -959,7 +960,7 @@ class resultWriter
959
960
 
960
961
  // write bookmark
961
962
  if (!m_noBookmark)
962
- m_nw->asyncWrite((const char*)&bookmark, 4);
963
+ m_nw->asyncWrite((const char*)bookmark, bmlen);
963
964
 
964
965
  // if pos ==NULL , that is not found record in a TD_KEY_SEEK_MULTI
965
966
  // operation
@@ -1010,6 +1011,7 @@ class resultWriter
1010
1011
  }
1011
1012
 
1012
1013
  public:
1014
+ resultWriter() : m_nw(NULL), m_def(NULL){}
1013
1015
 
1014
1016
  void init(netsvc::server::netWriter* nw, const extResultDef* def,
1015
1017
  bool noBookmark)
@@ -1019,15 +1021,19 @@ public:
1019
1021
  m_noBookmark = noBookmark;
1020
1022
  }
1021
1023
 
1022
- short write(position* pos, unsigned int bookmark)
1024
+ short write(position* pos, const unsigned char* bookmark, int len)
1023
1025
  {
1024
- return doWrite(pos, bookmark);
1026
+ return doWrite(pos, bookmark, len);
1025
1027
  }
1026
1028
 
1027
1029
  inline unsigned int end()
1028
1030
  {
1029
- m_nw->asyncWrite(NULL, 0, netsvc::server::netWriter::writeEnd);
1030
- return m_nw->resultLen();
1031
+ if (m_nw)
1032
+ {
1033
+ m_nw->asyncWrite(NULL, 0, netsvc::server::netWriter::writeEnd);
1034
+ return m_nw->resultLen();
1035
+ }
1036
+ return 0;
1031
1037
  }
1032
1038
 
1033
1039
  const char* resultBuffer() { return m_nw->ptr(); }
@@ -1073,7 +1079,7 @@ public:
1073
1079
  if(p->readMapSize)
1074
1080
  {
1075
1081
  bm.setTable(tb);
1076
- if (m_seeksMode)
1082
+ if (m_seeksMode && !(req->itype & FILTER_TYPE_SEEKS_BOOKMARKS))
1077
1083
  addKeysegFieldMap(tb);
1078
1084
  if (p->readMapSize)
1079
1085
  p->copyBitmapTo(bm.getReadBitmap());
@@ -1126,7 +1132,8 @@ public:
1126
1132
  if ((rd->fieldCount > 1) ||
1127
1133
  ((rd->fieldCount == 1) &&
1128
1134
  (rd->field[0].len < m_position.recordLenCl())))
1129
- ret = convResultPosToFieldNum(tb, noBookmark, rd, m_seeksMode);
1135
+ ret = convResultPosToFieldNum(tb, noBookmark, rd, m_seeksMode,
1136
+ (req->itype & FILTER_TYPE_SEEKS_BOOKMARKS) != 0);
1130
1137
 
1131
1138
  nw->beginExt(tb->blobFields() != 0);
1132
1139
  m_writer.init(nw, rd, noBookmark);
@@ -1154,7 +1161,7 @@ public:
1154
1161
 
1155
1162
  // TODO This convert is move to client. but legacy app is need this
1156
1163
  short convResultPosToFieldNum(engine::mysql::table* tb, bool noBookmark,
1157
- const extResultDef* rd, bool seeksMode)
1164
+ const extResultDef* rd, bool seeksMode, bool seekBookmark)
1158
1165
  {
1159
1166
  int blobs = 0;
1160
1167
  bm.setTable(tb);
@@ -1179,7 +1186,7 @@ public:
1179
1186
  fd = fd->next();
1180
1187
  }
1181
1188
  }
1182
- else
1189
+ else if (!seekBookmark)
1183
1190
  addKeysegFieldMap(tb);
1184
1191
 
1185
1192
  // if need bookmark , add primary key fields
@@ -1220,39 +1227,20 @@ public:
1220
1227
  return REC_MACTH;
1221
1228
  }
1222
1229
 
1223
- short write(const unsigned char* bmPtr,
1230
+ short write(const unsigned char* bookmarkPtr,
1224
1231
  unsigned int bmlen /*, short stat=0*/)
1225
1232
  {
1226
1233
  unsigned int bookmark = 0;
1227
1234
  // if bmPtr ==NULL , that is not found record in a TD_KEY_SEEK_MULTI
1228
1235
  // operation
1229
1236
  // and set error code to bookmark also STATUS_NOT_FOUND_TI
1230
- if (bmPtr == NULL)
1237
+ if (bookmarkPtr == NULL)
1231
1238
  {
1232
1239
  // bookmark = stat;
1233
- return m_writer.write(NULL, bookmark);
1240
+ return m_writer.write(NULL, (const unsigned char*)&bookmark, sizeof(bookmark));
1234
1241
  }
1235
1242
  else
1236
- {
1237
- switch (bmlen)
1238
- {
1239
- case 4:
1240
- bookmark = *((unsigned int*)bmPtr);
1241
- break;
1242
- case 2:
1243
- bookmark = *((unsigned short*)bmPtr);
1244
- break;
1245
- case 3:
1246
- bookmark = *((unsigned int*)bmPtr) & 0x0FFFFFF;
1247
- break;
1248
- case 1:
1249
- bookmark = *((unsigned short*)bmPtr) & 0x0FF;
1250
- break;
1251
- default:
1252
- break;
1253
- }
1254
- return m_writer.write(&m_position, bookmark);
1255
- }
1243
+ return m_writer.write(&m_position, bookmarkPtr, bmlen);
1256
1244
  }
1257
1245
  unsigned short rejectCount() const { return m_req->rejectCount; };
1258
1246
  unsigned short maxRows() const { return m_maxRows; };
@@ -108,7 +108,7 @@ public:
108
108
  p += TD_POSBLK_TRANSMIT_SIZE;
109
109
  if (P_MASK_PB_BOOKMARK & paramMask)
110
110
  {
111
- uint v = tb->posPtrLenRaw();
111
+ uint v = tb->posPtrLen();
112
112
  memcpy(p++, &v, 1);
113
113
  memcpy(p, tb->position(true), v);
114
114
  p += v;