transactd 2.4.0 → 2.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/BUILD_UNIX-JA.md +37 -29
- data/BUILD_WIN-JA.md +96 -69
- data/CMakeLists.txt +7 -17
- data/README-JA.md +22 -17
- data/README.md +23 -16
- data/{RELEASE_NOTE-JA → RELEASE_NOTE-JA.md} +163 -98
- data/{RELEASE_NOTE → RELEASE_NOTE.md} +165 -99
- data/bin/common/tdclc_32_2_4.dll +0 -0
- data/bin/common/tdclc_64_2_4.dll +0 -0
- data/build/common/get_boost_libs.cmake +2 -0
- data/build/common/system.cmake +6 -4
- data/build/common/transactd_cl_output.cmake +14 -2
- data/build/common/transactd_common.cmake +34 -12
- data/build/tdclc/CMakeLists.txt +10 -2
- data/build/tdclc/tdclc.rc +4 -4
- data/build/tdclcpp/CMakeLists.txt +34 -9
- data/build/tdclcpp/tdclcpp.rc +4 -4
- data/build/tdclrb/CMakeLists.txt +24 -15
- data/build/tdclrb/gem/Makefile.win32-VS +2 -2
- data/build/tdclrb/gem_output.cmake +27 -10
- data/build/tdclrb/tdclrb.rc +4 -4
- data/source/bzs/db/engine/mysql/database.cpp +18 -18
- data/source/bzs/db/engine/mysql/database.h +4 -4
- data/source/bzs/db/engine/mysql/dbManager.cpp +1 -2
- data/source/bzs/db/engine/mysql/mysqlInternal.h +23 -2
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +3 -2
- data/source/bzs/db/protocol/tdap/client/activeTableImple.h +26 -12
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +3 -3
- data/source/bzs/db/protocol/tdap/client/field.cpp +74 -23
- data/source/bzs/db/protocol/tdap/client/field.h +3 -1
- data/source/bzs/db/protocol/tdap/client/filter.h +4 -4
- data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +3 -1
- data/source/bzs/db/protocol/tdap/client/memRecord.cpp +16 -9
- data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
- data/source/bzs/db/protocol/tdap/client/nsDatabase.cpp +1 -1
- data/source/bzs/db/protocol/tdap/client/recordsetImple.h +3 -2
- data/source/bzs/db/protocol/tdap/client/serializer.cpp +12 -0
- data/source/bzs/db/protocol/tdap/client/serializer.h +1 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +60 -109
- data/source/bzs/db/protocol/tdap/client/table.h +2 -1
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +13 -0
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +1 -1
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +8 -8
- data/source/bzs/db/protocol/tdap/fieldComp.h +6 -0
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +147 -46
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +78 -0
- data/source/bzs/db/protocol/tdap/tdapSchema.h +6 -1
- data/source/bzs/db/protocol/tdap/tdapcapi.h +3 -3
- data/source/bzs/db/transactd/transactd.cpp +1 -1
- data/source/bzs/env/compiler.h +12 -0
- data/source/bzs/env/tcharMinGW.h +1 -0
- data/source/bzs/netsvc/client/tcpClient.h +4 -2
- data/source/bzs/netsvc/server/serverCpt.cpp +1 -0
- data/source/bzs/netsvc/server/serverTpool.cpp +3 -0
- data/source/bzs/test/tdclphp/transactd_Test.php +2 -2
- data/source/bzs/test/tdclphp/transactd_pool_Test.php +6 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +2 -2
- data/source/global/ormsrcgen/srcgen.cpp +1 -2
- data/source/linux/tchar.h +1 -0
- 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
|
-
|
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
|
-
|
1916
|
+
if (logType & eBitAnd)
|
1903
1917
|
{
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
1908
|
-
|
1909
|
-
|
1910
|
-
|
1911
|
-
|
1912
|
-
|
1913
|
-
|
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
|
-
|
1967
|
+
if (logType & eBitAnd)
|
1935
1968
|
{
|
1936
|
-
|
1937
|
-
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
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
|
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
|
-
|
344
|
-
|
345
|
-
|
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
|
-
|
352
|
-
|
353
|
-
if (
|
354
|
-
|
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
|
-
|
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]))
|
@@ -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;
|
249
|
+
int row = 0;
|
240
250
|
int count = 0;
|
241
|
-
|
251
|
+
int sqnum = 0;
|
242
252
|
unsigned short len = 0;
|
243
|
-
|
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
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
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
|
-
|
264
|
-
++count;
|
280
|
+
ptr = moveCurrentData(ptr, len, sqnum);
|
265
281
|
}
|
266
|
-
if (
|
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 =
|
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 +=
|
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 =
|
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[(
|
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
|
-
|
1476
|
+
|
1477
|
+
uint_td table::unPack(char* ptr, size_t size)
|
1462
1478
|
{
|
1463
|
-
|
1464
|
-
|
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)
|