transactd 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CMakeLists.txt +37 -4
  3. data/bin/common/tdclc_32_1_2.dll +0 -0
  4. data/bin/common/tdclc_64_1_2.dll +0 -0
  5. data/build/common/transactd_cl_common.cmake +0 -1
  6. data/build/common/transactd_common.cmake +26 -6
  7. data/build/swig/php/generate.cmake.in +58 -0
  8. data/build/swig/php/generate.cmd.in +41 -0
  9. data/build/swig/php/php.swg +155 -0
  10. data/build/swig/ruby/ruby.swg +38 -0
  11. data/build/swig/tdcl.i +133 -3
  12. data/build/tdclc/CMakeLists.txt +4 -1
  13. data/build/tdclc/tdclc_32.cbproj +1 -1
  14. data/build/tdclc/tdclc_64.cbproj +1 -1
  15. data/build/tdclcpp/CMakeLists.txt +1 -1
  16. data/build/tdclcpp/tdclcpp_bcb_32.cbproj +1 -4
  17. data/build/tdclcpp/tdclcpp_bcb_64.cbproj +0 -3
  18. data/build/tdclrb/CMakeLists.txt +1 -1
  19. data/build/tdclrb/GEM_VERSION +2 -2
  20. data/source/bzs/db/engine/mysql/IReadRecords.h +1 -1
  21. data/source/bzs/db/engine/mysql/bookmark.h +3 -3
  22. data/source/bzs/db/engine/mysql/database.cpp +95 -19
  23. data/source/bzs/db/engine/mysql/database.h +6 -6
  24. data/source/bzs/db/engine/mysql/mysqlInternal.h +43 -1
  25. data/source/bzs/db/engine/mysql/mysqlThd.cpp +10 -8
  26. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +1 -1
  27. data/source/bzs/db/protocol/tdap/btrDate.h +2 -2
  28. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +15 -8
  29. data/source/bzs/db/protocol/tdap/client/dbDef.h +2 -2
  30. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +4 -0
  31. data/source/bzs/db/protocol/tdap/client/fieldDDF.cpp +0 -5
  32. data/source/bzs/db/protocol/tdap/client/fileDDF.cpp +0 -4
  33. data/source/bzs/db/protocol/tdap/client/filter.cpp +0 -484
  34. data/source/bzs/db/protocol/tdap/client/filter.h +696 -84
  35. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +13 -3
  36. data/source/bzs/db/protocol/tdap/client/nsTable.h +12 -6
  37. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -1
  38. data/source/bzs/db/protocol/tdap/client/stringConverter.h +1 -0
  39. data/source/bzs/db/protocol/tdap/client/table.cpp +519 -75
  40. data/source/bzs/db/protocol/tdap/client/table.h +49 -7
  41. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +145 -124
  42. data/source/bzs/db/protocol/tdap/client/trdboostapiInternal.h +39 -0
  43. data/source/bzs/db/protocol/tdap/client/trdormapi.h +872 -0
  44. data/source/bzs/db/protocol/tdap/myDateTime.cpp +8 -8
  45. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +7 -9
  46. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +406 -195
  47. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +64 -13
  48. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +2 -1
  49. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +35 -3
  50. data/source/bzs/db/protocol/tdap/tdapSchema.h +11 -3
  51. data/source/bzs/db/protocol/tdap/tdapcapi.h +63 -53
  52. data/source/bzs/env/crosscompile.h +8 -3
  53. data/source/bzs/example/connection_pool_c.cpp +1 -7
  54. data/source/bzs/example/useORM.cpp +585 -0
  55. data/source/bzs/rtl/exception.h +6 -0
  56. data/source/bzs/test/tdclatl/bench_tdclatl.js +12 -7
  57. data/source/bzs/test/tdclphp/transactd_Test.php +1845 -0
  58. data/source/bzs/test/tdclphp/transactd_blob_Test.php +325 -0
  59. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +183 -0
  60. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +212 -0
  61. data/source/bzs/test/tdclrb/transactd_blob_spec.rb +332 -0
  62. data/source/bzs/test/tdclrb/transactd_spec.rb +256 -1
  63. data/source/bzs/test/trdclengn/test_blob.cpp +327 -0
  64. data/source/bzs/test/trdclengn/test_trdclengn.cpp +485 -5
  65. data/source/global/tdclatl/QueryBase.cpp +231 -0
  66. data/source/global/tdclatl/QueryBase.h +96 -0
  67. data/source/global/tdclatl/Table.cpp +24 -0
  68. data/source/global/tdclatl/Table.h +2 -1
  69. data/source/global/tdclatl/resource.h +0 -0
  70. data/source/global/tdclatl/tdclatl.idl +88 -2
  71. metadata +16 -3
  72. data/bin/common/tdclc_32_1_1.dll +0 -0
  73. 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