transactd 1.1.2 → 1.2.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.
- checksums.yaml +4 -4
- data/CMakeLists.txt +37 -4
- data/bin/common/tdclc_32_1_2.dll +0 -0
- data/bin/common/tdclc_64_1_2.dll +0 -0
- data/build/common/transactd_cl_common.cmake +0 -1
- data/build/common/transactd_common.cmake +26 -6
- data/build/swig/php/generate.cmake.in +58 -0
- data/build/swig/php/generate.cmd.in +41 -0
- data/build/swig/php/php.swg +155 -0
- data/build/swig/ruby/ruby.swg +38 -0
- data/build/swig/tdcl.i +133 -3
- data/build/tdclc/CMakeLists.txt +4 -1
- data/build/tdclc/tdclc_32.cbproj +1 -1
- data/build/tdclc/tdclc_64.cbproj +1 -1
- data/build/tdclcpp/CMakeLists.txt +1 -1
- data/build/tdclcpp/tdclcpp_bcb_32.cbproj +1 -4
- data/build/tdclcpp/tdclcpp_bcb_64.cbproj +0 -3
- data/build/tdclrb/CMakeLists.txt +1 -1
- data/build/tdclrb/GEM_VERSION +2 -2
- data/source/bzs/db/engine/mysql/IReadRecords.h +1 -1
- data/source/bzs/db/engine/mysql/bookmark.h +3 -3
- data/source/bzs/db/engine/mysql/database.cpp +95 -19
- data/source/bzs/db/engine/mysql/database.h +6 -6
- data/source/bzs/db/engine/mysql/mysqlInternal.h +43 -1
- data/source/bzs/db/engine/mysql/mysqlThd.cpp +10 -8
- data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
- data/source/bzs/db/protocol/tdap/btrDate.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dbDef.cpp +15 -8
- data/source/bzs/db/protocol/tdap/client/dbDef.h +2 -2
- data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -0
- data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +0 -5
- data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +0 -4
- data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -484
- data/source/bzs/db/protocol/tdap/client/filter.h +696 -84
- data/source/bzs/db/protocol/tdap/client/nsTable.cpp +13 -3
- data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -6
- data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -1
- data/source/bzs/db/protocol/tdap/client/stringConverter.h +1 -0
- data/source/bzs/db/protocol/tdap/client/table.cpp +519 -75
- data/source/bzs/db/protocol/tdap/client/table.h +49 -7
- data/source/bzs/db/protocol/tdap/client/trdboostapi.h +145 -124
- data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +39 -0
- data/source/bzs/db/protocol/tdap/client/trdormapi.h +872 -0
- data/source/bzs/db/protocol/tdap/myDateTime.cpp +8 -8
- data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +7 -9
- data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +406 -195
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +64 -13
- data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +2 -1
- data/source/bzs/db/protocol/tdap/tdapSchema.cpp +35 -3
- data/source/bzs/db/protocol/tdap/tdapSchema.h +11 -3
- data/source/bzs/db/protocol/tdap/tdapcapi.h +63 -53
- data/source/bzs/env/crosscompile.h +8 -3
- data/source/bzs/example/connection_pool_c.cpp +1 -7
- data/source/bzs/example/useORM.cpp +585 -0
- data/source/bzs/rtl/exception.h +6 -0
- data/source/bzs/test/tdclatl/bench_tdclatl.js +12 -7
- data/source/bzs/test/tdclphp/transactd_Test.php +1845 -0
- data/source/bzs/test/tdclphp/transactd_blob_Test.php +325 -0
- data/source/bzs/test/tdclphp/transactd_datetime_Test.php +183 -0
- data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +212 -0
- data/source/bzs/test/tdclrb/transactd_blob_spec.rb +332 -0
- data/source/bzs/test/tdclrb/transactd_spec.rb +256 -1
- data/source/bzs/test/trdclengn/test_blob.cpp +327 -0
- data/source/bzs/test/trdclengn/test_trdclengn.cpp +485 -5
- data/source/global/tdclatl/QueryBase.cpp +231 -0
- data/source/global/tdclatl/QueryBase.h +96 -0
- data/source/global/tdclatl/Table.cpp +24 -0
- data/source/global/tdclatl/Table.h +2 -1
- data/source/global/tdclatl/resource.h +0 -0
- data/source/global/tdclatl/tdclatl.idl +88 -2
- metadata +16 -3
- data/bin/common/tdclc_32_1_1.dll +0 -0
- data/bin/common/tdclc_64_1_1.dll +0 -0
|
@@ -262,6 +262,10 @@ extern "C" short_td __STDCALL
|
|
|
262
262
|
client_t->req().paramMask = P_MASK_POSBLK|P_MASK_DATA
|
|
263
263
|
|P_MASK_DATALEN|P_MASK_EX_SENDLEN;
|
|
264
264
|
break;
|
|
265
|
+
case TD_KEY_SEEK_MULTI:
|
|
266
|
+
client_t->req().paramMask = P_MASK_POSBLK|P_MASK_DATA|P_MASK_KEYNUM
|
|
267
|
+
|P_MASK_DATALEN|P_MASK_EX_SENDLEN;
|
|
268
|
+
break;
|
|
265
269
|
case TD_GETDIRECTORY:
|
|
266
270
|
case TD_SETDIRECTORY:
|
|
267
271
|
break;
|
|
@@ -83,11 +83,6 @@ void fieldDDF::writeRecordData()
|
|
|
83
83
|
for (size_t i = strlen(datbuf.name); i < 20; i++)
|
|
84
84
|
datbuf.name[i] = ' ';
|
|
85
85
|
|
|
86
|
-
#ifdef DDF_PSQLV_MODE
|
|
87
|
-
if (type == ft_logical)
|
|
88
|
-
type = ft_uinteger;
|
|
89
|
-
|
|
90
|
-
#endif
|
|
91
86
|
datbuf.type = type;
|
|
92
87
|
datbuf.pos = pos;
|
|
93
88
|
datbuf.len = len;
|
|
@@ -87,10 +87,6 @@ void fileDDF::writeRecordData()
|
|
|
87
87
|
strncpy(datbuf.filename, filename, 64);
|
|
88
88
|
for (size_t i = strlen(datbuf.filename); i < 64; i++)
|
|
89
89
|
datbuf.filename[i] = ' ';
|
|
90
|
-
#ifdef DDF_PSQLV_MODE
|
|
91
|
-
flag = 0;
|
|
92
|
-
|
|
93
|
-
#endif
|
|
94
90
|
|
|
95
91
|
datbuf.flag = flag;
|
|
96
92
|
memset(datbuf.filler, 0, 9);
|
|
@@ -35,490 +35,6 @@ namespace tdap
|
|
|
35
35
|
namespace client
|
|
36
36
|
{
|
|
37
37
|
|
|
38
|
-
inline ushort_td varlenForFilter(const fielddef& fd)
|
|
39
|
-
{
|
|
40
|
-
if (((fd.type >= ft_myvarchar) && (fd.type <= ft_mywvarbinary)) || fd.type == ft_lstring)
|
|
41
|
-
return fd.len < 256 ? 1 : 2;
|
|
42
|
-
else if ((fd.type == ft_myblob) || (fd.type == ft_mytext))
|
|
43
|
-
return fd.len - 8;
|
|
44
|
-
return 0;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Length of compare
|
|
48
|
-
* if part of string or zstring then return strlen.
|
|
49
|
-
*/
|
|
50
|
-
inline uint_td compDataLen(const fielddef& fd, const uchar_td* ptr, bool part)
|
|
51
|
-
{
|
|
52
|
-
uint_td length = fd.keyDataLen(ptr);
|
|
53
|
-
if (part)
|
|
54
|
-
{
|
|
55
|
-
if ((fd.type == ft_string) || (fd.type == ft_zstring) || (fd.type == ft_note))
|
|
56
|
-
length = (uint_td)strlen((const char*)ptr);
|
|
57
|
-
else if ((fd.type == ft_wstring) || (fd.type == ft_wzstring))
|
|
58
|
-
length = (uint_td)wcslen((const wchar_t*)ptr);
|
|
59
|
-
}
|
|
60
|
-
return length;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** copy data for select comp
|
|
64
|
-
*/
|
|
65
|
-
inline ushort_td copyForCompare(const fielddef& fd, uchar_td* to, const uchar_td* from, bool part)
|
|
66
|
-
{
|
|
67
|
-
ushort_td varlen = varlenForFilter(fd);
|
|
68
|
-
int copylen = compDataLen(fd, from, part);
|
|
69
|
-
if (varlen)
|
|
70
|
-
memcpy(to, from, varlen);
|
|
71
|
-
memcpy(to + varlen, fd.keyData(from), copylen);
|
|
72
|
-
return copylen + varlen;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
filter::filter(table* pBao)
|
|
76
|
-
{
|
|
77
|
-
m_pFilter = NULL;
|
|
78
|
-
m_pEntendBuf = NULL;
|
|
79
|
-
m_pEntendBuflen = 0;
|
|
80
|
-
|
|
81
|
-
init(pBao);
|
|
82
|
-
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
void filter::init(table* pBao)
|
|
86
|
-
{
|
|
87
|
-
m_tb = pBao;
|
|
88
|
-
strcpy(&m_PosType[0], "UC");
|
|
89
|
-
m_RejectCount = 65000;
|
|
90
|
-
m_iRecordCount = 1;
|
|
91
|
-
m_iFieldCount = 1;
|
|
92
|
-
memset(m_iFieldLen, 0, 255 * sizeof(ushort_td));
|
|
93
|
-
memset(m_iFieldOffset, 0, 255 * sizeof(ushort_td));
|
|
94
|
-
m_iFieldLen[0] = (ushort_td) m_tb->tableDef()->maxRecordLen;
|
|
95
|
-
m_iFieldOffset[0] = 0;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
filter::~filter()
|
|
99
|
-
{
|
|
100
|
-
if (m_pFilter != NULL)
|
|
101
|
-
delete[]m_pFilter; ;
|
|
102
|
-
if (m_pEntendBuf != NULL)
|
|
103
|
-
free(m_pEntendBuf);
|
|
104
|
-
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
ushort_td filter::GetFieldLen(int index) {return m_iFieldLen[index];
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
ushort_td filter::GetFieldOffset(int index) {return m_iFieldOffset[index];}
|
|
112
|
-
|
|
113
|
-
_TCHAR* filter::filterStr() {return m_pFilter;}
|
|
114
|
-
|
|
115
|
-
bool filter::GetPosType()
|
|
116
|
-
{
|
|
117
|
-
|
|
118
|
-
if (strcmp(m_PosType, "UC") == 0)
|
|
119
|
-
return false;
|
|
120
|
-
else
|
|
121
|
-
return true;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
void filter::SetPosType(bool getnext)
|
|
125
|
-
{
|
|
126
|
-
|
|
127
|
-
if (getnext)
|
|
128
|
-
strcpy(&m_PosType[0], "EG");
|
|
129
|
-
else
|
|
130
|
-
strcpy(&m_PosType[0], "UC");
|
|
131
|
-
if (m_pEntendBuf)
|
|
132
|
-
memcpy((void*)((char*)m_pEntendBuf + 2), &m_PosType[0], 2);
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
void filter::WriteBuffer() {memcpy(m_tb->dataBak(), m_pEntendBuf, m_pEntendBuflen);}
|
|
137
|
-
|
|
138
|
-
bool filter::setFilter(const _TCHAR* str, ushort_td RejectCount, ushort_td CashCount)
|
|
139
|
-
{
|
|
140
|
-
|
|
141
|
-
_TCHAR* NewPointer;
|
|
142
|
-
|
|
143
|
-
BFilter* itm;
|
|
144
|
-
BFilter* Olditm = NULL;
|
|
145
|
-
|
|
146
|
-
bool joint = false;
|
|
147
|
-
bool cmpfield;
|
|
148
|
-
ushort_td Oldlen;
|
|
149
|
-
short OldfieldNum = -1;
|
|
150
|
-
BFilterHeader* FilterHead;
|
|
151
|
-
ushort_td LogicalCount = 0;
|
|
152
|
-
BFilterDisc* disc;
|
|
153
|
-
|
|
154
|
-
m_RejectCount = RejectCount;
|
|
155
|
-
m_iRecordCount = CashCount;
|
|
156
|
-
|
|
157
|
-
if (m_pFilter)
|
|
158
|
-
delete[]m_pFilter;
|
|
159
|
-
size_t size = _tcslen(str) + 2;
|
|
160
|
-
m_pFilter = new _TCHAR[size];
|
|
161
|
-
if (m_pFilter == NULL)
|
|
162
|
-
return false;
|
|
163
|
-
memset(m_pFilter, 0, size * sizeof(_TCHAR));
|
|
164
|
-
_tcscpy(m_pFilter, str);
|
|
165
|
-
|
|
166
|
-
int sDataBufSize = 8192;
|
|
167
|
-
if (m_pEntendBuf == NULL)
|
|
168
|
-
m_pEntendBuf = malloc(sDataBufSize);
|
|
169
|
-
else
|
|
170
|
-
memset(m_pEntendBuf, 0, sDataBufSize);
|
|
171
|
-
|
|
172
|
-
if (m_pEntendBuf == NULL)
|
|
173
|
-
return false;
|
|
174
|
-
|
|
175
|
-
itm = (BFilter*)((char*)m_pEntendBuf + 8);
|
|
176
|
-
|
|
177
|
-
NewPointer = m_pFilter;
|
|
178
|
-
|
|
179
|
-
m_FieldSelected = false;
|
|
180
|
-
if (m_pFilter[0] == '*')
|
|
181
|
-
LogicalCount = 0;
|
|
182
|
-
else
|
|
183
|
-
{
|
|
184
|
-
|
|
185
|
-
// -------------------------------------------------------------
|
|
186
|
-
// SELECT
|
|
187
|
-
if (_tcsstr(m_pFilter, _T("SELECT ")) == NewPointer)
|
|
188
|
-
{
|
|
189
|
-
if (!MakeFieldSelect(&NewPointer))
|
|
190
|
-
return false;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
while (1)
|
|
194
|
-
{
|
|
195
|
-
cmpfield = false;
|
|
196
|
-
|
|
197
|
-
// -------------------------------------------------------------
|
|
198
|
-
// Get filed number
|
|
199
|
-
// -------------------------------------------------------------
|
|
200
|
-
short fieldNum = GetField(&NewPointer);
|
|
201
|
-
if (fieldNum == -1)
|
|
202
|
-
break;
|
|
203
|
-
|
|
204
|
-
LogicalCount++;
|
|
205
|
-
fielddef* fd = &m_tb->tableDef()->fieldDefs[fieldNum];
|
|
206
|
-
itm->Type = fd->type;
|
|
207
|
-
itm->Len = fd->len;
|
|
208
|
-
itm->Pos = fd->pos;
|
|
209
|
-
|
|
210
|
-
// -------------------------------------------------------------
|
|
211
|
-
// Get logical type
|
|
212
|
-
// -------------------------------------------------------------
|
|
213
|
-
itm->CompType = GetCompType(&NewPointer);
|
|
214
|
-
if (itm->CompType == 255)
|
|
215
|
-
return false;
|
|
216
|
-
|
|
217
|
-
// -------------------------------------------------------------
|
|
218
|
-
// Get compare value
|
|
219
|
-
// if [fieldName] then comapre as field value
|
|
220
|
-
// -------------------------------------------------------------
|
|
221
|
-
_TCHAR* start = NewPointer;
|
|
222
|
-
if (!GetCompStr(&NewPointer))
|
|
223
|
-
return false;
|
|
224
|
-
if (NewPointer == NULL)
|
|
225
|
-
return false;
|
|
226
|
-
|
|
227
|
-
int offset = 0;
|
|
228
|
-
if (start[0] == '[')
|
|
229
|
-
{
|
|
230
|
-
start++;
|
|
231
|
-
int num = m_tb->fieldNumByName(start);
|
|
232
|
-
if (num != -1)
|
|
233
|
-
{
|
|
234
|
-
itm->Data = m_tb->tableDef()->fieldDefs[num].pos;
|
|
235
|
-
itm->CompType |= CMPLOGICAL_FIELD;
|
|
236
|
-
cmpfield = true;
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
else
|
|
240
|
-
{
|
|
241
|
-
|
|
242
|
-
bool isPart = false;
|
|
243
|
-
if (start[0] == '\'')
|
|
244
|
-
{// string
|
|
245
|
-
start++; // erase front '
|
|
246
|
-
int len = (ushort_td) _tcslen(start);
|
|
247
|
-
start[--len] = 0x00; // erase after '
|
|
248
|
-
isPart = (start[len - 1] == '*');
|
|
249
|
-
if (isPart)
|
|
250
|
-
start[--len] = 0x00;
|
|
251
|
-
|
|
252
|
-
}
|
|
253
|
-
m_tb->setFV(fieldNum, start);
|
|
254
|
-
itm->Len =
|
|
255
|
-
copyForCompare(*fd, (uchar_td*)(&itm->Data),
|
|
256
|
-
(const uchar_td*)m_tb->fieldPtr(fieldNum), isPart);
|
|
257
|
-
if (!isPart && (fd->varLenBytes() || fd->blobLenBytes()))
|
|
258
|
-
itm->CompType |= CMPLOGICAL_VAR_COMP_ALL; //match complate
|
|
259
|
-
offset = itm->Len - 2;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// LogicalType
|
|
263
|
-
itm->LogicalType = GetLogical(&NewPointer);
|
|
264
|
-
// ------------------------------------------------------------
|
|
265
|
-
// chain befor field
|
|
266
|
-
// ------------------------------------------------------------
|
|
267
|
-
Oldlen = fd->len;
|
|
268
|
-
|
|
269
|
-
if ((joint == true) && (OldfieldNum + 1 == fieldNum) && (itm->CompType == 1) &&
|
|
270
|
-
(cmpfield == false) && (itm->Len == fd->len) && (itm->Type != 11) &&
|
|
271
|
-
(varlenForFilter(*fd) == 0))
|
|
272
|
-
{
|
|
273
|
-
Olditm->LogicalType = itm->LogicalType;
|
|
274
|
-
Oldlen = itm->Len;
|
|
275
|
-
memcpy((void*)((char*)(&Olditm->Data) + Olditm->Len), &itm->Data, itm->Len);
|
|
276
|
-
Olditm->Len += Oldlen;
|
|
277
|
-
Oldlen = Olditm->Len;
|
|
278
|
-
itm = Olditm;
|
|
279
|
-
itm->Type = 0; // comapre as string
|
|
280
|
-
|
|
281
|
-
offset = itm->Len - 2;
|
|
282
|
-
LogicalCount--;
|
|
283
|
-
}
|
|
284
|
-
if (itm->LogicalType != 0) // If zero then logical is end.
|
|
285
|
-
{
|
|
286
|
-
// ------------------------------------------------------------
|
|
287
|
-
// Can it connect? not * and not zstring
|
|
288
|
-
// ------------------------------------------------------------
|
|
289
|
-
if ((itm->CompType == 1) && (itm->LogicalType == 1) && (cmpfield == false) &&
|
|
290
|
-
(itm->Len == Oldlen) && (itm->Type != 11) && (varlenForFilter(*fd) == 0))
|
|
291
|
-
joint = true;
|
|
292
|
-
else
|
|
293
|
-
joint = false;
|
|
294
|
-
Olditm = itm;
|
|
295
|
-
OldfieldNum = fieldNum;
|
|
296
|
-
}
|
|
297
|
-
// ------------------------------------------------------------
|
|
298
|
-
// move pointer
|
|
299
|
-
itm = (BFilter*)((char*)itm +sizeof(BFilter) + offset);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
_tcscpy(m_pFilter, str);
|
|
303
|
-
// header
|
|
304
|
-
FilterHead = (BFilterHeader*) m_pEntendBuf;
|
|
305
|
-
FilterHead->BufLen = (ushort_td)((char*)itm - (char*)m_pEntendBuf + 4 + (m_iFieldCount * 4));
|
|
306
|
-
memcpy(FilterHead->PosType, m_PosType, 2);
|
|
307
|
-
FilterHead->RejectCount = m_RejectCount;
|
|
308
|
-
FilterHead->LogicalCount = LogicalCount;
|
|
309
|
-
|
|
310
|
-
// descipter
|
|
311
|
-
disc = (BFilterDisc*)itm;
|
|
312
|
-
disc->iRecordCount = m_iRecordCount;
|
|
313
|
-
disc->iFieldCount = m_iFieldCount;
|
|
314
|
-
int RecordSize = 0;
|
|
315
|
-
for (int i = 0; i < m_iFieldCount; i++)
|
|
316
|
-
{
|
|
317
|
-
disc->iSelectFields[i].iFieldLen = m_iFieldLen[i];
|
|
318
|
-
disc->iSelectFields[i].iFieldOffset = m_iFieldOffset[i];
|
|
319
|
-
RecordSize += m_iFieldLen[i];
|
|
320
|
-
}
|
|
321
|
-
m_iRecordCountDirect = &disc->iRecordCount;
|
|
322
|
-
m_pEntendBuflen = FilterHead->BufLen;
|
|
323
|
-
if (disc->iRecordCount == 0)
|
|
324
|
-
{
|
|
325
|
-
disc->iRecordCount = (ushort_td)(57000 / (RecordSize + 6));
|
|
326
|
-
}
|
|
327
|
-
m_ExDataBufLen = (ushort_td)((disc->iRecordCount * (RecordSize + 6)) + 2);
|
|
328
|
-
|
|
329
|
-
if ((ushort_td)m_ExDataBufLen < m_pEntendBuflen)
|
|
330
|
-
m_ExDataBufLen = m_pEntendBuflen;
|
|
331
|
-
|
|
332
|
-
uint_td len;
|
|
333
|
-
if ((m_FieldSelected == false) && !m_tb->valiableFormatType())
|
|
334
|
-
len = m_ExDataBufLen;
|
|
335
|
-
else
|
|
336
|
-
len = (uint_td)(m_ExDataBufLen + m_tb->buflen());
|
|
337
|
-
|
|
338
|
-
if (m_tb->buflen() < len)
|
|
339
|
-
{
|
|
340
|
-
m_tb->setDataBak((void*) realloc(m_tb->dataBak(), len));
|
|
341
|
-
m_tb->setData(m_tb->dataBak());
|
|
342
|
-
|
|
343
|
-
if (m_tb->data() == NULL)
|
|
344
|
-
return false;
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
-
return true;
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
bool filter::MakeFieldSelect(_TCHAR** str)
|
|
351
|
-
{
|
|
352
|
-
_TCHAR* p;
|
|
353
|
-
_TCHAR* ret;
|
|
354
|
-
_TCHAR* point[255];
|
|
355
|
-
ushort_td index = 0;
|
|
356
|
-
_TCHAR FiledName[20] = {0x00};
|
|
357
|
-
|
|
358
|
-
m_iFieldCount = 0;
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
*str += 7; // "select" length = 7
|
|
362
|
-
point[index] = *str;
|
|
363
|
-
|
|
364
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
|
|
365
|
-
if (ret == NULL)
|
|
366
|
-
return false;
|
|
367
|
-
ret[0] = 0x00; // set null
|
|
368
|
-
*str = ret + 1;
|
|
369
|
-
|
|
370
|
-
index++;
|
|
371
|
-
p = (_TCHAR*)_tcsmstr((_TUCHAR*)point[index - 1], (_TUCHAR*)_T(",")) + 1;
|
|
372
|
-
point[index] = p;
|
|
373
|
-
p--;
|
|
374
|
-
while (p)
|
|
375
|
-
{
|
|
376
|
-
index++;
|
|
377
|
-
p = (_TCHAR*)_tcsmstr((_TUCHAR*)point[index - 1], (_TUCHAR*)_T(","));
|
|
378
|
-
if (p)
|
|
379
|
-
point[index] = p + 1;
|
|
380
|
-
else
|
|
381
|
-
break;
|
|
382
|
-
|
|
383
|
-
}
|
|
384
|
-
point[index] = ret + 1;
|
|
385
|
-
size_t n;
|
|
386
|
-
short FieldNum;
|
|
387
|
-
for (int i = 0; i < index; i++)
|
|
388
|
-
{
|
|
389
|
-
n = point[i + 1] - point[i] - 1;
|
|
390
|
-
_tcsncpy(FiledName, point[i], n);
|
|
391
|
-
FiledName[n] = 0x00;
|
|
392
|
-
FieldNum = m_tb->fieldNumByName(FiledName);
|
|
393
|
-
if (FieldNum < 0)
|
|
394
|
-
return false;
|
|
395
|
-
m_iFieldLen[i] = m_tb->tableDef()->fieldDefs[FieldNum].len;
|
|
396
|
-
m_iFieldOffset[i] = m_tb->tableDef()->fieldDefs[FieldNum].pos;
|
|
397
|
-
}
|
|
398
|
-
m_iFieldCount = index;
|
|
399
|
-
m_FieldSelected = true;
|
|
400
|
-
|
|
401
|
-
return true;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
short filter::GetField(_TCHAR** str)
|
|
405
|
-
{
|
|
406
|
-
_TCHAR* ret;
|
|
407
|
-
_TCHAR FiledName[20] = {0x00};
|
|
408
|
-
int offset = 0;
|
|
409
|
-
// Get string that until next space.
|
|
410
|
-
if (*str[0] == '[')
|
|
411
|
-
{
|
|
412
|
-
offset = 1;
|
|
413
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*) _T("]"));
|
|
414
|
-
}
|
|
415
|
-
else
|
|
416
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
|
|
417
|
-
|
|
418
|
-
if (ret)
|
|
419
|
-
{
|
|
420
|
-
_tcsncpy(FiledName, *str + offset, ret - *str - offset);
|
|
421
|
-
*str = ret + 1 + offset;
|
|
422
|
-
return m_tb->fieldNumByName(FiledName);
|
|
423
|
-
}
|
|
424
|
-
else
|
|
425
|
-
return -1;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
bool filter::GetCompStr(_TCHAR** str)
|
|
429
|
-
{
|
|
430
|
-
_TCHAR* ret;
|
|
431
|
-
int offset = 0;
|
|
432
|
-
|
|
433
|
-
// Get string that until next space.
|
|
434
|
-
if (*str[0] == _T('['))
|
|
435
|
-
{
|
|
436
|
-
offset = 1;
|
|
437
|
-
ret = _tcsstr(*str, _T("]"));
|
|
438
|
-
if (!ret)
|
|
439
|
-
return false;
|
|
440
|
-
}
|
|
441
|
-
else if (*str[0] == _T('\''))
|
|
442
|
-
{ // find next '
|
|
443
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str + 1, (_TUCHAR*)_T("\'"));
|
|
444
|
-
|
|
445
|
-
if (ret)
|
|
446
|
-
ret += 1;
|
|
447
|
-
else
|
|
448
|
-
return false;
|
|
449
|
-
}
|
|
450
|
-
else
|
|
451
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
|
|
452
|
-
|
|
453
|
-
if (ret)
|
|
454
|
-
{
|
|
455
|
-
*ret = 0x00;
|
|
456
|
-
*str = ret + 1 + offset;
|
|
457
|
-
|
|
458
|
-
}
|
|
459
|
-
return true;
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
uchar_td filter::GetLogical(_TCHAR** str)
|
|
463
|
-
{
|
|
464
|
-
_TCHAR* ret;
|
|
465
|
-
_TCHAR LogicalStr[10] = {0x00};
|
|
466
|
-
|
|
467
|
-
// Get string that until next space.
|
|
468
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
|
|
469
|
-
if (ret)
|
|
470
|
-
{
|
|
471
|
-
_tcsncpy(LogicalStr, *str, ret - *str);
|
|
472
|
-
_tcsmupr((_TUCHAR*)LogicalStr);
|
|
473
|
-
*str = ret + 1;
|
|
474
|
-
if (_tcscmp(LogicalStr, _T("AND")) == 0)
|
|
475
|
-
return (uchar_td)1;
|
|
476
|
-
else if (_tcscmp(LogicalStr, _T("OR")) == 0)
|
|
477
|
-
return (uchar_td)2;
|
|
478
|
-
else
|
|
479
|
-
return 0;
|
|
480
|
-
}
|
|
481
|
-
else
|
|
482
|
-
return 0;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
uchar_td filter::GetCompType(_TCHAR** str)
|
|
486
|
-
{
|
|
487
|
-
_TCHAR* ret;
|
|
488
|
-
_TCHAR cmpstr[10] = {0x00};
|
|
489
|
-
|
|
490
|
-
// Get string that until next space.
|
|
491
|
-
ret = (_TCHAR*)_tcsmstr((_TUCHAR*)*str, (_TUCHAR*)_T(" "));
|
|
492
|
-
if (ret)
|
|
493
|
-
{
|
|
494
|
-
_tcsncpy(cmpstr, *str, ret - *str);
|
|
495
|
-
*str = ret + 1;
|
|
496
|
-
if (_tcscmp(cmpstr, _T("=")) == 0)
|
|
497
|
-
return (uchar_td)1;
|
|
498
|
-
|
|
499
|
-
if (_tcscmp(cmpstr, _T(">")) == 0)
|
|
500
|
-
return (uchar_td)2;
|
|
501
|
-
|
|
502
|
-
if (_tcscmp(cmpstr, _T("<")) == 0)
|
|
503
|
-
return (uchar_td)3;
|
|
504
|
-
|
|
505
|
-
if (_tcscmp(cmpstr, _T("<>")) == 0)
|
|
506
|
-
return (uchar_td)4;
|
|
507
|
-
|
|
508
|
-
if (_tcscmp(cmpstr, _T("=>")) == 0)
|
|
509
|
-
return (uchar_td)5;
|
|
510
|
-
if (_tcscmp(cmpstr, _T(">=")) == 0)
|
|
511
|
-
return (uchar_td)5;
|
|
512
|
-
|
|
513
|
-
if (_tcscmp(cmpstr, _T("=<")) == 0)
|
|
514
|
-
return (uchar_td)6;
|
|
515
|
-
if (_tcscmp(cmpstr, _T("<=")) == 0)
|
|
516
|
-
return (uchar_td)6;
|
|
517
|
-
return 255;
|
|
518
|
-
}
|
|
519
|
-
else
|
|
520
|
-
return 255;
|
|
521
|
-
}
|
|
522
38
|
|
|
523
39
|
}// namespace client
|
|
524
40
|
}// namespace tdap
|