sqlite3 1.3.8-x64-mingw32

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.
Files changed (55) hide show
  1. data/.gemtest +0 -0
  2. data/API_CHANGES.rdoc +50 -0
  3. data/CHANGELOG.rdoc +265 -0
  4. data/ChangeLog.cvs +88 -0
  5. data/Gemfile +15 -0
  6. data/LICENSE +27 -0
  7. data/Manifest.txt +52 -0
  8. data/README.rdoc +95 -0
  9. data/Rakefile +10 -0
  10. data/ext/sqlite3/backup.c +168 -0
  11. data/ext/sqlite3/backup.h +15 -0
  12. data/ext/sqlite3/database.c +822 -0
  13. data/ext/sqlite3/database.h +15 -0
  14. data/ext/sqlite3/exception.c +94 -0
  15. data/ext/sqlite3/exception.h +8 -0
  16. data/ext/sqlite3/extconf.rb +51 -0
  17. data/ext/sqlite3/sqlite3.c +40 -0
  18. data/ext/sqlite3/sqlite3_ruby.h +53 -0
  19. data/ext/sqlite3/statement.c +439 -0
  20. data/ext/sqlite3/statement.h +16 -0
  21. data/faq/faq.rb +145 -0
  22. data/faq/faq.yml +426 -0
  23. data/lib/sqlite3.rb +10 -0
  24. data/lib/sqlite3/2.0/sqlite3_native.so +0 -0
  25. data/lib/sqlite3/constants.rb +49 -0
  26. data/lib/sqlite3/database.rb +579 -0
  27. data/lib/sqlite3/errors.rb +44 -0
  28. data/lib/sqlite3/pragmas.rb +280 -0
  29. data/lib/sqlite3/resultset.rb +195 -0
  30. data/lib/sqlite3/statement.rb +144 -0
  31. data/lib/sqlite3/translator.rb +118 -0
  32. data/lib/sqlite3/value.rb +57 -0
  33. data/lib/sqlite3/version.rb +25 -0
  34. data/setup.rb +1333 -0
  35. data/tasks/faq.rake +9 -0
  36. data/tasks/gem.rake +37 -0
  37. data/tasks/native.rake +45 -0
  38. data/tasks/vendor_sqlite3.rake +87 -0
  39. data/test/helper.rb +18 -0
  40. data/test/test_backup.rb +33 -0
  41. data/test/test_collation.rb +82 -0
  42. data/test/test_database.rb +350 -0
  43. data/test/test_database_readonly.rb +29 -0
  44. data/test/test_deprecated.rb +44 -0
  45. data/test/test_encoding.rb +121 -0
  46. data/test/test_integration.rb +555 -0
  47. data/test/test_integration_open_close.rb +30 -0
  48. data/test/test_integration_pending.rb +115 -0
  49. data/test/test_integration_resultset.rb +159 -0
  50. data/test/test_integration_statement.rb +194 -0
  51. data/test/test_result_set.rb +37 -0
  52. data/test/test_sqlite3.rb +9 -0
  53. data/test/test_statement.rb +256 -0
  54. data/test/test_statement_execute.rb +35 -0
  55. metadata +246 -0
@@ -0,0 +1,29 @@
1
+ require 'helper'
2
+
3
+ module SQLite3
4
+ class TestDatabaseReadonly < SQLite3::TestCase
5
+ def setup
6
+ File.unlink 'test-readonly.db' if File.exists?('test-readonly.db')
7
+ @db = SQLite3::Database.new('test-readonly.db')
8
+ @db.execute("CREATE TABLE foos (id integer)")
9
+ @db.close
10
+ end
11
+
12
+ def teardown
13
+ @db.close unless @db.closed?
14
+ File.unlink 'test-readonly.db'
15
+ end
16
+
17
+ def test_open_readonly_database
18
+ @db = SQLite3::Database.new('test-readonly.db', :readonly => true)
19
+ assert @db.readonly?
20
+ end
21
+
22
+ def test_insert_readonly_database
23
+ @db = SQLite3::Database.new('test-readonly.db', :readonly => true)
24
+ assert_raise(SQLite3::ReadOnlyException) do
25
+ @db.execute("INSERT INTO foos (id) VALUES (12)")
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,44 @@
1
+ require 'helper'
2
+
3
+ module SQLite3
4
+ class TestDeprecated < SQLite3::TestCase
5
+ attr_reader :db
6
+
7
+ def setup
8
+ super
9
+ @warn_before = $-w
10
+ $-w = false
11
+ @db = SQLite3::Database.new(':memory:')
12
+ @db.execute 'CREATE TABLE test_table (name text, age int)'
13
+ end
14
+
15
+ def teardown
16
+ super
17
+ $-w = @warn_before
18
+ end
19
+
20
+ def test_query_with_many_bind_params_not_nil
21
+ assert_equal [[1, 2]], db.query('select ?, ?', 1, 2).to_a
22
+ end
23
+
24
+ def test_execute_with_many_bind_params_not_nil
25
+ assert_equal [[1, 2]], @db.execute("select ?, ?", 1, 2).to_a
26
+ end
27
+
28
+ def test_query_with_many_bind_params
29
+ assert_equal [[nil, 1]], @db.query("select ?, ?", nil, 1).to_a
30
+ end
31
+
32
+ def test_query_with_nil_bind_params
33
+ assert_equal [['foo']], @db.query("select 'foo'", nil).to_a
34
+ end
35
+
36
+ def test_execute_with_many_bind_params
37
+ assert_equal [[nil, 1]], @db.execute("select ?, ?", nil, 1)
38
+ end
39
+
40
+ def test_execute_with_nil_bind_params
41
+ assert_equal [['foo']], @db.execute("select 'foo'", nil)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,121 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require 'helper'
4
+
5
+ module SQLite3
6
+ class TestEncoding < SQLite3::TestCase
7
+ def setup
8
+ @db = SQLite3::Database.new(':memory:')
9
+ @create = "create table ex(id int, data string)"
10
+ @insert = "insert into ex(id, data) values (?, ?)"
11
+ @db.execute(@create);
12
+ end
13
+
14
+ def test_default_internal_is_honored
15
+ warn_before = $-w
16
+ $-w = false
17
+
18
+ before_enc = Encoding.default_internal
19
+
20
+ str = "壁に耳あり、障子に目あり"
21
+ stmt = @db.prepare('insert into ex(data) values (?)')
22
+ stmt.bind_param 1, str
23
+ stmt.step
24
+
25
+ Encoding.default_internal = 'EUC-JP'
26
+ string = @db.execute('select data from ex').first.first
27
+
28
+ assert_equal Encoding.default_internal, string.encoding
29
+ assert_equal str.encode('EUC-JP'), string
30
+ assert_equal str, string.encode(str.encoding)
31
+ ensure
32
+ Encoding.default_internal = before_enc
33
+ $-w = warn_before
34
+ end
35
+
36
+ def test_blob_is_binary
37
+ str = "猫舌"
38
+ @db.execute('create table foo(data text)')
39
+ stmt = @db.prepare('insert into foo(data) values (?)')
40
+ stmt.bind_param(1, SQLite3::Blob.new(str))
41
+ stmt.step
42
+
43
+ string = @db.execute('select data from foo').first.first
44
+ assert_equal Encoding.find('ASCII-8BIT'), string.encoding
45
+ assert_equal str, string.force_encoding('UTF-8')
46
+ end
47
+
48
+ def test_blob_is_ascii8bit
49
+ str = "猫舌"
50
+ @db.execute('create table foo(data text)')
51
+ stmt = @db.prepare('insert into foo(data) values (?)')
52
+ stmt.bind_param(1, str.dup.force_encoding("ASCII-8BIT"))
53
+ stmt.step
54
+
55
+ string = @db.execute('select data from foo').first.first
56
+ assert_equal Encoding.find('ASCII-8BIT'), string.encoding
57
+ assert_equal str, string.force_encoding('UTF-8')
58
+ end
59
+
60
+ def test_blob_with_eucjp
61
+ str = "猫舌".encode("EUC-JP")
62
+ @db.execute('create table foo(data text)')
63
+ stmt = @db.prepare('insert into foo(data) values (?)')
64
+ stmt.bind_param(1, SQLite3::Blob.new(str))
65
+ stmt.step
66
+
67
+ string = @db.execute('select data from foo').first.first
68
+ assert_equal Encoding.find('ASCII-8BIT'), string.encoding
69
+ assert_equal str, string.force_encoding('EUC-JP')
70
+ end
71
+
72
+ def test_db_with_eucjp
73
+ db = SQLite3::Database.new(':memory:'.encode('EUC-JP'))
74
+ assert_equal(Encoding.find('UTF-8'), db.encoding)
75
+ end
76
+
77
+ def test_db_with_utf16
78
+ utf16 = ([1].pack("I") == [1].pack("N")) ? "UTF-16BE" : "UTF-16LE"
79
+
80
+ db = SQLite3::Database.new(':memory:'.encode(utf16))
81
+ assert_equal(Encoding.find(utf16), db.encoding)
82
+ end
83
+
84
+ def test_statement_eucjp
85
+ str = "猫舌"
86
+ @db.execute("insert into ex(data) values ('#{str}')".encode('EUC-JP'))
87
+ row = @db.execute("select data from ex")
88
+ assert_equal @db.encoding, row.first.first.encoding
89
+ assert_equal str, row.first.first
90
+ end
91
+
92
+ def test_statement_utf8
93
+ str = "猫舌"
94
+ @db.execute("insert into ex(data) values ('#{str}')")
95
+ row = @db.execute("select data from ex")
96
+ assert_equal @db.encoding, row.first.first.encoding
97
+ assert_equal str, row.first.first
98
+ end
99
+
100
+ def test_encoding
101
+ assert_equal Encoding.find("UTF-8"), @db.encoding
102
+ end
103
+
104
+ def test_utf_8
105
+ str = "猫舌"
106
+ @db.execute(@insert, [10, str])
107
+ row = @db.execute("select data from ex")
108
+ assert_equal @db.encoding, row.first.first.encoding
109
+ assert_equal str, row.first.first
110
+ end
111
+
112
+ def test_euc_jp
113
+ str = "猫舌".encode('EUC-JP')
114
+ @db.execute(@insert, [10, str])
115
+ row = @db.execute("select data from ex")
116
+ assert_equal @db.encoding, row.first.first.encoding
117
+ assert_equal str.encode('UTF-8'), row.first.first
118
+ end
119
+
120
+ end if RUBY_VERSION >= '1.9.1'
121
+ end
@@ -0,0 +1,555 @@
1
+ require 'helper'
2
+
3
+ class TC_Database_Integration < SQLite3::TestCase
4
+ def setup
5
+ @db = SQLite3::Database.new(":memory:")
6
+ @db.transaction do
7
+ @db.execute "create table foo ( a integer primary key, b text )"
8
+ @db.execute "insert into foo ( b ) values ( 'foo' )"
9
+ @db.execute "insert into foo ( b ) values ( 'bar' )"
10
+ @db.execute "insert into foo ( b ) values ( 'baz' )"
11
+ end
12
+ end
13
+
14
+ def teardown
15
+ @db.close
16
+ end
17
+
18
+ def test_table_info_with_type_translation_active
19
+ assert_nothing_raised { @db.table_info("foo") }
20
+ end
21
+
22
+ def test_table_info_with_defaults_for_version_3_3_8_and_higher
23
+ @db.transaction do
24
+ @db.execute "create table defaults_test ( a string default NULL, b string default 'Hello' )"
25
+ data = @db.table_info( "defaults_test" )
26
+ assert_equal({"name" => "a", "type" => "string", "dflt_value" => nil, "notnull" => 0, "cid" => 0, "pk" => 0},
27
+ data[0])
28
+ assert_equal({"name" => "b", "type" => "string", "dflt_value" => "Hello", "notnull" => 0, "cid" => 1, "pk" => 0},
29
+ data[1])
30
+ end
31
+ end
32
+
33
+ def test_table_info_without_defaults_for_version_3_3_8_and_higher
34
+ @db.transaction do
35
+ @db.execute "create table no_defaults_test ( a integer default 1, b integer )"
36
+ data = @db.table_info( "no_defaults_test" )
37
+ assert_equal({"name" => "a", "type" => "integer", "dflt_value" => "1", "notnull" => 0, "cid" => 0, "pk" => 0},
38
+ data[0])
39
+ assert_equal({"name" => "b", "type" => "integer", "dflt_value" => nil, "notnull" => 0, "cid" => 1, "pk" => 0},
40
+ data[1])
41
+ end
42
+ end
43
+
44
+ def test_complete_fail
45
+ assert !@db.complete?( "select * from foo" )
46
+ end
47
+ def test_complete_success
48
+ assert @db.complete?( "select * from foo;" )
49
+ end
50
+
51
+ # FIXME: do people really need UTF16 sql statements?
52
+ #def test_complete_fail_utf16
53
+ # assert !@db.complete?( "select * from foo".to_utf16(false), true )
54
+ #end
55
+
56
+ # FIXME: do people really need UTF16 sql statements?
57
+ #def test_complete_success_utf16
58
+ # assert @db.complete?( "select * from foo;".to_utf16(true), true )
59
+ #end
60
+
61
+ def test_errmsg
62
+ assert_equal "not an error", @db.errmsg
63
+ end
64
+
65
+ # FIXME: do people really need UTF16 error messages?
66
+ #def test_errmsg_utf16
67
+ # msg = Iconv.conv('UTF-16', 'UTF-8', 'not an error')
68
+ # assert_equal msg, @db.errmsg(true)
69
+ #end
70
+
71
+ def test_errcode
72
+ assert_equal 0, @db.errcode
73
+ end
74
+
75
+ def test_trace
76
+ result = nil
77
+ @db.trace { |sql| result = sql }
78
+ @db.execute "select * from foo"
79
+ assert_equal "select * from foo", result
80
+ end
81
+
82
+ def test_authorizer_okay
83
+ @db.authorizer { |type,a,b,c,d| 0 }
84
+ rows = @db.execute "select * from foo"
85
+ assert_equal 3, rows.length
86
+ end
87
+
88
+ def test_authorizer_error
89
+ @db.authorizer { |type,a,b,c,d| 1 }
90
+ assert_raise( SQLite3::AuthorizationException ) do
91
+ @db.execute "select * from foo"
92
+ end
93
+ end
94
+
95
+ def test_authorizer_silent
96
+ @db.authorizer { |type,a,b,c,d| 2 }
97
+ rows = @db.execute "select * from foo"
98
+ assert rows.empty?
99
+ end
100
+
101
+ def test_prepare_invalid_syntax
102
+ assert_raise( SQLite3::SQLException ) do
103
+ @db.prepare "select from foo"
104
+ end
105
+ end
106
+
107
+ def test_prepare_invalid_column
108
+ assert_raise( SQLite3::SQLException ) do
109
+ @db.prepare "select k from foo"
110
+ end
111
+ end
112
+
113
+ def test_prepare_invalid_table
114
+ assert_raise( SQLite3::SQLException ) do
115
+ @db.prepare "select * from barf"
116
+ end
117
+ end
118
+
119
+ def test_prepare_no_block
120
+ stmt = @db.prepare "select * from foo"
121
+ assert stmt.respond_to?(:execute)
122
+ stmt.close
123
+ end
124
+
125
+ def test_prepare_with_block
126
+ called = false
127
+ @db.prepare "select * from foo" do |stmt|
128
+ called = true
129
+ assert stmt.respond_to?(:execute)
130
+ end
131
+ assert called
132
+ end
133
+
134
+ def test_execute_no_block_no_bind_no_match
135
+ rows = @db.execute( "select * from foo where a > 100" )
136
+ assert rows.empty?
137
+ end
138
+
139
+ def test_execute_with_block_no_bind_no_match
140
+ called = false
141
+ @db.execute( "select * from foo where a > 100" ) do |row|
142
+ called = true
143
+ end
144
+ assert !called
145
+ end
146
+
147
+ def test_execute_no_block_with_bind_no_match
148
+ rows = @db.execute( "select * from foo where a > ?", 100 )
149
+ assert rows.empty?
150
+ end
151
+
152
+ def test_execute_with_block_with_bind_no_match
153
+ called = false
154
+ @db.execute( "select * from foo where a > ?", 100 ) do |row|
155
+ called = true
156
+ end
157
+ assert !called
158
+ end
159
+
160
+ def test_execute_no_block_no_bind_with_match
161
+ rows = @db.execute( "select * from foo where a = 1" )
162
+ assert_equal 1, rows.length
163
+ end
164
+
165
+ def test_execute_with_block_no_bind_with_match
166
+ called = 0
167
+ @db.execute( "select * from foo where a = 1" ) do |row|
168
+ called += 1
169
+ end
170
+ assert_equal 1, called
171
+ end
172
+
173
+ def test_execute_no_block_with_bind_with_match
174
+ rows = @db.execute( "select * from foo where a = ?", 1 )
175
+ assert_equal 1, rows.length
176
+ end
177
+
178
+ def test_execute_with_block_with_bind_with_match
179
+ called = 0
180
+ @db.execute( "select * from foo where a = ?", 1 ) do |row|
181
+ called += 1
182
+ end
183
+ assert_equal 1, called
184
+ end
185
+
186
+ def test_execute2_no_block_no_bind_no_match
187
+ columns, *rows = @db.execute2( "select * from foo where a > 100" )
188
+ assert rows.empty?
189
+ assert_equal [ "a", "b" ], columns
190
+ end
191
+
192
+ def test_execute2_with_block_no_bind_no_match
193
+ called = 0
194
+ @db.execute2( "select * from foo where a > 100" ) do |row|
195
+ assert [ "a", "b" ], row unless called == 0
196
+ called += 1
197
+ end
198
+ assert_equal 1, called
199
+ end
200
+
201
+ def test_execute2_no_block_with_bind_no_match
202
+ columns, *rows = @db.execute2( "select * from foo where a > ?", 100 )
203
+ assert rows.empty?
204
+ assert_equal [ "a", "b" ], columns
205
+ end
206
+
207
+ def test_execute2_with_block_with_bind_no_match
208
+ called = 0
209
+ @db.execute2( "select * from foo where a > ?", 100 ) do |row|
210
+ assert_equal [ "a", "b" ], row unless called == 0
211
+ called += 1
212
+ end
213
+ assert_equal 1, called
214
+ end
215
+
216
+ def test_execute2_no_block_no_bind_with_match
217
+ columns, *rows = @db.execute2( "select * from foo where a = 1" )
218
+ assert_equal 1, rows.length
219
+ assert_equal [ "a", "b" ], columns
220
+ end
221
+
222
+ def test_execute2_with_block_no_bind_with_match
223
+ called = 0
224
+ @db.execute2( "select * from foo where a = 1" ) do |row|
225
+ assert_equal [ 1, "foo" ], row unless called == 0
226
+ called += 1
227
+ end
228
+ assert_equal 2, called
229
+ end
230
+
231
+ def test_execute2_no_block_with_bind_with_match
232
+ columns, *rows = @db.execute2( "select * from foo where a = ?", 1 )
233
+ assert_equal 1, rows.length
234
+ assert_equal [ "a", "b" ], columns
235
+ end
236
+
237
+ def test_execute2_with_block_with_bind_with_match
238
+ called = 0
239
+ @db.execute2( "select * from foo where a = ?", 1 ) do |row|
240
+ called += 1
241
+ end
242
+ assert_equal 2, called
243
+ end
244
+
245
+ def test_execute_batch_empty
246
+ assert_nothing_raised { @db.execute_batch "" }
247
+ end
248
+
249
+ def test_execute_batch_no_bind
250
+ @db.transaction do
251
+ @db.execute_batch <<-SQL
252
+ create table bar ( a, b, c );
253
+ insert into bar values ( 'one', 2, 'three' );
254
+ insert into bar values ( 'four', 5, 'six' );
255
+ insert into bar values ( 'seven', 8, 'nine' );
256
+ SQL
257
+ end
258
+ rows = @db.execute( "select * from bar" )
259
+ assert_equal 3, rows.length
260
+ end
261
+
262
+ def test_execute_batch_with_bind
263
+ @db.execute_batch( <<-SQL, [1] )
264
+ create table bar ( a, b, c );
265
+ insert into bar values ( 'one', 2, ? );
266
+ insert into bar values ( 'four', 5, ? );
267
+ insert into bar values ( 'seven', 8, ? );
268
+ SQL
269
+ rows = @db.execute( "select * from bar" ).map { |a,b,c| c }
270
+ assert_equal [1, 1, 1], rows
271
+ end
272
+
273
+ def test_query_no_block_no_bind_no_match
274
+ result = @db.query( "select * from foo where a > 100" )
275
+ assert_nil result.next
276
+ result.close
277
+ end
278
+
279
+ def test_query_with_block_no_bind_no_match
280
+ r = nil
281
+ @db.query( "select * from foo where a > 100" ) do |result|
282
+ assert_nil result.next
283
+ r = result
284
+ end
285
+ assert r.closed?
286
+ end
287
+
288
+ def test_query_no_block_with_bind_no_match
289
+ result = @db.query( "select * from foo where a > ?", 100 )
290
+ assert_nil result.next
291
+ result.close
292
+ end
293
+
294
+ def test_query_with_block_with_bind_no_match
295
+ r = nil
296
+ @db.query( "select * from foo where a > ?", 100 ) do |result|
297
+ assert_nil result.next
298
+ r = result
299
+ end
300
+ assert r.closed?
301
+ end
302
+
303
+ def test_query_no_block_no_bind_with_match
304
+ result = @db.query( "select * from foo where a = 1" )
305
+ assert_not_nil result.next
306
+ assert_nil result.next
307
+ result.close
308
+ end
309
+
310
+ def test_query_with_block_no_bind_with_match
311
+ r = nil
312
+ @db.query( "select * from foo where a = 1" ) do |result|
313
+ assert_not_nil result.next
314
+ assert_nil result.next
315
+ r = result
316
+ end
317
+ assert r.closed?
318
+ end
319
+
320
+ def test_query_no_block_with_bind_with_match
321
+ result = @db.query( "select * from foo where a = ?", 1 )
322
+ assert_not_nil result.next
323
+ assert_nil result.next
324
+ result.close
325
+ end
326
+
327
+ def test_query_with_block_with_bind_with_match
328
+ r = nil
329
+ @db.query( "select * from foo where a = ?", 1 ) do |result|
330
+ assert_not_nil result.next
331
+ assert_nil result.next
332
+ r = result
333
+ end
334
+ assert r.closed?
335
+ end
336
+
337
+ def test_get_first_row_no_bind_no_match
338
+ result = @db.get_first_row( "select * from foo where a=100" )
339
+ assert_nil result
340
+ end
341
+
342
+ def test_get_first_row_no_bind_with_match
343
+ result = @db.get_first_row( "select * from foo where a=1" )
344
+ assert_equal [ 1, "foo" ], result
345
+ end
346
+
347
+ def test_get_first_row_with_bind_no_match
348
+ result = @db.get_first_row( "select * from foo where a=?", 100 )
349
+ assert_nil result
350
+ end
351
+
352
+ def test_get_first_row_with_bind_with_match
353
+ result = @db.get_first_row( "select * from foo where a=?", 1 )
354
+ assert_equal [ 1, "foo" ], result
355
+ end
356
+
357
+ def test_get_first_value_no_bind_no_match
358
+ result = @db.get_first_value( "select b, a from foo where a=100" )
359
+ assert_nil result
360
+ end
361
+
362
+ def test_get_first_value_no_bind_with_match
363
+ result = @db.get_first_value( "select b, a from foo where a=1" )
364
+ assert_equal "foo", result
365
+ end
366
+
367
+ def test_get_first_value_with_bind_no_match
368
+ result = @db.get_first_value( "select b, a from foo where a=?", 100 )
369
+ assert_nil result
370
+ end
371
+
372
+ def test_get_first_value_with_bind_with_match
373
+ result = @db.get_first_value( "select b, a from foo where a=?", 1 )
374
+ assert_equal "foo", result
375
+ end
376
+
377
+ def test_last_insert_row_id
378
+ @db.execute "insert into foo ( b ) values ( 'test' )"
379
+ assert_equal 4, @db.last_insert_row_id
380
+ @db.execute "insert into foo ( b ) values ( 'again' )"
381
+ assert_equal 5, @db.last_insert_row_id
382
+ end
383
+
384
+ def test_changes
385
+ @db.execute "insert into foo ( b ) values ( 'test' )"
386
+ assert_equal 1, @db.changes
387
+ @db.execute "delete from foo where 1=1"
388
+ assert_equal 4, @db.changes
389
+ end
390
+
391
+ def test_total_changes
392
+ assert_equal 3, @db.total_changes
393
+ @db.execute "insert into foo ( b ) values ( 'test' )"
394
+ @db.execute "delete from foo where 1=1"
395
+ assert_equal 8, @db.total_changes
396
+ end
397
+
398
+ def test_transaction_nest
399
+ assert_raise( SQLite3::SQLException ) do
400
+ @db.transaction do
401
+ @db.transaction do
402
+ end
403
+ end
404
+ end
405
+ end
406
+
407
+ def test_transaction_rollback
408
+ @db.transaction
409
+ @db.execute_batch <<-SQL
410
+ insert into foo (b) values ( 'test1' );
411
+ insert into foo (b) values ( 'test2' );
412
+ insert into foo (b) values ( 'test3' );
413
+ insert into foo (b) values ( 'test4' );
414
+ SQL
415
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
416
+ @db.rollback
417
+ assert_equal 3, @db.get_first_value("select count(*) from foo").to_i
418
+ end
419
+
420
+ def test_transaction_commit
421
+ @db.transaction
422
+ @db.execute_batch <<-SQL
423
+ insert into foo (b) values ( 'test1' );
424
+ insert into foo (b) values ( 'test2' );
425
+ insert into foo (b) values ( 'test3' );
426
+ insert into foo (b) values ( 'test4' );
427
+ SQL
428
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
429
+ @db.commit
430
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
431
+ end
432
+
433
+ def test_transaction_rollback_in_block
434
+ assert_raise( SQLite3::SQLException ) do
435
+ @db.transaction do
436
+ @db.rollback
437
+ end
438
+ end
439
+ end
440
+
441
+ def test_transaction_commit_in_block
442
+ assert_raise( SQLite3::SQLException ) do
443
+ @db.transaction do
444
+ @db.commit
445
+ end
446
+ end
447
+ end
448
+
449
+ def test_transaction_active
450
+ assert !@db.transaction_active?
451
+ @db.transaction
452
+ assert @db.transaction_active?
453
+ @db.commit
454
+ assert !@db.transaction_active?
455
+ end
456
+
457
+ def test_transaction_implicit_rollback
458
+ assert !@db.transaction_active?
459
+ @db.transaction
460
+ @db.execute('create table bar (x CHECK(1 = 0))')
461
+ assert @db.transaction_active?
462
+ assert_raises( SQLite3::ConstraintException ) do
463
+ @db.execute("insert or rollback into bar (x) VALUES ('x')")
464
+ end
465
+ assert !@db.transaction_active?
466
+ end
467
+
468
+ def test_interrupt
469
+ @db.create_function( "abort", 1 ) do |func,x|
470
+ @db.interrupt
471
+ func.result = x
472
+ end
473
+
474
+ assert_raise( SQLite3::InterruptException ) do
475
+ @db.execute "select abort(a) from foo"
476
+ end
477
+ end
478
+
479
+ def test_create_function
480
+ @db.create_function( "munge", 1 ) do |func,x|
481
+ func.result = ">>>#{x}<<<"
482
+ end
483
+
484
+ value = @db.get_first_value( "select munge(b) from foo where a=1" )
485
+ assert_match( />>>.*<<</, value )
486
+ end
487
+
488
+ def test_create_aggregate_without_block
489
+ step = proc do |ctx,a|
490
+ ctx[:sum] ||= 0
491
+ ctx[:sum] += a.to_i
492
+ end
493
+
494
+ final = proc { |ctx| ctx.result = ctx[:sum] }
495
+
496
+ @db.create_aggregate( "accumulate", 1, step, final )
497
+
498
+ value = @db.get_first_value( "select accumulate(a) from foo" )
499
+ assert_equal 6, value
500
+ end
501
+
502
+ def test_create_aggregate_with_block
503
+ @db.create_aggregate( "accumulate", 1 ) do
504
+ step do |ctx,a|
505
+ ctx[:sum] ||= 0
506
+ ctx[:sum] += a.to_i
507
+ end
508
+
509
+ finalize { |ctx| ctx.result = ctx[:sum] }
510
+ end
511
+
512
+ value = @db.get_first_value( "select accumulate(a) from foo" )
513
+ assert_equal 6, value
514
+ end
515
+
516
+ def test_create_aggregate_with_no_data
517
+ @db.create_aggregate( "accumulate", 1 ) do
518
+ step do |ctx,a|
519
+ ctx[:sum] ||= 0
520
+ ctx[:sum] += a.to_i
521
+ end
522
+
523
+ finalize { |ctx| ctx.result = ctx[:sum] || 0 }
524
+ end
525
+
526
+ value = @db.get_first_value(
527
+ "select accumulate(a) from foo where a = 100" )
528
+ assert_equal 0, value
529
+ end
530
+
531
+ def test_create_aggregate_handler
532
+ handler = Class.new do
533
+ class << self
534
+ def arity; 1; end
535
+ def text_rep; SQLite3::Constants::TextRep::ANY; end
536
+ def name; "multiply"; end
537
+ end
538
+ def step(ctx, a)
539
+ ctx[:buffer] ||= 1
540
+ ctx[:buffer] *= a.to_i
541
+ end
542
+ def finalize(ctx); ctx.result = ctx[:buffer]; end
543
+ end
544
+
545
+ @db.create_aggregate_handler( handler )
546
+ value = @db.get_first_value( "select multiply(a) from foo" )
547
+ assert_equal 6, value
548
+ end
549
+
550
+ def test_bind_array_parameter
551
+ result = @db.get_first_value( "select b from foo where a=? and b=?",
552
+ [ 1, "foo" ] )
553
+ assert_equal "foo", result
554
+ end
555
+ end