transactd 2.4.0 → 2.4.2

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/BUILD_UNIX-JA.md +37 -29
  3. data/BUILD_WIN-JA.md +96 -69
  4. data/CMakeLists.txt +7 -17
  5. data/README-JA.md +22 -17
  6. data/README.md +23 -16
  7. data/{RELEASE_NOTE-JA → RELEASE_NOTE-JA.md} +163 -98
  8. data/{RELEASE_NOTE → RELEASE_NOTE.md} +165 -99
  9. data/bin/common/tdclc_32_2_4.dll +0 -0
  10. data/bin/common/tdclc_64_2_4.dll +0 -0
  11. data/build/common/get_boost_libs.cmake +2 -0
  12. data/build/common/system.cmake +6 -4
  13. data/build/common/transactd_cl_output.cmake +14 -2
  14. data/build/common/transactd_common.cmake +34 -12
  15. data/build/tdclc/CMakeLists.txt +10 -2
  16. data/build/tdclc/tdclc.rc +4 -4
  17. data/build/tdclcpp/CMakeLists.txt +34 -9
  18. data/build/tdclcpp/tdclcpp.rc +4 -4
  19. data/build/tdclrb/CMakeLists.txt +24 -15
  20. data/build/tdclrb/gem/Makefile.win32-VS +2 -2
  21. data/build/tdclrb/gem_output.cmake +27 -10
  22. data/build/tdclrb/tdclrb.rc +4 -4
  23. data/source/bzs/db/engine/mysql/database.cpp +18 -18
  24. data/source/bzs/db/engine/mysql/database.h +4 -4
  25. data/source/bzs/db/engine/mysql/dbManager.cpp +1 -2
  26. data/source/bzs/db/engine/mysql/mysqlInternal.h +23 -2
  27. data/source/bzs/db/engine/mysql/mysqlThd.cpp +3 -2
  28. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +26 -12
  29. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +3 -3
  30. data/source/bzs/db/protocol/tdap/client/field.cpp +74 -23
  31. data/source/bzs/db/protocol/tdap/client/field.h +3 -1
  32. data/source/bzs/db/protocol/tdap/client/filter.h +4 -4
  33. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +3 -1
  34. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +16 -9
  35. data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
  36. data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
  37. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +3 -2
  38. data/source/bzs/db/protocol/tdap/client/serializer.cpp +12 -0
  39. data/source/bzs/db/protocol/tdap/client/serializer.h +1 -0
  40. data/source/bzs/db/protocol/tdap/client/table.cpp +60 -109
  41. data/source/bzs/db/protocol/tdap/client/table.h +2 -1
  42. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
  43. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +1 -1
  44. data/source/bzs/db/protocol/tdap/client/trdormapi.h +8 -8
  45. data/source/bzs/db/protocol/tdap/fieldComp.h +6 -0
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +147 -46
  47. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +78 -0
  48. data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
  49. data/source/bzs/db/protocol/tdap/tdapcapi.h +3 -3
  50. data/source/bzs/db/transactd/transactd.cpp +1 -1
  51. data/source/bzs/env/compiler.h +12 -0
  52. data/source/bzs/env/tcharMinGW.h +1 -0
  53. data/source/bzs/netsvc/client/tcpClient.h +4 -2
  54. data/source/bzs/netsvc/server/serverCpt.cpp +1 -0
  55. data/source/bzs/netsvc/server/serverTpool.cpp +3 -0
  56. data/source/bzs/test/tdclphp/transactd_Test.php +2 -2
  57. data/source/bzs/test/tdclphp/transactd_pool_Test.php +6 -0
  58. data/source/bzs/test/trdclengn/test_trdclengn.cpp +2 -2
  59. data/source/global/ormsrcgen/srcgen.cpp +1 -2
  60. data/source/linux/tchar.h +1 -0
  61. metadata +4 -4
@@ -1659,7 +1659,7 @@ double field::getFVnumeric() const
1659
1659
  char dp[] = "{ABCDEFGHI}JKLMNOPQR";
1660
1660
  char dpsa[] = "PQRSTUVWXYpqrstuvwxy";
1661
1661
  char* pdp = NULL;
1662
- char i;
1662
+ int i;
1663
1663
  char buf[20] = { 0x00 };
1664
1664
  char dummy[20];
1665
1665
 
@@ -1836,6 +1836,20 @@ inline int compNumber(const field& l, const field& r, char logType)
1836
1836
  return compare<T>((const char*)l.ptr(), (const char*)r.ptr());
1837
1837
  }
1838
1838
 
1839
+ template <class T>
1840
+ inline int compBitAnd(const field& l, const field& r, char logType)
1841
+ {
1842
+ return bitMask<T>((const char*)l.ptr(), (const char*)r.ptr());
1843
+ }
1844
+
1845
+ inline int compBitAnd24(const field& l, const field& r, char logType)
1846
+ {
1847
+
1848
+ int lv = ((*((int*)(const char*)l.ptr()) & 0xFFFFFF) << 8) / 0x100;
1849
+ int rv = ((*((int*)(const char*)r.ptr()) & 0xFFFFFF) << 8) / 0x100;
1850
+ return bitMask<int>((const char*)&lv, (const char*)&rv);
1851
+ }
1852
+
1839
1853
  inline int compNumber24(const field& l, const field& r, char logType)
1840
1854
  {
1841
1855
  return compareInt24((const char*)l.ptr(), (const char*)r.ptr());
@@ -1899,18 +1913,37 @@ compFieldFunc field::getCompFunc(char logType) const
1899
1913
  case ft_autoinc:
1900
1914
  case ft_currency:
1901
1915
  {
1902
- switch (m_fd->len)
1916
+ if (logType & eBitAnd)
1903
1917
  {
1904
- case 1:
1905
- return &compNumber<char>;
1906
- case 2:
1907
- return &compNumber<short>;
1908
- case 3:
1909
- return &compNumber24;
1910
- case 4:
1911
- return &compNumber<int>;
1912
- case 8:
1913
- return &compNumber<__int64>;
1918
+
1919
+ switch (m_fd->len)
1920
+ {
1921
+ case 1:
1922
+ return &compBitAnd<char>;
1923
+ case 2:
1924
+ return &compBitAnd<short>;
1925
+ case 3:
1926
+ return &compBitAnd24;
1927
+ case 4:
1928
+ return &compBitAnd<int>;
1929
+ case 8:
1930
+ return &compBitAnd<__int64>;
1931
+ }
1932
+ }else
1933
+ {
1934
+ switch (m_fd->len)
1935
+ {
1936
+ case 1:
1937
+ return &compNumber<char>;
1938
+ case 2:
1939
+ return &compNumber<short>;
1940
+ case 3:
1941
+ return &compNumber24;
1942
+ case 4:
1943
+ return &compNumber<int>;
1944
+ case 8:
1945
+ return &compNumber<__int64>;
1946
+ }
1914
1947
  }
1915
1948
  }
1916
1949
  case ft_mychar:
@@ -1931,18 +1964,36 @@ compFieldFunc field::getCompFunc(char logType) const
1931
1964
  case ft_timestamp:
1932
1965
  case ft_mydate:
1933
1966
  {
1934
- switch (m_fd->len)
1967
+ if (logType & eBitAnd)
1935
1968
  {
1936
- case 1:
1937
- return &compNumber<unsigned char>;
1938
- case 2:
1939
- return &compNumber<unsigned short>;
1940
- case 3:
1941
- return &compNumberU24;
1942
- case 4:
1943
- return &compNumber<unsigned int>;
1944
- case 8:
1945
- return &compNumber<unsigned __int64>;
1969
+ switch (m_fd->len)
1970
+ {
1971
+ case 1:
1972
+ return &compBitAnd<unsigned char>;
1973
+ case 2:
1974
+ return &compBitAnd<unsigned short>;
1975
+ case 3:
1976
+ return &compBitAnd24;
1977
+ case 4:
1978
+ return &compBitAnd<unsigned int>;
1979
+ case 8:
1980
+ return &compBitAnd<unsigned __int64>;
1981
+ }
1982
+ }else
1983
+ {
1984
+ switch (m_fd->len)
1985
+ {
1986
+ case 1:
1987
+ return &compNumber<unsigned char>;
1988
+ case 2:
1989
+ return &compNumber<unsigned short>;
1990
+ case 3:
1991
+ return &compNumberU24;
1992
+ case 4:
1993
+ return &compNumber<unsigned int>;
1994
+ case 8:
1995
+ return &compNumber<unsigned __int64>;
1996
+ }
1946
1997
  }
1947
1998
  }
1948
1999
  case ft_mytime:
@@ -85,8 +85,9 @@ class DLLLIB fielddefs : public fieldShare
85
85
  friend class recordsetQuery;
86
86
  friend struct recordsetQueryImple;
87
87
  friend class fieldsBase;
88
-
88
+ public:
89
89
  void addAllFileds(tabledef* def);
90
+ protected:
90
91
  void copyFrom(const class table* tb);
91
92
  bool canUnion(const fielddefs& r) const;
92
93
  size_t totalFieldLen() const;
@@ -95,6 +96,7 @@ class DLLLIB fielddefs : public fieldShare
95
96
  void push_back(const fielddef* p, bool rePosition = false);
96
97
  void remove(int index);
97
98
  void reserve(size_t size);
99
+ public:
98
100
  void clear();
99
101
 
100
102
  public:
@@ -806,7 +806,7 @@ class filter
806
806
  {
807
807
  int keySize = q->getJoinKeySize();
808
808
  uchar_td* dataBuf;
809
- keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
809
+ keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
810
810
 
811
811
  if (!prebuiltSeeks(kd, keyValues.size(), q, keySize, &dataBuf))
812
812
  return false;
@@ -1098,7 +1098,7 @@ public:
1098
1098
  bool supplySeekValues(const T& values, size_t size, int keySize)
1099
1099
  {
1100
1100
  uchar_td* dataBuf;
1101
- keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
1101
+ keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
1102
1102
 
1103
1103
  if (!prebuiltSeeks(kd, size, NULL, keySize, &dataBuf))
1104
1104
  return false;
@@ -1113,7 +1113,7 @@ public:
1113
1113
 
1114
1114
  bool beginSupplySeekValues(size_t size, int keySize)
1115
1115
  {
1116
- keydef* kd = &m_tb->tableDef()->keyDefs[m_tb->keyNum()];
1116
+ keydef* kd = &m_tb->tableDef()->keyDefs[(int)m_tb->keyNum()];
1117
1117
 
1118
1118
  if (!prebuiltSeeks(kd, size, NULL, keySize, &m_buftmp))
1119
1119
  return false;
@@ -1126,7 +1126,7 @@ public:
1126
1126
  bool supplySeekValue(const uchar_td* ptr[] , int len[], int keySize, int& index)
1127
1127
  {
1128
1128
  const tabledef* td = m_tb->tableDef();
1129
- keydef* kd = &td->keyDefs[m_tb->keyNum()];
1129
+ keydef* kd = &td->keyDefs[(int)m_tb->keyNum()];
1130
1130
  fielddef* fds = td->fieldDefs;
1131
1131
 
1132
1132
  seek& l = m_seeks[index];
@@ -268,10 +268,11 @@ void recordsetQuery::init(const fielddefs* fdinfo)
268
268
 
269
269
  bool recordsetQuery::isMatch(int ret, unsigned char compType) const
270
270
  {
271
- compType &= 0xf; // lower then 15
271
+ compType &= 0xf; // lower than 15
272
272
  switch ((eCompType)compType)
273
273
  {
274
274
  case eEqual:
275
+ case eBitAnd:
275
276
  return (ret == 0);
276
277
  case eGreaterEq:
277
278
  return (ret >= 0);
@@ -282,6 +283,7 @@ bool recordsetQuery::isMatch(int ret, unsigned char compType) const
282
283
  case eLess:
283
284
  return (ret < 0);
284
285
  case eNotEq:
286
+ case eNotBitAnd:
285
287
  return (ret != 0);
286
288
  }
287
289
  return false;
@@ -336,22 +336,29 @@ void writableRecord::insert()
336
336
  copyFromBuffer(m_tb);
337
337
  }
338
338
 
339
- void writableRecord::del(bool KeysetAlrady)
339
+ void writableRecord::del(bool KeysetAlrady, bool noSeek)
340
340
  {
341
341
  if (!KeysetAlrady)
342
342
  copyToBuffer(m_tb);
343
- m_tb->seek();
344
- if (m_tb->stat())
345
- nstable::throwError(_T("activeTable delete "), m_tb->stat());
343
+ if (noSeek == false)
344
+ {
345
+ m_tb->seek();
346
+ if (m_tb->stat())
347
+ nstable::throwError(_T("activeTable delete "), m_tb->stat());
348
+ }
346
349
  deleteRecord(m_tb);
347
350
  }
348
351
 
349
- void writableRecord::update()
352
+ void writableRecord::update(bool KeysetAlrady, bool noSeek)
350
353
  {
351
- copyToBuffer(m_tb);
352
- m_tb->seek();
353
- if (m_tb->stat())
354
- nstable::throwError(_T("activeTable update "), m_tb->stat());
354
+ if (!KeysetAlrady)
355
+ copyToBuffer(m_tb);
356
+ if (noSeek == false)
357
+ {
358
+ m_tb->seek();
359
+ if (m_tb->stat())
360
+ nstable::throwError(_T("activeTable update "), m_tb->stat());
361
+ }
355
362
  copyToBuffer(m_tb, true /*only changed*/);
356
363
  updateRecord(m_tb);
357
364
  }
@@ -173,8 +173,8 @@ public:
173
173
  bool read(bool KeysetAlrady = false);
174
174
  bool read(bookmark_td& bm);
175
175
  void insert();
176
- void del(bool KeysetAlrady = false);
177
- void update();
176
+ void del(bool KeysetAlrady = false, bool noSeek = false);
177
+ void update(bool KeysetAlrady = false, bool noSeek = false);
178
178
  void save();
179
179
 
180
180
  };
@@ -786,7 +786,7 @@ bool nsdatabase::connect(const _TCHAR* URI, bool newConnection)
786
786
 
787
787
  char uri_a[MAX_PATH] = { 0x00 };
788
788
  const char* p = toServerUri(uri_a, MAX_PATH, URI, isUseTransactd());
789
- char_td keyNum = newConnection ? 3 : 0;
789
+ char_td keyNum = (isUseTransactd() == false) ? 0 : newConnection ? 3 : 0;
790
790
  m_stat = m_btrcallid(TD_CONNECT, NULL, NULL, &datalen, (void*)p,
791
791
  (keylen_td)(strlen(p) + 1), keyNum, clientID());
792
792
  if (m_stat)
@@ -152,7 +152,7 @@ private:
152
152
  m_fds->copyFrom(tb);
153
153
  if (tb && (addtype == mra_nojoin))
154
154
  {
155
- const keydef& kd = tb->tableDef()->keyDefs[tb->keyNum()];
155
+ const keydef& kd = tb->tableDef()->keyDefs[(int)tb->keyNum()];
156
156
  m_uniqueReadMaxField = (kd.segments[0].flags.bit0 == false)
157
157
  ? (short)m_fds->size()
158
158
  : 0;
@@ -580,7 +580,8 @@ public:
580
580
  m_fds->push_back(&fd);
581
581
  for (int i = 0; i < (int)m_unionFds.size(); ++i)
582
582
  m_unionFds[i]->push_back(&fd);
583
- registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
583
+ if (size())
584
+ registerMemoryBlock(NULL, fd.len * size(), fd.len, mra_outerjoin);
584
585
  }
585
586
 
586
587
  inline recordsetImple& operator+=(const recordsetImple& r)
@@ -647,6 +647,13 @@ struct queryStatementsImple
647
647
  }
648
648
  }
649
649
 
650
+ void move(int from, int to)
651
+ {
652
+ executable* p = statements[from];
653
+ statements.erase(statements.begin() + from);
654
+ statements.insert(statements.begin() + to, p);
655
+ }
656
+
650
657
  private:
651
658
  friend class boost::serialization::access;
652
659
  template <class Archive>
@@ -1105,6 +1112,11 @@ void queryStatements::clear()
1105
1112
  m_impl->reset();
1106
1113
  }
1107
1114
 
1115
+ void queryStatements::move(int from, int to)
1116
+ {
1117
+ m_impl->move(from, to);
1118
+ }
1119
+
1108
1120
  int queryStatements::statementType(int index)
1109
1121
  {
1110
1122
  if (dynamic_cast<readHasMany*>(m_impl->statements[index]))
@@ -274,6 +274,7 @@ public:
274
274
 
275
275
  void clear();
276
276
  int size() const;
277
+ void move(int from, int to);
277
278
  void save(const _TCHAR* filename);
278
279
  void load(const _TCHAR* filename);
279
280
  void save(std::stringstream& sf);
@@ -233,38 +233,58 @@ public:
233
233
  }
234
234
  }
235
235
 
236
+ inline char* moveCurrentData(char* ptr, unsigned short& len, int& sqnum)
237
+ {
238
+ len = *((unsigned short*)ptr);
239
+ ptr += DATASIZE_BYTE;
240
+ sqnum = *((int*)(ptr));
241
+ ptr += sizeof(int);
242
+ ptr += len;
243
+ return ptr;
244
+ }
245
+
236
246
  inline void hasManyJoinMra(int rowCount, uchar_td* data)
237
247
  {
238
248
  int rowOffset = 0;
239
- int row = 0; // zero start
249
+ int row = 0;
240
250
  int count = 0;
241
- char* ptr = (char*)data + DATASIZE_BYTE; // rowCount
251
+ int sqnum = 0;
242
252
  unsigned short len = 0;
243
- for (int i = 0; i < (int)rowCount; ++i)
253
+
254
+ char* ptr = (char*)data + DATASIZE_BYTE; // rowCount
255
+ ptr = moveCurrentData(ptr, len, sqnum); // getFirst
256
+ for (int i = 1; i < (int)rowCount; ++i)
244
257
  {
245
- ptr += len;
246
- len = *((unsigned short*)ptr);
247
- ptr += DATASIZE_BYTE;
248
-
249
- // get sequential number
250
- int tmp = *((int*)(ptr));
251
- ptr += sizeof(int);
252
- // If len == 0 then next first record read error
253
- if ((len == 0) || (tmp != row))
258
+ if (sqnum == row)
259
+ {
260
+ ++count;
261
+
262
+ //if row == 0
263
+ if (len == 0)
264
+ {
265
+ ++row;
266
+ count = 0;
267
+ }
268
+
269
+ }else if(sqnum != row)
254
270
  {
255
- if (count)
271
+ if (--count > 0)
256
272
  {
257
273
  m_tb->m_impl->mraPtr->duplicateRow(row + rowOffset, count);
258
274
  rowOffset += count;
259
275
  }
260
276
  ++row;
261
- count = 0;
277
+ count = (len == 0) ? 0 : 1;
278
+
262
279
  }
263
- else if (i != 0)
264
- ++count;
280
+ ptr = moveCurrentData(ptr, len, sqnum);
265
281
  }
266
- if (count)
282
+ if (sqnum == row)
283
+ count = (len == 0) ? 0 : count + 1;
284
+
285
+ if (--count > 0)
267
286
  m_tb->m_impl->mraPtr->duplicateRow(row + rowOffset, count);
287
+
268
288
  }
269
289
 
270
290
  inline void reset(filter* p, uchar_td* data, unsigned int totalSize,
@@ -291,7 +311,6 @@ public:
291
311
  const tabledef* td = m_tb->tableDef();
292
312
  ushort_td fieldCount = m_filter->fieldCount();
293
313
  m_tmpPtr = mra->ptr(m_row, mra_current_block);
294
- int resultOffset = 0;
295
314
 
296
315
  while (m_row < m_rowCount)
297
316
  {
@@ -302,7 +321,7 @@ public:
302
321
  if (m_filter->fieldSelected())
303
322
  {
304
323
  uchar_td* fieldPtr = m_ptr;
305
- resultOffset = 0;
324
+ int resultOffset = 0;
306
325
  int blobFieldNum = 0;
307
326
  for (int i = 0; i < fieldCount; i++)
308
327
  {
@@ -324,21 +343,17 @@ public:
324
343
  {
325
344
  memset(m_tmpPtr, 0, td->maxRecordLen);
326
345
  memcpy(m_tmpPtr, m_ptr, m_len);
327
- m_unpackLen = m_tb->unPack((char*)m_tmpPtr, m_len);
328
- resultOffset = m_unpackLen;
346
+ m_unpackLen = td->unPack((char*)m_tmpPtr, m_len);
329
347
  }
330
348
  else
331
- {
332
349
  memcpy(m_tmpPtr, m_ptr, m_len);
333
- resultOffset = m_len;
334
- }
335
350
  if (bd)
336
351
  bd = m_tb->setBlobFieldPointer((char*)m_tmpPtr, m_hd, bd);
337
352
  }
338
353
  }
339
354
  ++m_row;
340
355
  moveNextRow(bookmarkSize);
341
- m_tmpPtr += resultOffset;
356
+ m_tmpPtr += recordLen;
342
357
  }
343
358
  }
344
359
  //prebuilt next ead operation
@@ -407,7 +422,7 @@ public:
407
422
  {
408
423
  memset(m_tmpPtr, 0, td->maxRecordLen);
409
424
  memcpy(m_tmpPtr, m_ptr, m_len);
410
- m_unpackLen = m_tb->unPack((char*)m_tmpPtr, m_len);
425
+ m_unpackLen = td->unPack((char*)m_tmpPtr, m_len);
411
426
  }
412
427
  else
413
428
  m_tmpPtr = m_ptr;
@@ -1218,7 +1233,7 @@ void table::getKeySpec(keySpec* ks, bool SpecifyKeyNum)
1218
1233
  short FieldNum;
1219
1234
  int j;
1220
1235
  tabledef* td = (*m_tableDef);
1221
- KeyDef = &td->keyDefs[m_keynum];
1236
+ KeyDef = &td->keyDefs[(int)m_keynum];
1222
1237
  for (j = 0; j < KeyDef->segmentCount; j++)
1223
1238
  {
1224
1239
  FieldNum = KeyDef->segments[j].fieldNum;
@@ -1261,7 +1276,7 @@ void table::doCreateIndex(bool SpecifyKeyNum)
1261
1276
  }
1262
1277
  else
1263
1278
  {
1264
- int segmentCount = (*m_tableDef)->keyDefs[m_keynum].segmentCount;
1279
+ int segmentCount = (*m_tableDef)->keyDefs[(int)m_keynum].segmentCount;
1265
1280
  keySpec* ks = (keySpec*)malloc(sizeof(keySpec) * segmentCount);
1266
1281
  memset(ks, 0, sizeof(keySpec) * segmentCount);
1267
1282
  getKeySpec(ks, SpecifyKeyNum);
@@ -1290,7 +1305,7 @@ bool table::isUniqeKey(char_td keynum)
1290
1305
  {
1291
1306
  if ((keynum >= 0) && (keynum < (*m_tableDef)->keyCount))
1292
1307
  {
1293
- keydef* kd = &(*m_tableDef)->keyDefs[m_keynum];
1308
+ keydef* kd = &(*m_tableDef)->keyDefs[(int)m_keynum];
1294
1309
  return !(kd->segments[0].flags.bit0);
1295
1310
  }
1296
1311
  return false;
@@ -1388,7 +1403,7 @@ void* table::attachBuffer(void* NewPtr, bool unpack, size_t size)
1388
1403
  m_pdata = NewPtr;
1389
1404
  ushort_td len = (*m_tableDef)->maxRecordLen;
1390
1405
  if (unpack)
1391
- len = unPack((char*)m_pdata, size);
1406
+ len = (*m_tableDef)->unPack((char*)m_pdata, size);
1392
1407
  m_datalen = len;
1393
1408
  return oldptr;
1394
1409
  }
@@ -1436,7 +1451,7 @@ keylen_td table::writeKeyDataTo(uchar_td* to, int keySize)
1436
1451
  if ((*m_tableDef)->keyCount)
1437
1452
  {
1438
1453
  keydef& keydef =
1439
- (*m_tableDef)->keyDefs[(short)m_impl->keyNumIndex[m_keynum]];
1454
+ (*m_tableDef)->keyDefs[(int)m_impl->keyNumIndex[(int)m_keynum]];
1440
1455
  uchar_td* start = to;
1441
1456
  if (keySize == 0)
1442
1457
  keySize = keydef.segmentCount;
@@ -1458,40 +1473,19 @@ keylen_td table::writeKeyData()
1458
1473
  return writeKeyDataTo((uchar_td*)m_impl->keybuf, 0);
1459
1474
  }
1460
1475
 
1461
- uint_td table::pack(char* ptr, size_t size)
1476
+
1477
+ uint_td table::unPack(char* ptr, size_t size)
1462
1478
  {
1463
- char* pos = ptr;
1464
- char* end = pos + size;
1465
- int movelen;
1466
- for (int i = 0; i < (*m_tableDef)->fieldCount; i++)
1467
- {
1468
- fielddef& fd = (*m_tableDef)->fieldDefs[i];
1469
- if (fd.type == ft_myfixedbinary)
1470
- {
1471
- memmove(pos + 2, pos, fd.len - 2); // move as size pace in the field
1472
- *((unsigned short*)(pos)) = fd.len - 2; // fixed size
1473
- pos += fd.len;
1474
- }
1475
- else
1476
- {
1477
- int blen = fd.varLenBytes();
1478
- int dl = fd.len; // length
1479
- if (blen == 1)
1480
- dl = *((unsigned char*)(pos)) + blen;
1481
- else if (blen == 2)
1482
- dl = *((unsigned short*)(pos)) + blen;
1483
- pos += dl;
1484
- if ((movelen = fd.len - dl) != 0)
1485
- {
1486
- end -= movelen;
1487
- memmove(pos, pos + movelen, end - pos);
1488
- }
1489
- }
1490
- }
1491
- m_impl->dataPacked = true;
1492
- return (uint_td)(pos - ptr);
1479
+ m_impl->dataPacked = false;
1480
+ return tableDef()->unPack(ptr, size);
1493
1481
  }
1494
1482
 
1483
+ uint_td table::pack(char* ptr, size_t size)
1484
+ {
1485
+ m_impl->dataPacked = true;
1486
+ return tableDef()->pack(ptr, size);
1487
+ }
1488
+
1495
1489
  uint_td table::doGetWriteImageLen()
1496
1490
  {
1497
1491
  tabledef* td = (*m_tableDef);
@@ -1550,49 +1544,6 @@ uint_td table::doGetWriteImageLen()
1550
1544
  }
1551
1545
  }
1552
1546
 
1553
- uint_td table::unPack(char* ptr, size_t size)
1554
- {
1555
- char* pos = ptr;
1556
- const char* end = pos + size;
1557
- tabledef* td = *m_tableDef;
1558
- const char* max = pos + td->maxRecordLen;
1559
- int movelen;
1560
- for (int i = 0; i < td->fieldCount; i++)
1561
- {
1562
- fielddef& fd = td->fieldDefs[i];
1563
- if (fd.type == ft_myfixedbinary)
1564
- {
1565
- int dl = *((unsigned short*)(pos));
1566
- memmove(pos, pos + 2, dl);
1567
- pos += fd.len - 2;
1568
- *((unsigned short*)(pos)) = 0x00;
1569
- ;
1570
- pos += 2;
1571
- }
1572
- else
1573
- {
1574
- int blen = fd.varLenBytes();
1575
- int dl = fd.len; // length
1576
- if (blen == 1)
1577
- dl = *((unsigned char*)(pos)) + blen;
1578
- else if (blen == 2)
1579
- dl = *((unsigned short*)(pos)) + blen;
1580
- if ((movelen = fd.len - dl) != 0)
1581
- {
1582
- if (max < end + movelen)
1583
- return 0;
1584
- char* src = pos + dl;
1585
- memmove(pos + fd.len, src, end - src);
1586
- memset(src, 0, movelen);
1587
- end += movelen;
1588
- }
1589
- pos += fd.len;
1590
- }
1591
- }
1592
- m_impl->dataPacked = false;
1593
- return (uint_td)(pos - ptr);
1594
- }
1595
-
1596
1547
  void table::addBlobEndRow()
1597
1548
  {
1598
1549
  char_td knum = m_keynum;
@@ -2015,7 +1966,7 @@ short_td table::doBtrvErr(HWND hWnd, _TCHAR* retbuf)
2015
1966
  bool table::setSeekValueField(int row)
2016
1967
  {
2017
1968
  const std::vector<client::seek>& keyValues = m_impl->filterPtr->seeks();
2018
- keydef* kd = &tableDef()->keyDefs[keyNum()];
1969
+ keydef* kd = &tableDef()->keyDefs[(int)keyNum()];
2019
1970
  if (keyValues.size() % kd->segmentCount)
2020
1971
  return false;
2021
1972
  // Check uniqe key
@@ -2055,9 +2006,9 @@ void table::keyValueDescription(_TCHAR* buf, int bufsize)
2055
2006
  if (stat() == STATUS_NOT_FOUND_TI)
2056
2007
  {
2057
2008
 
2058
- for (int i = 0; i < tableDef()->keyDefs[keyNum()].segmentCount; i++)
2009
+ for (int i = 0; i < tableDef()->keyDefs[(int)keyNum()].segmentCount; i++)
2059
2010
  {
2060
- short fnum = tableDef()->keyDefs[keyNum()].segments[i].fieldNum;
2011
+ short fnum = tableDef()->keyDefs[(int)keyNum()].segments[i].fieldNum;
2061
2012
  s += std::_tstring(tableDef()->fieldDefs[fnum].name()) + _T(" = ") +
2062
2013
  getFVstr(fnum) + _T("\n");
2063
2014
  }
@@ -2475,7 +2426,7 @@ const _TCHAR* queryBase::toString() const
2475
2426
  for (size_t i = 0; i < wheres.size(); i += 4)
2476
2427
  {
2477
2428
  if (i + 1 < wheres.size())
2478
- s += wheres[i] + _T(" ") + wheres[i + 1];
2429
+ s += wheres[i] + _T(" ") + escape_value(wheres[i + 1]);
2479
2430
  if (i + 2 < wheres.size())
2480
2431
  s += _T(" '") + escape_value(wheres[i + 2]) + _T("' ");
2481
2432
  if (i + 3 < wheres.size())
@@ -132,7 +132,8 @@ protected:
132
132
  void* reallocDataBuffer(uint_td v);
133
133
  int dataBufferLen() const;
134
134
  uint_td unPack(char* ptr, size_t size);
135
- uint_td pack(char* ptr, size_t size);
135
+ uint_td pack(char* ptr, size_t size);
136
+
136
137
  keylen_td writeKeyData(); // orverride
137
138
  keylen_td writeKeyDataTo(uchar_td* to, int keySize);
138
139
 
@@ -101,6 +101,19 @@ public:
101
101
  : m_type(TYPE_SCHEMA_BDF), m_mode(TD_OPEN_READONLY)
102
102
  {
103
103
  _tcscpy_s(m_buf, MAX_PATH, uri);
104
+ size_t len = _tcslen(uri);
105
+ if (len > 5)
106
+ {
107
+ _TCHAR tmp[10];
108
+ _tcscpy_s(tmp, 10, uri + len - 4);
109
+ #ifdef _tcsupr_s
110
+ _tcsupr_s(tmp, 10);
111
+ #else
112
+ _tcsupr(tmp);
113
+ #endif
114
+ if (_tcscmp(tmp, _T(".DDF"))==0)
115
+ m_type = TYPE_SCHEMA_DDF;
116
+ }
104
117
  }
105
118
  inline void setMode(char_td v) { m_mode = v; }
106
119
 
@@ -172,7 +172,7 @@ public:
172
172
  if (keynum < td.keyCount)
173
173
  {
174
174
  tb->clearBuffer();
175
- const keydef kd = td.keyDefs[keynum];
175
+ const keydef kd = td.keyDefs[(int)keynum];
176
176
  if (kd.segmentCount > 0)
177
177
  tb->setFV(kd.segments[0].fieldNum, kv0);
178
178
  if (kd.segmentCount > 1)