transactd 2.4.0 → 2.4.2

Sign up to get free protection for your applications and to get access to all the features.
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)