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
@@ -100,6 +100,21 @@ def testCreateTable(db)
100
100
  fd.len = 33
101
101
  dbdef.updateTableDef(1)
102
102
  expect(dbdef.stat()).to eq 0
103
+
104
+ fd = dbdef.insertField(1, 2)
105
+ fd.setName('select')
106
+ fd.type = Transactd::Ft_integer
107
+ fd.len = 4
108
+ dbdef.updateTableDef(1)
109
+ expect(dbdef.stat()).to eq 0
110
+
111
+ fd = dbdef.insertField(1, 3)
112
+ fd.setName('in')
113
+ fd.type = Transactd::Ft_integer
114
+ fd.len = 4
115
+ dbdef.updateTableDef(1)
116
+ expect(dbdef.stat()).to eq 0
117
+
103
118
  kd = dbdef.insertKey(1,0)
104
119
  kd.segment(0).fieldNum = 0
105
120
  kd.segment(0).flags.bit8 = 1
@@ -191,6 +206,7 @@ def testFind(db)
191
206
  i = i - 1
192
207
  end
193
208
  # out of filter range (EOF)
209
+ tb.clearBuffer()
194
210
  v = TEST_COUNT
195
211
  tb.setFV(FDI_ID, v)
196
212
  tb.find(Transactd::Table::FindForword)
@@ -215,6 +231,79 @@ def testFindNext(db)
215
231
  tb.close()
216
232
  end
217
233
 
234
+ def testFindIn(db)
235
+ tb = testOpenTable(db)
236
+ tb.setKeyNum(0)
237
+ tb.clearBuffer()
238
+ q = Transactd::QueryBase.new()
239
+ q.addInValue('10', true)
240
+ q.addInValue('300000')
241
+ q.addInValue('50')
242
+ q.addInValue('-1')
243
+ q.addInValue('80')
244
+ q.addInValue('5000')
245
+
246
+ tb.setQuery(q)
247
+ expect(tb.stat()).to eq 0
248
+ tb.find()
249
+ expect(tb.stat()).to eq 0
250
+ expect(tb.getFVint(FDI_ID)).to eq 10
251
+ tb.findNext()
252
+ expect(tb.stat()).to eq Transactd::STATUS_NOT_FOUND_TI
253
+
254
+ msg = tb.keyValueDescription()
255
+ expect(msg).to eq "table:user\nstat:4\nid = 300000\n"
256
+
257
+ tb.findNext()
258
+ expect(tb.getFVint(FDI_ID)).to eq 50
259
+ tb.findNext()
260
+ expect(tb.stat()).to eq Transactd::STATUS_NOT_FOUND_TI
261
+
262
+ msg = tb.keyValueDescription()
263
+ expect(msg).to eq "table:user\nstat:4\nid = -1\n"
264
+
265
+ tb.findNext()
266
+ expect(tb.getFVint(FDI_ID)).to eq 80
267
+ tb.findNext()
268
+ expect(tb.getFVint(FDI_ID)).to eq 5000
269
+ tb.findNext()
270
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
271
+
272
+ # Many params
273
+ q.addInValue('1', true)
274
+ 2.upto(10000) do |i|
275
+ q.addInValue(i.to_s)
276
+ end
277
+ tb.setQuery(q)
278
+ expect(tb.stat()).to eq 0
279
+
280
+ tb.find()
281
+ i = 0
282
+ while tb.stat() == 0 do
283
+ i = i + 1
284
+ expect(tb.getFVint(FDI_ID)).to eq i
285
+ tb.findNext(true)
286
+ end
287
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
288
+ expect(i).to eq 10000
289
+
290
+ # LogicalCountLimit
291
+ q.select('id')
292
+ tb.setQuery(q)
293
+
294
+ tb.find()
295
+ i = 0
296
+ while tb.stat() == 0 do
297
+ i = i + 1
298
+ expect(tb.getFVint(FDI_ID)).to eq i
299
+ tb.findNext(true)
300
+ end
301
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
302
+ expect(i).to eq 10000
303
+
304
+ tb.close()
305
+ end
306
+
218
307
  def testGetPercentage(db)
219
308
  tb = testOpenTable(db)
220
309
  tb.clearBuffer()
@@ -448,7 +537,7 @@ def testSnapShot(db)
448
537
  if ISOLATION_READ_COMMITTED
449
538
  expect(tb2.stat()).to eq 0
450
539
  elsif ISOLATION_REPEATABLE_READ
451
- expect(tb2.stat()).to eq STATUS_LOCK_ERROR
540
+ expect(tb2.stat()).to eq Transactd::STATUS_LOCK_ERROR
452
541
  end
453
542
  # ----------------------------------------------------
454
543
  tb.seekFirst()
@@ -1263,6 +1352,7 @@ def testCreateTableStringFilter(db, id, name, type, type2)
1263
1352
  end
1264
1353
 
1265
1354
  def doTestInsertStringFilter(tb)
1355
+ tb.beginBulkInsert(BULKBUFSIZE)
1266
1356
  tb.clearBuffer()
1267
1357
  id = 1
1268
1358
  tb.setFV('id', id)
@@ -1293,6 +1383,7 @@ def doTestInsertStringFilter(tb)
1293
1383
  tb.setFV('name', 'おめでとうございます。')
1294
1384
  tb.setFV('namew', 'おめでとうございます。')
1295
1385
  tb.insert()
1386
+ tb.commitBulkInsert()
1296
1387
  end
1297
1388
 
1298
1389
  def doTestReadStringFilter(tb)
@@ -1325,18 +1416,91 @@ end
1325
1416
  def doTestSetStringFilter(tb)
1326
1417
  tb.setKeyNum(0)
1327
1418
  tb.clearBuffer()
1419
+
1328
1420
  tb.setFilter("name = 'あい*'", 0, 10)
1421
+ expect(tb.stat()).to eq 0
1329
1422
  tb.seekFirst()
1423
+ expect(tb.stat()).to eq 0
1330
1424
  tb.findNext(false)
1331
1425
  expect(tb.stat()).to eq 0
1332
1426
  expect(tb.getFVstr(FDI_NAME)).to eq 'あいうえおかきくこ'
1333
1427
  expect(tb.recordCount()).to eq 2
1428
+
1334
1429
  tb.setFilter("name <> 'あい*'", 0, 10)
1335
1430
  expect(tb.recordCount()).to eq 3
1431
+ tb.clearBuffer()
1432
+ tb.seekFirst()
1433
+ expect(tb.stat()).to eq 0
1434
+ tb.findNext(false)
1435
+ expect(tb.stat()).to eq 0
1436
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'A123456'
1437
+
1438
+ tb.findNext()
1439
+ expect(tb.stat()).to eq 0
1440
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おはようございます'
1441
+
1442
+ tb.findNext()
1443
+ expect(tb.stat()).to eq 0
1444
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おめでとうございます。'
1445
+
1446
+ tb.findNext()
1447
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
1448
+
1449
+ tb.clearBuffer()
1450
+ tb.seekLast()
1451
+ tb.findPrev(false)
1452
+ expect(tb.stat()).to eq 0
1453
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おめでとうございます。'
1454
+
1455
+ tb.findPrev()
1456
+ expect(tb.stat()).to eq 0
1457
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'おはようございます'
1458
+
1459
+ tb.findPrev(false)
1460
+ expect(tb.stat()).to eq 0
1461
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'A123456'
1462
+
1463
+ tb.findPrev()
1464
+ expect(tb.stat()).to eq Transactd::STATUS_EOF
1465
+
1336
1466
  tb.setFilter("name = 'あい'", 0, 10)
1337
1467
  expect(tb.recordCount()).to eq 0
1468
+
1338
1469
  tb.setFilter("name <> ''", 0, 10)
1339
1470
  expect(tb.recordCount()).to eq 5
1471
+
1472
+ # testing that setFilter don't change field value
1473
+ tb.clearBuffer()
1474
+ tb.setFV('name', 'ABCDE')
1475
+ tb.setFilter("name = 'あい'", 0, 10)
1476
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE'
1477
+ end
1478
+
1479
+ def doTestUpdateStringFilter(tb)
1480
+ tb.setKeyNum(0)
1481
+ tb.clearBuffer()
1482
+ tb.seekFirst()
1483
+ expect(tb.stat()).to eq 0
1484
+ tb.setFV('name', 'ABCDE')
1485
+ tb.setFV('namew', 'ABCDEW')
1486
+ tb.update()
1487
+ expect(tb.stat()).to eq 0
1488
+ tb.seekNext()
1489
+ expect(tb.stat()).to eq 0
1490
+
1491
+ tb.setFV('name', 'ABCDE2')
1492
+ tb.setFV('namew', 'ABCDEW2')
1493
+ tb.update()
1494
+ expect(tb.stat()).to eq 0
1495
+
1496
+ tb.seekFirst()
1497
+ expect(tb.stat()).to eq 0
1498
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE'
1499
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'ABCDEW'
1500
+ tb.seekNext()
1501
+ expect(tb.stat()).to eq 0
1502
+ expect(tb.getFVstr(FDI_NAME)).to eq 'ABCDE2'
1503
+ expect(tb.getFVstr(FDI_NAMEW)).to eq 'ABCDEW2'
1340
1504
  end
1341
1505
 
1342
1506
  def doTestStringFilter(db, id, name, type, type2)
@@ -1346,6 +1510,7 @@ def doTestStringFilter(db, id, name, type, type2)
1346
1510
  doTestInsertStringFilter(tb)
1347
1511
  doTestReadStringFilter(tb)
1348
1512
  doTestSetStringFilter(tb)
1513
+ doTestUpdateStringFilter(tb)
1349
1514
  tb.close()
1350
1515
  end
1351
1516
 
@@ -1374,6 +1539,90 @@ def testDropDatabaseStringFilter(db)
1374
1539
  expect(db.stat()).to eq 0
1375
1540
  end
1376
1541
 
1542
+ def testQuery()
1543
+ q = Transactd::QueryBase.new()
1544
+ q.queryString("id = 0 and name = 'Abc efg'")
1545
+ expect(q.toString()).to eq "id = '0' and name = 'Abc efg'"
1546
+
1547
+ q.queryString('')
1548
+ q.where('id', '=', '0').andWhere('name', '=', 'Abc efg')
1549
+ expect(q.toString()).to eq "id = '0' and name = 'Abc efg'"
1550
+
1551
+ q.queryString("select id,name id = 0 AND name = 'Abc&' efg'")
1552
+ expect(q.toString()).to eq "select id,name id = '0' AND name = 'Abc&' efg'"
1553
+
1554
+ q.queryString('')
1555
+ q.select('id', 'name').where('id', '=', '0').andWhere('name', '=', "Abc' efg")
1556
+ expect(q.toString()).to eq "select id,name id = '0' and name = 'Abc&' efg'"
1557
+
1558
+ q.queryString("select id,name id = 0 AND name = 'Abc&& efg'")
1559
+ expect(q.toString()).to eq "select id,name id = '0' AND name = 'Abc&& efg'"
1560
+
1561
+ q.queryString('')
1562
+ q.select('id', 'name').where('id', '=', '0').andWhere('name', '=', 'Abc& efg')
1563
+ expect(q.toString()).to eq "select id,name id = '0' and name = 'Abc&& efg'"
1564
+
1565
+ q.queryString('*')
1566
+ expect(q.toString()).to eq '*'
1567
+
1568
+ q.all()
1569
+ expect(q.toString()).to eq '*'
1570
+
1571
+ q.queryString('Select id,name id = 2')
1572
+ expect(q.toString()).to eq "select id,name id = '2'"
1573
+
1574
+ q.queryString('')
1575
+ q.select('id', 'name').where('id', '=', '2')
1576
+ expect(q.toString()).to eq "select id,name id = '2'"
1577
+
1578
+ q.queryString('SELECT id,name,fc id = 2')
1579
+ expect(q.toString()).to eq "select id,name,fc id = '2'"
1580
+
1581
+ q.queryString('')
1582
+ q.select('id', 'name', 'fc').where('id', '=', '2')
1583
+ expect(q.toString()).to eq "select id,name,fc id = '2'"
1584
+
1585
+ q.queryString("select id,name,fc id = 2 and name = '3'")
1586
+ expect(q.toString()).to eq "select id,name,fc id = '2' and name = '3'"
1587
+
1588
+ q.queryString('')
1589
+ q.select('id', 'name', 'fc').where('id', '=', '2').andWhere('name', '=', '3')
1590
+ expect(q.toString()).to eq "select id,name,fc id = '2' and name = '3'"
1591
+
1592
+ # IN include
1593
+ q.queryString("select id,name,fc IN '1','2','3'")
1594
+ expect(q.toString()).to eq "select id,name,fc in '1','2','3'"
1595
+
1596
+ q.queryString('')
1597
+ q.select('id', 'name', 'fc').In('1', '2', '3')
1598
+ expect(q.toString()).to eq "select id,name,fc in '1','2','3'"
1599
+
1600
+ q.queryString("IN '1','2','3'")
1601
+ expect(q.toString()).to eq "in '1','2','3'"
1602
+
1603
+ q.queryString('IN 1,2,3')
1604
+ expect(q.toString()).to eq "in '1','2','3'"
1605
+
1606
+ q.queryString('')
1607
+ q.In('1', '2', '3')
1608
+ expect(q.toString()).to eq "in '1','2','3'"
1609
+
1610
+ # special field name
1611
+ q.queryString('select = 1')
1612
+ expect(q.toString()).to eq "select = '1'"
1613
+
1614
+ q.queryString('')
1615
+ q.where('select', '=', '1')
1616
+ expect(q.toString()).to eq "select = '1'"
1617
+
1618
+ q.queryString('in <> 1')
1619
+ expect(q.toString()).to eq "in <> '1'"
1620
+
1621
+ q.queryString('')
1622
+ q.where('in', '<>', '1')
1623
+ expect(q.toString()).to eq "in <> '1'"
1624
+ end
1625
+
1377
1626
 
1378
1627
  describe Transactd do
1379
1628
  before :each do
@@ -1405,6 +1654,9 @@ describe Transactd do
1405
1654
  it 'findNext' do
1406
1655
  testFindNext(@db)
1407
1656
  end
1657
+ it 'findIn' do
1658
+ testFindIn(@db)
1659
+ end
1408
1660
  it 'get percentage' do
1409
1661
  testGetPercentage(@db)
1410
1662
  end
@@ -1465,6 +1717,9 @@ describe Transactd do
1465
1717
  it 'login' do
1466
1718
  testLogin(@db)
1467
1719
  end
1720
+ it 'query' do
1721
+ testQuery()
1722
+ end
1468
1723
  end
1469
1724
 
1470
1725
  describe Transactd, 'var tables' do
@@ -0,0 +1,327 @@
1
+ #include <boost/test/included/unit_test.hpp>
2
+ #include <bzs/db/protocol/tdap/client/database.h>
3
+ #include <bzs/db/protocol/tdap/client/table.h>
4
+ #include <bzs/db/protocol/tdap/client/dbDef.h>
5
+ #include <bzs/db/protocol/tdap/mysql/characterset.h>
6
+ #include <bzs/db/protocol/tdap/tdapcapi.h>
7
+ #include <bzs/db/protocol/tdap/client/stringConverter.h>
8
+ #include <stdio.h>
9
+ #include <bzs/db/protocol/tdap/client/filter.h>
10
+
11
+ using namespace bzs::db::protocol::tdap::client;
12
+ using namespace bzs::db::protocol::tdap;
13
+ using namespace std;
14
+ #define ISOLATION_READ_COMMITTED
15
+
16
+ #define URL _T("tdap://localhost/testString?dbfile=test.bdf")
17
+ #define TABLE_NAME _T("comments")
18
+ #define TABLE_ID 1
19
+
20
+ #define FDN_ID _T("id")
21
+ #define FDN_USER _T("user_id")
22
+ #define FDN_BODY _T("body")
23
+ #define FDN_IMAGE _T("image")
24
+ #define FDI_ID (short)0
25
+ #define FDI_USER (short)1
26
+ #define FDI_BODY (short)2
27
+ #define FDI_IMAGE (short)3
28
+
29
+ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[]);
30
+
31
+ boost::unit_test::test_suite* init_unit_test_suite(int argc, char* argv[])
32
+ {
33
+ return 0;
34
+ }
35
+
36
+ class fixture
37
+ {
38
+ mutable database* m_db;
39
+
40
+ public:
41
+ fixture() : m_db(NULL)
42
+ {
43
+ m_db = database::create();
44
+ if (!m_db)
45
+ printf("Error database::create()\n");
46
+ }
47
+
48
+ ~fixture()
49
+ {
50
+ if (m_db)
51
+ database::destroy(m_db);
52
+ }
53
+
54
+ ::database* db() const {return m_db;}
55
+ };
56
+
57
+ // ------------------------------------------------------------------------
58
+
59
+ void doInsertStringFileter(table* tb)
60
+ {
61
+ tb->clearBuffer();
62
+ tb->setFV(FDI_USER, 1);
63
+ tb->setFV(FDI_BODY, _T("1\ntest\nテスト\n\nあいうえおあいうえおb"));
64
+ tb->setFV(FDI_IMAGE, _T("1\ntest\nテスト\n\nあいうえおあいうえおi"));
65
+ tb->insert();
66
+
67
+ tb->clearBuffer();
68
+ tb->setFV(FDI_USER, 1);
69
+ tb->setFV(FDI_BODY, _T("2\ntest\nテスト\n\nあいうえおあいうえおb"));
70
+ tb->setFV(FDI_IMAGE, _T("2\ntest\nテスト\n\nあいうえおあいうえおi"));
71
+ tb->insert();
72
+
73
+ tb->clearBuffer();
74
+ tb->setFV(FDI_USER, 2);
75
+ tb->setFV(FDI_BODY, _T("3\ntest\nテスト\n\nあいうえおあいうえおb"));
76
+ tb->setFV(FDI_IMAGE, _T("3\ntest\nテスト\n\nあいうえおあいうえおi"));
77
+ tb->insert();
78
+ }
79
+
80
+ void doTestSeek(table* tb)
81
+ {
82
+ uint_td dummy = 0;
83
+ // 1
84
+ tb->clearBuffer();
85
+ tb->setFV(FDI_ID, 1);
86
+ tb->seek();
87
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 1");
88
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestSeek - id 1");
89
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 1");
90
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
91
+ _tstring(_T("1\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 1");
92
+ // 2
93
+ tb->seekNext();
94
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 2");
95
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestSeek - id 2");
96
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 2");
97
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
98
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 2");
99
+ // 3
100
+ tb->seekNext();
101
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 3");
102
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 3, "doTestSeek - id 3");
103
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 2, "doTestSeek - user_id 3");
104
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
105
+ _tstring(_T("3\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 3");
106
+ // 2
107
+ tb->seekPrev();
108
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestSeek - stat 2");
109
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestSeek - id 2");
110
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestSeek - user_id 2");
111
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
112
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestSeek - body 2");
113
+ }
114
+
115
+ void doTestFind(table* tb)
116
+ {
117
+ tb->setKeyNum(0);
118
+ tb->clearBuffer();
119
+
120
+ tb->setFilter(_T("id >= 1 and id < 3"), 1, 0);
121
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - setFilter");
122
+
123
+ tb->setFV(FDI_ID, 1);
124
+ tb->find(table::findForword);
125
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - find");
126
+ BOOST_CHECK_MESSAGE(1 == tb->getFVint(FDI_ID), "doTestFind - getFVint 1");
127
+
128
+ tb->findNext(true);
129
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestFind - findNext");
130
+ BOOST_CHECK_MESSAGE(2 == tb->getFVint(FDI_ID), "doTestFind - getFVint 2");
131
+ BOOST_CHECK_MESSAGE(
132
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえおb")) == _tstring(tb->getFVstr(FDI_BODY)),
133
+ "doTestFind - getFVstr 2");
134
+ tb->findNext(true);
135
+ BOOST_CHECK_MESSAGE(9 == tb->stat(), "doTestFind - findNext");
136
+ // 2
137
+ tb->findPrev(true);
138
+ BOOST_CHECK_MESSAGE(tb->stat() == STATUS_PROGRAM_ERROR, "doTestFind - findPrev");
139
+ }
140
+
141
+ void doTestUpdate(table* tb)
142
+ {
143
+ // select 1
144
+ tb->clearBuffer();
145
+ tb->setFV(FDI_ID, 1);
146
+ tb->seek();
147
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 1");
148
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestUpdate - id 1");
149
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestUpdate - user_id 1");
150
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
151
+ _tstring(_T("1\ntest\nテスト\n\nあいうえおあいうえお")), "doTestUpdate - body 1");
152
+ // update
153
+ tb->setFV(FDI_USER, 11);
154
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 1");
155
+ tb->setFV(FDI_BODY, "1\nテスト\ntest\n\nABCDEFG");
156
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 1");
157
+ tb->update();
158
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - update stat 1");
159
+ // select 2
160
+ tb->seekNext();
161
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2");
162
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestUpdate - id 2");
163
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 1, "doTestUpdate - user_id 2");
164
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
165
+ _tstring(_T("2\ntest\nテスト\n\nあいうえおあいうえお")), "doTestUpdate - body 2");
166
+ // update
167
+ tb->setFV(FDI_USER, 12);
168
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 2");
169
+ tb->setFV(FDI_BODY, "2\nテスト\ntest\n\nABCDEFG");
170
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - setFV stat 2");
171
+ tb->update();
172
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - update stat 2");
173
+ // check 1
174
+ tb->seekPrev();
175
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2 1");
176
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestUpdate - id 2 1");
177
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 11, "doTestUpdate - user_id 2 1");
178
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
179
+ _tstring(_T("1\nテスト\ntest\n\nABCDEFG")), "doTestUpdate - body 2 1");
180
+ // check 2
181
+ tb->seekNext();
182
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestUpdate - stat 2 2");
183
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 2, "doTestUpdate - id 2 2");
184
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 12, "doTestUpdate - user_id 2 2");
185
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
186
+ _tstring(_T("2\nテスト\ntest\n\nABCDEFG")), "doTestUpdate - body 2 2");
187
+ }
188
+
189
+ void doTestDelete(table* tb)
190
+ {
191
+ // delete 2
192
+ tb->clearBuffer();
193
+ tb->setFV(FDI_ID, 2);
194
+ tb->seek();
195
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - seek 2");
196
+ tb->del();
197
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - delete 2");
198
+ // select 1
199
+ tb->clearBuffer();
200
+ tb->setFV(FDI_ID, 1);
201
+ tb->seek();
202
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - stat 1");
203
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 1, "doTestDelete - id 1");
204
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 11, "doTestDelete - user_id 1");
205
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
206
+ _tstring(_T("1\nテスト\ntest\n\nABCDEFG")), "doTestDelete - body 1");
207
+ // next is 3
208
+ tb->seekNext();
209
+ BOOST_CHECK_MESSAGE(0 == tb->stat(), "doTestDelete - stat 3");
210
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_ID) == 3, "doTestDelete - id 3");
211
+ BOOST_CHECK_MESSAGE(tb->getFVint(FDI_USER) == 2, "doTestDelete - user_id 3");
212
+ BOOST_CHECK_MESSAGE(_tstring(tb->getFVstr(FDI_BODY)) ==
213
+ _tstring(_T("3\ntest\nテスト\n\nあいうえおあいうえお")), "doTestDelete - body 3");
214
+ // eof
215
+ tb->seekNext();
216
+ BOOST_CHECK_MESSAGE(tb->stat() == STATUS_EOF, "doTestDelete - eof 3");
217
+ }
218
+
219
+ void createDatabase(database* db)
220
+ {
221
+ db->create(URL);
222
+ if (db->stat() == STATUS_TABLE_EXISTS_ERROR)
223
+ {
224
+ db->open(URL, 0, 0);
225
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1");
226
+ db->drop();
227
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat=" << db->stat());
228
+ db->create(URL);
229
+ }
230
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase");
231
+ }
232
+
233
+ void createTable(database* db)
234
+ {
235
+ // create table
236
+ dbdef* def = db->dbDef();
237
+ tabledef td;
238
+ memset(&td, 0, sizeof(td));
239
+ td.setTableName(TABLE_NAME);
240
+ _TCHAR buf[267];
241
+ _tcscpy_s(buf, 100, TABLE_NAME);
242
+ _tcscat_s(buf, 100, _T(".dat"));
243
+ td.setFileName(buf);
244
+ td.id = TABLE_ID;
245
+ td.primaryKeyNum = -1;
246
+ td.parentKeyNum = -1;
247
+ td.replicaKeyNum = -1;
248
+ td.pageSize = 2048;
249
+ td.charsetIndex = CHARSET_UTF8B4;
250
+
251
+ def->insertTable(&td);
252
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "insertTable stat = " << def->stat());
253
+
254
+ fielddef* fd = def->insertField(TABLE_ID, FDI_ID);
255
+ fd->setName(FDN_ID);
256
+ fd->type = ft_autoinc;
257
+ fd->len = (ushort_td)4;
258
+ def->updateTableDef(TABLE_ID);
259
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 1 stat = " << def->stat());
260
+
261
+ fd = def->insertField(TABLE_ID, FDI_USER);
262
+ fd->setName(FDN_USER);
263
+ fd->type = ft_integer;
264
+ fd->len = (ushort_td)4;
265
+ def->updateTableDef(TABLE_ID);
266
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 1 stat = " << def->stat());
267
+
268
+ fd = def->insertField(TABLE_ID, FDI_BODY);
269
+ fd->setName(FDN_BODY);
270
+ fd->type = ft_mytext;
271
+ fd->len = 10;
272
+ def->updateTableDef(TABLE_ID);
273
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 2 stat = " << def->stat());
274
+
275
+ fd = def->insertField(TABLE_ID, FDI_IMAGE);
276
+ fd->setName(FDN_IMAGE);
277
+ fd->type = ft_myblob;
278
+ fd->len = 10;
279
+ def->updateTableDef(TABLE_ID);
280
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 3");
281
+
282
+ keydef* kd = def->insertKey(TABLE_ID, 0);
283
+ kd->segments[0].fieldNum = 0;
284
+ kd->segments[0].flags.bit8 = 1; // extended key type
285
+ kd->segments[0].flags.bit1 = 1; // changeable
286
+ kd->segmentCount = 1;
287
+ def->updateTableDef(TABLE_ID);
288
+ BOOST_CHECK_MESSAGE(0 == def->stat(), "updateTableDef 4");
289
+ }
290
+
291
+ void testStringFileter(database* db)
292
+ {
293
+ createDatabase(db);
294
+
295
+ db->open(URL, 0, 0);
296
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "createNewDataBase 1 stat = " << db->stat());
297
+
298
+ createTable(db);
299
+
300
+ table* tb = db->openTable(TABLE_ID);
301
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "openTable");
302
+
303
+ doInsertStringFileter(tb);
304
+ doTestSeek(tb);
305
+ doTestFind(tb);
306
+ doTestUpdate(tb);
307
+ doTestDelete(tb);
308
+
309
+ tb->release();
310
+
311
+ db->close();
312
+
313
+ db->open(URL, 0, 0);
314
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop 1");
315
+ db->drop();
316
+ BOOST_CHECK_MESSAGE(0 == db->stat(), "drop stat=" << db->stat());
317
+ }
318
+
319
+
320
+ // ------------------------------------------------------------------------
321
+ BOOST_AUTO_TEST_SUITE(filter)
322
+
323
+ BOOST_FIXTURE_TEST_CASE(stringFileter, fixture) {testStringFileter(db());}
324
+
325
+ BOOST_AUTO_TEST_SUITE_END()
326
+ // ------------------------------------------------------------------------
327
+