extralite 2.4 → 2.5
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-bundle.yml +30 -0
- data/.github/workflows/test.yml +2 -12
- data/CHANGELOG.md +39 -10
- data/Gemfile.lock +1 -1
- data/README.md +45 -11
- data/TODO.md +0 -3
- data/ext/extralite/common.c +222 -15
- data/ext/extralite/database.c +185 -16
- data/ext/extralite/extralite.h +5 -1
- data/ext/extralite/extralite_ext.c +4 -0
- data/ext/extralite/query.c +213 -12
- data/gemspec.rb +1 -1
- data/lib/extralite/version.rb +1 -1
- data/lib/extralite.rb +14 -6
- data/test/helper.rb +1 -0
- data/test/issue-54.rb +21 -0
- data/test/issue-59.rb +70 -0
- data/test/test_database.rb +471 -12
- data/test/test_query.rb +362 -2
- metadata +6 -3
data/test/test_query.rb
CHANGED
@@ -478,7 +478,25 @@ class QueryTest < MiniTest::Test
|
|
478
478
|
assert_equal [[1, 2, 3], [4, 5, 6], [42, 8, 9]], @db.query_ary('select * from t order by z')
|
479
479
|
end
|
480
480
|
|
481
|
-
def
|
481
|
+
def test_query_execute_with_mixed_params
|
482
|
+
@db.execute 'delete from t'
|
483
|
+
q = @db.prepare('insert into t values (?, ?, ?)')
|
484
|
+
|
485
|
+
q.execute(1, [2], 3)
|
486
|
+
q.execute([4, 5], 6)
|
487
|
+
q.execute([7], 8, [9])
|
488
|
+
|
489
|
+
assert_equal [[1, 2, 3], [4, 5, 6], [7, 8, 9]], @db.query_ary('select * from t order by z')
|
490
|
+
end
|
491
|
+
|
492
|
+
def test_query_chverons
|
493
|
+
q = @db.prepare('update t set x = ? where z = ?')
|
494
|
+
assert_equal q, (q << [42, 9])
|
495
|
+
assert_equal [[1, 2, 3], [4, 5, 6], [42, 8, 9]], @db.query_ary('select * from t order by z')
|
496
|
+
end
|
497
|
+
|
498
|
+
|
499
|
+
def test_query_batch_execute
|
482
500
|
@db.query('create table foo (a, b, c)')
|
483
501
|
assert_equal [], @db.query('select * from foo')
|
484
502
|
|
@@ -488,7 +506,7 @@ class QueryTest < MiniTest::Test
|
|
488
506
|
]
|
489
507
|
|
490
508
|
p = @db.prepare('insert into foo values (?, ?, ?)')
|
491
|
-
changes = p.
|
509
|
+
changes = p.batch_execute(records)
|
492
510
|
|
493
511
|
assert_equal 2, changes
|
494
512
|
assert_equal [
|
@@ -497,6 +515,328 @@ class QueryTest < MiniTest::Test
|
|
497
515
|
], @db.query('select * from foo')
|
498
516
|
end
|
499
517
|
|
518
|
+
def test_query_batch_execute_with_each_interface
|
519
|
+
@db.query('create table foo (a)')
|
520
|
+
assert_equal [], @db.query('select * from foo')
|
521
|
+
|
522
|
+
p = @db.prepare('insert into foo values (?)')
|
523
|
+
changes = p.batch_execute(1..3)
|
524
|
+
|
525
|
+
assert_equal 3, changes
|
526
|
+
assert_equal [
|
527
|
+
{ a: 1 },
|
528
|
+
{ a: 2 },
|
529
|
+
{ a: 3 }
|
530
|
+
], @db.query('select * from foo')
|
531
|
+
end
|
532
|
+
|
533
|
+
def test_query_batch_execute_with_proc
|
534
|
+
source = [42, 43, 44]
|
535
|
+
|
536
|
+
@db.query('create table foo (a)')
|
537
|
+
assert_equal [], @db.query('select * from foo')
|
538
|
+
|
539
|
+
p = @db.prepare('insert into foo values (?)')
|
540
|
+
pr = proc { source.shift }
|
541
|
+
changes = p.batch_execute(pr)
|
542
|
+
|
543
|
+
assert_equal 3, changes
|
544
|
+
assert_equal [
|
545
|
+
{ a: 42 },
|
546
|
+
{ a: 43 },
|
547
|
+
{ a: 44 }
|
548
|
+
], @db.query('select * from foo')
|
549
|
+
end
|
550
|
+
|
551
|
+
def test_query_batch_query_with_array
|
552
|
+
@db.query('create table foo (a integer primary key, b)')
|
553
|
+
assert_equal [], @db.query('select * from foo')
|
554
|
+
|
555
|
+
data = [5, 4, 3]
|
556
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
557
|
+
assert_equal [
|
558
|
+
[[1, 5]],
|
559
|
+
[[2, 4]],
|
560
|
+
[[3, 3]]
|
561
|
+
], results
|
562
|
+
|
563
|
+
q = @db.prepare('update foo set b = ? returning *')
|
564
|
+
|
565
|
+
results = q.batch_query([42, 43])
|
566
|
+
assert_equal [
|
567
|
+
[{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
|
568
|
+
[{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
|
569
|
+
], results
|
570
|
+
|
571
|
+
array = []
|
572
|
+
changes = q.batch_query([44, 45]) do |rows|
|
573
|
+
array << rows
|
574
|
+
end
|
575
|
+
assert_equal 6, changes
|
576
|
+
assert_equal [
|
577
|
+
[{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
|
578
|
+
[{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
|
579
|
+
], array
|
580
|
+
end
|
581
|
+
|
582
|
+
def test_query_batch_query_with_enumerable
|
583
|
+
@db.query('create table foo (a integer primary key, b)')
|
584
|
+
assert_equal [], @db.query('select * from foo')
|
585
|
+
|
586
|
+
data = [5, 4, 3]
|
587
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
588
|
+
assert_equal [
|
589
|
+
[[1, 5]],
|
590
|
+
[[2, 4]],
|
591
|
+
[[3, 3]]
|
592
|
+
], results
|
593
|
+
|
594
|
+
q = @db.prepare('update foo set b = ? returning *')
|
595
|
+
|
596
|
+
results = q.batch_query(42..43)
|
597
|
+
assert_equal [
|
598
|
+
[{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
|
599
|
+
[{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
|
600
|
+
], results
|
601
|
+
|
602
|
+
array = []
|
603
|
+
changes = q.batch_query(44..45) do |rows|
|
604
|
+
array << rows
|
605
|
+
end
|
606
|
+
assert_equal 6, changes
|
607
|
+
assert_equal [
|
608
|
+
[{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
|
609
|
+
[{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
|
610
|
+
], array
|
611
|
+
end
|
612
|
+
|
613
|
+
def parameter_source_proc(values)
|
614
|
+
proc { values.shift }
|
615
|
+
end
|
616
|
+
|
617
|
+
def test_query_batch_query_with_proc
|
618
|
+
@db.query('create table foo (a integer primary key, b)')
|
619
|
+
assert_equal [], @db.query('select * from foo')
|
620
|
+
|
621
|
+
data = [5, 4, 3]
|
622
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
623
|
+
assert_equal [
|
624
|
+
[[1, 5]],
|
625
|
+
[[2, 4]],
|
626
|
+
[[3, 3]]
|
627
|
+
], results
|
628
|
+
|
629
|
+
q = @db.prepare('update foo set b = ? returning *')
|
630
|
+
|
631
|
+
pr = parameter_source_proc([42, 43])
|
632
|
+
results = q.batch_query(pr)
|
633
|
+
assert_equal [
|
634
|
+
[{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
|
635
|
+
[{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
|
636
|
+
], results
|
637
|
+
|
638
|
+
array = []
|
639
|
+
pr = parameter_source_proc([44, 45])
|
640
|
+
changes = q.batch_query(pr) do |rows|
|
641
|
+
array << rows
|
642
|
+
end
|
643
|
+
assert_equal 6, changes
|
644
|
+
assert_equal [
|
645
|
+
[{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
|
646
|
+
[{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
|
647
|
+
], array
|
648
|
+
end
|
649
|
+
|
650
|
+
def test_query_batch_query_ary_with_array
|
651
|
+
@db.query('create table foo (a integer primary key, b)')
|
652
|
+
assert_equal [], @db.query('select * from foo')
|
653
|
+
|
654
|
+
data = [5, 4, 3]
|
655
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
656
|
+
assert_equal [
|
657
|
+
[[1, 5]],
|
658
|
+
[[2, 4]],
|
659
|
+
[[3, 3]]
|
660
|
+
], results
|
661
|
+
|
662
|
+
q = @db.prepare('update foo set b = ? returning *')
|
663
|
+
|
664
|
+
results = q.batch_query_ary([42, 43])
|
665
|
+
assert_equal [
|
666
|
+
[[1, 42], [2, 42], [3, 42]],
|
667
|
+
[[1, 43], [2, 43], [3, 43]]
|
668
|
+
], results
|
669
|
+
|
670
|
+
array = []
|
671
|
+
changes = q.batch_query_ary([44, 45]) do |rows|
|
672
|
+
array << rows
|
673
|
+
end
|
674
|
+
assert_equal 6, changes
|
675
|
+
assert_equal [
|
676
|
+
[[1, 44], [2, 44], [3, 44]],
|
677
|
+
[[1, 45], [2, 45], [3, 45]]
|
678
|
+
], array
|
679
|
+
end
|
680
|
+
|
681
|
+
def test_query_batch_query_ary_with_enumerable
|
682
|
+
@db.query('create table foo (a integer primary key, b)')
|
683
|
+
assert_equal [], @db.query('select * from foo')
|
684
|
+
|
685
|
+
data = [5, 4, 3]
|
686
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
687
|
+
assert_equal [
|
688
|
+
[[1, 5]],
|
689
|
+
[[2, 4]],
|
690
|
+
[[3, 3]]
|
691
|
+
], results
|
692
|
+
|
693
|
+
q = @db.prepare('update foo set b = ? returning *')
|
694
|
+
|
695
|
+
results = q.batch_query_ary(42..43)
|
696
|
+
assert_equal [
|
697
|
+
[[1, 42], [2, 42], [3, 42]],
|
698
|
+
[[1, 43], [2, 43], [3, 43]]
|
699
|
+
], results
|
700
|
+
|
701
|
+
array = []
|
702
|
+
changes = q.batch_query_ary(44..45) do |rows|
|
703
|
+
array << rows
|
704
|
+
end
|
705
|
+
assert_equal 6, changes
|
706
|
+
assert_equal [
|
707
|
+
[[1, 44], [2, 44], [3, 44]],
|
708
|
+
[[1, 45], [2, 45], [3, 45]]
|
709
|
+
], array
|
710
|
+
end
|
711
|
+
|
712
|
+
def test_query_batch_query_ary_with_proc
|
713
|
+
@db.query('create table foo (a integer primary key, b)')
|
714
|
+
assert_equal [], @db.query('select * from foo')
|
715
|
+
|
716
|
+
data = [5, 4, 3]
|
717
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
718
|
+
assert_equal [
|
719
|
+
[[1, 5]],
|
720
|
+
[[2, 4]],
|
721
|
+
[[3, 3]]
|
722
|
+
], results
|
723
|
+
|
724
|
+
q = @db.prepare('update foo set b = ? returning *')
|
725
|
+
|
726
|
+
pr = parameter_source_proc([42, 43])
|
727
|
+
results = q.batch_query_ary(pr)
|
728
|
+
assert_equal [
|
729
|
+
[[1, 42], [2, 42], [3, 42]],
|
730
|
+
[[1, 43], [2, 43], [3, 43]]
|
731
|
+
], results
|
732
|
+
|
733
|
+
array = []
|
734
|
+
pr = parameter_source_proc([44, 45])
|
735
|
+
changes = q.batch_query_ary(pr) do |rows|
|
736
|
+
array << rows
|
737
|
+
end
|
738
|
+
assert_equal 6, changes
|
739
|
+
assert_equal [
|
740
|
+
[[1, 44], [2, 44], [3, 44]],
|
741
|
+
[[1, 45], [2, 45], [3, 45]]
|
742
|
+
], array
|
743
|
+
end
|
744
|
+
|
745
|
+
def test_query_batch_query_single_column_with_array
|
746
|
+
@db.query('create table foo (a integer primary key, b)')
|
747
|
+
assert_equal [], @db.query('select * from foo')
|
748
|
+
|
749
|
+
data = [5, 4, 3]
|
750
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
751
|
+
assert_equal [
|
752
|
+
[[1, 5]],
|
753
|
+
[[2, 4]],
|
754
|
+
[[3, 3]]
|
755
|
+
], results
|
756
|
+
|
757
|
+
q = @db.prepare('update foo set b = ? returning b * 10 + a')
|
758
|
+
|
759
|
+
results = q.batch_query_single_column([42, 43])
|
760
|
+
assert_equal [
|
761
|
+
[421, 422, 423],
|
762
|
+
[431, 432, 433]
|
763
|
+
], results
|
764
|
+
|
765
|
+
array = []
|
766
|
+
changes = q.batch_query_single_column([44, 45]) do |rows|
|
767
|
+
array << rows
|
768
|
+
end
|
769
|
+
assert_equal 6, changes
|
770
|
+
assert_equal [
|
771
|
+
[441, 442, 443],
|
772
|
+
[451, 452, 453]
|
773
|
+
], array
|
774
|
+
end
|
775
|
+
|
776
|
+
def test_query_batch_query_single_column_with_enumerable
|
777
|
+
@db.query('create table foo (a integer primary key, b)')
|
778
|
+
assert_equal [], @db.query('select * from foo')
|
779
|
+
|
780
|
+
data = [5, 4, 3]
|
781
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
782
|
+
assert_equal [
|
783
|
+
[[1, 5]],
|
784
|
+
[[2, 4]],
|
785
|
+
[[3, 3]]
|
786
|
+
], results
|
787
|
+
|
788
|
+
q = @db.prepare('update foo set b = ? returning b * 10 + a')
|
789
|
+
|
790
|
+
results = q.batch_query_single_column(42..43)
|
791
|
+
assert_equal [
|
792
|
+
[421, 422, 423],
|
793
|
+
[431, 432, 433]
|
794
|
+
], results
|
795
|
+
|
796
|
+
array = []
|
797
|
+
changes = q.batch_query_single_column(44..45) do |rows|
|
798
|
+
array << rows
|
799
|
+
end
|
800
|
+
assert_equal 6, changes
|
801
|
+
assert_equal [
|
802
|
+
[441, 442, 443],
|
803
|
+
[451, 452, 453]
|
804
|
+
], array
|
805
|
+
end
|
806
|
+
|
807
|
+
def test_query_batch_query_single_column_with_proc
|
808
|
+
@db.query('create table foo (a integer primary key, b)')
|
809
|
+
assert_equal [], @db.query('select * from foo')
|
810
|
+
|
811
|
+
data = [5, 4, 3]
|
812
|
+
results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
|
813
|
+
assert_equal [
|
814
|
+
[[1, 5]],
|
815
|
+
[[2, 4]],
|
816
|
+
[[3, 3]]
|
817
|
+
], results
|
818
|
+
|
819
|
+
q = @db.prepare('update foo set b = ? returning b * 10 + a')
|
820
|
+
|
821
|
+
pr = parameter_source_proc([42, 43])
|
822
|
+
results = q.batch_query_single_column(pr)
|
823
|
+
assert_equal [
|
824
|
+
[421, 422, 423],
|
825
|
+
[431, 432, 433]
|
826
|
+
], results
|
827
|
+
|
828
|
+
array = []
|
829
|
+
pr = parameter_source_proc([44, 45])
|
830
|
+
changes = q.batch_query_single_column(pr) do |rows|
|
831
|
+
array << rows
|
832
|
+
end
|
833
|
+
assert_equal 6, changes
|
834
|
+
assert_equal [
|
835
|
+
[441, 442, 443],
|
836
|
+
[451, 452, 453]
|
837
|
+
], array
|
838
|
+
end
|
839
|
+
|
500
840
|
def test_query_status
|
501
841
|
assert_equal 0, @query.status(Extralite::SQLITE_STMTSTATUS_RUN)
|
502
842
|
@query.to_a
|
@@ -552,4 +892,24 @@ class QueryTest < MiniTest::Test
|
|
552
892
|
q = @db.prepare('select x from t')
|
553
893
|
assert_match /^\#\<Extralite::Query:0x[0-9a-f]+ #{q.sql.inspect}\>$/, q.inspect
|
554
894
|
end
|
895
|
+
|
896
|
+
def test_query_clone
|
897
|
+
q1 = @db.prepare('select x from t')
|
898
|
+
q2 = q1.clone
|
899
|
+
|
900
|
+
assert_kind_of Extralite::Query, q2
|
901
|
+
assert_equal @db, q2.database
|
902
|
+
assert_equal q1.sql, q2.sql
|
903
|
+
refute_equal q1, q2
|
904
|
+
end
|
905
|
+
|
906
|
+
def test_query_dup
|
907
|
+
q1 = @db.prepare('select x from t')
|
908
|
+
q2 = q1.dup
|
909
|
+
|
910
|
+
assert_kind_of Extralite::Query, q2
|
911
|
+
assert_equal @db, q2.database
|
912
|
+
assert_equal q1.sql, q2.sql
|
913
|
+
refute_equal q1, q2
|
914
|
+
end
|
555
915
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extralite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '2.
|
4
|
+
version: '2.5'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sharon Rosner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake-compiler
|
@@ -90,6 +90,7 @@ extra_rdoc_files:
|
|
90
90
|
files:
|
91
91
|
- ".editorconfig"
|
92
92
|
- ".github/FUNDING.yml"
|
93
|
+
- ".github/workflows/test-bundle.yml"
|
93
94
|
- ".github/workflows/test.yml"
|
94
95
|
- ".gitignore"
|
95
96
|
- ".yardopts"
|
@@ -123,6 +124,8 @@ files:
|
|
123
124
|
- test/fixtures/image.png
|
124
125
|
- test/helper.rb
|
125
126
|
- test/issue-38.rb
|
127
|
+
- test/issue-54.rb
|
128
|
+
- test/issue-59.rb
|
126
129
|
- test/perf_ary.rb
|
127
130
|
- test/perf_hash.rb
|
128
131
|
- test/perf_prepared.rb
|
@@ -152,7 +155,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
152
155
|
requirements:
|
153
156
|
- - ">="
|
154
157
|
- !ruby/object:Gem::Version
|
155
|
-
version: '
|
158
|
+
version: '3.0'
|
156
159
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
160
|
requirements:
|
158
161
|
- - ">="
|