extralite 2.7.1 → 2.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +1 -1
- data/CHANGELOG.md +17 -4
- data/README.md +79 -42
- data/examples/kv_store.rb +1 -1
- data/examples/pubsub_store_polyphony.rb +7 -7
- 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 +134 -61
- data/ext/extralite/extralite.h +10 -17
- data/ext/extralite/query.c +17 -17
- data/gemspec.rb +1 -1
- data/lib/extralite/version.rb +1 -1
- data/lib/extralite.rb +158 -3
- 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 +193 -120
- 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.
|
951
|
-
|
950
|
+
assert_equal [42, 43], db.query_splat('select x from foo')
|
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,94 @@ 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
|
1049
|
+
|
1050
|
+
def test_execute_with_comments
|
1051
|
+
result = @db.execute(<<~SQL)
|
1052
|
+
-- this is a comment
|
1053
|
+
SQL
|
1054
|
+
assert_nil result
|
1055
|
+
|
1056
|
+
result = @db.execute(<<~SQL)
|
1057
|
+
DELETE FROM t;
|
1058
|
+
INSERT INTO t (x, y, z) VALUES (1, 1, 1);
|
1059
|
+
INSERT INTO t (x, y, z) VALUES (2, 2, 2);
|
1060
|
+
SQL
|
1061
|
+
assert_equal 1, result
|
1062
|
+
assert_equal [1, 2], @db.query_splat('SELECT x FROM t ORDER BY x')
|
1063
|
+
|
1064
|
+
result = @db.execute(<<~SQL)
|
1065
|
+
-- this is a comment at the beginning
|
1066
|
+
DELETE FROM t;
|
1067
|
+
INSERT INTO t (x, y, z) VALUES (3, 3, 3);
|
1068
|
+
INSERT INTO t (x, y, z) VALUES (4, 4, 4);
|
1069
|
+
SQL
|
1070
|
+
assert_equal 1, result
|
1071
|
+
assert_equal [3, 4], @db.query_splat('SELECT x FROM t ORDER BY x')
|
1072
|
+
|
1073
|
+
result = @db.execute(<<~SQL)
|
1074
|
+
DELETE FROM t;
|
1075
|
+
INSERT INTO t (x, y, z) VALUES (5, 5, 5);
|
1076
|
+
-- this is a comment in the middle
|
1077
|
+
INSERT INTO t (x, y, z) VALUES (6, 6, 6);
|
1078
|
+
SQL
|
1079
|
+
assert_equal 1, result
|
1080
|
+
assert_equal [5, 6], @db.query_splat('SELECT x FROM t ORDER BY x')
|
1081
|
+
|
1082
|
+
result = @db.execute(<<~SQL)
|
1083
|
+
DELETE FROM t;
|
1084
|
+
INSERT INTO t (x, y, z) VALUES (7, 7, 7);
|
1085
|
+
INSERT INTO t (x, y, z) VALUES (8, 8, 8);
|
1086
|
+
-- this is a comment at the end
|
1087
|
+
SQL
|
1088
|
+
assert_nil result
|
1089
|
+
assert_equal [7, 8], @db.query_splat('SELECT x FROM t ORDER BY x')
|
1090
|
+
end
|
1018
1091
|
end
|
1019
1092
|
|
1020
1093
|
class ScenarioTest < Minitest::Test
|
@@ -1046,7 +1119,7 @@ class ScenarioTest < Minitest::Test
|
|
1046
1119
|
|
1047
1120
|
sleep 0.1
|
1048
1121
|
@db.query 'begin deferred'
|
1049
|
-
result = @db.
|
1122
|
+
result = @db.query_splat('select x from t')
|
1050
1123
|
assert_equal [1, 4], result
|
1051
1124
|
|
1052
1125
|
assert_raises(Extralite::BusyError) do
|
@@ -1080,7 +1153,7 @@ class ScenarioTest < Minitest::Test
|
|
1080
1153
|
@db.query('insert into t values (7, 8, 9)')
|
1081
1154
|
@db.query('commit')
|
1082
1155
|
|
1083
|
-
result = @db.
|
1156
|
+
result = @db.query_splat('select x from t')
|
1084
1157
|
assert_equal [1, 4, 7], result
|
1085
1158
|
ensure
|
1086
1159
|
t&.kill
|
@@ -1109,7 +1182,7 @@ class ScenarioTest < Minitest::Test
|
|
1109
1182
|
t1.join
|
1110
1183
|
t2.join
|
1111
1184
|
|
1112
|
-
assert_equal (1..100).to_a, @db.
|
1185
|
+
assert_equal (1..100).to_a, @db.query_splat('select x from t order by x')
|
1113
1186
|
ensure
|
1114
1187
|
t1&.kill
|
1115
1188
|
t2&.kill
|
@@ -1153,19 +1226,19 @@ class BackupTest < Minitest::Test
|
|
1153
1226
|
|
1154
1227
|
def test_backup
|
1155
1228
|
@src.backup(@dst)
|
1156
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1229
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from t')
|
1157
1230
|
end
|
1158
1231
|
|
1159
1232
|
def test_backup_with_block
|
1160
1233
|
progress = []
|
1161
1234
|
@src.backup(@dst) { |r, t| progress << [r, t] }
|
1162
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1235
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from t')
|
1163
1236
|
assert_equal [[2, 2]], progress
|
1164
1237
|
end
|
1165
1238
|
|
1166
1239
|
def test_backup_with_schema_names
|
1167
1240
|
@src.backup(@dst, 'main', 'temp')
|
1168
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.
|
1241
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], @dst.query_array('select * from temp.t')
|
1169
1242
|
end
|
1170
1243
|
|
1171
1244
|
def test_backup_with_fn
|
@@ -1173,7 +1246,7 @@ class BackupTest < Minitest::Test
|
|
1173
1246
|
@src.backup(tmp_fn)
|
1174
1247
|
|
1175
1248
|
db = Extralite::Database.new(tmp_fn)
|
1176
|
-
assert_equal [[1, 2, 3], [4, 5, 6]], db.
|
1249
|
+
assert_equal [[1, 2, 3], [4, 5, 6]], db.query_array('select * from t')
|
1177
1250
|
end
|
1178
1251
|
end
|
1179
1252
|
|
@@ -1407,7 +1480,7 @@ class ConcurrencyTest < Minitest::Test
|
|
1407
1480
|
|
1408
1481
|
def test_progress_handler_invalid_arg
|
1409
1482
|
db = Extralite::Database.new(':memory:')
|
1410
|
-
|
1483
|
+
|
1411
1484
|
assert_raises(TypeError) { db.on_progress(period: :foo) }
|
1412
1485
|
assert_raises(TypeError) { db.on_progress(tick: :foo) }
|
1413
1486
|
assert_raises(ArgumentError) { db.on_progress(mode: :foo) }
|
@@ -1604,7 +1677,7 @@ end
|
|
1604
1677
|
class RactorTest < Minitest::Test
|
1605
1678
|
def test_ractor_simple
|
1606
1679
|
skip if SKIP_RACTOR_TESTS
|
1607
|
-
|
1680
|
+
|
1608
1681
|
fn = Tempfile.new('extralite_test_database_in_ractor').path
|
1609
1682
|
|
1610
1683
|
r = Ractor.new do
|
@@ -1620,7 +1693,7 @@ class RactorTest < Minitest::Test
|
|
1620
1693
|
r << 42
|
1621
1694
|
r.take # wait for ractor to terminate
|
1622
1695
|
|
1623
|
-
assert_equal 42, db.
|
1696
|
+
assert_equal 42, db.query_single_splat('select x from foo')
|
1624
1697
|
end
|
1625
1698
|
|
1626
1699
|
# Adapted from here: https://github.com/sparklemotion/sqlite3-ruby/pull/365/files
|
@@ -1681,7 +1754,7 @@ class RactorTest < Minitest::Test
|
|
1681
1754
|
|
1682
1755
|
final_check = Ractor.new(fn) do |rfn|
|
1683
1756
|
rdb = Extralite::Database.new(rfn, wal: true)
|
1684
|
-
count = rdb.
|
1757
|
+
count = rdb.query_single_splat('select count(*) from stress_test')
|
1685
1758
|
Ractor.yield count
|
1686
1759
|
end
|
1687
1760
|
count = final_check.take
|
@@ -1739,15 +1812,15 @@ class DatabaseTransformTest < Minitest::Test
|
|
1739
1812
|
], buf
|
1740
1813
|
end
|
1741
1814
|
|
1742
|
-
def
|
1815
|
+
def test_query_array_transform
|
1743
1816
|
transform = ->(h) { MyModel.new(h) }
|
1744
1817
|
|
1745
1818
|
sql = 'select a, b from t where a = ?'
|
1746
|
-
o = @db.
|
1819
|
+
o = @db.query_array(transform, sql, 1).first
|
1747
1820
|
assert_kind_of MyModel, o
|
1748
1821
|
assert_equal([1, 2], o.values)
|
1749
1822
|
|
1750
|
-
o = @db.
|
1823
|
+
o = @db.query_array(transform, sql, 4).first
|
1751
1824
|
assert_kind_of MyModel, o
|
1752
1825
|
assert_equal([4, 5], o.values)
|
1753
1826
|
|
@@ -1755,10 +1828,10 @@ class DatabaseTransformTest < Minitest::Test
|
|
1755
1828
|
assert_equal [
|
1756
1829
|
[1, 2],
|
1757
1830
|
[4, 5]
|
1758
|
-
], @db.
|
1831
|
+
], @db.query_array(transform, sql).map(&:values)
|
1759
1832
|
|
1760
1833
|
buf = []
|
1761
|
-
@db.
|
1834
|
+
@db.query_array(transform, sql) { |r| buf << r.values }
|
1762
1835
|
assert_equal [
|
1763
1836
|
[1, 2],
|
1764
1837
|
[4, 5]
|
@@ -1778,74 +1851,74 @@ class DatabaseTransformTest < Minitest::Test
|
|
1778
1851
|
assert_equal({ a: 4, b: 5 }, o.values)
|
1779
1852
|
end
|
1780
1853
|
|
1781
|
-
def
|
1854
|
+
def test_query_array_single_row_transform
|
1782
1855
|
transform = ->(h) { MyModel.new(h) }
|
1783
1856
|
|
1784
1857
|
sql = 'select a, b from t where a = ?'
|
1785
|
-
o = @db.
|
1858
|
+
o = @db.query_single_array(transform, sql, 1)
|
1786
1859
|
assert_kind_of MyModel, o
|
1787
1860
|
assert_equal([1, 2], o.values)
|
1788
1861
|
|
1789
|
-
o = @db.
|
1862
|
+
o = @db.query_single_array(transform, sql, 4)
|
1790
1863
|
assert_kind_of MyModel, o
|
1791
1864
|
assert_equal([4, 5], o.values)
|
1792
1865
|
end
|
1793
1866
|
|
1794
|
-
def
|
1867
|
+
def test_query_splat_single_column_transform
|
1795
1868
|
transform = ->(c) { JSON.parse(c, symbolize_names: true) }
|
1796
1869
|
sql = 'select c from t where a = ?'
|
1797
1870
|
|
1798
|
-
assert_equal([{ foo: 42, bar: 43 }], @db.
|
1799
|
-
assert_equal([{ foo: 45, bar: 46 }], @db.
|
1871
|
+
assert_equal([{ foo: 42, bar: 43 }], @db.query_splat(transform, sql, 1))
|
1872
|
+
assert_equal([{ foo: 45, bar: 46 }], @db.query_splat(transform, sql, 4))
|
1800
1873
|
|
1801
1874
|
sql = 'select c from t order by a'
|
1802
1875
|
assert_equal [
|
1803
1876
|
{ foo: 42, bar: 43 },
|
1804
1877
|
{ foo: 45, bar: 46 }
|
1805
|
-
], @db.
|
1878
|
+
], @db.query_splat(transform, sql)
|
1806
1879
|
|
1807
1880
|
buf = []
|
1808
|
-
@db.
|
1881
|
+
@db.query_splat(transform, sql) { |r| buf << r }
|
1809
1882
|
assert_equal [
|
1810
1883
|
{ foo: 42, bar: 43 },
|
1811
1884
|
{ foo: 45, bar: 46 }
|
1812
1885
|
], buf
|
1813
1886
|
end
|
1814
1887
|
|
1815
|
-
def
|
1888
|
+
def test_query_splat_single_row_single_column
|
1816
1889
|
transform = ->(c) { JSON.parse(c, symbolize_names: true) }
|
1817
1890
|
sql = 'select c from t where a = ?'
|
1818
1891
|
|
1819
|
-
assert_equal({ foo: 42, bar: 43 }, @db.
|
1820
|
-
assert_equal({ foo: 45, bar: 46 }, @db.
|
1892
|
+
assert_equal({ foo: 42, bar: 43 }, @db.query_single_splat(transform, sql, 1))
|
1893
|
+
assert_equal({ foo: 45, bar: 46 }, @db.query_single_splat(transform, sql, 4))
|
1821
1894
|
end
|
1822
1895
|
|
1823
|
-
def
|
1896
|
+
def test_query_splat_multi_column
|
1824
1897
|
transform = ->(a, b, c) { { a: a, b: b, c: JSON.parse(c, symbolize_names: true) } }
|
1825
1898
|
sql = 'select * from t where a = ?'
|
1826
1899
|
|
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.
|
1900
|
+
assert_equal([{ a: 1, b: 2, c: { foo: 42, bar: 43 }}], @db.query_splat(transform, sql, 1))
|
1901
|
+
assert_equal([{ a: 4, b: 5, c: { foo: 45, bar: 46 }}], @db.query_splat(transform, sql, 4))
|
1829
1902
|
|
1830
1903
|
sql = 'select * from t order by a'
|
1831
1904
|
assert_equal [
|
1832
1905
|
{ a: 1, b: 2, c: { foo: 42, bar: 43 }},
|
1833
1906
|
{ a: 4, b: 5, c: { foo: 45, bar: 46 }}
|
1834
|
-
], @db.
|
1907
|
+
], @db.query_splat(transform, sql)
|
1835
1908
|
|
1836
1909
|
buf = []
|
1837
|
-
@db.
|
1910
|
+
@db.query_splat(transform, sql) { |r| buf << r }
|
1838
1911
|
assert_equal [
|
1839
1912
|
{ a: 1, b: 2, c: { foo: 42, bar: 43 }},
|
1840
1913
|
{ a: 4, b: 5, c: { foo: 45, bar: 46 }}
|
1841
1914
|
], buf
|
1842
1915
|
end
|
1843
1916
|
|
1844
|
-
def
|
1917
|
+
def test_query_splat_single_row_multi_column
|
1845
1918
|
transform = ->(a, b, c) { { a: a, b: b, c: JSON.parse(c, symbolize_names: true) } }
|
1846
1919
|
sql = 'select * from t where a = ?'
|
1847
1920
|
|
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.
|
1921
|
+
assert_equal({ a: 1, b: 2, c: { foo: 42, bar: 43 }}, @db.query_single_splat(transform, sql, 1))
|
1922
|
+
assert_equal({ a: 4, b: 5, c: { foo: 45, bar: 46 }}, @db.query_single_splat(transform, sql, 4))
|
1850
1923
|
end
|
1851
1924
|
end
|