extralite 2.4 → 2.6

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.
data/test/test_query.rb CHANGED
@@ -37,6 +37,11 @@ class QueryTest < MiniTest::Test
37
37
  results = q.bind(foo: 'c').to_a_ary
38
38
 
39
39
  assert_equal [['a', 'b', 'c']], results
40
+
41
+ # try again with the same parameters
42
+ results = q.to_a_ary
43
+
44
+ assert_equal [['a', 'b', 'c']], results
40
45
  end
41
46
 
42
47
  def test_query_next
@@ -478,7 +483,25 @@ class QueryTest < MiniTest::Test
478
483
  assert_equal [[1, 2, 3], [4, 5, 6], [42, 8, 9]], @db.query_ary('select * from t order by z')
479
484
  end
480
485
 
481
- def test_query_execute_multi
486
+ def test_query_execute_with_mixed_params
487
+ @db.execute 'delete from t'
488
+ q = @db.prepare('insert into t values (?, ?, ?)')
489
+
490
+ q.execute(1, [2], 3)
491
+ q.execute([4, 5], 6)
492
+ q.execute([7], 8, [9])
493
+
494
+ assert_equal [[1, 2, 3], [4, 5, 6], [7, 8, 9]], @db.query_ary('select * from t order by z')
495
+ end
496
+
497
+ def test_query_chverons
498
+ q = @db.prepare('update t set x = ? where z = ?')
499
+ assert_equal q, (q << [42, 9])
500
+ assert_equal [[1, 2, 3], [4, 5, 6], [42, 8, 9]], @db.query_ary('select * from t order by z')
501
+ end
502
+
503
+
504
+ def test_query_batch_execute
482
505
  @db.query('create table foo (a, b, c)')
483
506
  assert_equal [], @db.query('select * from foo')
484
507
 
@@ -488,7 +511,7 @@ class QueryTest < MiniTest::Test
488
511
  ]
489
512
 
490
513
  p = @db.prepare('insert into foo values (?, ?, ?)')
491
- changes = p.execute_multi(records)
514
+ changes = p.batch_execute(records)
492
515
 
493
516
  assert_equal 2, changes
494
517
  assert_equal [
@@ -497,6 +520,328 @@ class QueryTest < MiniTest::Test
497
520
  ], @db.query('select * from foo')
498
521
  end
499
522
 
523
+ def test_query_batch_execute_with_each_interface
524
+ @db.query('create table foo (a)')
525
+ assert_equal [], @db.query('select * from foo')
526
+
527
+ p = @db.prepare('insert into foo values (?)')
528
+ changes = p.batch_execute(1..3)
529
+
530
+ assert_equal 3, changes
531
+ assert_equal [
532
+ { a: 1 },
533
+ { a: 2 },
534
+ { a: 3 }
535
+ ], @db.query('select * from foo')
536
+ end
537
+
538
+ def test_query_batch_execute_with_proc
539
+ source = [42, 43, 44]
540
+
541
+ @db.query('create table foo (a)')
542
+ assert_equal [], @db.query('select * from foo')
543
+
544
+ p = @db.prepare('insert into foo values (?)')
545
+ pr = proc { source.shift }
546
+ changes = p.batch_execute(pr)
547
+
548
+ assert_equal 3, changes
549
+ assert_equal [
550
+ { a: 42 },
551
+ { a: 43 },
552
+ { a: 44 }
553
+ ], @db.query('select * from foo')
554
+ end
555
+
556
+ def test_query_batch_query_with_array
557
+ @db.query('create table foo (a integer primary key, b)')
558
+ assert_equal [], @db.query('select * from foo')
559
+
560
+ data = [5, 4, 3]
561
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
562
+ assert_equal [
563
+ [[1, 5]],
564
+ [[2, 4]],
565
+ [[3, 3]]
566
+ ], results
567
+
568
+ q = @db.prepare('update foo set b = ? returning *')
569
+
570
+ results = q.batch_query([42, 43])
571
+ assert_equal [
572
+ [{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
573
+ [{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
574
+ ], results
575
+
576
+ array = []
577
+ changes = q.batch_query([44, 45]) do |rows|
578
+ array << rows
579
+ end
580
+ assert_equal 6, changes
581
+ assert_equal [
582
+ [{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
583
+ [{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
584
+ ], array
585
+ end
586
+
587
+ def test_query_batch_query_with_enumerable
588
+ @db.query('create table foo (a integer primary key, b)')
589
+ assert_equal [], @db.query('select * from foo')
590
+
591
+ data = [5, 4, 3]
592
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
593
+ assert_equal [
594
+ [[1, 5]],
595
+ [[2, 4]],
596
+ [[3, 3]]
597
+ ], results
598
+
599
+ q = @db.prepare('update foo set b = ? returning *')
600
+
601
+ results = q.batch_query(42..43)
602
+ assert_equal [
603
+ [{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
604
+ [{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
605
+ ], results
606
+
607
+ array = []
608
+ changes = q.batch_query(44..45) do |rows|
609
+ array << rows
610
+ end
611
+ assert_equal 6, changes
612
+ assert_equal [
613
+ [{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
614
+ [{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
615
+ ], array
616
+ end
617
+
618
+ def parameter_source_proc(values)
619
+ proc { values.shift }
620
+ end
621
+
622
+ def test_query_batch_query_with_proc
623
+ @db.query('create table foo (a integer primary key, b)')
624
+ assert_equal [], @db.query('select * from foo')
625
+
626
+ data = [5, 4, 3]
627
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
628
+ assert_equal [
629
+ [[1, 5]],
630
+ [[2, 4]],
631
+ [[3, 3]]
632
+ ], results
633
+
634
+ q = @db.prepare('update foo set b = ? returning *')
635
+
636
+ pr = parameter_source_proc([42, 43])
637
+ results = q.batch_query(pr)
638
+ assert_equal [
639
+ [{ a: 1, b: 42 }, { a: 2, b: 42 }, { a: 3, b: 42 }],
640
+ [{ a: 1, b: 43 }, { a: 2, b: 43 }, { a: 3, b: 43 }]
641
+ ], results
642
+
643
+ array = []
644
+ pr = parameter_source_proc([44, 45])
645
+ changes = q.batch_query(pr) do |rows|
646
+ array << rows
647
+ end
648
+ assert_equal 6, changes
649
+ assert_equal [
650
+ [{ a: 1, b: 44 }, { a: 2, b: 44 }, { a: 3, b: 44 }],
651
+ [{ a: 1, b: 45 }, { a: 2, b: 45 }, { a: 3, b: 45 }]
652
+ ], array
653
+ end
654
+
655
+ def test_query_batch_query_ary_with_array
656
+ @db.query('create table foo (a integer primary key, b)')
657
+ assert_equal [], @db.query('select * from foo')
658
+
659
+ data = [5, 4, 3]
660
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
661
+ assert_equal [
662
+ [[1, 5]],
663
+ [[2, 4]],
664
+ [[3, 3]]
665
+ ], results
666
+
667
+ q = @db.prepare('update foo set b = ? returning *')
668
+
669
+ results = q.batch_query_ary([42, 43])
670
+ assert_equal [
671
+ [[1, 42], [2, 42], [3, 42]],
672
+ [[1, 43], [2, 43], [3, 43]]
673
+ ], results
674
+
675
+ array = []
676
+ changes = q.batch_query_ary([44, 45]) do |rows|
677
+ array << rows
678
+ end
679
+ assert_equal 6, changes
680
+ assert_equal [
681
+ [[1, 44], [2, 44], [3, 44]],
682
+ [[1, 45], [2, 45], [3, 45]]
683
+ ], array
684
+ end
685
+
686
+ def test_query_batch_query_ary_with_enumerable
687
+ @db.query('create table foo (a integer primary key, b)')
688
+ assert_equal [], @db.query('select * from foo')
689
+
690
+ data = [5, 4, 3]
691
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
692
+ assert_equal [
693
+ [[1, 5]],
694
+ [[2, 4]],
695
+ [[3, 3]]
696
+ ], results
697
+
698
+ q = @db.prepare('update foo set b = ? returning *')
699
+
700
+ results = q.batch_query_ary(42..43)
701
+ assert_equal [
702
+ [[1, 42], [2, 42], [3, 42]],
703
+ [[1, 43], [2, 43], [3, 43]]
704
+ ], results
705
+
706
+ array = []
707
+ changes = q.batch_query_ary(44..45) do |rows|
708
+ array << rows
709
+ end
710
+ assert_equal 6, changes
711
+ assert_equal [
712
+ [[1, 44], [2, 44], [3, 44]],
713
+ [[1, 45], [2, 45], [3, 45]]
714
+ ], array
715
+ end
716
+
717
+ def test_query_batch_query_ary_with_proc
718
+ @db.query('create table foo (a integer primary key, b)')
719
+ assert_equal [], @db.query('select * from foo')
720
+
721
+ data = [5, 4, 3]
722
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
723
+ assert_equal [
724
+ [[1, 5]],
725
+ [[2, 4]],
726
+ [[3, 3]]
727
+ ], results
728
+
729
+ q = @db.prepare('update foo set b = ? returning *')
730
+
731
+ pr = parameter_source_proc([42, 43])
732
+ results = q.batch_query_ary(pr)
733
+ assert_equal [
734
+ [[1, 42], [2, 42], [3, 42]],
735
+ [[1, 43], [2, 43], [3, 43]]
736
+ ], results
737
+
738
+ array = []
739
+ pr = parameter_source_proc([44, 45])
740
+ changes = q.batch_query_ary(pr) do |rows|
741
+ array << rows
742
+ end
743
+ assert_equal 6, changes
744
+ assert_equal [
745
+ [[1, 44], [2, 44], [3, 44]],
746
+ [[1, 45], [2, 45], [3, 45]]
747
+ ], array
748
+ end
749
+
750
+ def test_query_batch_query_single_column_with_array
751
+ @db.query('create table foo (a integer primary key, b)')
752
+ assert_equal [], @db.query('select * from foo')
753
+
754
+ data = [5, 4, 3]
755
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
756
+ assert_equal [
757
+ [[1, 5]],
758
+ [[2, 4]],
759
+ [[3, 3]]
760
+ ], results
761
+
762
+ q = @db.prepare('update foo set b = ? returning b * 10 + a')
763
+
764
+ results = q.batch_query_single_column([42, 43])
765
+ assert_equal [
766
+ [421, 422, 423],
767
+ [431, 432, 433]
768
+ ], results
769
+
770
+ array = []
771
+ changes = q.batch_query_single_column([44, 45]) do |rows|
772
+ array << rows
773
+ end
774
+ assert_equal 6, changes
775
+ assert_equal [
776
+ [441, 442, 443],
777
+ [451, 452, 453]
778
+ ], array
779
+ end
780
+
781
+ def test_query_batch_query_single_column_with_enumerable
782
+ @db.query('create table foo (a integer primary key, b)')
783
+ assert_equal [], @db.query('select * from foo')
784
+
785
+ data = [5, 4, 3]
786
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
787
+ assert_equal [
788
+ [[1, 5]],
789
+ [[2, 4]],
790
+ [[3, 3]]
791
+ ], results
792
+
793
+ q = @db.prepare('update foo set b = ? returning b * 10 + a')
794
+
795
+ results = q.batch_query_single_column(42..43)
796
+ assert_equal [
797
+ [421, 422, 423],
798
+ [431, 432, 433]
799
+ ], results
800
+
801
+ array = []
802
+ changes = q.batch_query_single_column(44..45) do |rows|
803
+ array << rows
804
+ end
805
+ assert_equal 6, changes
806
+ assert_equal [
807
+ [441, 442, 443],
808
+ [451, 452, 453]
809
+ ], array
810
+ end
811
+
812
+ def test_query_batch_query_single_column_with_proc
813
+ @db.query('create table foo (a integer primary key, b)')
814
+ assert_equal [], @db.query('select * from foo')
815
+
816
+ data = [5, 4, 3]
817
+ results = @db.batch_query_ary('insert into foo (b) values (?) returning *', data)
818
+ assert_equal [
819
+ [[1, 5]],
820
+ [[2, 4]],
821
+ [[3, 3]]
822
+ ], results
823
+
824
+ q = @db.prepare('update foo set b = ? returning b * 10 + a')
825
+
826
+ pr = parameter_source_proc([42, 43])
827
+ results = q.batch_query_single_column(pr)
828
+ assert_equal [
829
+ [421, 422, 423],
830
+ [431, 432, 433]
831
+ ], results
832
+
833
+ array = []
834
+ pr = parameter_source_proc([44, 45])
835
+ changes = q.batch_query_single_column(pr) do |rows|
836
+ array << rows
837
+ end
838
+ assert_equal 6, changes
839
+ assert_equal [
840
+ [441, 442, 443],
841
+ [451, 452, 453]
842
+ ], array
843
+ end
844
+
500
845
  def test_query_status
501
846
  assert_equal 0, @query.status(Extralite::SQLITE_STMTSTATUS_RUN)
502
847
  @query.to_a
@@ -552,4 +897,24 @@ class QueryTest < MiniTest::Test
552
897
  q = @db.prepare('select x from t')
553
898
  assert_match /^\#\<Extralite::Query:0x[0-9a-f]+ #{q.sql.inspect}\>$/, q.inspect
554
899
  end
900
+
901
+ def test_query_clone
902
+ q1 = @db.prepare('select x from t')
903
+ q2 = q1.clone
904
+
905
+ assert_kind_of Extralite::Query, q2
906
+ assert_equal @db, q2.database
907
+ assert_equal q1.sql, q2.sql
908
+ refute_equal q1, q2
909
+ end
910
+
911
+ def test_query_dup
912
+ q1 = @db.prepare('select x from t')
913
+ q2 = q1.dup
914
+
915
+ assert_kind_of Extralite::Query, q2
916
+ assert_equal @db, q2.database
917
+ assert_equal q1.sql, q2.sql
918
+ refute_equal q1, q2
919
+ end
555
920
  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'
4
+ version: '2.6'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sharon Rosner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-24 00:00:00.000000000 Z
11
+ date: 2024-01-23 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"
@@ -102,6 +103,7 @@ files:
102
103
  - Rakefile
103
104
  - TODO.md
104
105
  - bin/update_sqlite_source
106
+ - ext/extralite/changeset.c
105
107
  - ext/extralite/common.c
106
108
  - ext/extralite/database.c
107
109
  - ext/extralite/extconf-bundle.rb
@@ -123,10 +125,13 @@ files:
123
125
  - test/fixtures/image.png
124
126
  - test/helper.rb
125
127
  - test/issue-38.rb
128
+ - test/issue-54.rb
129
+ - test/issue-59.rb
126
130
  - test/perf_ary.rb
127
131
  - test/perf_hash.rb
128
- - test/perf_prepared.rb
132
+ - test/perf_hash_prepared.rb
129
133
  - test/run.rb
134
+ - test/test_changeset.rb
130
135
  - test/test_database.rb
131
136
  - test/test_extralite.rb
132
137
  - test/test_iterator.rb
@@ -152,14 +157,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
157
  requirements:
153
158
  - - ">="
154
159
  - !ruby/object:Gem::Version
155
- version: '2.7'
160
+ version: '3.0'
156
161
  required_rubygems_version: !ruby/object:Gem::Requirement
157
162
  requirements:
158
163
  - - ">="
159
164
  - !ruby/object:Gem::Version
160
165
  version: '0'
161
166
  requirements: []
162
- rubygems_version: 3.4.1
167
+ rubygems_version: 3.5.3
163
168
  signing_key:
164
169
  specification_version: 4
165
170
  summary: Extra-lightweight SQLite3 wrapper for Ruby
@@ -1,64 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/inline'
4
-
5
- gemfile do
6
- source 'https://rubygems.org'
7
- gem 'extralite', path: '..'
8
- gem 'sqlite3'
9
- gem 'benchmark-ips'
10
- end
11
-
12
- require 'benchmark/ips'
13
- require 'fileutils'
14
-
15
- DB_PATH = '/tmp/extralite_sqlite3_perf.db'
16
-
17
- def prepare_database(count)
18
- FileUtils.rm(DB_PATH) rescue nil
19
- db = Extralite::Database.new(DB_PATH)
20
- db.query('create table foo ( a integer primary key, b text )')
21
- db.query('begin')
22
- count.times { db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
23
- db.query('commit')
24
- end
25
-
26
- def sqlite3_prepare
27
- db = SQLite3::Database.new(DB_PATH, :results_as_hash => true)
28
- db.prepare('select * from foo')
29
- end
30
-
31
- def sqlite3_run(stmt, count)
32
- # db = SQLite3::Database.new(DB_PATH, :results_as_hash => true)
33
- results = stmt.execute.to_a
34
- raise unless results.size == count
35
- end
36
-
37
- def extralite_prepare
38
- db = Extralite::Database.new(DB_PATH)
39
- db.prepare('select * from foo')
40
- end
41
-
42
- def extralite_run(query, count)
43
- # db = Extralite::Database.new(DB_PATH)
44
- results = query.to_a
45
- raise unless results.size == count
46
- end
47
-
48
- [10, 1000, 100000].each do |c|
49
- puts; puts; puts "Record count: #{c}"
50
-
51
- prepare_database(c)
52
-
53
- sqlite3_stmt = sqlite3_prepare
54
- extralite_stmt = extralite_prepare
55
-
56
- Benchmark.ips do |x|
57
- x.config(:time => 3, :warmup => 1)
58
-
59
- x.report("sqlite3") { sqlite3_run(sqlite3_stmt, c) }
60
- x.report("extralite") { extralite_run(extralite_stmt, c) }
61
-
62
- x.compare!
63
- end
64
- end