extralite 2.7 → 2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -1
- data/.yardopts +1 -1
- data/CHANGELOG.md +15 -4
- data/README.md +83 -46
- data/examples/kv_store.rb +1 -1
- data/examples/pubsub_store_polyphony.rb +2 -2
- data/examples/pubsub_store_threads.rb +3 -3
- data/ext/extralite/changeset.c +1 -1
- data/ext/extralite/common.c +27 -27
- data/ext/extralite/database.c +182 -102
- data/ext/extralite/extralite.h +10 -17
- data/ext/extralite/iterator.c +0 -1
- data/ext/extralite/query.c +45 -44
- data/gemspec.rb +1 -1
- data/lib/extralite/version.rb +1 -1
- data/lib/extralite.rb +158 -4
- data/test/{perf_ary.rb → perf_array.rb} +1 -1
- data/test/perf_splat.rb +63 -0
- data/test/{perf_argv_transform.rb → perf_splat_transform.rb} +7 -7
- data/test/test_database.rb +148 -117
- data/test/test_iterator.rb +12 -12
- data/test/test_query.rb +92 -92
- metadata +7 -7
- data/lib/extralite/sqlite3_constants.rb +0 -157
data/test/test_database.rb
CHANGED
@@ -40,30 +40,30 @@ class DatabaseTest < Minitest::Test
|
|
40
40
|
assert_equal [], r
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
44
|
-
r = @db.
|
43
|
+
def test_query_array
|
44
|
+
r = @db.query_array('select * from t')
|
45
45
|
assert_equal [[1, 2, 3], [4, 5, 6]], r
|
46
46
|
|
47
|
-
r = @db.
|
47
|
+
r = @db.query_array('select * from t where x = 2')
|
48
48
|
assert_equal [], r
|
49
49
|
end
|
50
50
|
|
51
|
-
def
|
52
|
-
r = @db.
|
51
|
+
def test_query_splat
|
52
|
+
r = @db.query_splat('select * from t')
|
53
53
|
assert_equal [[1, 2, 3], [4, 5, 6]], r
|
54
54
|
|
55
|
-
r = @db.
|
55
|
+
r = @db.query_splat('select * from t where x = 2')
|
56
56
|
assert_equal [], r
|
57
57
|
|
58
58
|
# with block
|
59
59
|
r = []
|
60
|
-
@db.
|
60
|
+
@db.query_splat('select * from t') { |a, b, c| r << [a, b, c] }
|
61
61
|
assert_equal [[1, 2, 3], [4, 5, 6]], r
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
64
|
+
def test_query_splat_with_too_many_columns
|
65
65
|
assert_raises(Extralite::Error) {
|
66
|
-
@db.
|
66
|
+
@db.query_splat('select 1, 2, 3, 4, 5, 6, 7, 8, 9');
|
67
67
|
}
|
68
68
|
end
|
69
69
|
|
@@ -75,11 +75,11 @@ class DatabaseTest < Minitest::Test
|
|
75
75
|
assert_nil r
|
76
76
|
end
|
77
77
|
|
78
|
-
def
|
79
|
-
r = @db.
|
78
|
+
def test_query_single_splat
|
79
|
+
r = @db.query_single_splat('select z from t order by Z desc limit 1')
|
80
80
|
assert_equal 6, r
|
81
81
|
|
82
|
-
r = @db.
|
82
|
+
r = @db.query_single_splat('select z from t where x = 2')
|
83
83
|
assert_nil r
|
84
84
|
end
|
85
85
|
|
@@ -99,7 +99,7 @@ class DatabaseTest < Minitest::Test
|
|
99
99
|
def test_multiple_statements
|
100
100
|
@db.query("insert into t values ('a', 'b', 'c'); insert into t values ('d', 'e', 'f');")
|
101
101
|
|
102
|
-
assert_equal [1, 4, 'a', 'd'], @db.
|
102
|
+
assert_equal [1, 4, 'a', 'd'], @db.query_splat('select x from t order by x')
|
103
103
|
end
|
104
104
|
|
105
105
|
def test_multiple_statements_with_error
|
@@ -123,13 +123,13 @@ class DatabaseTest < Minitest::Test
|
|
123
123
|
|
124
124
|
def test_close
|
125
125
|
assert_equal false, @db.closed?
|
126
|
-
r = @db.
|
126
|
+
r = @db.query_single_splat('select 42')
|
127
127
|
assert_equal 42, r
|
128
128
|
|
129
129
|
assert_equal @db, @db.close
|
130
130
|
assert_equal true, @db.closed?
|
131
131
|
|
132
|
-
assert_raises(Extralite::Error) { @db.
|
132
|
+
assert_raises(Extralite::Error) { @db.query_single_splat('select 42') }
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_parameter_binding_simple
|
@@ -139,7 +139,7 @@ class DatabaseTest < Minitest::Test
|
|
139
139
|
r = @db.query('select x, y, z from t where z = ?', 6)
|
140
140
|
assert_equal [{ x: 4, y: 5, z: 6 }], r
|
141
141
|
|
142
|
-
error = assert_raises(Extralite::ParameterError) { @db.
|
142
|
+
error = assert_raises(Extralite::ParameterError) { @db.query_single_splat('select ?', Date.today) }
|
143
143
|
assert_equal error.message, 'Cannot bind parameter at position 1 of type Date'
|
144
144
|
end
|
145
145
|
|
@@ -173,24 +173,24 @@ class DatabaseTest < Minitest::Test
|
|
173
173
|
class Foo; end
|
174
174
|
|
175
175
|
def test_parameter_binding_from_hash
|
176
|
-
assert_equal 42, @db.
|
177
|
-
assert_equal 42, @db.
|
178
|
-
assert_equal 42, @db.
|
179
|
-
assert_nil @db.
|
176
|
+
assert_equal 42, @db.query_single_splat('select :bar', foo: 41, bar: 42)
|
177
|
+
assert_equal 42, @db.query_single_splat('select :bar', 'foo' => 41, 'bar' => 42)
|
178
|
+
assert_equal 42, @db.query_single_splat('select ?8', 7 => 41, 8 => 42)
|
179
|
+
assert_nil @db.query_single_splat('select :bar', foo: 41)
|
180
180
|
|
181
|
-
error = assert_raises(Extralite::ParameterError) { @db.
|
181
|
+
error = assert_raises(Extralite::ParameterError) { @db.query_single_splat('select ?', Foo.new => 42) }
|
182
182
|
assert_equal error.message, 'Cannot bind parameter with a key of type DatabaseTest::Foo'
|
183
183
|
|
184
|
-
error = assert_raises(Extralite::ParameterError) { @db.
|
184
|
+
error = assert_raises(Extralite::ParameterError) { @db.query_single_splat('select ?', %w[a b] => 42) }
|
185
185
|
assert_equal error.message, 'Cannot bind parameter with a key of type Array'
|
186
186
|
end
|
187
187
|
|
188
188
|
def test_parameter_binding_from_struct
|
189
189
|
foo_bar = Struct.new(:':foo', :bar)
|
190
190
|
value = foo_bar.new(41, 42)
|
191
|
-
assert_equal 41, @db.
|
192
|
-
assert_equal 42, @db.
|
193
|
-
assert_nil @db.
|
191
|
+
assert_equal 41, @db.query_single_splat('select :foo', value)
|
192
|
+
assert_equal 42, @db.query_single_splat('select :bar', value)
|
193
|
+
assert_nil @db.query_single_splat('select :baz', value)
|
194
194
|
end
|
195
195
|
|
196
196
|
def test_parameter_binding_from_data_class
|
@@ -198,8 +198,8 @@ class DatabaseTest < Minitest::Test
|
|
198
198
|
|
199
199
|
foo_bar = Data.define(:':foo', :bar)
|
200
200
|
value = foo_bar.new(':foo': 41, bar: 42)
|
201
|
-
assert_equal 42, @db.
|
202
|
-
assert_nil @db.
|
201
|
+
assert_equal 42, @db.query_single_splat('select :bar', value)
|
202
|
+
assert_nil @db.query_single_splat('select :baz', value)
|
203
203
|
end
|
204
204
|
|
205
205
|
def test_parameter_binding_for_blobs
|
@@ -235,43 +235,43 @@ class DatabaseTest < Minitest::Test
|
|
235
235
|
end
|
236
236
|
|
237
237
|
def test_parameter_binding_for_simple_types
|
238
|
-
assert_nil @db.
|
238
|
+
assert_nil @db.query_single_splat('select ?', nil)
|
239
239
|
|
240
240
|
# 32-bit integers
|
241
|
-
assert_equal(-2** 31, @db.
|
242
|
-
assert_equal(2**31 - 1, @db.
|
241
|
+
assert_equal(-2** 31, @db.query_single_splat('select ?', -2**31))
|
242
|
+
assert_equal(2**31 - 1, @db.query_single_splat('select ?', 2**31 - 1))
|
243
243
|
|
244
244
|
# 64-bit integers
|
245
|
-
assert_equal(-2 ** 63, @db.
|
246
|
-
assert_equal(2**63 - 1, @db.
|
245
|
+
assert_equal(-2 ** 63, @db.query_single_splat('select ?', -2 ** 63))
|
246
|
+
assert_equal(2**63 - 1, @db.query_single_splat('select ?', 2**63 - 1))
|
247
247
|
|
248
248
|
# floats
|
249
|
-
assert_equal Float::MIN, @db.
|
250
|
-
assert_equal Float::MAX, @db.
|
249
|
+
assert_equal Float::MIN, @db.query_single_splat('select ?', Float::MIN)
|
250
|
+
assert_equal Float::MAX, @db.query_single_splat('select ?', Float::MAX)
|
251
251
|
|
252
252
|
# boolean
|
253
|
-
assert_equal 1, @db.
|
254
|
-
assert_equal 0, @db.
|
253
|
+
assert_equal 1, @db.query_single_splat('select ?', true)
|
254
|
+
assert_equal 0, @db.query_single_splat('select ?', false)
|
255
255
|
|
256
256
|
# strings and symbols
|
257
|
-
assert_equal 'foo', @db.
|
258
|
-
assert_equal 'foo', @db.
|
257
|
+
assert_equal 'foo', @db.query_single_splat('select ?', 'foo')
|
258
|
+
assert_equal 'foo', @db.query_single_splat('select ?', :foo)
|
259
259
|
end
|
260
260
|
|
261
261
|
def test_value_casting
|
262
|
-
r = @db.
|
262
|
+
r = @db.query_single_splat("select 'abc'")
|
263
263
|
assert_equal 'abc', r
|
264
264
|
|
265
|
-
r = @db.
|
265
|
+
r = @db.query_single_splat('select 123')
|
266
266
|
assert_equal 123, r
|
267
267
|
|
268
|
-
r = @db.
|
268
|
+
r = @db.query_single_splat('select 12.34')
|
269
269
|
assert_equal 12.34, r
|
270
270
|
|
271
|
-
r = @db.
|
271
|
+
r = @db.query_single_splat('select zeroblob(4)')
|
272
272
|
assert_equal "\x00\x00\x00\x00", r
|
273
273
|
|
274
|
-
r = @db.
|
274
|
+
r = @db.query_single_splat('select null')
|
275
275
|
assert_nil r
|
276
276
|
end
|
277
277
|
|
@@ -283,7 +283,7 @@ class DatabaseTest < Minitest::Test
|
|
283
283
|
@db.load_extension(File.join(__dir__, 'extensions/text.dylib'))
|
284
284
|
end
|
285
285
|
|
286
|
-
r = @db.
|
286
|
+
r = @db.query_single_splat("select reverse('abcd')")
|
287
287
|
assert_equal 'dcba', r
|
288
288
|
end
|
289
289
|
|
@@ -342,13 +342,13 @@ class DatabaseTest < Minitest::Test
|
|
342
342
|
def test_execute_with_params
|
343
343
|
changes = @db.execute('update t set x = ? where z = ?', 42, 6)
|
344
344
|
assert_equal 1, changes
|
345
|
-
assert_equal [[1, 2, 3], [42, 5, 6]], @db.
|
345
|
+
assert_equal [[1, 2, 3], [42, 5, 6]], @db.query_array('select * from t order by x')
|
346
346
|
end
|
347
347
|
|
348
348
|
def test_execute_with_params_array
|
349
349
|
changes = @db.execute('update t set x = ? where z = ?', [42, 6])
|
350
350
|
assert_equal 1, changes
|
351
|
-
assert_equal [[1, 2, 3], [42, 5, 6]], @db.
|
351
|
+
assert_equal [[1, 2, 3], [42, 5, 6]], @db.query_array('select * from t order by x')
|
352
352
|
end
|
353
353
|
|
354
354
|
def test_batch_execute
|
@@ -513,7 +513,7 @@ class DatabaseTest < Minitest::Test
|
|
513
513
|
], array
|
514
514
|
end
|
515
515
|
|
516
|
-
def
|
516
|
+
def test_batch_query_array_with_array
|
517
517
|
@db.query('create table foo (a, b, c)')
|
518
518
|
assert_equal [], @db.query('select * from foo')
|
519
519
|
|
@@ -521,20 +521,20 @@ class DatabaseTest < Minitest::Test
|
|
521
521
|
[1, '2', 3],
|
522
522
|
['4', 5, 6]
|
523
523
|
]
|
524
|
-
results = @db.
|
524
|
+
results = @db.batch_query_array('insert into foo values (?, ?, ?) returning *', data)
|
525
525
|
assert_equal [
|
526
526
|
[[1, '2', 3]],
|
527
527
|
[['4', 5, 6]]
|
528
528
|
], results
|
529
529
|
|
530
|
-
results = @db.
|
530
|
+
results = @db.batch_query_array('update foo set c = ? returning *', [42, 43])
|
531
531
|
assert_equal [
|
532
532
|
[[1, '2', 42], ['4', 5, 42]],
|
533
533
|
[[1, '2', 43], ['4', 5, 43]]
|
534
534
|
], results
|
535
535
|
|
536
536
|
array = []
|
537
|
-
changes = @db.
|
537
|
+
changes = @db.batch_query_array('update foo set c = ? returning *', [44, 45]) do |rows|
|
538
538
|
array << rows
|
539
539
|
end
|
540
540
|
assert_equal 4, changes
|
@@ -544,25 +544,25 @@ class DatabaseTest < Minitest::Test
|
|
544
544
|
], array
|
545
545
|
end
|
546
546
|
|
547
|
-
def
|
547
|
+
def test_batch_query_array_with_enumerable
|
548
548
|
@db.query('create table foo (a integer primary key, b)')
|
549
549
|
assert_equal [], @db.query('select * from foo')
|
550
550
|
|
551
|
-
results = @db.
|
551
|
+
results = @db.batch_query_array('insert into foo (b) values (?) returning *', 11..13)
|
552
552
|
assert_equal [
|
553
553
|
[[1, 11]],
|
554
554
|
[[2, 12]],
|
555
555
|
[[3, 13]]
|
556
556
|
], results
|
557
557
|
|
558
|
-
results = @db.
|
558
|
+
results = @db.batch_query_array('update foo set b = ? returning *', [42, 43])
|
559
559
|
assert_equal [
|
560
560
|
[[1, 42], [2, 42], [3, 42]],
|
561
561
|
[[1, 43], [2, 43], [3, 43]]
|
562
562
|
], results
|
563
563
|
|
564
564
|
array = []
|
565
|
-
changes = @db.
|
565
|
+
changes = @db.batch_query_array('update foo set b = ? returning *', [44, 45]) do |rows|
|
566
566
|
array << rows
|
567
567
|
end
|
568
568
|
assert_equal 6, changes
|
@@ -572,13 +572,13 @@ class DatabaseTest < Minitest::Test
|
|
572
572
|
], array
|
573
573
|
end
|
574
574
|
|
575
|
-
def
|
575
|
+
def test_batch_query_array_with_proc
|
576
576
|
@db.query('create table foo (a integer primary key, b)')
|
577
577
|
assert_equal [], @db.query('select * from foo')
|
578
578
|
|
579
579
|
pr = parameter_source_proc([5, 4, 3])
|
580
580
|
assert_kind_of Proc, pr
|
581
|
-
results = @db.
|
581
|
+
results = @db.batch_query_array('insert into foo (b) values (?) returning *', pr)
|
582
582
|
assert_equal [
|
583
583
|
[[1, 5]],
|
584
584
|
[[2, 4]],
|
@@ -586,7 +586,7 @@ class DatabaseTest < Minitest::Test
|
|
586
586
|
], results
|
587
587
|
|
588
588
|
pr = parameter_source_proc([42, 43])
|
589
|
-
results = @db.
|
589
|
+
results = @db.batch_query_array('update foo set b = ? returning *', pr)
|
590
590
|
assert_equal [
|
591
591
|
[[1, 42], [2, 42], [3, 42]],
|
592
592
|
[[1, 43], [2, 43], [3, 43]]
|
@@ -594,7 +594,7 @@ class DatabaseTest < Minitest::Test
|
|
594
594
|
|
595
595
|
array = []
|
596
596
|
pr = parameter_source_proc([44, 45])
|
597
|
-
changes = @db.
|
597
|
+
changes = @db.batch_query_array('update foo set b = ? returning *', pr) do |rows|
|
598
598
|
array << rows
|
599
599
|
end
|
600
600
|
assert_equal 6, changes
|
@@ -604,7 +604,7 @@ class DatabaseTest < Minitest::Test
|
|
604
604
|
], array
|
605
605
|
end
|
606
606
|
|
607
|
-
def
|
607
|
+
def test_batch_query_splat_with_array
|
608
608
|
@db.query('create table foo (a, b, c)')
|
609
609
|
assert_equal [], @db.query('select * from foo')
|
610
610
|
|
@@ -612,20 +612,20 @@ class DatabaseTest < Minitest::Test
|
|
612
612
|
[1, '2', 3],
|
613
613
|
['4', 5, 6]
|
614
614
|
]
|
615
|
-
results = @db.
|
615
|
+
results = @db.batch_query_splat('insert into foo values (?, ?, ?) returning c', data)
|
616
616
|
assert_equal [
|
617
617
|
[3],
|
618
618
|
[6]
|
619
619
|
], results
|
620
620
|
|
621
|
-
results = @db.
|
621
|
+
results = @db.batch_query_splat('update foo set c = ? returning c * 10 + cast(b as integer)', [42, 43])
|
622
622
|
assert_equal [
|
623
623
|
[422, 425],
|
624
624
|
[432, 435]
|
625
625
|
], results
|
626
626
|
|
627
627
|
array = []
|
628
|
-
changes = @db.
|
628
|
+
changes = @db.batch_query_splat('update foo set c = ? returning c * 10 + cast(b as integer)', [44, 45]) do |rows|
|
629
629
|
array << rows
|
630
630
|
end
|
631
631
|
assert_equal 4, changes
|
@@ -635,25 +635,25 @@ class DatabaseTest < Minitest::Test
|
|
635
635
|
], array
|
636
636
|
end
|
637
637
|
|
638
|
-
def
|
638
|
+
def test_batch_query_splat_with_enumerable
|
639
639
|
@db.query('create table foo (a integer primary key, b)')
|
640
640
|
assert_equal [], @db.query('select * from foo')
|
641
641
|
|
642
|
-
results = @db.
|
642
|
+
results = @db.batch_query_splat('insert into foo (b) values (?) returning b * 10 + a', 11..13)
|
643
643
|
assert_equal [
|
644
644
|
[111],
|
645
645
|
[122],
|
646
646
|
[133]
|
647
647
|
], results
|
648
648
|
|
649
|
-
results = @db.
|
649
|
+
results = @db.batch_query_splat('update foo set b = ? returning b * 10 + a', 42..43)
|
650
650
|
assert_equal [
|
651
651
|
[421, 422, 423],
|
652
652
|
[431, 432, 433]
|
653
653
|
], results
|
654
654
|
|
655
655
|
array = []
|
656
|
-
changes = @db.
|
656
|
+
changes = @db.batch_query_splat('update foo set b = ? returning b * 10 + a', 44..45) do |rows|
|
657
657
|
array << rows
|
658
658
|
end
|
659
659
|
assert_equal 6, changes
|
@@ -663,13 +663,13 @@ class DatabaseTest < Minitest::Test
|
|
663
663
|
], array
|
664
664
|
end
|
665
665
|
|
666
|
-
def
|
666
|
+
def test_batch_query_splat_with_proc
|
667
667
|
@db.query('create table foo (a integer primary key, b)')
|
668
668
|
assert_equal [], @db.query('select * from foo')
|
669
669
|
|
670
670
|
pr = parameter_source_proc([5, 4, 3])
|
671
671
|
assert_kind_of Proc, pr
|
672
|
-
results = @db.
|
672
|
+
results = @db.batch_query_splat('insert into foo (b) values (?) returning b', pr)
|
673
673
|
assert_equal [
|
674
674
|
[5],
|
675
675
|
[4],
|
@@ -677,7 +677,7 @@ class DatabaseTest < Minitest::Test
|
|
677
677
|
], results
|
678
678
|
|
679
679
|
pr = parameter_source_proc([42, 43])
|
680
|
-
results = @db.
|
680
|
+
results = @db.batch_query_splat('update foo set b = ? returning b * 10 + a', pr)
|
681
681
|
assert_equal [
|
682
682
|
[421, 422, 423],
|
683
683
|
[431, 432, 433]
|
@@ -685,7 +685,7 @@ class DatabaseTest < Minitest::Test
|
|
685
685
|
|
686
686
|
array = []
|
687
687
|
pr = parameter_source_proc([44, 45])
|
688
|
-
changes = @db.
|
688
|
+
changes = @db.batch_query_splat('update foo set b = ? returning b * 10 + a', pr) do |rows|
|
689
689
|
array << rows
|
690
690
|
end
|
691
691
|
assert_equal 6, changes
|
@@ -857,7 +857,7 @@ class DatabaseTest < Minitest::Test
|
|
857
857
|
|
858
858
|
def test_string_encoding
|
859
859
|
db = Extralite::Database.new(':memory:')
|
860
|
-
v = db.
|
860
|
+
v = db.query_single_splat("select 'foo'")
|
861
861
|
assert_equal 'foo', v
|
862
862
|
assert_equal 'UTF-8', v.encoding.name
|
863
863
|
end
|
@@ -942,24 +942,24 @@ class DatabaseTest < Minitest::Test
|
|
942
942
|
assert_equal [], db.query('select * from foo')
|
943
943
|
|
944
944
|
db.execute('insert into foo values (42)')
|
945
|
-
assert_equal [42], db.
|
945
|
+
assert_equal [42], db.query_splat('select x from foo')
|
946
946
|
|
947
947
|
db.savepoint(:a)
|
948
948
|
|
949
949
|
db.execute('insert into foo values (43)')
|
950
|
-
assert_equal [42, 43], db.
|
950
|
+
assert_equal [42, 43], db.query_splat('select x from foo')
|
951
951
|
|
952
952
|
db.savepoint(:b)
|
953
953
|
|
954
954
|
db.execute('insert into foo values (44)')
|
955
|
-
assert_equal [42, 43, 44], db.
|
955
|
+
assert_equal [42, 43, 44], db.query_splat('select x from foo')
|
956
956
|
|
957
957
|
db.rollback_to(:b)
|
958
|
-
assert_equal [42, 43], db.
|
958
|
+
assert_equal [42, 43], db.query_splat('select x from foo')
|
959
959
|
|
960
960
|
db.release(:a)
|
961
961
|
|
962
|
-
assert_equal [42, 43], db.
|
962
|
+
assert_equal [42, 43], db.query_splat('select x from foo')
|
963
963
|
end
|
964
964
|
end
|
965
965
|
|
@@ -973,8 +973,8 @@ class DatabaseTest < Minitest::Test
|
|
973
973
|
], q.to_a
|
974
974
|
end
|
975
975
|
|
976
|
-
def
|
977
|
-
q = @db.
|
976
|
+
def test_prepare_splat
|
977
|
+
q = @db.prepare_splat('select * from t order by x')
|
978
978
|
assert_kind_of Extralite::Query, q
|
979
979
|
|
980
980
|
buf = []
|
@@ -982,8 +982,8 @@ class DatabaseTest < Minitest::Test
|
|
982
982
|
assert_equal [3, 6], buf
|
983
983
|
end
|
984
984
|
|
985
|
-
def
|
986
|
-
q = @db.
|
985
|
+
def test_prepare_array
|
986
|
+
q = @db.prepare_array('select * from t order by x')
|
987
987
|
assert_kind_of Extralite::Query, q
|
988
988
|
|
989
989
|
assert_equal [
|
@@ -1000,21 +1000,52 @@ class DatabaseTest < Minitest::Test
|
|
1000
1000
|
], q.to_a
|
1001
1001
|
end
|
1002
1002
|
|
1003
|
-
def
|
1004
|
-
q = @db.
|
1003
|
+
def test_prepare_splat_with_transform
|
1004
|
+
q = @db.prepare_splat('select * from t order by x') { |x, y, z| x * 100 + y * 10 + z }
|
1005
1005
|
assert_equal [
|
1006
1006
|
123,
|
1007
1007
|
456
|
1008
1008
|
], q.to_a
|
1009
1009
|
end
|
1010
1010
|
|
1011
|
-
def
|
1012
|
-
q = @db.
|
1011
|
+
def test_prepare_array_with_transform
|
1012
|
+
q = @db.prepare_array('select * from t order by x') { |r| r * 2 }
|
1013
1013
|
assert_equal [
|
1014
1014
|
[1, 2, 3, 1, 2, 3],
|
1015
1015
|
[4, 5, 6, 4, 5, 6]
|
1016
1016
|
], q.to_a
|
1017
1017
|
end
|
1018
|
+
|
1019
|
+
def test_wal_checkpoint
|
1020
|
+
fn = Tempfile.new('extralite_test_wal_checkpoint').path
|
1021
|
+
|
1022
|
+
db = Extralite::Database.new(fn, wal: true)
|
1023
|
+
|
1024
|
+
db.execute 'create table t (x, y, z)'
|
1025
|
+
rows = (1..1000).map { [rand, rand, rand] }
|
1026
|
+
db.batch_execute('insert into t values (?, ?, ?)', rows)
|
1027
|
+
|
1028
|
+
wal_fn = "#{fn}-wal"
|
1029
|
+
|
1030
|
+
assert File.exist?(wal_fn)
|
1031
|
+
assert File.size(wal_fn) > 0
|
1032
|
+
|
1033
|
+
# invalid mode
|
1034
|
+
assert_raises(ArgumentError) { db.wal_checkpoint(:foo) }
|
1035
|
+
|
1036
|
+
# invalid db name
|
1037
|
+
assert_raises(Extralite::Error) { db.wal_checkpoint(:passive, 'foo') }
|
1038
|
+
|
1039
|
+
r = db.wal_checkpoint(:full)
|
1040
|
+
assert File.exist?(wal_fn)
|
1041
|
+
assert File.size(wal_fn) > 0
|
1042
|
+
assert_equal [19, 19], r
|
1043
|
+
|
1044
|
+
r = db.wal_checkpoint(:truncate)
|
1045
|
+
assert File.exist?(wal_fn)
|
1046
|
+
assert File.size(wal_fn) == 0
|
1047
|
+
assert_equal [0, 0], r
|
1048
|
+
end
|
1018
1049
|
end
|
1019
1050
|
|
1020
1051
|
class ScenarioTest < Minitest::Test
|
@@ -1046,7 +1077,7 @@ class ScenarioTest < Minitest::Test
|
|
1046
1077
|
|
1047
1078
|
sleep 0.1
|
1048
1079
|
@db.query 'begin deferred'
|
1049
|
-
result = @db.
|
1080
|
+
result = @db.query_splat('select x from t')
|
1050
1081
|
assert_equal [1, 4], result
|
1051
1082
|
|
1052
1083
|
assert_raises(Extralite::BusyError) do
|
@@ -1080,7 +1111,7 @@ class ScenarioTest < Minitest::Test
|
|
1080
1111
|
@db.query('insert into t values (7, 8, 9)')
|
1081
1112
|
@db.query('commit')
|
1082
1113
|
|
1083
|
-
result = @db.
|
1114
|
+
result = @db.query_splat('select x from t')
|
1084
1115
|
assert_equal [1, 4, 7], result
|
1085
1116
|
ensure
|
1086
1117
|
t&.kill
|
@@ -1109,7 +1140,7 @@ class ScenarioTest < Minitest::Test
|
|
1109
1140
|
t1.join
|
1110
1141
|
t2.join
|
1111
1142
|
|
1112
|
-
assert_equal (1..100).to_a, @db.
|
1143
|
+
assert_equal (1..100).to_a, @db.query_splat('select x from t order by x')
|
1113
1144
|
ensure
|
1114
1145
|
t1&.kill
|
1115
1146
|
t2&.kill
|
@@ -1153,19 +1184,19 @@ class BackupTest < Minitest::Test
|
|
1153
1184
|
|
1154
1185
|
def test_backup
|
1155
1186
|
@src.backup(@dst)
|
1156
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1187
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from t')
|
1157
1188
|
end
|
1158
1189
|
|
1159
1190
|
def test_backup_with_block
|
1160
1191
|
progress = []
|
1161
1192
|
@src.backup(@dst) { |r, t| progress << [r, t] }
|
1162
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1193
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from t')
|
1163
1194
|
assert_equal [[2, 2]], progress
|
1164
1195
|
end
|
1165
1196
|
|
1166
1197
|
def test_backup_with_schema_names
|
1167
1198
|
@src.backup(@dst, 'main', 'temp')
|
1168
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1199
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from temp.t')
|
1169
1200
|
end
|
1170
1201
|
|
1171
1202
|
def test_backup_with_fn
|
@@ -1173,7 +1204,7 @@ class BackupTest < Minitest::Test
|
|
1173
1204
|
@src.backup(tmp_fn)
|
1174
1205
|
|
1175
1206
|
db = Extralite::Database.new(tmp_fn)
|
1176
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], db.
|
1207
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], db.query_array('select * from t')
|
1177
1208
|
end
|
1178
1209
|
end
|
1179
1210
|
|
@@ -1620,7 +1651,7 @@ class RactorTest < Minitest::Test
|
|
1620
1651
|
r << 42
|
1621
1652
|
r.take # wait for ractor to terminate
|
1622
1653
|
|
1623
|
-
assert_equal 42, db.
|
1654
|
+
assert_equal 42, db.query_single_splat('select x from foo')
|
1624
1655
|
end
|
1625
1656
|
|
1626
1657
|
# Adapted from here: https://github.com/sparklemotion/sqlite3-ruby/pull/365/files
|
@@ -1681,7 +1712,7 @@ class RactorTest < Minitest::Test
|
|
1681
1712
|
|
1682
1713
|
final_check = Ractor.new(fn) do |rfn|
|
1683
1714
|
rdb = Extralite::Database.new(rfn, wal: true)
|
1684
|
-
count = rdb.
|
1715
|
+
count = rdb.query_single_splat('select count(*) from stress_test')
|
1685
1716
|
Ractor.yield count
|
1686
1717
|
end
|
1687
1718
|
count = final_check.take
|
@@ -1739,15 +1770,15 @@ class DatabaseTransformTest < Minitest::Test
|
|
1739
1770
|
], buf
|
1740
1771
|
end
|
1741
1772
|
|
1742
|
-
def
|
1773
|
+
def test_query_array_transform
|
1743
1774
|
transform = ->(h) { MyModel.new(h) }
|
1744
1775
|
|
1745
1776
|
sql = 'select a, b from t where a = ?'
|
1746
|
-
o = @db.
|
1777
|
+
o = @db.query_array(transform, sql, 1).first
|
1747
1778
|
assert_kind_of MyModel, o
|
1748
1779
|
assert_equal([1, 2], o.values)
|
1749
1780
|
|
1750
|
-
o = @db.
|
1781
|
+
o = @db.query_array(transform, sql, 4).first
|
1751
1782
|
assert_kind_of MyModel, o
|
1752
1783
|
assert_equal([4, 5], o.values)
|
1753
1784
|
|
@@ -1755,10 +1786,10 @@ class DatabaseTransformTest < Minitest::Test
|
|
1755
1786
|
assert_equal [
|
1756
1787
|
[1, 2],
|
1757
1788
|
[4, 5]
|
1758
|
-
], @db.
|
1789
|
+
], @db.query_array(transform, sql).map(&:values)
|
1759
1790
|
|
1760
1791
|
buf = []
|
1761
|
-
@db.
|
1792
|
+
@db.query_array(transform, sql) { |r| buf << r.values }
|
1762
1793
|
assert_equal [
|
1763
1794
|
[1, 2],
|
1764
1795
|
[4, 5]
|
@@ -1778,74 +1809,74 @@ class DatabaseTransformTest < Minitest::Test
|
|
1778
1809
|
assert_equal({ a: 4, b: 5 }, o.values)
|
1779
1810
|
end
|
1780
1811
|
|
1781
|
-
def
|
1812
|
+
def test_query_array_single_row_transform
|
1782
1813
|
transform = ->(h) { MyModel.new(h) }
|
1783
1814
|
|
1784
1815
|
sql = 'select a, b from t where a = ?'
|
1785
|
-
o = @db.
|
1816
|
+
o = @db.query_single_array(transform, sql, 1)
|
1786
1817
|
assert_kind_of MyModel, o
|
1787
1818
|
assert_equal([1, 2], o.values)
|
1788
1819
|
|
1789
|
-
o = @db.
|
1820
|
+
o = @db.query_single_array(transform, sql, 4)
|
1790
1821
|
assert_kind_of MyModel, o
|
1791
1822
|
assert_equal([4, 5], o.values)
|
1792
1823
|
end
|
1793
1824
|
|
1794
|
-
def
|
1825
|
+
def test_query_splat_single_column_transform
|
1795
1826
|
transform = ->(c) { JSON.parse(c, symbolize_names: true) }
|
1796
1827
|
sql = 'select c from t where a = ?'
|
1797
1828
|
|
1798
|
-
assert_equal([{ foo: 42, bar: 43 }], @db.
|
1799
|
-
assert_equal([{ foo: 45, bar: 46 }], @db.
|
1829
|
+
assert_equal([{ foo: 42, bar: 43 }], @db.query_splat(transform, sql, 1))
|
1830
|
+
assert_equal([{ foo: 45, bar: 46 }], @db.query_splat(transform, sql, 4))
|
1800
1831
|
|
1801
1832
|
sql = 'select c from t order by a'
|
1802
1833
|
assert_equal [
|
1803
1834
|
{ foo: 42, bar: 43 },
|
1804
1835
|
{ foo: 45, bar: 46 }
|
1805
|
-
], @db.
|
1836
|
+
], @db.query_splat(transform, sql)
|
1806
1837
|
|
1807
1838
|
buf = []
|
1808
|
-
@db.
|
1839
|
+
@db.query_splat(transform, sql) { |r| buf << r }
|
1809
1840
|
assert_equal [
|
1810
1841
|
{ foo: 42, bar: 43 },
|
1811
1842
|
{ foo: 45, bar: 46 }
|
1812
1843
|
], buf
|
1813
1844
|
end
|
1814
1845
|
|
1815
|
-
def
|
1846
|
+
def test_query_splat_single_row_single_column
|
1816
1847
|
transform = ->(c) { JSON.parse(c, symbolize_names: true) }
|
1817
1848
|
sql = 'select c from t where a = ?'
|
1818
1849
|
|
1819
|
-
assert_equal({ foo: 42, bar: 43 }, @db.
|
1820
|
-
assert_equal({ foo: 45, bar: 46 }, @db.
|
1850
|
+
assert_equal({ foo: 42, bar: 43 }, @db.query_single_splat(transform, sql, 1))
|
1851
|
+
assert_equal({ foo: 45, bar: 46 }, @db.query_single_splat(transform, sql, 4))
|
1821
1852
|
end
|
1822
1853
|
|
1823
|
-
def
|
1854
|
+
def test_query_splat_multi_column
|
1824
1855
|
transform = ->(a, b, c) { { a: a, b: b, c: JSON.parse(c, symbolize_names: true) } }
|
1825
1856
|
sql = 'select * from t where a = ?'
|
1826
1857
|
|
1827
|
-
assert_equal([{ a: 1, b: 2, c: { foo: 42, bar: 43 }}], @db.
|
1828
|
-
assert_equal([{ a: 4, b: 5, c: { foo: 45, bar: 46 }}], @db.
|
1858
|
+
assert_equal([{ a: 1, b: 2, c: { foo: 42, bar: 43 }}], @db.query_splat(transform, sql, 1))
|
1859
|
+
assert_equal([{ a: 4, b: 5, c: { foo: 45, bar: 46 }}], @db.query_splat(transform, sql, 4))
|
1829
1860
|
|
1830
1861
|
sql = 'select * from t order by a'
|
1831
1862
|
assert_equal [
|
1832
1863
|
{ a: 1, b: 2, c: { foo: 42, bar: 43 }},
|
1833
1864
|
{ a: 4, b: 5, c: { foo: 45, bar: 46 }}
|
1834
|
-
], @db.
|
1865
|
+
], @db.query_splat(transform, sql)
|
1835
1866
|
|
1836
1867
|
buf = []
|
1837
|
-
@db.
|
1868
|
+
@db.query_splat(transform, sql) { |r| buf << r }
|
1838
1869
|
assert_equal [
|
1839
1870
|
{ a: 1, b: 2, c: { foo: 42, bar: 43 }},
|
1840
1871
|
{ a: 4, b: 5, c: { foo: 45, bar: 46 }}
|
1841
1872
|
], buf
|
1842
1873
|
end
|
1843
1874
|
|
1844
|
-
def
|
1875
|
+
def test_query_splat_single_row_multi_column
|
1845
1876
|
transform = ->(a, b, c) { { a: a, b: b, c: JSON.parse(c, symbolize_names: true) } }
|
1846
1877
|
sql = 'select * from t where a = ?'
|
1847
1878
|
|
1848
|
-
assert_equal({ a: 1, b: 2, c: { foo: 42, bar: 43 }}, @db.
|
1849
|
-
assert_equal({ a: 4, b: 5, c: { foo: 45, bar: 46 }}, @db.
|
1879
|
+
assert_equal({ a: 1, b: 2, c: { foo: 42, bar: 43 }}, @db.query_single_splat(transform, sql, 1))
|
1880
|
+
assert_equal({ a: 4, b: 5, c: { foo: 45, bar: 46 }}, @db.query_single_splat(transform, sql, 4))
|
1850
1881
|
end
|
1851
1882
|
end
|