extralite 2.5 → 2.6

Sign up to get free protection for your applications and to get access to all the features.
data/test/perf_ary.rb CHANGED
@@ -15,26 +15,25 @@ require 'fileutils'
15
15
  DB_PATH = "/tmp/extralite_sqlite3_perf-#{Time.now.to_i}-#{rand(10000)}.db"
16
16
  puts "DB_PATH = #{DB_PATH.inspect}"
17
17
 
18
+ $sqlite3_db = SQLite3::Database.new(DB_PATH)
19
+ $extralite_db = Extralite::Database.new(DB_PATH, gvl_release_threshold: -1)
18
20
 
19
21
  def prepare_database(count)
20
22
  db = Extralite::Database.new(DB_PATH)
21
- db.query('create table if not exists foo ( a integer primary key, b text )')
22
- db.query('delete from foo')
23
- db.query('begin')
24
- count.times { db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
25
- db.query('commit')
26
- db.close
23
+ $extralite_db.query('create table if not exists foo ( a integer primary key, b text )')
24
+ $extralite_db.query('delete from foo')
25
+ $extralite_db.query('begin')
26
+ count.times { $extralite_db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
27
+ $extralite_db.query('commit')
27
28
  end
28
29
 
29
30
  def sqlite3_run(count)
30
- db = SQLite3::Database.new(DB_PATH)
31
- results = db.execute('select * from foo')
31
+ results = $sqlite3_db.execute('select * from foo')
32
32
  raise unless results.size == count
33
33
  end
34
34
 
35
35
  def extralite_run(count)
36
- db = Extralite::Database.new(DB_PATH)
37
- results = db.query_ary('select * from foo')
36
+ results = $extralite_db.query('select * from foo')
38
37
  raise unless results.size == count
39
38
  end
40
39
 
@@ -43,12 +42,15 @@ end
43
42
 
44
43
  prepare_database(c)
45
44
 
46
- Benchmark.ips do |x|
47
- x.config(:time => 3, :warmup => 1)
45
+ bm = Benchmark.ips do |x|
46
+ x.config(:time => 5, :warmup => 2)
48
47
 
49
48
  x.report("sqlite3") { sqlite3_run(c) }
50
49
  x.report("extralite") { extralite_run(c) }
51
50
 
52
51
  x.compare!
53
52
  end
53
+ puts;
54
+ bm.entries.each { |e| puts "#{e.label}: #{(e.ips * c).round.to_i} rows/s" }
55
+ puts;
54
56
  end
data/test/perf_hash.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Run on Ruby 3.3 with YJIT enabled
4
+
3
5
  require 'bundler/inline'
4
6
 
5
7
  gemfile do
@@ -15,40 +17,40 @@ require 'fileutils'
15
17
  DB_PATH = "/tmp/extralite_sqlite3_perf-#{Time.now.to_i}-#{rand(10000)}.db"
16
18
  puts "DB_PATH = #{DB_PATH.inspect}"
17
19
 
20
+ $sqlite3_db = SQLite3::Database.new(DB_PATH, results_as_hash: true)
21
+ $extralite_db = Extralite::Database.new(DB_PATH, gvl_release_threshold: -1)
22
+
18
23
  def prepare_database(count)
19
- db = Extralite::Database.new(DB_PATH)
20
- db.query('create table if not exists foo ( a integer primary key, b text )')
21
- db.query('delete from foo')
22
- db.query('begin')
23
- count.times { db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
24
- db.query('commit')
25
- db.close
24
+ $extralite_db.query('create table if not exists foo ( a integer primary key, b text )')
25
+ $extralite_db.query('delete from foo')
26
+ $extralite_db.query('begin')
27
+ count.times { $extralite_db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
28
+ $extralite_db.query('commit')
26
29
  end
27
30
 
28
31
  def sqlite3_run(count)
29
- db = SQLite3::Database.new(DB_PATH, :results_as_hash => true)
30
- results = db.execute('select * from foo')
32
+ results = $sqlite3_db.execute('select * from foo')
31
33
  raise unless results.size == count
32
34
  end
33
35
 
34
36
  def extralite_run(count)
35
- db = Extralite::Database.new(DB_PATH)
36
- results = db.query('select * from foo')
37
+ results = $extralite_db.query('select * from foo')
37
38
  raise unless results.size == count
38
39
  end
39
40
 
40
41
  [10, 1000, 100000].each do |c|
41
42
  puts "Record count: #{c}"
42
-
43
43
  prepare_database(c)
44
44
 
45
- Benchmark.ips do |x|
46
- x.config(:time => 3, :warmup => 1)
45
+ bm = Benchmark.ips do |x|
46
+ x.config(:time => 5, :warmup => 2)
47
47
 
48
48
  x.report("sqlite3") { sqlite3_run(c) }
49
49
  x.report("extralite") { extralite_run(c) }
50
50
 
51
51
  x.compare!
52
52
  end
53
- puts; puts;
53
+ puts;
54
+ bm.entries.each { |e| puts "#{e.label}: #{(e.ips * c).round.to_i} rows/s" }
55
+ puts;
54
56
  end
@@ -0,0 +1,58 @@
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-#{Time.now.to_i}-#{rand(10000)}.db"
16
+ puts "DB_PATH = #{DB_PATH.inspect}"
17
+
18
+ def prepare_database(count)
19
+ $sqlite3_db = SQLite3::Database.new(DB_PATH, results_as_hash: true)
20
+ $extralite_db = Extralite::Database.new(DB_PATH, gvl_release_threshold: -1)
21
+
22
+ $extralite_db.query('create table if not exists foo ( a integer primary key, b text )')
23
+ $extralite_db.query('delete from foo')
24
+ $extralite_db.query('begin')
25
+ count.times { $extralite_db.query('insert into foo (b) values (?)', "hello#{rand(1000)}" )}
26
+ $extralite_db.query('commit')
27
+
28
+ $sqlite3_stmt = $sqlite3_db.prepare('select * from foo')
29
+ $extralite_q = $extralite_db.prepare('select * from foo')
30
+ end
31
+
32
+ def sqlite3_run(count)
33
+ results = $sqlite3_stmt.execute
34
+ raise unless results.to_a.size == count
35
+ end
36
+
37
+ def extralite_run(count)
38
+ results = $extralite_q.to_a
39
+ raise unless results.size == count
40
+ end
41
+
42
+ [10, 1000, 100000].each do |c|
43
+ puts "Record count: #{c}"
44
+
45
+ prepare_database(c)
46
+
47
+ bm = Benchmark.ips do |x|
48
+ x.config(:time => 5, :warmup => 2)
49
+
50
+ x.report("sqlite3") { sqlite3_run(c) }
51
+ x.report("extralite") { extralite_run(c) }
52
+
53
+ x.compare!
54
+ end
55
+ puts;
56
+ bm.entries.each { |e| puts "#{e.label}: #{(e.ips * c).round.to_i} rows/s" }
57
+ puts;
58
+ end
@@ -0,0 +1,161 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'helper'
4
+
5
+ require 'date'
6
+ require 'tempfile'
7
+
8
+ class ChangesetTest < MiniTest::Test
9
+ def setup
10
+ @db = Extralite::Database.new(':memory:')
11
+ skip if !@db.respond_to?(:track_changes)
12
+
13
+ @db.execute('create table if not exists t (x integer primary key, y, z)')
14
+ end
15
+
16
+ def test_each
17
+ changeset = Extralite::Changeset.new
18
+
19
+ changeset.track(@db, [nil]) do
20
+ @db.execute('insert into t values (1, 2, 3)')
21
+ end
22
+ changes = []
23
+ changeset.each { |*o| changes << o }
24
+ assert_equal [
25
+ [:insert, 't', nil, [1, 2, 3]]
26
+ ], changes
27
+
28
+
29
+ changeset.track(@db, [nil]) do
30
+ @db.execute('update t set y = 22 where x = 1')
31
+ end
32
+ changes = []
33
+ changeset.each { |*o| changes << o }
34
+ assert_equal [
35
+ [:update, 't', [1, 2, nil], [nil, 22, nil]]
36
+ ], changes
37
+
38
+
39
+ changeset.track(@db, [nil]) do
40
+ @db.execute('delete from t where x = 1')
41
+ end
42
+ changes = []
43
+ changeset.each { |*o| changes << o }
44
+ assert_equal [
45
+ [:delete, 't', [1, 22, 3], nil]
46
+ ], changes
47
+ end
48
+
49
+ def test_to_a
50
+ changeset = Extralite::Changeset.new
51
+
52
+ changeset.track(@db, [nil]) do
53
+ @db.execute('insert into t values (1, 2, 3)')
54
+ @db.execute('insert into t values (4, 5, 6)')
55
+ end
56
+ assert_equal [
57
+ [:insert, 't', nil, [1, 2, 3]],
58
+ [:insert, 't', nil, [4, 5, 6]]
59
+ ], changeset.to_a
60
+
61
+
62
+ changeset.track(@db, [nil]) do
63
+ @db.execute('update t set y = 22.22 where z < 10')
64
+ end
65
+ assert_equal [
66
+ [:update, 't', [1, 2, nil], [nil, 22.22, nil]],
67
+ [:update, 't', [4, 5, nil], [nil, 22.22, nil]]
68
+ ], changeset.to_a
69
+
70
+
71
+ changeset.track(@db, [nil]) do
72
+ @db.execute('delete from t where x = 1')
73
+ end
74
+ assert_equal [
75
+ [:delete, 't', [1, 22.22, 3], nil]
76
+ ], changeset.to_a
77
+ end
78
+
79
+ def test_apply
80
+ changeset = Extralite::Changeset.new
81
+
82
+ changeset.track(@db, [:t]) do
83
+ @db.execute('insert into t values (1, 2, 3)')
84
+ @db.execute('insert into t values (4, 5, 6)')
85
+ end
86
+
87
+ db2 = Extralite::Database.new(':memory:')
88
+ db2.execute('create table if not exists t (x integer primary key, y, z)')
89
+
90
+ changeset.apply(db2)
91
+
92
+ assert_equal [
93
+ { x: 1, y: 2, z: 3 },
94
+ { x: 4, y: 5, z: 6 }
95
+ ], db2.query('select * from t')
96
+ end
97
+
98
+ def test_invert
99
+ changeset = Extralite::Changeset.new
100
+
101
+ changeset.track(@db, [:t]) do
102
+ @db.execute('insert into t values (1, 2, 3)')
103
+ @db.execute('insert into t values (4, 5, 6)')
104
+ end
105
+
106
+ db2 = Extralite::Database.new(':memory:')
107
+ db2.execute('create table if not exists t (x integer primary key, y, z)')
108
+
109
+ changeset.apply(db2)
110
+
111
+ assert_equal [
112
+ { x: 1, y: 2, z: 3 },
113
+ { x: 4, y: 5, z: 6 }
114
+ ], db2.query('select * from t')
115
+
116
+ db2.execute('insert into t values (7, 8, 9)')
117
+ inverted = changeset.invert
118
+
119
+ assert_kind_of Extralite::Changeset, inverted
120
+ refute_equal inverted, changeset
121
+
122
+ assert_equal [
123
+ [:delete, 't', [1, 2, 3], nil],
124
+ [:delete, 't', [4, 5, 6], nil],
125
+ ], inverted.to_a
126
+
127
+ inverted.apply(@db)
128
+ assert_equal [], @db.query('select * from t')
129
+ end
130
+
131
+ def test_blob
132
+ changeset = Extralite::Changeset.new
133
+ assert_equal "", changeset.to_blob
134
+
135
+ changeset.track(@db, [:t]) do
136
+ @db.execute('insert into t values (1, 2, 3)')
137
+ @db.execute('insert into t values (4, 5, 6)')
138
+ end
139
+
140
+ blob = changeset.to_blob
141
+ assert_kind_of String, blob
142
+ assert_equal Encoding::ASCII_8BIT, blob.encoding
143
+ assert !blob.empty?
144
+
145
+ c2 = Extralite::Changeset.new
146
+ c2.load(blob)
147
+ assert_equal c2.to_blob, blob
148
+
149
+ assert_equal [
150
+ [:insert, 't', nil, [1, 2, 3]],
151
+ [:insert, 't', nil, [4, 5, 6]]
152
+ ], c2.to_a
153
+ end
154
+
155
+ def test_empty_blob
156
+ changeset = Extralite::Changeset.new
157
+ changeset.load('')
158
+
159
+ assert_raises(Extralite::Error) { changeset.to_a }
160
+ end
161
+ end
@@ -896,6 +896,53 @@ class DatabaseTest < MiniTest::Test
896
896
  assert_kind_of RuntimeError, exception
897
897
  assert_equal 'bar', exception.message
898
898
  end
899
+
900
+ def test_database_transaction_rollback!
901
+ db = Extralite::Database.new(':memory:')
902
+ db.execute('create table foo(x)')
903
+
904
+ exception = nil
905
+ begin
906
+ db.transaction do
907
+ db.execute('insert into foo values (42)')
908
+ db.rollback!
909
+ end
910
+ rescue => e
911
+ exception = e
912
+ end
913
+
914
+ assert_equal [], db.query('select * from foo')
915
+ assert_nil exception
916
+ end
917
+
918
+ def test_database_savepoint
919
+ db = Extralite::Database.new(':memory:')
920
+ db.execute('create table foo(x)')
921
+
922
+ db.transaction do
923
+ assert_equal [], db.query('select * from foo')
924
+
925
+ db.execute('insert into foo values (42)')
926
+ assert_equal [42], db.query_single_column('select x from foo')
927
+
928
+ db.savepoint(:a)
929
+
930
+ db.execute('insert into foo values (43)')
931
+ assert_equal [42, 43], db.query_single_column('select x from foo')
932
+
933
+ db.savepoint(:b)
934
+
935
+ db.execute('insert into foo values (44)')
936
+ assert_equal [42, 43, 44], db.query_single_column('select x from foo')
937
+
938
+ db.rollback_to(:b)
939
+ assert_equal [42, 43], db.query_single_column('select x from foo')
940
+
941
+ db.release(:a)
942
+
943
+ assert_equal [42, 43], db.query_single_column('select x from foo')
944
+ end
945
+ end
899
946
  end
900
947
 
901
948
  class ScenarioTest < MiniTest::Test
@@ -1053,7 +1100,7 @@ class BackupTest < MiniTest::Test
1053
1100
  end
1054
1101
  end
1055
1102
 
1056
- class GVLReleaseThresholdTest < Minitest::Test
1103
+ class ConcurrencyTest < Minitest::Test
1057
1104
  def setup
1058
1105
  @sql = <<~SQL
1059
1106
  WITH RECURSIVE r(i) AS (
@@ -1148,6 +1195,159 @@ class GVLReleaseThresholdTest < Minitest::Test
1148
1195
  db.gvl_release_threshold = nil
1149
1196
  assert_equal 1000, db.gvl_release_threshold
1150
1197
  end
1198
+
1199
+ def test_progress_handler_simple
1200
+ db = Extralite::Database.new(':memory:')
1201
+
1202
+ buf = []
1203
+ db.on_progress(1) { buf << :progress }
1204
+
1205
+ result = db.query_single_row('select 1 as a, 2 as b, 3 as c')
1206
+ assert_equal({ a: 1, b: 2, c: 3 }, result)
1207
+ assert_in_range 5..7, buf.size
1208
+
1209
+ buf = []
1210
+ db.on_progress(2) { buf << :progress }
1211
+
1212
+ result = db.query_single_row('select 1 as a, 2 as b, 3 as c')
1213
+ assert_equal({ a: 1, b: 2, c: 3 }, result)
1214
+ assert_in_range 2..4, buf.size
1215
+ end
1216
+
1217
+ LONG_QUERY = <<~SQL
1218
+ WITH RECURSIVE
1219
+ fibo (curr, next)
1220
+ AS
1221
+ ( SELECT 1,1
1222
+ UNION ALL
1223
+ SELECT next, curr + next FROM fibo
1224
+ LIMIT 10000000 )
1225
+ SELECT curr, next FROM fibo LIMIT 1 OFFSET 10000000-1;
1226
+ SQL
1227
+
1228
+ def test_progress_handler_timeout_interrupt
1229
+ db = Extralite::Database.new(':memory:')
1230
+ t0 = Time.now
1231
+ db.on_progress(1000) do
1232
+ Thread.pass
1233
+ db.interrupt if Time.now - t0 >= 0.2
1234
+ end
1235
+
1236
+ q = db.prepare(LONG_QUERY)
1237
+ result = nil
1238
+ err = nil
1239
+ begin
1240
+ result = q.next
1241
+ rescue => e
1242
+ err = e
1243
+ end
1244
+ t1 = Time.now
1245
+
1246
+ assert_nil result
1247
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1248
+ assert_kind_of Extralite::InterruptError, err
1249
+
1250
+ # try a second time, just to make sure no undefined state is left behind
1251
+ t0 = Time.now
1252
+ q = db.prepare(LONG_QUERY)
1253
+ result = nil
1254
+ err = nil
1255
+ begin
1256
+ result = q.next
1257
+ rescue => e
1258
+ err = e
1259
+ end
1260
+ t1 = Time.now
1261
+
1262
+ assert_nil result
1263
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1264
+ assert_kind_of Extralite::InterruptError, err
1265
+ end
1266
+
1267
+ class CustomTimeoutError < RuntimeError
1268
+ end
1269
+
1270
+ def test_progress_handler_timeout_raise
1271
+ db = Extralite::Database.new(':memory:')
1272
+ t0 = Time.now
1273
+ db.on_progress(1000) do
1274
+ Thread.pass
1275
+ raise CustomTimeoutError if Time.now - t0 >= 0.2
1276
+ end
1277
+
1278
+ q = db.prepare(LONG_QUERY)
1279
+ result = nil
1280
+ err = nil
1281
+ begin
1282
+ result = q.next
1283
+ rescue => e
1284
+ err = e
1285
+ end
1286
+ t1 = Time.now
1287
+
1288
+ assert_nil result
1289
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1290
+ assert_kind_of CustomTimeoutError, err
1291
+
1292
+ # try a second time, just to make sure no undefined state is left behind
1293
+ t0 = Time.now
1294
+ q = db.prepare(LONG_QUERY)
1295
+ result = nil
1296
+ err = nil
1297
+ begin
1298
+ result = q.next
1299
+ rescue => e
1300
+ err = e
1301
+ end
1302
+ t1 = Time.now
1303
+
1304
+ assert_nil result
1305
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1306
+ assert_kind_of CustomTimeoutError, err
1307
+ end
1308
+
1309
+ def test_progress_handler_busy_timeout
1310
+ fn = Tempfile.new('extralite_test_progress_handler_busy_timeout').path
1311
+ db1 = Extralite::Database.new(fn)
1312
+ db2 = Extralite::Database.new(fn)
1313
+
1314
+ db1.query('begin exclusive')
1315
+ assert_raises(Extralite::BusyError) { db2.query('begin exclusive') }
1316
+
1317
+ t0 = Time.now
1318
+ db2.on_progress(1000) do
1319
+ Thread.pass
1320
+ raise CustomTimeoutError if Time.now - t0 >= 0.2
1321
+ end
1322
+
1323
+ result = nil
1324
+ err = nil
1325
+ begin
1326
+ result = db2.execute('begin exclusive')
1327
+ rescue => e
1328
+ err = e
1329
+ end
1330
+ t1 = Time.now
1331
+
1332
+ assert_nil result
1333
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1334
+ assert_kind_of CustomTimeoutError, err
1335
+
1336
+ # Try a second time, to ensure no undefined state remains behind
1337
+ t0 = Time.now
1338
+ result = nil
1339
+ err = nil
1340
+ begin
1341
+ result = db2.execute('begin exclusive')
1342
+ rescue => e
1343
+ err = e
1344
+ end
1345
+ t1 = Time.now
1346
+
1347
+ assert_nil result
1348
+ assert_equal 1, ((t1 - t0) * 5).round.to_i
1349
+ assert_kind_of CustomTimeoutError, err
1350
+ end
1151
1351
  end
1152
1352
 
1153
1353
  class RactorTest < Minitest::Test
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
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.5'
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: 2024-01-16 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
@@ -103,6 +103,7 @@ files:
103
103
  - Rakefile
104
104
  - TODO.md
105
105
  - bin/update_sqlite_source
106
+ - ext/extralite/changeset.c
106
107
  - ext/extralite/common.c
107
108
  - ext/extralite/database.c
108
109
  - ext/extralite/extconf-bundle.rb
@@ -128,8 +129,9 @@ files:
128
129
  - test/issue-59.rb
129
130
  - test/perf_ary.rb
130
131
  - test/perf_hash.rb
131
- - test/perf_prepared.rb
132
+ - test/perf_hash_prepared.rb
132
133
  - test/run.rb
134
+ - test/test_changeset.rb
133
135
  - test/test_database.rb
134
136
  - test/test_extralite.rb
135
137
  - test/test_iterator.rb
@@ -162,7 +164,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
164
  - !ruby/object:Gem::Version
163
165
  version: '0'
164
166
  requirements: []
165
- rubygems_version: 3.4.1
167
+ rubygems_version: 3.5.3
166
168
  signing_key:
167
169
  specification_version: 4
168
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