transactd 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +4 -4
  2. data/bin/common/{tdclc_32_3_5.dll → tdclc_32_3_6.dll} +0 -0
  3. data/bin/common/tdclc_64_3_6.dll +0 -0
  4. data/build/swig/ruby/tdclrb_wrap.cpp +12524 -24430
  5. data/build/swig/tdcl.i +5 -0
  6. data/build/tdclc/tdclc.cbproj +1 -1
  7. data/build/tdclc/tdclc.rc +4 -4
  8. data/build/tdclcpp/tdclcpp.rc +4 -4
  9. data/build/tdclcpp/tdclcpp_bc.cbproj +1 -1
  10. data/build/tdclrb/tdclrb.rc +4 -4
  11. data/source/bzs/db/engine/mysql/database.cpp +210 -184
  12. data/source/bzs/db/engine/mysql/database.h +276 -105
  13. data/source/bzs/db/engine/mysql/mysqlInternal.h +37 -0
  14. data/source/bzs/db/engine/mysql/mysqlProtocol.cpp +1 -0
  15. data/source/bzs/db/protocol/hs/hsCommandExecuter.cpp +4 -4
  16. data/source/bzs/db/protocol/tdap/client/activeTable.h +1 -1
  17. data/source/bzs/db/protocol/tdap/client/activeTableImple.h +1 -0
  18. data/source/bzs/db/protocol/tdap/client/connMgr.cpp +1 -1
  19. data/source/bzs/db/protocol/tdap/client/database.cpp +7 -4
  20. data/source/bzs/db/protocol/tdap/client/database.h +6 -1
  21. data/source/bzs/db/protocol/tdap/client/databaseManager.h +2 -2
  22. data/source/bzs/db/protocol/tdap/client/dbDef.cpp +21 -9
  23. data/source/bzs/db/protocol/tdap/client/dbDef.h +1 -1
  24. data/source/bzs/db/protocol/tdap/client/dllmain.cpp +10 -2
  25. data/source/bzs/db/protocol/tdap/client/field.cpp +29 -5
  26. data/source/bzs/db/protocol/tdap/client/field.h +3 -1
  27. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.cpp +5 -0
  28. data/source/bzs/db/protocol/tdap/client/fieldNameAlias.h +1 -0
  29. data/source/bzs/db/protocol/tdap/client/fields.h +9 -2
  30. data/source/bzs/db/protocol/tdap/client/groupQuery.cpp +8 -4
  31. data/source/bzs/db/protocol/tdap/client/memRecord.cpp +18 -5
  32. data/source/bzs/db/protocol/tdap/client/memRecord.h +2 -2
  33. data/source/bzs/db/protocol/tdap/client/nsTable.cpp +46 -13
  34. data/source/bzs/db/protocol/tdap/client/nsTable.h +5 -0
  35. data/source/bzs/db/protocol/tdap/client/recordset.cpp +5 -0
  36. data/source/bzs/db/protocol/tdap/client/recordset.h +1 -0
  37. data/source/bzs/db/protocol/tdap/client/recordsetImple.h +6 -2
  38. data/source/bzs/db/protocol/tdap/client/request.h +46 -38
  39. data/source/bzs/db/protocol/tdap/client/sqlBuilder.cpp +2 -3
  40. data/source/bzs/db/protocol/tdap/client/stringConverter.h +29 -13
  41. data/source/bzs/db/protocol/tdap/client/table.cpp +60 -10
  42. data/source/bzs/db/protocol/tdap/client/table.h +4 -1
  43. data/source/bzs/db/protocol/tdap/client/trdboostapi.h +18 -1
  44. data/source/bzs/db/protocol/tdap/client/trdormapi.h +10 -4
  45. data/source/bzs/db/protocol/tdap/fieldComp.h +1 -1
  46. data/source/bzs/db/protocol/tdap/mysql/characterset.h +1 -0
  47. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.cpp +11 -4
  48. data/source/bzs/db/protocol/tdap/mysql/databaseSchema.h +2 -1
  49. data/source/bzs/db/protocol/tdap/mysql/recordsetReader.h +52 -94
  50. data/source/bzs/db/protocol/tdap/mysql/request.h +20 -13
  51. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.cpp +92 -60
  52. data/source/bzs/db/protocol/tdap/mysql/tdapCommandExecuter.h +4 -4
  53. data/source/bzs/db/protocol/tdap/tdapRequest.h +11 -0
  54. data/source/bzs/db/protocol/tdap/tdapSchema.cpp +83 -34
  55. data/source/bzs/db/protocol/tdap/tdapSchema.h +5 -1
  56. data/source/bzs/db/protocol/tdap/tdapcapi.h +7 -3
  57. data/source/bzs/example/ormap_c.cpp +2 -2
  58. data/source/bzs/netsvc/server/serverPipe.cpp +35 -1
  59. data/source/bzs/test/tdclatl/test_v3.js +48 -1
  60. data/source/bzs/test/tdclphp/bench.php +89 -76
  61. data/source/bzs/test/tdclphp/transactd_Test.php +691 -687
  62. data/source/bzs/test/tdclphp/transactd_blob_Test.php +46 -43
  63. data/source/bzs/test/tdclphp/transactd_datetime_Test.php +46 -43
  64. data/source/bzs/test/tdclphp/transactd_kanjischema_Test.php +33 -33
  65. data/source/bzs/test/tdclphp/transactd_pool_Test.php +29 -25
  66. data/source/bzs/test/tdclphp/transactd_v3_Test.php +653 -183
  67. data/source/bzs/test/tdclrb/transactd_datetime_spec.rb +40 -4
  68. data/source/bzs/test/tdclrb/transactd_fetch_spec.rb +785 -0
  69. data/source/bzs/test/tdclrb/transactd_pool_spec.rb +21 -1
  70. data/source/bzs/test/tdclrb/transactd_setget_spec.rb +450 -0
  71. data/source/bzs/test/tdclrb/transactd_spec.rb +14 -2
  72. data/source/bzs/test/tdclrb/transactd_v3_spec.rb +1192 -11
  73. data/source/bzs/test/trdclengn/testField.h +522 -1
  74. data/source/bzs/test/trdclengn/test_tdclcpp_v3.cpp +37 -1
  75. data/source/bzs/test/trdclengn/test_trdclengn.cpp +62 -4
  76. data/source/global/tdclatl/RecordsetQuery.cpp +2 -1
  77. data/source/global/tdclatl/RecordsetQuery.h +1 -1
  78. data/source/global/tdclatl/Table.cpp +17 -0
  79. data/source/global/tdclatl/Table.h +3 -1
  80. data/source/global/tdclatl/tdclatl.idl +7 -2
  81. data/transactd.gemspec +1 -1
  82. metadata +7 -5
  83. data/bin/common/tdclc_64_3_5.dll +0 -0
@@ -203,9 +203,10 @@ def createUserTable(db)
203
203
  fieldIndex += 1
204
204
  fd = dbdef.insertField(tableid, fieldIndex)
205
205
  fd.setName('tel')
206
- fd.type = Transactd::Ft_myvarchar
207
- fd.len = 4
208
- fd.setLenByCharnum(21)
206
+ #fd.type = Transactd::Ft_myvarchar
207
+ #fd.setLenByCharnum(21)
208
+ fd.type = Transactd::Ft_myvarbinary
209
+ fd.len = 64
209
210
  fd.setNullable(true)
210
211
  fieldIndex += 1
211
212
  fd = dbdef.insertField(tableid, fieldIndex)
@@ -337,7 +338,145 @@ def createSetEnumBitTable(db)
337
338
  expect(db.stat()).to eq 0
338
339
  end
339
340
 
341
+ class RecordDateTime
342
+ attr_accessor :update_datetime, :create_datetime
343
+ def initialize
344
+ @update_datetime = nil
345
+ @create_datetime = nil
346
+ end
347
+ def empty?
348
+ @update_datetime.nil? && @create_datetime.nil?
349
+ end
350
+ end
351
+
352
+ class RecordDateTimeWithAlias
353
+ attr_accessor :update, :create
354
+ def initialize
355
+ @update = nil
356
+ @create = nil
357
+ end
358
+ def empty?
359
+ @update.nil? && @create.nil?
360
+ end
361
+ end
362
+
363
+ class DateTimeNest
364
+ attr_accessor :datetime, :aliased_datetime
365
+ def initialize
366
+ @datetime = RecordDateTime.new
367
+ @aliased_datetime = RecordDateTimeWithAlias.new
368
+ end
369
+ end
370
+
371
+ class NameHolder
372
+ attr_accessor :name, :"名前", :"名前2"
373
+ def initialize
374
+ @name = nil
375
+ @名前 = nil
376
+ @名前2 = nil
377
+ end
378
+ end
379
+
380
+ class NestName
381
+ attr_accessor :name_holder
382
+ def initialize
383
+ @name_holder = NameHolder.new
384
+ end
385
+ end
386
+
387
+ class User
388
+ attr_accessor :a, :b, :c, :datetime, :aliased_datetime, :nest, :nest_name
389
+ def initialize(_a, _b, _c)
390
+ @a = _a
391
+ @b = _b
392
+ @c = _c
393
+ @datetime = RecordDateTime.new
394
+ @aliased_datetime = RecordDateTimeWithAlias.new
395
+ @nest = DateTimeNest.new
396
+ @nest_name = NestName.new
397
+ end
398
+
399
+ @_nodefine_original = false
400
+ def self.define_original_name
401
+ @_nodefine_original = false
402
+ end
403
+ def self.remove_original_name
404
+ @_nodefine_original = true
405
+ end
406
+
407
+ @_alias_map = {}
408
+ def self.alias_attribute(newname, oldname)
409
+ @_alias_map = {} if @_alias_map.nil?
410
+ @_alias_map[newname.to_sym] = oldname.to_s
411
+ end
412
+
413
+ @_transfer_map = {}
414
+ def self.transfer_map=(v)
415
+ @_transfer_map = v
416
+ end
417
+
418
+ def self.reset_class
419
+ remove_instance_variable(:@_alias_map) if self.instance_variables.include?(:@_alias_map)
420
+ remove_instance_variable(:@_accessor_initialized) if self.instance_variables.include?(:@_accessor_initialized)
421
+ remove_instance_variable(:@_transfer_map) if self.instance_variables.include?(:@_transfer_map)
422
+ remove_instance_variable(:@_internal_transfer_map) if self.instance_variables.include?(:@_internal_transfer_map)
423
+ ["id", "name", "名前", "名前2", "group", "tel", "update_datetime", "create_datetime"].each { |n|
424
+ remove_method(n.to_sym) if self.instance_methods(false).include?(n.to_sym)
425
+ remove_method("#{n}=".to_sym) if self.instance_methods(false).include?("#{n}=".to_sym)
426
+ }
427
+ end
428
+ end
429
+
430
+ class Number
431
+ attr_accessor :tel
432
+ end
433
+
434
+ class Phone
435
+ attr_accessor :number, :number2
436
+ def initialize
437
+ @number = Number.new
438
+ @number2 = nil
439
+ end
440
+ end
441
+
442
+ class UserT
443
+ attr_accessor :phone, :phone2, :id
444
+ def initialize
445
+ @id = 0
446
+ @phone = Phone.new
447
+ @phone2 = nil
448
+ end
449
+
450
+ @_transfer_map = { tel: [:phone, :number] }
451
+ def self.setTransferMap(type)
452
+ remove_instance_variable(:@_transfer_map) if self.instance_variables.include?(:@_transfer_map)
453
+ remove_instance_variable(:@_internal_transfer_map) if self.instance_variables.include?(:@_internal_transfer_map)
454
+ if (type == 0)
455
+ @_transfer_map = { tel: [:phone, :number] }
456
+ elsif (type == 1)
457
+ @_transfer_map = { tel: [:phone2, :number] }
458
+ elsif (type == 2)
459
+ @_transfer_map = { tel: [:phone, :number2] }
460
+ end
461
+ end
462
+ end
463
+
340
464
  describe Transactd, 'V3Features' do
465
+ it 'test no schema' do
466
+ db = Transactd::Database.new()
467
+ db.open(URL_AUTOSCHEMA)
468
+ if (db.stat == 0)
469
+ db.drop()
470
+ expect(db.stat()).to eq 0
471
+ end
472
+ db.create(URL_AUTOSCHEMA)
473
+ expect(db.stat()).to eq 0
474
+ db.open(URL_AUTOSCHEMA)
475
+ expect(db.stat()).to eq 0
476
+ db.drop()
477
+ expect(db.stat()).to eq 0
478
+ end
479
+
341
480
  it 'create tables' do
342
481
  db = Transactd::Database.new()
343
482
  createDatabase(db)
@@ -361,16 +500,23 @@ describe Transactd, 'V3Features' do
361
500
  expect(db.autoSchemaUseNullkey()).to eq true
362
501
  db.setAutoSchemaUseNullkey(false)
363
502
  expect(db.autoSchemaUseNullkey()).to eq false
364
- expect(Transactd::Database::compatibleMode()).to eq Transactd::Database::CMP_MODE_MYSQL_NULL
365
- Transactd::Database::setCompatibleMode(Transactd::Database::CMP_MODE_OLD_NULL)
366
- expect(Transactd::Database::compatibleMode()).to eq Transactd::Database::CMP_MODE_OLD_NULL
503
+ # default
504
+ expect(Transactd::Database::compatibleMode).to eq Transactd::Database::CMP_MODE_MYSQL_NULL
505
+ # CMP_MODE_OLD_NULL
506
+ Transactd::Database::set_compatible_mode(Transactd::Database::CMP_MODE_OLD_NULL)
507
+ expect(Transactd::Database::compatibleMode).to eq Transactd::Database::CMP_MODE_OLD_NULL
508
+ # CMP_MODE_BINFD_DEFAULT_STR
509
+ Transactd::Database::compatible_mode = Transactd::Database::CMP_MODE_BINFD_DEFAULT_STR
510
+ expect(Transactd::Database::compatibleMode).to eq Transactd::Database::CMP_MODE_BINFD_DEFAULT_STR
511
+ # CMP_MODE_MYSQL_NULL
367
512
  Transactd::Database::setCompatibleMode(Transactd::Database::CMP_MODE_MYSQL_NULL)
368
- expect(Transactd::Database::compatibleMode()).to eq Transactd::Database::CMP_MODE_MYSQL_NULL
513
+ expect(Transactd::Database::compatible_mode).to eq Transactd::Database::CMP_MODE_MYSQL_NULL
369
514
  db.close()
370
515
  end
371
516
 
372
517
  it 'check' do
373
518
  Transactd::Database::setCompatibleMode(Transactd::Database::CMP_MODE_MYSQL_NULL)
519
+ expect(Transactd::Database::compatible_mode).to eq Transactd::Database::CMP_MODE_MYSQL_NULL
374
520
  db = Transactd::Database.new()
375
521
  openDatabase(db)
376
522
  openTableOnce(db)
@@ -439,7 +585,7 @@ describe Transactd, 'V3Features' do
439
585
  # getSqlStringForCreateTable
440
586
  sql = db.getSqlStringForCreateTable("extention")
441
587
  expect(db.stat()).to eq 0
442
- expect(sql).to eq 'CREATE TABLE `extention` (`id` INT NOT NULL ,`comment` VARCHAR(60) binary NULL DEFAULT NULL,`bits` BIGINT NOT NULL , UNIQUE key0(`id`)) ENGINE=InnoDB default charset=utf8'
588
+ expect(sql).to eq 'CREATE TABLE `extention` (`id` INT NOT NULL ,`comment` VARCHAR(60) binary NULL DEFAULT NULL,`bits` BIGINT NOT NULL , PRIMARY KEY(`id`)) ENGINE=InnoDB default charset=utf8'
443
589
  # setValidationTarget(bool isMariadb, uchar_td srvMinorVersion)
444
590
  td = dbdef.tableDefs(1)
445
591
  td.setValidationTarget(true, 0)
@@ -570,11 +716,11 @@ describe Transactd, 'V3Features' do
570
716
  rs2 = rs2.matchBy(rq)
571
717
  expect(rs2.count()).to eq 10
572
718
  # setBin bin
573
- hex_str = ['FF01FF02']
719
+ hex_str = ['FF00FF02']
574
720
  bin = hex_str.pack('H*')
575
721
  wr["tel"].setBin(bin)
576
722
  ret = wr["tel"].bin()
577
- expect(ret.unpack('H*')[0].upcase()).to eq hex_str[0]
723
+ expect(bin).to eq ret
578
724
  atu.release()
579
725
  ate.release()
580
726
  db.close()
@@ -810,7 +956,9 @@ describe Transactd, 'V3Features' do
810
956
  # other database connection
811
957
  db_other = Transactd::Database.new()
812
958
  openDatabase(db_other)
813
- tb_other = db_other.openTable("user")
959
+ tb_other = db_other.openTable("user", Transactd::TD_OPEN_READONLY)
960
+ expect(db_other.stat()).to eq 0
961
+ db_other.beginTrn
814
962
  expect(db_other.stat()).to eq 0
815
963
  # connMgr connection
816
964
  db = Transactd::Database.new()
@@ -825,10 +973,27 @@ describe Transactd, 'V3Features' do
825
973
  recs = mgr.inUseDatabases(recs[0].conId)
826
974
  expect(mgr.stat()).to eq 0
827
975
  expect(recs.size()).to eq 1
976
+ # connRecord::inTransaction, connRecord::inSnapshot
977
+ rec = recs[0]
978
+ expect(rec.name).to eq DBNAME
979
+ expect(rec.inTransaction).to be true
980
+ expect(rec.inSnapshot).to be false
828
981
  # inUseTables
829
982
  recs = mgr.inUseTables(recs[0].conId, recs[0].db)
830
983
  expect(mgr.stat()).to eq 0
831
984
  expect(recs.size()).to eq 2
985
+ # connRecord::openNormal, connRecord::openReadOnly
986
+ # connRecord::openEx, connRecord::openReadOnlyEx
987
+ expect(recs[0].name).to eq "test" # schema table
988
+ expect(recs[0].openNormal).to be true
989
+ expect(recs[0].openReadOnly).to be false
990
+ expect(recs[0].openEx).to be false
991
+ expect(recs[0].openReadOnlyEx).to be false
992
+ expect(recs[1].name).to eq "user" # opened as tb_other
993
+ expect(recs[1].openNormal).to be false
994
+ expect(recs[1].openReadOnly).to be true
995
+ expect(recs[1].openEx).to be false
996
+ expect(recs[1].openReadOnlyEx).to be false
832
997
  # tables, views
833
998
  recs = mgr.tables("test_v3")
834
999
  expect(mgr.stat()).to eq 0
@@ -931,6 +1096,1022 @@ describe Transactd, 'V3Features' do
931
1096
  expect(mgr.stat()).to eq Transactd::ERROR_TD_HOSTNAME_NOT_FOUND
932
1097
  mgr.disconnect()
933
1098
  tb_other.close()
1099
+ db_other.abortTrn
934
1100
  db_other.close()
935
1101
  end
1102
+ it 'fetch_mode' do
1103
+ db = Transactd::Database.new()
1104
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1105
+ tb = db.openTable("user")
1106
+ expect(tb.stat()).to eq 0
1107
+ tb.seekFirst()
1108
+ expect(tb.stat()).to eq 0
1109
+ # test fetch field type (table)
1110
+ # FETCH_RECORD_INTO
1111
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1112
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1113
+ rec = tb.fields()
1114
+ # FIELD_VALUE_MODE_OBJECT
1115
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_OBJECT
1116
+ expect(rec["id"].i()).to eq 1
1117
+ # FIELD_VALUE_MODE_VALUE
1118
+ Transactd::set_field_value_mode(Transactd::FIELD_VALUE_MODE_VALUE)
1119
+ expect(rec["id"]).to eq 1
1120
+ # FETCH_VAL_NUM
1121
+ tb.fetchMode = Transactd::FETCH_VAL_NUM
1122
+ expect(tb.fetchMode).to eq Transactd::FETCH_VAL_NUM
1123
+ rec = tb.fields()
1124
+ expect(rec[0]).to eq 1
1125
+ # FETCH_VAL_ASSOC
1126
+ tb.fetchMode = Transactd::FETCH_VAL_ASSOC
1127
+ expect(tb.fetchMode).to eq Transactd::FETCH_VAL_ASSOC
1128
+ rec = tb.fields()
1129
+ expect(rec["id"]).to eq 1
1130
+ # FETCH_VAL_BOTH
1131
+ tb.fetchMode = Transactd::FETCH_VAL_BOTH
1132
+ expect(tb.fetchMode).to eq Transactd::FETCH_VAL_BOTH
1133
+ rec = tb.fields()
1134
+ expect(rec[0]).to eq 1
1135
+ expect(rec["id"]).to eq 1
1136
+ # FETCH_OBJ
1137
+ tb.fetchMode = Transactd::FETCH_OBJ
1138
+ expect(tb.fetchMode).to eq Transactd::FETCH_OBJ
1139
+ usr = tb.fields()
1140
+ expect(usr.id).to eq 1
1141
+ expect(usr.名前).to eq "1 user"
1142
+ # FETCH_USR_CLASS
1143
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1144
+ User.reset_class
1145
+ tb.fetchClass = User
1146
+ tb.ctorArgs = ["1", "2", "3"]
1147
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1148
+ usr = tb.fields()
1149
+ expect(usr.id).to eq 1
1150
+ expect(usr.名前).to eq "1 user"
1151
+ expect(usr.a).to eq "1"
1152
+ expect(usr.b).to eq "2"
1153
+ expect(usr.c).to eq "3"
1154
+ tb.close()
1155
+ # test fetch field type (activeTable)
1156
+ at = Transactd::ActiveTable.new(db, "user")
1157
+ q = Transactd::Query.new()
1158
+ q.where("id", "<", 10)
1159
+ rs = at.index(0).keyValue(0).read(q)
1160
+ # FETCH_RECORD_INTO
1161
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1162
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1163
+ expect(rs.size()).to eq 9
1164
+ # FIELD_VALUE_MODE_OBJECT
1165
+ Transactd::setFieldValueMode(Transactd::FIELD_VALUE_MODE_OBJECT)
1166
+ expect(rs[0]["id"].i()).to eq 1
1167
+ # FIELD_VALUE_MODE_VALUE
1168
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_VALUE
1169
+ expect(rs[0]["id"]).to eq 1
1170
+ # FETCH_VAL_NUM
1171
+ rs.fetchMode = Transactd::FETCH_VAL_NUM
1172
+ expect(rs.fetchMode).to eq Transactd::FETCH_VAL_NUM
1173
+ expect(rs.size()).to eq 9
1174
+ expect(rs[0][0]).to eq 1
1175
+ # FETCH_VAL_ASSOC
1176
+ rs.fetchMode = Transactd::FETCH_VAL_ASSOC
1177
+ expect(rs.fetchMode).to eq Transactd::FETCH_VAL_ASSOC
1178
+ expect(rs.size()).to eq 9
1179
+ expect(rs[0]["id"]).to eq 1
1180
+ # FETCH_VAL_BOTH
1181
+ rs.fetchMode = Transactd::FETCH_VAL_BOTH
1182
+ expect(rs.fetchMode).to eq Transactd::FETCH_VAL_BOTH
1183
+ expect(rs.size()).to eq 9
1184
+ expect(rs[0][0]).to eq 1
1185
+ expect(rs[0]["id"]).to eq 1
1186
+ # FETCH_OBJ
1187
+ rs.fetchMode = Transactd::FETCH_OBJ
1188
+ expect(rs.fetchMode).to eq Transactd::FETCH_OBJ
1189
+ expect(rs.size()).to eq 9
1190
+ expect(rs[0].id).to eq 1
1191
+ expect(rs[0].名前).to eq "1 user"
1192
+ # FETCH_USR_CLASS
1193
+ rs.fetchMode = Transactd::FETCH_USR_CLASS
1194
+ rs.fetchClass = User
1195
+ rs.ctorArgs = ["1", "2", "3"]
1196
+ expect(rs.fetchMode).to eq Transactd::FETCH_USR_CLASS
1197
+ expect(rs.size()).to eq 9
1198
+ expect(rs[1].id).to eq 2
1199
+ expect(rs[1].名前).to eq "2 user"
1200
+ expect(rs[0].a).to eq "1"
1201
+ expect(rs[0].b).to eq "2"
1202
+ expect(rs[0].c).to eq "3"
1203
+ at.release
1204
+ db.close()
1205
+ end
1206
+ it 'fetchMode, alias and UTF-8 field name' do
1207
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_VALUE
1208
+ db = Transactd::Database.new()
1209
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1210
+ # table
1211
+ tb = db.openTable("user")
1212
+ expect(tb.stat()).to eq 0
1213
+ tb.seekFirst()
1214
+ expect(tb.stat()).to eq 0
1215
+ tb.setAlias("名前", "名前2")
1216
+ expect(tb.stat()).to eq 0
1217
+ # FETCH_OBJ (remove_original_name)
1218
+ tb.fetchMode = Transactd::FETCH_OBJ
1219
+ expect(tb.fetchMode).to eq Transactd::FETCH_OBJ
1220
+ usr = tb.fields()
1221
+ expect(usr.id).to eq 1
1222
+ expect(usr.respond_to?(:"名前")).to be false
1223
+ expect(usr.respond_to?(:"名前2")).to be true
1224
+ expect(usr.名前2).to eq "1 user"
1225
+ # FETCH_USR_CLASS
1226
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1227
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1228
+ tb.fetchClass = User
1229
+ tb.ctorArgs = ["1", "2", "3"]
1230
+ # define_original_name
1231
+ User.reset_class
1232
+ User.alias_attribute("名前2", "名前")
1233
+ User.define_original_name
1234
+ usr = tb.fields()
1235
+ expect(usr.id).to eq 1
1236
+ expect(usr.respond_to?(:"名前")).to be true
1237
+ expect(usr.respond_to?(:"名前2")).to be true
1238
+ expect(usr.名前).to eq "1 user"
1239
+ expect(usr.名前2).to eq "1 user"
1240
+ expect(usr.a).to eq "1"
1241
+ expect(usr.b).to eq "2"
1242
+ expect(usr.c).to eq "3"
1243
+ # remove_original_name
1244
+ User.reset_class
1245
+ User.alias_attribute("名前2", "名前")
1246
+ User.remove_original_name
1247
+ usr = tb.fields()
1248
+ expect(usr.id).to eq 1
1249
+ expect(usr.respond_to?(:"名前")).to be false
1250
+ expect(usr.respond_to?(:"名前2")).to be true
1251
+ expect(usr.名前2).to eq "1 user"
1252
+ expect(usr.a).to eq "1"
1253
+ expect(usr.b).to eq "2"
1254
+ expect(usr.c).to eq "3"
1255
+ tb.close
1256
+ # activeTable
1257
+ at = Transactd::ActiveTable.new(db, "user")
1258
+ at.alias("名前", "名前2")
1259
+ q = Transactd::Query.new()
1260
+ q.where("id", "<", 10)
1261
+ rs = at.index(0).keyValue(0).read(q)
1262
+ expect(rs.size()).to eq 9
1263
+ # FETCH_OBJ (remove_original_name)
1264
+ rs.fetchMode = Transactd::FETCH_OBJ
1265
+ expect(rs.fetchMode).to eq Transactd::FETCH_OBJ
1266
+ expect(rs[0].id).to eq 1
1267
+ expect(rs[0].respond_to?(:"名前")).to be false
1268
+ expect(rs[0].respond_to?(:"名前2")).to be true
1269
+ expect(rs[0].名前2).to eq "1 user"
1270
+ # FETCH_USR_CLASS
1271
+ rs.fetchMode = Transactd::FETCH_USR_CLASS
1272
+ expect(rs.fetchMode).to eq Transactd::FETCH_USR_CLASS
1273
+ rs.fetchClass = User
1274
+ rs.ctorArgs = ["1", "2", "3"]
1275
+ # define_original_name
1276
+ User.reset_class
1277
+ User.alias_attribute("名前2", "名前")
1278
+ User.define_original_name
1279
+ expect(rs[0].id).to eq 1
1280
+ expect(rs[0].respond_to?(:"名前")).to be true
1281
+ expect(rs[0].respond_to?(:"名前2")).to be true
1282
+ expect(rs[0].名前).to eq "1 user"
1283
+ expect(rs[0].名前2).to eq "1 user"
1284
+ # remove_original_name
1285
+ User.reset_class
1286
+ User.alias_attribute("名前2", "名前")
1287
+ User.remove_original_name
1288
+ expect(rs[0].id).to eq 1
1289
+ expect(rs[0].respond_to?(:"名前")).to be false
1290
+ expect(rs[0].respond_to?(:"名前2")).to be true
1291
+ expect(rs[0].名前2).to eq "1 user"
1292
+ at.release
1293
+ db.close
1294
+ end
1295
+ it 'set_value_by_object, alias and UTF-8 field name' do
1296
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_VALUE
1297
+ db = Transactd::Database.new()
1298
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1299
+ # table
1300
+ tb = db.openTable("user")
1301
+ expect(tb.stat()).to eq 0
1302
+ # FETCH_OBJ, no alias
1303
+ tb.seekFirst()
1304
+ expect(tb.stat()).to eq 0
1305
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1306
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1307
+ rec = tb.fields()
1308
+ tb.fetchMode = Transactd::FETCH_OBJ
1309
+ expect(tb.fetchMode).to eq Transactd::FETCH_OBJ
1310
+ usr = tb.fields()
1311
+ expect(usr.名前).to eq "1 user"
1312
+ expect(usr.respond_to?(:"名前2")).to be false
1313
+ usr.名前 = "1 ユーザー"
1314
+ rec.set_value_by_object(usr)
1315
+ usr2 = tb.fields()
1316
+ expect(usr2.名前).to eq "1 ユーザー"
1317
+ expect(usr2.respond_to?(:"名前2")).to be false
1318
+ # FETCH_USR_CLASS, no alias
1319
+ tb.seekFirst()
1320
+ expect(tb.stat()).to eq 0
1321
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1322
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1323
+ rec = tb.fields()
1324
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1325
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1326
+ tb.fetchClass = User
1327
+ tb.ctorArgs = ["1", "2", "3"]
1328
+ User.reset_class
1329
+ User.remove_original_name
1330
+ usr = tb.fields()
1331
+ expect(usr.名前).to eq "1 user"
1332
+ expect(usr.respond_to?(:"名前2")).to be false
1333
+ usr.名前 = "1 ユーザー"
1334
+ rec.set_value_by_object(usr)
1335
+ usr2 = tb.fields()
1336
+ expect(usr2.名前).to eq "1 ユーザー"
1337
+ expect(usr2.respond_to?(:"名前2")).to be false
1338
+ # FETCH_OBJ, with alias
1339
+ tb.setAlias("名前", "名前2")
1340
+ expect(tb.stat()).to eq 0
1341
+ tb.seekFirst()
1342
+ expect(tb.stat()).to eq 0
1343
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1344
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1345
+ rec = tb.fields()
1346
+ tb.fetchMode = Transactd::FETCH_OBJ
1347
+ expect(tb.fetchMode).to eq Transactd::FETCH_OBJ
1348
+ usr = tb.fields()
1349
+ expect(usr.respond_to?(:"名前")).to be false
1350
+ expect(usr.名前2).to eq "1 user"
1351
+ usr.名前2 = "1 ユーザー"
1352
+ rec.set_value_by_object(usr)
1353
+ usr2 = tb.fields()
1354
+ expect(usr2.respond_to?(:"名前")).to be false
1355
+ expect(usr2.名前2).to eq "1 ユーザー"
1356
+ # FETCH_USR_CLASS, with alias, remove_original_name
1357
+ tb.seekFirst()
1358
+ expect(tb.stat()).to eq 0
1359
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1360
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1361
+ rec = tb.fields()
1362
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1363
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1364
+ tb.fetchClass = User
1365
+ tb.ctorArgs = ["1", "2", "3"]
1366
+ User.reset_class
1367
+ User.alias_attribute("名前2", "名前")
1368
+ User.remove_original_name
1369
+ usr = tb.fields()
1370
+ expect(usr.respond_to?(:"名前")).to be false
1371
+ expect(usr.名前2).to eq "1 user"
1372
+ usr.名前2 = "1 ユーザー"
1373
+ rec.set_value_by_object(usr)
1374
+ usr2 = tb.fields()
1375
+ expect(usr2.respond_to?(:"名前")).to be false
1376
+ expect(usr2.名前2).to eq "1 ユーザー"
1377
+ # FETCH_USR_CLASS, with alias, define_original_name
1378
+ tb.seekFirst()
1379
+ expect(tb.stat()).to eq 0
1380
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1381
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1382
+ rec = tb.fields()
1383
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1384
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1385
+ tb.fetchClass = User
1386
+ tb.ctorArgs = ["1", "2", "3"]
1387
+ User.reset_class
1388
+ User.alias_attribute("名前2", "名前")
1389
+ User.define_original_name
1390
+ usr = tb.fields()
1391
+ expect(usr.名前).to eq "1 user"
1392
+ expect(usr.名前2).to eq "1 user"
1393
+ usr.名前2 = "1 ユーザー 名前2"
1394
+ rec.set_value_by_object(usr)
1395
+ usr2 = tb.fields()
1396
+ expect(usr2.名前).to eq "1 ユーザー 名前2"
1397
+ expect(usr2.名前2).to eq "1 ユーザー 名前2"
1398
+ usr.名前 = "1 ユーザー 名前"
1399
+ rec.set_value_by_object(usr)
1400
+ usr3 = tb.fields()
1401
+ expect(usr3.名前).to eq "1 ユーザー 名前"
1402
+ expect(usr3.名前2).to eq "1 ユーザー 名前"
1403
+ tb.close
1404
+ # activeTable
1405
+ at = Transactd::ActiveTable.new(db, "user")
1406
+ q = Transactd::Query.new()
1407
+ q.where("id", "<", 10)
1408
+ # FETCH_OBJ, no alias
1409
+ rs = at.index(0).keyValue(0).read(q)
1410
+ expect(rs.size()).to eq 9
1411
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1412
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1413
+ rec = rs[0]
1414
+ rs.fetchMode = Transactd::FETCH_OBJ
1415
+ expect(rs.fetchMode).to eq Transactd::FETCH_OBJ
1416
+ usr = rs[0]
1417
+ expect(usr.名前).to eq "1 user"
1418
+ expect(usr.respond_to?(:"名前2")).to be false
1419
+ usr.名前 = "1 ユーザー"
1420
+ rec.set_value_by_object(usr)
1421
+ usr2 = rs[0]
1422
+ expect(usr2.名前).to eq "1 ユーザー"
1423
+ expect(usr2.respond_to?(:"名前2")).to be false
1424
+ # FETCH_USR_CLASS, no alias
1425
+ rs = at.index(0).keyValue(0).read(q)
1426
+ expect(rs.size()).to eq 9
1427
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1428
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1429
+ rec = rs[0]
1430
+ rs.fetchMode = Transactd::FETCH_USR_CLASS
1431
+ expect(rs.fetchMode).to eq Transactd::FETCH_USR_CLASS
1432
+ rs.fetchClass = User
1433
+ rs.ctorArgs = ["1", "2", "3"]
1434
+ User.reset_class
1435
+ User.remove_original_name
1436
+ usr = rs[0]
1437
+ expect(usr.名前).to eq "1 user"
1438
+ expect(usr.respond_to?(:"名前2")).to be false
1439
+ usr.名前 = "1 ユーザー"
1440
+ rec.set_value_by_object(usr)
1441
+ usr2 = rs[0]
1442
+ expect(usr2.名前).to eq "1 ユーザー"
1443
+ expect(usr2.respond_to?(:"名前2")).to be false
1444
+ # FETCH_OBJ, with alias
1445
+ at.alias("名前", "名前2")
1446
+ rs = at.index(0).keyValue(0).read(q)
1447
+ expect(rs.size()).to eq 9
1448
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1449
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1450
+ rec = rs[0]
1451
+ rs.fetchMode = Transactd::FETCH_OBJ
1452
+ expect(rs.fetchMode).to eq Transactd::FETCH_OBJ
1453
+ usr = rs[0]
1454
+ expect(usr.respond_to?(:"名前")).to be false
1455
+ expect(usr.名前2).to eq "1 user"
1456
+ usr.名前2 = "1 ユーザー"
1457
+ rec.set_value_by_object(usr)
1458
+ usr2 = rs[0]
1459
+ expect(usr2.respond_to?(:"名前")).to be false
1460
+ expect(usr2.名前2).to eq "1 ユーザー"
1461
+ # FETCH_USR_CLASS, with alias, remove_original_name
1462
+ rs = at.index(0).keyValue(0).read(q)
1463
+ expect(rs.size()).to eq 9
1464
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1465
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1466
+ rec = rs[0]
1467
+ rs.fetchMode = Transactd::FETCH_USR_CLASS
1468
+ expect(rs.fetchMode).to eq Transactd::FETCH_USR_CLASS
1469
+ rs.fetchClass = User
1470
+ rs.ctorArgs = ["1", "2", "3"]
1471
+ User.reset_class
1472
+ User.alias_attribute("名前2", "名前")
1473
+ User.remove_original_name
1474
+ usr = rs[0]
1475
+ expect(usr.respond_to?(:"名前")).to be false
1476
+ expect(usr.名前2).to eq "1 user"
1477
+ usr.名前2 = "1 ユーザー"
1478
+ rec.set_value_by_object(usr)
1479
+ usr2 = rs[0]
1480
+ expect(usr2.respond_to?(:"名前")).to be false
1481
+ expect(usr2.名前2).to eq "1 ユーザー"
1482
+ # FETCH_USR_CLASS, with alias, define_original_name
1483
+ rs = at.index(0).keyValue(0).read(q)
1484
+ expect(rs.size()).to eq 9
1485
+ rs.fetchMode = Transactd::FETCH_RECORD_INTO
1486
+ expect(rs.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1487
+ rec = rs[0]
1488
+ rs.fetchMode = Transactd::FETCH_USR_CLASS
1489
+ expect(rs.fetchMode).to eq Transactd::FETCH_USR_CLASS
1490
+ rs.fetchClass = User
1491
+ rs.ctorArgs = ["1", "2", "3"]
1492
+ User.reset_class
1493
+ User.alias_attribute("名前2", "名前")
1494
+ User.define_original_name
1495
+ usr = rs[0]
1496
+ expect(usr.名前).to eq "1 user"
1497
+ expect(usr.名前2).to eq "1 user"
1498
+ usr.名前2 = "1 ユーザー 名前2"
1499
+ rec.set_value_by_object(usr)
1500
+ usr2 = rs[0]
1501
+ expect(usr2.名前).to eq "1 ユーザー 名前2"
1502
+ expect(usr2.名前2).to eq "1 ユーザー 名前2"
1503
+ usr.名前 = "1 ユーザー 名前"
1504
+ rec.set_value_by_object(usr)
1505
+ usr3 = rs[0]
1506
+ expect(usr3.名前).to eq "1 ユーザー 名前"
1507
+ expect(usr3.名前2).to eq "1 ユーザー 名前"
1508
+ at.release
1509
+ db.close
1510
+ end
1511
+ it 'set_ailas' do
1512
+ db = Transactd::Database.new()
1513
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1514
+ tb = db.openTable("user")
1515
+ expect(tb.stat()).to eq 0
1516
+ tb.setAlias("名前", "name")
1517
+ tb.setAlias("id", "user_id")
1518
+ expect(tb.fieldNumByName("user_id")).to eq 0
1519
+ tb.seekFirst()
1520
+ expect(tb.stat()).to eq 0
1521
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1522
+ User.reset_class
1523
+ User.alias_attribute("name", "名前")
1524
+ User.alias_attribute("user_id", "id")
1525
+ User.define_original_name
1526
+ tb.fetchClass = User
1527
+ tb.ctorArgs = ["1", "2", "3"]
1528
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1529
+ usr = tb.fields()
1530
+ expect(usr.id).to eq 1
1531
+ expect(usr.user_id).to eq 1
1532
+ expect(usr.名前).to eq "1 user"
1533
+ expect(usr.name).to eq "1 user"
1534
+ q = Transactd::Query.new()
1535
+ q.select("name").where("id", "<", 10)
1536
+ tb.setQuery(q)
1537
+ tb.clearBuffer()
1538
+ users = tb.findAll()
1539
+ expect(users.length).to eq 9
1540
+ expect(users[0].name).to eq "1 user"
1541
+ tb.close()
1542
+ db.close()
1543
+ end
1544
+ it 'CRUD operations with object' do
1545
+ db = Transactd::Database.new()
1546
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1547
+ tb = db.openTable("user")
1548
+ expect(tb.stat()).to eq 0
1549
+ tb.setAlias("名前", "name")
1550
+ tb.seekFirst()
1551
+ expect(tb.stat()).to eq 0
1552
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1553
+ User.reset_class
1554
+ tb.fetchClass = User
1555
+ tb.ctorArgs = ["1", "2", "3"]
1556
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1557
+ # Insert
1558
+ usr = tb.fields()
1559
+ usr.id = 0
1560
+ usr.name = 'test_insertObject'
1561
+ expect(tb.insert_by_object(usr)).to eq true
1562
+ tb.seekLast()
1563
+ usr = tb.fields()
1564
+ expect(usr.name).to eq 'test_insertObject'
1565
+ expect(usr.id).to eq 1001
1566
+ # Update
1567
+ usr.name = 'test_UpdateObject'
1568
+ expect(tb.update_by_object(usr)).to eq true
1569
+ usr.name = ''
1570
+ # Read
1571
+ expect(tb.read_by_object(usr)).to eq true
1572
+ expect(usr.name).to eq 'test_UpdateObject'
1573
+ expect(usr.id).to eq 1001
1574
+ row = tb.getRecord()
1575
+ row.set_value_by_object(usr)
1576
+ usr2 = tb.fields()
1577
+ expect(usr2.a).to eq usr.a
1578
+ expect(usr2.b).to eq usr.b
1579
+ expect(usr2.c).to eq usr.c
1580
+ expect(usr2.id).to eq usr.id
1581
+ expect(usr2.name).to eq usr.name
1582
+ expect(usr2.group).to eq usr.group
1583
+ expect(usr2.tel).to eq usr.tel
1584
+ expect(usr2.update_datetime).to eq usr.update_datetime
1585
+ expect(usr2.create_datetime).to eq usr.create_datetime
1586
+ # Delete
1587
+ expect(tb.delete_by_object(usr)).to eq true
1588
+ tb.seekLast()
1589
+ usr = tb.fields()
1590
+ expect(usr.id).to eq 1000
1591
+ tb.close
1592
+ db.close
1593
+ end
1594
+ it 'test UCC' do
1595
+ db = Transactd::Database.new()
1596
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1597
+ tb = db.openTable("user")
1598
+ tb2 = db.openTable("user")
1599
+ # test ChangeCurrentCc
1600
+ # updateConflictCheck true
1601
+ db.beginTrn()
1602
+ tb.seekFirst()
1603
+ expect(tb.stat()).to eq 0
1604
+ tb2.seekFirst()
1605
+ expect(tb2.stat()).to eq 0
1606
+ tb.setFV("名前", 'John')
1607
+ tb.update()
1608
+ expect(tb.stat()).to eq 0
1609
+ tb2.setFV("名前", 'mike')
1610
+ tb2.setUpdateConflictCheck(true)
1611
+ expect(tb2.updateConflictCheck()).to eq true
1612
+ tb2.update(Transactd::Nstable::ChangeCurrentCc)
1613
+ expect(tb2.stat()).to eq Transactd::STATUS_CHANGE_CONFLICT
1614
+ db.abortTrn()
1615
+ # updateConflictCheck false
1616
+ db.beginTrn()
1617
+ tb.seekFirst()
1618
+ expect(tb.stat()).to eq 0
1619
+ tb2.seekFirst()
1620
+ expect(tb2.stat()).to eq 0
1621
+ tb.setFV("名前", 'John')
1622
+ tb.update()
1623
+ expect(tb.stat()).to eq 0
1624
+ tb2.setFV("名前", 'mike')
1625
+ tb2.setUpdateConflictCheck(false)
1626
+ expect(tb2.updateConflictCheck()).to eq false
1627
+ tb2.update(Transactd::Nstable::ChangeCurrentCc)
1628
+ expect(tb2.stat()).to eq 0
1629
+ db.abortTrn()
1630
+ # test ChangeInKey
1631
+ # updateConflictCheck true
1632
+ db.beginTrn()
1633
+ tb.seekFirst()
1634
+ expect(tb.stat()).to eq 0
1635
+ tb2.seekFirst()
1636
+ expect(tb2.stat()).to eq 0
1637
+ tb.setFV("名前", 'John')
1638
+ tb.update()
1639
+ expect(tb.stat()).to eq 0
1640
+ tb2.setFV("名前", 'mike')
1641
+ tb2.setUpdateConflictCheck(true)
1642
+ expect(tb2.updateConflictCheck()).to eq true
1643
+ tb2.update(Transactd::Nstable::ChangeInKey)
1644
+ expect(tb2.stat()).to eq Transactd::STATUS_CHANGE_CONFLICT
1645
+ db.abortTrn()
1646
+ # updateConflictCheck false
1647
+ db.beginTrn()
1648
+ tb.seekFirst()
1649
+ expect(tb.stat()).to eq 0
1650
+ tb2.seekFirst()
1651
+ expect(tb2.stat()).to eq 0
1652
+ tb.setFV("名前", 'John')
1653
+ tb.update()
1654
+ expect(tb.stat()).to eq 0
1655
+ tb2.setFV("名前", 'mike')
1656
+ tb2.setUpdateConflictCheck(false)
1657
+ expect(tb2.updateConflictCheck()).to eq false
1658
+ tb2.update(Transactd::Nstable::ChangeInKey)
1659
+ expect(tb2.stat()).to eq 0
1660
+ db.abortTrn()
1661
+ tb.close
1662
+ tb2.close
1663
+ db.close
1664
+ end
1665
+ it 'test transfer' do
1666
+ db = Transactd::Database.new()
1667
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1668
+ tb = db.openTable("user")
1669
+ expect(tb.stat()).to eq 0
1670
+ tb.seekFirst()
1671
+ expect(tb.stat()).to eq 0
1672
+ tb.setAlias("名前", "name")
1673
+ usr = UserT.new()
1674
+ usr.id = 5
1675
+ expect(tb.read_by_object(usr)).to be true
1676
+ expect(usr.id).to eq 5
1677
+ expect(usr.phone.number.tel).to eq '0236-99-9999'
1678
+ UserT.setTransferMap(1)
1679
+ usr.id = 5
1680
+ expect(tb.read_by_object(usr)).to be true # No error
1681
+ expect(usr.id).to eq 5
1682
+ expect(usr.phone2).to be nil
1683
+ UserT.setTransferMap(2)
1684
+ usr.id = 5
1685
+ expect(tb.read_by_object(usr)).to be true # No error
1686
+ expect(usr.id).to eq 5
1687
+ expect(usr.phone.number2).to be nil
1688
+ tb.close
1689
+ db.close
1690
+ end
1691
+ it 'test with object option' do
1692
+ db = Transactd::Database.new()
1693
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1694
+ tb = db.openTable("user")
1695
+ expect(tb.stat()).to eq 0
1696
+ tb.setAlias("名前", "name")
1697
+ usr = UserT.new()
1698
+ # read option (key number)
1699
+ tb.setKeyNum(0)
1700
+ usr.id = 5
1701
+ expect(tb.read_by_object(usr, 2)).to be false
1702
+ expect(tb.keyNum()).to eq 2
1703
+ expect(tb.read_by_object(usr)).to be true
1704
+ expect(tb.keyNum()).to eq 0
1705
+ # update option (eUpdateType)
1706
+ expect(tb.read_by_object(usr, 2)).to be false # No currency
1707
+ expect(tb.update_by_object(usr, Transactd::Nstable::ChangeCurrentCc)).to eq false
1708
+ expect(tb.update_by_object(usr)).to be true # default value Nstable::changeInKey
1709
+ # delete option
1710
+ usr.id = 0
1711
+ expect(tb.insert_by_object(usr)).to be true # Insert id = 1001
1712
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1713
+ tb.fetchClass = UserT
1714
+ tb.seekLast
1715
+ expect(tb.stat).to eq 0
1716
+ usr = tb.getRow
1717
+ id = usr.id
1718
+ usr.id = 1005
1719
+ expect(tb.read_by_object(usr)).to be false # No currency
1720
+ usr.id = id
1721
+ tb.setKeyNum(2)
1722
+ expect(tb.delete_by_object(usr, false)).to be false # inKey
1723
+ expect(tb.delete_by_object(usr)).to be true # default value true
1724
+ tb.close
1725
+ db.close
1726
+ end
1727
+ it 'test transfer_map on define and read' do
1728
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_VALUE
1729
+ db = Transactd::Database.new()
1730
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1731
+ tb = db.openTable("user")
1732
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1733
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1734
+ tb.fetchClass = User
1735
+ tb.ctorArgs = ["1", "2", "3"]
1736
+ # without alias, without nest
1737
+ User.reset_class
1738
+ User.transfer_map = {
1739
+ update_datetime: :datetime,
1740
+ create_datetime: :datetime
1741
+ }
1742
+ tb.seekFirst
1743
+ expect(tb.stat()).to eq 0
1744
+ rec = tb.fields
1745
+ expect(rec.id).to eq 1
1746
+ expect(rec.名前).to eq "1 user"
1747
+ expect(rec.a).to eq "1"
1748
+ expect(rec.b).to eq "2"
1749
+ expect(rec.c).to eq "3"
1750
+ expect(rec.respond_to?(:update_datetime)).to be false
1751
+ expect(rec.respond_to?(:create_datetime)).to be false
1752
+ expect(rec.datetime.update_datetime.nil?).to be false
1753
+ expect(rec.datetime.create_datetime.nil?).to be false
1754
+ expect(rec.aliased_datetime.empty?).to be true
1755
+ expect(rec.nest.datetime.empty?).to be true
1756
+ expect(rec.nest.aliased_datetime.empty?).to be true
1757
+ # without alias, with nest
1758
+ User.reset_class
1759
+ User.transfer_map = {
1760
+ update_datetime: [:nest, :datetime],
1761
+ create_datetime: [:nest, :datetime]
1762
+ }
1763
+ tb.seekFirst
1764
+ expect(tb.stat()).to eq 0
1765
+ rec = tb.fields
1766
+ expect(rec.id).to eq 1
1767
+ expect(rec.名前).to eq "1 user"
1768
+ expect(rec.a).to eq "1"
1769
+ expect(rec.b).to eq "2"
1770
+ expect(rec.c).to eq "3"
1771
+ expect(rec.respond_to?(:update_datetime)).to be false
1772
+ expect(rec.respond_to?(:create_datetime)).to be false
1773
+ expect(rec.datetime.empty?).to be true
1774
+ expect(rec.aliased_datetime.empty?).to be true
1775
+ expect(rec.nest.datetime.update_datetime.nil?).to be false
1776
+ expect(rec.nest.datetime.create_datetime.nil?).to be false
1777
+ expect(rec.nest.aliased_datetime.empty?).to be true
1778
+ # with alias, without nest
1779
+ tb.setAlias("update_datetime", "update")
1780
+ tb.setAlias("create_datetime", "create")
1781
+ User.reset_class
1782
+ User.alias_attribute("update", "update_datetime")
1783
+ User.alias_attribute("create", "create_datetime")
1784
+ User.transfer_map = {
1785
+ update: :aliased_datetime,
1786
+ create: :aliased_datetime
1787
+ }
1788
+ tb.seekFirst
1789
+ expect(tb.stat()).to eq 0
1790
+ rec = tb.fields
1791
+ expect(rec.id).to eq 1
1792
+ expect(rec.名前).to eq "1 user"
1793
+ expect(rec.a).to eq "1"
1794
+ expect(rec.b).to eq "2"
1795
+ expect(rec.c).to eq "3"
1796
+ expect(rec.respond_to?(:update_datetime)).to be false
1797
+ expect(rec.respond_to?(:create_datetime)).to be false
1798
+ expect(rec.respond_to?(:update)).to be false
1799
+ expect(rec.respond_to?(:create)).to be false
1800
+ expect(rec.datetime.empty?).to be true
1801
+ expect(rec.aliased_datetime.update.nil?).to be false
1802
+ expect(rec.aliased_datetime.create.nil?).to be false
1803
+ expect(rec.nest.datetime.empty?).to be true
1804
+ expect(rec.nest.aliased_datetime.empty?).to be true
1805
+ # with alias, with nest
1806
+ User.reset_class
1807
+ User.alias_attribute("update", "update_datetime")
1808
+ User.alias_attribute("create", "create_datetime")
1809
+ User.transfer_map = {
1810
+ update: [:nest, :aliased_datetime],
1811
+ create: [:nest, :aliased_datetime]
1812
+ }
1813
+ tb.seekFirst
1814
+ expect(tb.stat()).to eq 0
1815
+ rec = tb.fields
1816
+ expect(rec.id).to eq 1
1817
+ expect(rec.名前).to eq "1 user"
1818
+ expect(rec.a).to eq "1"
1819
+ expect(rec.b).to eq "2"
1820
+ expect(rec.c).to eq "3"
1821
+ expect(rec.respond_to?(:update_datetime)).to be false
1822
+ expect(rec.respond_to?(:create_datetime)).to be false
1823
+ expect(rec.respond_to?(:update)).to be false
1824
+ expect(rec.respond_to?(:create)).to be false
1825
+ expect(rec.datetime.empty?).to be true
1826
+ expect(rec.aliased_datetime.empty?).to be true
1827
+ expect(rec.nest.datetime.empty?).to be true
1828
+ expect(rec.nest.aliased_datetime.update.nil?).to be false
1829
+ expect(rec.nest.aliased_datetime.create.nil?).to be false
1830
+ User.reset_class
1831
+ tb.close
1832
+ db.close
1833
+ end
1834
+ it 'test transfer_map on define and set_value_by_object' do
1835
+ sample_datetime = "2016-11-01 12:34:56"
1836
+ db = Transactd::Database.new()
1837
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1838
+ tb = db.openTable("user")
1839
+ tb.fetchClass = User
1840
+ tb.ctorArgs = ["1", "2", "3"]
1841
+ # without alias, without nest
1842
+ User.reset_class
1843
+ User.transfer_map = {
1844
+ update_datetime: :datetime,
1845
+ create_datetime: :datetime
1846
+ }
1847
+ tb.seekFirst
1848
+ expect(tb.stat()).to eq 0
1849
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1850
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1851
+ rec = tb.fields
1852
+ expect(tb.stat()).to eq 0
1853
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1854
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1855
+ obj = tb.fields
1856
+ expect(obj.id).to eq 1
1857
+ expect(obj.名前).to eq "1 user"
1858
+ expect(obj.datetime.update_datetime.nil?).to be false
1859
+ expect(obj.datetime.update_datetime).not_to start_with sample_datetime
1860
+ obj.名前 = "1 ユーザー"
1861
+ obj.datetime.update_datetime = sample_datetime
1862
+ rec.set_value_by_object(obj)
1863
+ obj2 = tb.fields
1864
+ expect(obj2.id).to eq 1
1865
+ expect(obj2.名前).to eq "1 ユーザー"
1866
+ expect(obj2.datetime.update_datetime.nil?).to be false
1867
+ expect(obj2.datetime.update_datetime).to start_with sample_datetime
1868
+ # without alias, with nest
1869
+ User.reset_class
1870
+ User.transfer_map = {
1871
+ update_datetime: [:nest, :datetime],
1872
+ create_datetime: [:nest, :datetime]
1873
+ }
1874
+ tb.seekFirst
1875
+ expect(tb.stat()).to eq 0
1876
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1877
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1878
+ rec = tb.fields
1879
+ expect(tb.stat()).to eq 0
1880
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1881
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1882
+ obj = tb.fields
1883
+ expect(obj.id).to eq 1
1884
+ expect(obj.名前).to eq "1 user"
1885
+ expect(obj.nest.datetime.update_datetime.nil?).to be false
1886
+ expect(obj.nest.datetime.update_datetime).not_to start_with sample_datetime
1887
+ obj.名前 = "1 ユーザー"
1888
+ obj.nest.datetime.update_datetime = sample_datetime
1889
+ rec.set_value_by_object(obj)
1890
+ obj2 = tb.fields
1891
+ expect(obj2.id).to eq 1
1892
+ expect(obj2.名前).to eq "1 ユーザー"
1893
+ expect(obj2.nest.datetime.update_datetime.nil?).to be false
1894
+ expect(obj2.nest.datetime.update_datetime).to start_with sample_datetime
1895
+ # with alias, without nest
1896
+ tb.setAlias("update_datetime", "update")
1897
+ tb.setAlias("create_datetime", "create")
1898
+ User.reset_class
1899
+ User.alias_attribute("update", "update_datetime")
1900
+ User.alias_attribute("create", "create_datetime")
1901
+ User.transfer_map = {
1902
+ update: :aliased_datetime,
1903
+ create: :aliased_datetime
1904
+ }
1905
+ tb.seekFirst
1906
+ expect(tb.stat()).to eq 0
1907
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1908
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1909
+ rec = tb.fields
1910
+ expect(tb.stat()).to eq 0
1911
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1912
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1913
+ obj = tb.fields
1914
+ expect(obj.id).to eq 1
1915
+ expect(obj.名前).to eq "1 user"
1916
+ expect(obj.aliased_datetime.update.nil?).to be false
1917
+ expect(obj.aliased_datetime.update).not_to start_with sample_datetime
1918
+ obj.名前 = "1 ユーザー"
1919
+ obj.aliased_datetime.update = sample_datetime
1920
+ rec.set_value_by_object(obj)
1921
+ obj2 = tb.fields
1922
+ expect(obj2.id).to eq 1
1923
+ expect(obj2.名前).to eq "1 ユーザー"
1924
+ expect(obj2.aliased_datetime.update.nil?).to be false
1925
+ expect(obj2.aliased_datetime.update).to start_with sample_datetime
1926
+ # with alias, with nest
1927
+ User.reset_class
1928
+ User.alias_attribute("update", "update_datetime")
1929
+ User.alias_attribute("create", "create_datetime")
1930
+ User.transfer_map = {
1931
+ update: [:nest, :aliased_datetime],
1932
+ create: [:nest, :aliased_datetime]
1933
+ }
1934
+ tb.seekFirst
1935
+ expect(tb.stat()).to eq 0
1936
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1937
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1938
+ rec = tb.fields
1939
+ expect(tb.stat()).to eq 0
1940
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1941
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1942
+ obj = tb.fields
1943
+ expect(obj.id).to eq 1
1944
+ expect(obj.名前).to eq "1 user"
1945
+ expect(obj.nest.aliased_datetime.update.nil?).to be false
1946
+ expect(obj.nest.aliased_datetime.update).not_to start_with sample_datetime
1947
+ obj.名前 = "1 ユーザー"
1948
+ obj.nest.aliased_datetime.update = sample_datetime
1949
+ rec.set_value_by_object(obj)
1950
+ obj2 = tb.fields
1951
+ expect(obj2.id).to eq 1
1952
+ expect(obj2.名前).to eq "1 ユーザー"
1953
+ expect(obj2.nest.aliased_datetime.update.nil?).to be false
1954
+ expect(obj2.nest.aliased_datetime.update).to start_with sample_datetime
1955
+ User.reset_class
1956
+ tb.close
1957
+ db.close
1958
+ end
1959
+ it 'test transfer_map with UTF-8 field name and alias' do
1960
+ Transactd::field_value_mode = Transactd::FIELD_VALUE_MODE_VALUE
1961
+ db = Transactd::Database.new()
1962
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
1963
+ tb = db.openTable("user")
1964
+ tb.fetchClass = User
1965
+ tb.ctorArgs = ["1", "2", "3"]
1966
+ # without alias
1967
+ User.reset_class
1968
+ User.transfer_map = {
1969
+ 名前: [:nest_name, :name_holder]
1970
+ }
1971
+ tb.seekFirst
1972
+ expect(tb.stat()).to eq 0
1973
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
1974
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
1975
+ rec = tb.fields
1976
+ expect(tb.stat()).to eq 0
1977
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
1978
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
1979
+ obj = tb.fields
1980
+ expect(obj.id).to eq 1
1981
+ expect(obj.respond_to?(:"名前")).to be false
1982
+ expect(obj.nest_name.name_holder.名前.nil?).to be false
1983
+ expect(obj.nest_name.name_holder.名前).to eq "1 user"
1984
+ obj.nest_name.name_holder.名前 = "1 ユーザー"
1985
+ rec.set_value_by_object(obj)
1986
+ obj2 = tb.fields
1987
+ expect(obj2.id).to eq 1
1988
+ expect(obj2.respond_to?(:"名前")).to be false
1989
+ expect(obj2.nest_name.name_holder.名前.nil?).to be false
1990
+ expect(obj2.nest_name.name_holder.名前).to eq "1 ユーザー"
1991
+ # with alias
1992
+ tb.setAlias("名前", "name")
1993
+ User.reset_class
1994
+ User.alias_attribute("name", "名前")
1995
+ User.transfer_map = {
1996
+ name: [:nest_name, :name_holder]
1997
+ }
1998
+ tb.seekFirst
1999
+ expect(tb.stat()).to eq 0
2000
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
2001
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
2002
+ rec = tb.fields
2003
+ expect(tb.stat()).to eq 0
2004
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
2005
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
2006
+ obj = tb.fields
2007
+ expect(obj.id).to eq 1
2008
+ expect(obj.respond_to?(:name)).to be false
2009
+ expect(obj.respond_to?(:"名前")).to be false
2010
+ expect(obj.nest_name.name_holder.name.nil?).to be false
2011
+ expect(obj.nest_name.name_holder.name).to eq "1 user"
2012
+ obj.nest_name.name_holder.name = "1 ユーザー"
2013
+ rec.set_value_by_object(obj)
2014
+ obj2 = tb.fields
2015
+ expect(obj2.id).to eq 1
2016
+ expect(obj2.respond_to?(:name)).to be false
2017
+ expect(obj2.respond_to?(:"名前")).to be false
2018
+ expect(obj2.nest_name.name_holder.name.nil?).to be false
2019
+ expect(obj2.nest_name.name_holder.name).to eq "1 ユーザー"
2020
+ # to change alias...
2021
+ tb.close
2022
+ tb = db.openTable("user")
2023
+ tb.fetchClass = User
2024
+ tb.ctorArgs = ["1", "2", "3"]
2025
+ # with UTF-8 string alias
2026
+ tb.setAlias("名前", "名前2")
2027
+ User.reset_class
2028
+ User.alias_attribute("名前2", "名前")
2029
+ User.transfer_map = {
2030
+ 名前2: [:nest_name, :name_holder]
2031
+ }
2032
+ tb.seekFirst
2033
+ expect(tb.stat()).to eq 0
2034
+ tb.fetchMode = Transactd::FETCH_RECORD_INTO
2035
+ expect(tb.fetchMode).to eq Transactd::FETCH_RECORD_INTO
2036
+ rec = tb.fields
2037
+ expect(tb.stat()).to eq 0
2038
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
2039
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
2040
+ obj = tb.fields
2041
+ expect(obj.id).to eq 1
2042
+ expect(obj.respond_to?(:"名前2")).to be false
2043
+ expect(obj.respond_to?(:"名前")).to be false
2044
+ expect(obj.nest_name.name_holder.名前2.nil?).to be false
2045
+ expect(obj.nest_name.name_holder.名前2).to eq "1 user"
2046
+ obj.nest_name.name_holder.名前2 = "1 ユーザー"
2047
+ rec.set_value_by_object(obj)
2048
+ obj2 = tb.fields
2049
+ expect(obj2.id).to eq 1
2050
+ expect(obj2.respond_to?(:"名前2")).to be false
2051
+ expect(obj2.respond_to?(:"名前")).to be false
2052
+ expect(obj2.nest_name.name_holder.名前2.nil?).to be false
2053
+ expect(obj2.nest_name.name_holder.名前2).to eq "1 ユーザー"
2054
+ User.reset_class
2055
+ tb.close
2056
+ db.close
2057
+ end
2058
+ it 'insert_object with transfer_map' do
2059
+ db = Transactd::Database.new()
2060
+ db.open(URL, Transactd::TYPE_SCHEMA_BDF, Transactd::TD_OPEN_NORMAL)
2061
+ tb = db.openTable("user")
2062
+ expect(tb.stat()).to eq 0
2063
+ tb.fetchClass = User
2064
+ tb.ctorArgs = ["1", "2", "3"]
2065
+ tb.setAlias("名前", "名前2")
2066
+ tb.setAlias("update_datetime", "update")
2067
+ tb.seekFirst()
2068
+ expect(tb.stat()).to eq 0
2069
+ # use alias and transfer_map
2070
+ tb.fetchMode = Transactd::FETCH_USR_CLASS
2071
+ expect(tb.fetchMode).to eq Transactd::FETCH_USR_CLASS
2072
+ User.reset_class
2073
+ User.alias_attribute("名前2", "名前")
2074
+ User.alias_attribute("update", "update_datetime")
2075
+ User.transfer_map = {
2076
+ 名前2: [:nest_name, :name_holder],
2077
+ update: [:nest, :aliased_datetime],
2078
+ create_datetime: [:nest, :datetime]
2079
+ }
2080
+ usr = tb.fields()
2081
+ expect(usr.respond_to?(:"名前")).to be false
2082
+ expect(usr.respond_to?(:"名前2")).to be false
2083
+ expect(usr.respond_to?(:update_datetime)).to be false
2084
+ expect(usr.respond_to?(:create_datetime)).to be false
2085
+ expect(usr.respond_to?(:update)).to be false
2086
+ expect(usr.respond_to?(:create)).to be false
2087
+ expect(usr.nest_name.name_holder.名前.nil?).to be true
2088
+ expect(usr.nest_name.name_holder.name.nil?).to be true
2089
+ expect(usr.nest_name.name_holder.名前2.nil?).to be false
2090
+ expect(usr.nest.aliased_datetime.update.nil?).to be false
2091
+ expect(usr.nest.aliased_datetime.create.nil?).to be true
2092
+ expect(usr.nest.datetime.update_datetime.nil?).to be true
2093
+ expect(usr.nest.datetime.create_datetime.nil?).to be false
2094
+ usr.id = 0
2095
+ usr.nest_name.name_holder.名前2 = 'test_insert_transfer'
2096
+ usr.nest.aliased_datetime.update = '2016-11-02 12:34:56'
2097
+ tb.insert_by_object(usr)
2098
+ tb.seekLast()
2099
+ usr = tb.fields()
2100
+ expect(usr.nest_name.name_holder.名前2).to eq 'test_insert_transfer'
2101
+ expect(usr.id).to eq 1003
2102
+ row = tb.getRecord()
2103
+ row.set_value_by_object(usr)
2104
+ usr2 = tb.fields()
2105
+ expect(usr2.a).to eq usr.a
2106
+ expect(usr2.b).to eq usr.b
2107
+ expect(usr2.c).to eq usr.c
2108
+ expect(usr2.id).to eq usr.id
2109
+ expect(usr2.nest_name.name_holder.名前2).to eq usr.nest_name.name_holder.名前2
2110
+ expect(usr2.group).to eq usr.group
2111
+ expect(usr2.tel).to eq usr.tel
2112
+ expect(usr2.nest.aliased_datetime.update).to eq usr.nest.aliased_datetime.update
2113
+ expect(usr2.nest.datetime.create_datetime).to start_with usr.nest.datetime.create_datetime
2114
+ tb.close
2115
+ db.close
2116
+ end
936
2117
  end