transactd 2.3.0 → 2.4.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 (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;