sqlite3-ruby 1.2.3-x86-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.

Potentially problematic release.


This version of sqlite3-ruby might be problematic. Click here for more details.

@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ gem 'mocha'
3
+
4
+ require 'mocha'
5
+
6
+ class Driver < Mocha::Mock
7
+ def initialize
8
+ super
9
+ stubs( :open ).returns([0, 'cookie'])
10
+ stubs( :close ).returns(0)
11
+ stubs( :complete? ).returns(0)
12
+ stubs( :errmsg ).returns('')
13
+ stubs( :errcode ).returns(0)
14
+ stubs( :trace ).returns(nil)
15
+ stubs( :set_authorizer ).returns(0)
16
+ stubs( :prepare ).returns([0, 'stmt', 'remainder'])
17
+ stubs( :finalize ).returns(0)
18
+ stubs( :changes ).returns(14)
19
+ stubs( :total_changes ).returns(28)
20
+ stubs( :interrupt ).returns(0)
21
+ end
22
+ end
23
+
24
+ class MockResultSet < Mocha::Mock
25
+ def initialize
26
+ super
27
+ stubs( :each ).yields(['foo'])
28
+ stubs( :columns ).returns(['name'])
29
+ end
30
+ end
31
+
32
+ class Statement < Mocha::Mock
33
+ attr_reader :handle
34
+ attr_reader :sql
35
+ attr_reader :last_result
36
+
37
+ def initialize( handle, sql )
38
+ super()
39
+ @handle = handle
40
+ @sql = sql
41
+ stubs( :close ).returns(0)
42
+ stubs( :remainder ).returns('')
43
+ stubs( :execute ).returns(MockResultSet.new)
44
+ end
45
+ end
@@ -0,0 +1,126 @@
1
+ $:.unshift "../lib", "../ext/sqlite3_api"
2
+
3
+ require 'sqlite3'
4
+
5
+ require 'benchmark'
6
+
7
+ N = 1000
8
+
9
+ $VERBOSE=nil
10
+
11
+ puts "database creation..."
12
+ Benchmark.bm( 7 ) do |x|
13
+ x.report('dl') do
14
+ N.times do
15
+ File.delete "test.db" rescue nil
16
+ SQLite3::Database.open( "test.db", :driver => "DL" ).close
17
+ end
18
+ end
19
+ x.report('native') do
20
+ N.times do
21
+ File.delete "test.db" rescue nil
22
+ SQLite3::Database.open( "test.db", :driver => "Native" ).close
23
+ end
24
+ end
25
+ end
26
+ File.delete "test.db" rescue nil
27
+
28
+ SQLite3::Database.open( "test.db" ).close
29
+
30
+ puts
31
+ puts "database open..."
32
+ Benchmark.bm( 7 ) do |x|
33
+ x.report('dl') do
34
+ N.times do
35
+ SQLite3::Database.open( "test.db", :driver => "DL" ).close
36
+ end
37
+ end
38
+ x.report('native') do
39
+ N.times do
40
+ SQLite3::Database.open( "test.db", :driver => "Native" ).close
41
+ end
42
+ end
43
+ end
44
+ File.delete "test.db" rescue nil
45
+
46
+ dl = SQLite3::Database.open( "test-dl.db", :driver => "DL" )
47
+ native = SQLite3::Database.open( "test-native.db", :driver => "Native" )
48
+
49
+ dl.execute "create table foo (a,b)"
50
+ native.execute "create table foo (a,b)"
51
+
52
+ puts
53
+ puts "insertions"
54
+ Benchmark.bm( 7 ) do |x|
55
+ x.report('dl') do
56
+ dl.transaction do
57
+ N.times do |i|
58
+ dl.execute "insert into foo values (#{i}, #{i+1})"
59
+ end
60
+ end
61
+ end
62
+ x.report('native') do
63
+ native.transaction do
64
+ N.times do |i|
65
+ native.execute "insert into foo values (#{i}, #{i+1})"
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ puts
72
+ puts "insertions using prepared statement"
73
+ Benchmark.bm( 7 ) do |x|
74
+ x.report('dl') do
75
+ dl.transaction do
76
+ dl.prepare "insert into foo values (?,?)" do |stmt|
77
+ N.times { |i| stmt.execute i, i+1 }
78
+ end
79
+ end
80
+ end
81
+ x.report('native') do
82
+ native.transaction do
83
+ native.prepare( "insert into foo values (?,?)" ) do |stmt|
84
+ N.times { |i| stmt.execute i, i+1 }
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ dl.close
91
+ native.close
92
+ File.delete "test-dl.db" rescue nil
93
+ File.delete "test-native.db" rescue nil
94
+
95
+ dl = SQLite3::Database.open( "test-dl.db", :driver => "DL" )
96
+ native = SQLite3::Database.open( "test-native.db", :driver => "Native" )
97
+
98
+ dl.execute "create table foo (a,b)"
99
+ dl.execute "insert into foo values (1,2)"
100
+ dl.execute "insert into foo values (3,4)"
101
+ dl.execute "insert into foo values (5,6)"
102
+
103
+ native.execute "create table foo (a,b)"
104
+ native.execute "insert into foo values (1,2)"
105
+ native.execute "insert into foo values (3,4)"
106
+ native.execute "insert into foo values (5,6)"
107
+
108
+ puts
109
+ puts "queries"
110
+ Benchmark.bm( 7 ) do |x|
111
+ x.report('dl') do
112
+ N.times do
113
+ dl.execute "select * from foo"
114
+ end
115
+ end
116
+ x.report('native') do
117
+ N.times do
118
+ native.execute "select * from foo"
119
+ end
120
+ end
121
+ end
122
+
123
+ dl.close
124
+ native.close
125
+ File.delete "test-dl.db" rescue nil
126
+ File.delete "test-native.db" rescue nil
@@ -0,0 +1,198 @@
1
+ $:.unshift "../lib"
2
+
3
+ require 'sqlite3/database'
4
+ require 'test/unit'
5
+
6
+ require 'mocks'
7
+
8
+ class TC_Database_Init < Test::Unit::TestCase
9
+ def test_new
10
+ # any_instance fails here...
11
+ driver = Driver.new
12
+ driver.expects(:open).once.with('foo.db', false).returns([0, 'cookie'])
13
+ Driver.stubs(:new).returns(driver)
14
+ db = SQLite3::Database.new( 'foo.db', :driver => Driver )
15
+ assert !db.closed?
16
+ assert !db.results_as_hash
17
+ assert !db.type_translation
18
+ end
19
+
20
+ def test_open
21
+ driver = Driver.new
22
+ driver.expects(:open).once.with('foo.db', false).returns([0, 'cookie'])
23
+ Driver.stubs(:new).returns(driver)
24
+ db = SQLite3::Database.open( "foo.db", :driver => Driver )
25
+ assert !db.closed?
26
+ assert !db.results_as_hash
27
+ assert !db.type_translation
28
+ end
29
+
30
+ def test_with_type_translation
31
+ db = SQLite3::Database.open( "foo.db", :driver => Driver,
32
+ :type_translation => true )
33
+ assert db.type_translation
34
+ end
35
+
36
+ def test_with_results_as_hash
37
+ db = SQLite3::Database.open( "foo.db", :driver => Driver,
38
+ :results_as_hash => true )
39
+ assert db.results_as_hash
40
+ end
41
+
42
+ def test_with_type_translation_and_results_as_hash
43
+ db = SQLite3::Database.open( "foo.db", :driver => Driver,
44
+ :results_as_hash => true,
45
+ :type_translation => true )
46
+ assert db.results_as_hash
47
+ assert db.type_translation
48
+ end
49
+ end
50
+
51
+ class TC_Database < Test::Unit::TestCase
52
+ def setup
53
+ @db = SQLite3::Database.open( "foo.db",
54
+ :driver => Driver, :statement_factory => Statement )
55
+ end
56
+
57
+ def test_quote
58
+ assert_equal "''one''two''three''", SQLite3::Database.quote(
59
+ "'one'two'three'" )
60
+ end
61
+
62
+ def test_complete
63
+ Driver.any_instance.expects(:complete?)
64
+ @db.complete? "foo"
65
+ end
66
+
67
+ def test_errmsg
68
+ Driver.any_instance.expects(:errmsg)
69
+ @db.errmsg
70
+ end
71
+
72
+ def test_errcode
73
+ Driver.any_instance.expects(:errcode)
74
+ @db.errcode
75
+ end
76
+
77
+ def test_translator
78
+ translator = @db.translator
79
+ assert_instance_of SQLite3::Translator, translator
80
+ end
81
+
82
+ def test_close
83
+ Driver.any_instance.expects(:close).returns(0)
84
+ @db.close
85
+ assert @db.closed?
86
+ Driver.any_instance.expects(:close).never
87
+ @db.close
88
+ end
89
+
90
+ def test_trace
91
+ Driver.any_instance.expects(:trace).with('cookie', 15)
92
+ @db.trace( 15 ) { "foo" }
93
+ # assert_equal 1, driver.mock_blocks[:trace].length
94
+ end
95
+
96
+ def test_authorizer
97
+ Driver.any_instance.expects(:set_authorizer).with('cookie', 15).returns(0)
98
+ @db.authorizer( 15 ) { "foo" }
99
+ # assert_equal 1, driver.mock_blocks[:set_authorizer].length
100
+ end
101
+
102
+ def test_prepare_no_block
103
+ Statement.any_instance.expects(:close).never
104
+ assert_nothing_raised { @db.prepare( "foo" ) }
105
+ end
106
+
107
+ def test_prepare_with_block
108
+ called = false
109
+ # any_instance fails here...
110
+ statement = Statement.new('cookie', 'foo')
111
+ statement.expects(:close).once
112
+ Statement.stubs(:new).returns(statement)
113
+ @db.prepare( "foo" ) { |stmt| called = true }
114
+ assert called
115
+ end
116
+
117
+ def test_execute_no_block
118
+ # any_instance fails here...
119
+ statement = Statement.new('cookie', 'foo')
120
+ statement.expects(:execute).with('bar', 'baz').returns(MockResultSet.new)
121
+ Statement.stubs(:new).returns(statement)
122
+ MockResultSet.any_instance.stubs(:inject).returns([['foo']])
123
+ result = @db.execute( "foo", "bar", "baz" )
124
+ assert_equal [["foo"]], result
125
+ end
126
+
127
+ def test_execute_with_block
128
+ called = false
129
+ # any_instance fails here...
130
+ statement = Statement.new('cookie', 'foo')
131
+ statement.expects(:execute).with('bar', 'baz').returns(MockResultSet.new)
132
+ Statement.stubs(:new).returns(statement)
133
+ @db.execute( "foo", "bar", "baz" ) do |row|
134
+ called = true
135
+ assert_equal ["foo"], row
136
+ end
137
+
138
+ assert called
139
+ end
140
+
141
+ def test_execute2_no_block
142
+ # any_instance fails here...
143
+ statement = Statement.new('cookie', 'foo')
144
+ statement.expects(:execute).with('bar', 'baz').returns(MockResultSet.new)
145
+ Statement.stubs(:new).returns(statement)
146
+ MockResultSet.any_instance.stubs(:inject).returns([['name'], ['foo']])
147
+ result = @db.execute2( "foo", "bar", "baz" )
148
+ assert_equal [["name"],["foo"]], result
149
+ end
150
+
151
+ def test_execute2_with_block
152
+ called = false
153
+ parts = [ ["name"],["foo"] ]
154
+ # any_instance fails here...
155
+ statement = Statement.new('cookie', 'foo')
156
+ statement.expects(:execute).with('bar', 'baz').returns(MockResultSet.new)
157
+ Statement.stubs(:new).returns(statement)
158
+ @db.execute2( "foo", "bar", "baz" ) do |row|
159
+ called = true
160
+ assert_equal parts.shift, row
161
+ end
162
+
163
+ assert called
164
+ end
165
+
166
+ def test_execute_batch
167
+ # any_instance fails here...
168
+ statement = Statement.new('cookie', 'foo')
169
+ statement.expects(:execute).with('bar', 'baz').returns(MockResultSet.new)
170
+ Statement.stubs(:new).returns(statement)
171
+ @db.execute_batch( "foo", "bar", "baz" )
172
+ end
173
+
174
+ def test_get_first_row
175
+ result = @db.get_first_row( "foo", "bar", "baz" )
176
+ assert_equal ["foo"], result
177
+ end
178
+
179
+ def test_get_first_value
180
+ result = @db.get_first_value( "foo", "bar", "baz" )
181
+ assert_equal "foo", result
182
+ end
183
+
184
+ def test_changes
185
+ Driver.any_instance.expects(:changes).returns(14)
186
+ assert_equal 14, @db.changes
187
+ end
188
+
189
+ def test_total_changes
190
+ Driver.any_instance.expects(:total_changes).returns(28)
191
+ assert_equal 28, @db.total_changes
192
+ end
193
+
194
+ def test_interrupt
195
+ Driver.any_instance.expects(:interrupt)
196
+ @db.interrupt
197
+ end
198
+ end
@@ -0,0 +1,21 @@
1
+ $:.unshift "../lib"
2
+
3
+ require 'sqlite3/errors'
4
+ require 'test/unit'
5
+ require 'mocha'
6
+
7
+ class TC_Errors < Test::Unit::TestCase
8
+ (1..26).each do |code|
9
+ define_method( "test_error_code_%02d" % code ) do
10
+ db = stub('database', :errmsg => 'message')
11
+ begin
12
+ SQLite3::Error.check( code, db )
13
+ rescue SQLite3::Exception => e
14
+ assert_instance_of SQLite3::EXCEPTIONS[code], e
15
+ assert_equal code, e.code
16
+ assert_equal code, e.class.code
17
+ assert_equal "message", e.message
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,1044 @@
1
+ $:.unshift "#{File.dirname(__FILE__)}/../lib"
2
+ $:.unshift "#{File.dirname(__FILE__)}/../ext/sqlite3_api"
3
+
4
+ require 'test/unit'
5
+ require 'benchmark'
6
+ require 'sqlite3/database'
7
+ require 'thread'
8
+
9
+ class String
10
+ def to_utf16(terminate=false)
11
+ self.split(//).map { |c| c[0] }.pack("v*") +
12
+ (terminate ? "\0\0" : "")
13
+ end
14
+
15
+ def from_utf16
16
+ result = ""
17
+ length.times do |i|
18
+ result << self[i,1] if i % 2 == 0 && self[i] != 0
19
+ end
20
+ result
21
+ end
22
+ end
23
+
24
+ module Integration
25
+
26
+ drivers_to_test = ( ENV["SQLITE3_DRIVERS"] || "Native" ).split(',')
27
+ drivers_to_test.each do |driver|
28
+
29
+ # == TC_OpenClose =========================================================
30
+
31
+ test_case = Class.new( Test::Unit::TestCase ) do
32
+ define_method( "test_create_close" ) do
33
+ begin
34
+ db = SQLite3::Database.new( "test-create.db",
35
+ :driver => driver )
36
+ assert File.exist?( "test-create.db" )
37
+ assert_nothing_raised { db.close }
38
+ ensure
39
+ File.delete( "test-create.db" ) rescue nil
40
+ end
41
+ end
42
+
43
+ define_method( "test_open_close" ) do
44
+ begin
45
+ File.open( "test-open.db", "w" ) { |f| }
46
+ assert File.exist?( "test-open.db" )
47
+ db = SQLite3::Database.new( "test-open.db",
48
+ :driver => driver )
49
+ assert_nothing_raised { db.close }
50
+ ensure
51
+ File.delete( "test-open.db" ) rescue nil
52
+ end
53
+ end
54
+
55
+ define_method( "test_bad_open" ) do
56
+ assert_raise( SQLite3::CantOpenException ) do
57
+ SQLite3::Database.new( ".", :driver => driver )
58
+ end
59
+ end
60
+ end
61
+ const_set( "TC_OpenClose_#{driver}", test_case )
62
+
63
+ # == TC_Database ==========================================================
64
+
65
+ test_case = Class.new( Test::Unit::TestCase ) do
66
+ define_method( "setup" ) do
67
+ @db = SQLite3::Database.new( "test.db", :driver=>driver )
68
+ @db.transaction do
69
+ @db.execute "create table foo ( a integer primary key, b text )"
70
+ @db.execute "insert into foo ( b ) values ( 'foo' )"
71
+ @db.execute "insert into foo ( b ) values ( 'bar' )"
72
+ @db.execute "insert into foo ( b ) values ( 'baz' )"
73
+ end
74
+ end
75
+
76
+ define_method( "teardown" ) do
77
+ @db.close
78
+ File.delete( "test.db" )
79
+ end
80
+
81
+ define_method( "test_table_info_with_type_translation_active" ) do
82
+ @db.type_translation = true
83
+ assert_nothing_raised { @db.table_info("foo") }
84
+ end
85
+
86
+ define_method( "test_table_info_with_defaults_for_version_3_3_8_and_higher" ) do
87
+ @db.transaction do
88
+ @db.execute "create table defaults_test ( a string default NULL, b string default 'Hello' )"
89
+ data = @db.table_info( "defaults_test" )
90
+ assert_equal({"name" => "a", "type" => "string", "dflt_value" => nil, "notnull" => "0", "cid" => "0", "pk" => "0"},
91
+ data[0])
92
+ assert_equal({"name" => "b", "type" => "string", "dflt_value" => "Hello", "notnull" => "0", "cid" => "1", "pk" => "0"},
93
+ data[1])
94
+ end
95
+ end
96
+
97
+ define_method( "test_table_info_without_defaults_for_version_3_3_8_and_higher" ) do
98
+ @db.transaction do
99
+ @db.execute "create table no_defaults_test ( a integer default 1, b integer )"
100
+ data = @db.table_info( "no_defaults_test" )
101
+ assert_equal({"name" => "a", "type" => "integer", "dflt_value" => "1", "notnull" => "0", "cid" => "0", "pk" => "0"},
102
+ data[0])
103
+ assert_equal({"name" => "b", "type" => "integer", "dflt_value" => nil, "notnull" => "0", "cid" => "1", "pk" => "0"},
104
+ data[1])
105
+ end
106
+ end
107
+
108
+ define_method( "test_complete_fail" ) do
109
+ assert !@db.complete?( "select * from foo" )
110
+ end
111
+ define_method( "test_complete_success" ) do
112
+ assert @db.complete?( "select * from foo;" )
113
+ end
114
+
115
+ define_method( "test_complete_fail_utf16" ) do
116
+ assert !@db.complete?( "select * from foo".to_utf16(false), true )
117
+ end
118
+
119
+ define_method( "test_complete_success_utf16" ) do
120
+ assert @db.complete?( "select * from foo;".to_utf16(true), true )
121
+ end
122
+
123
+ define_method( "test_errmsg" ) do
124
+ assert_equal "not an error", @db.errmsg
125
+ end
126
+
127
+ define_method( "test_errmsg_utf16" ) do
128
+ assert_equal "not an error".to_utf16, @db.errmsg(true)
129
+ end
130
+
131
+ define_method( "test_errcode" ) do
132
+ assert_equal 0, @db.errcode
133
+ end
134
+
135
+ define_method( "test_trace" ) do
136
+ result = nil
137
+ @db.trace( "data" ) { |data,sql| result = [ data, sql ]; 0 }
138
+ @db.execute "select * from foo"
139
+ assert_equal ["data","select * from foo"], result
140
+ end
141
+
142
+ define_method( "test_authorizer_okay" ) do
143
+ @db.authorizer( "data" ) { |data,type,a,b,c,d| 0 }
144
+ rows = @db.execute "select * from foo"
145
+ assert_equal 3, rows.length
146
+ end
147
+
148
+ define_method( "test_authorizer_error" ) do
149
+ @db.authorizer( "data" ) { |data,type,a,b,c,d| 1 }
150
+ assert_raise( SQLite3::AuthorizationException ) do
151
+ @db.execute "select * from foo"
152
+ end
153
+ end
154
+
155
+ # FIXME: this test is failing with sqlite3 3.2.5
156
+ # define_method( "test_authorizer_silent" ) do
157
+ # @db.authorizer( "data" ) { |data,type,a,b,c,d| 2 }
158
+ # rows = @db.execute "select * from foo"
159
+ # assert rows.empty?
160
+ # end
161
+
162
+ define_method( "test_prepare_invalid_syntax" ) do
163
+ assert_raise( SQLite3::SQLException ) do
164
+ @db.prepare "select from foo"
165
+ end
166
+ end
167
+
168
+ define_method( "test_prepare_invalid_column" ) do
169
+ assert_raise( SQLite3::SQLException ) do
170
+ @db.prepare "select k from foo"
171
+ end
172
+ end
173
+
174
+ define_method( "test_prepare_invalid_table" ) do
175
+ assert_raise( SQLite3::SQLException ) do
176
+ @db.prepare "select * from barf"
177
+ end
178
+ end
179
+
180
+ define_method( "test_prepare_no_block" ) do
181
+ stmt = @db.prepare "select * from foo"
182
+ assert stmt.respond_to?(:execute)
183
+ stmt.close
184
+ end
185
+
186
+ define_method( "test_prepare_with_block" ) do
187
+ called = false
188
+ @db.prepare "select * from foo" do |stmt|
189
+ called = true
190
+ assert stmt.respond_to?(:execute)
191
+ end
192
+ assert called
193
+ end
194
+
195
+ define_method( "test_execute_no_block_no_bind_no_match" ) do
196
+ rows = @db.execute( "select * from foo where a > 100" )
197
+ assert rows.empty?
198
+ end
199
+
200
+ define_method( "test_execute_with_block_no_bind_no_match" ) do
201
+ called = false
202
+ @db.execute( "select * from foo where a > 100" ) do |row|
203
+ called = true
204
+ end
205
+ assert !called
206
+ end
207
+
208
+ define_method( "test_execute_no_block_with_bind_no_match" ) do
209
+ rows = @db.execute( "select * from foo where a > ?", 100 )
210
+ assert rows.empty?
211
+ end
212
+
213
+ define_method( "test_execute_with_block_with_bind_no_match" ) do
214
+ called = false
215
+ @db.execute( "select * from foo where a > ?", 100 ) do |row|
216
+ called = true
217
+ end
218
+ assert !called
219
+ end
220
+
221
+ define_method( "test_execute_no_block_no_bind_with_match" ) do
222
+ rows = @db.execute( "select * from foo where a = 1" )
223
+ assert_equal 1, rows.length
224
+ end
225
+
226
+ define_method( "test_execute_with_block_no_bind_with_match" ) do
227
+ called = 0
228
+ @db.execute( "select * from foo where a = 1" ) do |row|
229
+ called += 1
230
+ end
231
+ assert_equal 1, called
232
+ end
233
+
234
+ define_method( "test_execute_no_block_with_bind_with_match" ) do
235
+ rows = @db.execute( "select * from foo where a = ?", 1 )
236
+ assert_equal 1, rows.length
237
+ end
238
+
239
+ define_method( "test_execute_with_block_with_bind_with_match" ) do
240
+ called = 0
241
+ @db.execute( "select * from foo where a = ?", 1 ) do |row|
242
+ called += 1
243
+ end
244
+ assert_equal 1, called
245
+ end
246
+
247
+ define_method( "test_execute2_no_block_no_bind_no_match" ) do
248
+ columns, *rows = @db.execute2( "select * from foo where a > 100" )
249
+ assert rows.empty?
250
+ assert [ "a", "b" ], columns
251
+ end
252
+
253
+ define_method( "test_execute2_with_block_no_bind_no_match" ) do
254
+ called = 0
255
+ @db.execute2( "select * from foo where a > 100" ) do |row|
256
+ assert [ "a", "b" ], row unless called == 0
257
+ called += 1
258
+ end
259
+ assert_equal 1, called
260
+ end
261
+
262
+ define_method( "test_execute2_no_block_with_bind_no_match" ) do
263
+ columns, *rows = @db.execute2( "select * from foo where a > ?", 100 )
264
+ assert rows.empty?
265
+ assert [ "a", "b" ], columns
266
+ end
267
+
268
+ define_method( "test_execute2_with_block_with_bind_no_match" ) do
269
+ called = 0
270
+ @db.execute2( "select * from foo where a > ?", 100 ) do |row|
271
+ assert [ "a", "b" ], row unless called == 0
272
+ called += 1
273
+ end
274
+ assert_equal 1, called
275
+ end
276
+
277
+ define_method( "test_execute2_no_block_no_bind_with_match" ) do
278
+ columns, *rows = @db.execute2( "select * from foo where a = 1" )
279
+ assert_equal 1, rows.length
280
+ assert [ "a", "b" ], columns
281
+ end
282
+
283
+ define_method( "test_execute2_with_block_no_bind_with_match" ) do
284
+ called = 0
285
+ @db.execute2( "select * from foo where a = 1" ) do |row|
286
+ assert [ "a", "b" ], row unless called == 0
287
+ called += 1
288
+ end
289
+ assert_equal 2, called
290
+ end
291
+
292
+ define_method( "test_execute2_no_block_with_bind_with_match" ) do
293
+ columns, *rows = @db.execute2( "select * from foo where a = ?", 1 )
294
+ assert_equal 1, rows.length
295
+ assert [ "a", "b" ], columns
296
+ end
297
+
298
+ define_method( "test_execute2_with_block_with_bind_with_match" ) do
299
+ called = 0
300
+ @db.execute2( "select * from foo where a = ?", 1 ) do |row|
301
+ called += 1
302
+ end
303
+ assert_equal 2, called
304
+ end
305
+
306
+ define_method( "test_execute_batch_empty" ) do
307
+ assert_nothing_raised { @db.execute_batch "" }
308
+ end
309
+
310
+ define_method( "test_execute_batch_no_bind" ) do
311
+ @db.transaction do
312
+ @db.execute_batch <<-SQL
313
+ create table bar ( a, b, c );
314
+ insert into bar values ( 'one', 2, 'three' );
315
+ insert into bar values ( 'four', 5, 'six' );
316
+ insert into bar values ( 'seven', 8, 'nine' );
317
+ SQL
318
+ end
319
+ rows = @db.execute( "select * from bar" )
320
+ assert_equal 3, rows.length
321
+ end
322
+
323
+ define_method( "test_execute_batch_with_bind" ) do
324
+ @db.execute_batch( <<-SQL, 1 )
325
+ create table bar ( a, b, c );
326
+ insert into bar values ( 'one', 2, ? );
327
+ insert into bar values ( 'four', 5, ? );
328
+ insert into bar values ( 'seven', 8, ? );
329
+ SQL
330
+ rows = @db.execute( "select * from bar" ).map { |a,b,c| c }
331
+ assert_equal %w{1 1 1}, rows
332
+ end
333
+
334
+ define_method( "test_query_no_block_no_bind_no_match" ) do
335
+ result = @db.query( "select * from foo where a > 100" )
336
+ assert_nil result.next
337
+ result.close
338
+ end
339
+
340
+ define_method( "test_query_with_block_no_bind_no_match" ) do
341
+ r = nil
342
+ @db.query( "select * from foo where a > 100" ) do |result|
343
+ assert_nil result.next
344
+ r = result
345
+ end
346
+ assert r.closed?
347
+ end
348
+
349
+ define_method( "test_query_no_block_with_bind_no_match" ) do
350
+ result = @db.query( "select * from foo where a > ?", 100 )
351
+ assert_nil result.next
352
+ result.close
353
+ end
354
+
355
+ define_method( "test_query_with_block_with_bind_no_match" ) do
356
+ r = nil
357
+ @db.query( "select * from foo where a > ?", 100 ) do |result|
358
+ assert_nil result.next
359
+ r = result
360
+ end
361
+ assert r.closed?
362
+ end
363
+
364
+ define_method( "test_query_no_block_no_bind_with_match" ) do
365
+ result = @db.query( "select * from foo where a = 1" )
366
+ assert_not_nil result.next
367
+ assert_nil result.next
368
+ result.close
369
+ end
370
+
371
+ define_method( "test_query_with_block_no_bind_with_match" ) do
372
+ r = nil
373
+ @db.query( "select * from foo where a = 1" ) do |result|
374
+ assert_not_nil result.next
375
+ assert_nil result.next
376
+ r = result
377
+ end
378
+ assert r.closed?
379
+ end
380
+
381
+ define_method( "test_query_no_block_with_bind_with_match" ) do
382
+ result = @db.query( "select * from foo where a = ?", 1 )
383
+ assert_not_nil result.next
384
+ assert_nil result.next
385
+ result.close
386
+ end
387
+
388
+ define_method( "test_query_with_block_with_bind_with_match" ) do
389
+ r = nil
390
+ @db.query( "select * from foo where a = ?", 1 ) do |result|
391
+ assert_not_nil result.next
392
+ assert_nil result.next
393
+ r = result
394
+ end
395
+ assert r.closed?
396
+ end
397
+
398
+ define_method( "test_get_first_row_no_bind_no_match" ) do
399
+ result = @db.get_first_row( "select * from foo where a=100" )
400
+ assert_nil result
401
+ end
402
+
403
+ define_method( "test_get_first_row_no_bind_with_match" ) do
404
+ result = @db.get_first_row( "select * from foo where a=1" )
405
+ assert_equal [ "1", "foo" ], result
406
+ end
407
+
408
+ define_method( "test_get_first_row_with_bind_no_match" ) do
409
+ result = @db.get_first_row( "select * from foo where a=?", 100 )
410
+ assert_nil result
411
+ end
412
+
413
+ define_method( "test_get_first_row_with_bind_with_match" ) do
414
+ result = @db.get_first_row( "select * from foo where a=?", 1 )
415
+ assert_equal [ "1", "foo" ], result
416
+ end
417
+
418
+ define_method( "test_get_first_value_no_bind_no_match" ) do
419
+ result = @db.get_first_value( "select b, a from foo where a=100" )
420
+ assert_nil result
421
+ end
422
+
423
+ define_method( "test_get_first_value_no_bind_with_match" ) do
424
+ result = @db.get_first_value( "select b, a from foo where a=1" )
425
+ assert_equal "foo", result
426
+ end
427
+
428
+ define_method( "test_get_first_value_with_bind_no_match" ) do
429
+ result = @db.get_first_value( "select b, a from foo where a=?", 100 )
430
+ assert_nil result
431
+ end
432
+
433
+ define_method( "test_get_first_value_with_bind_with_match" ) do
434
+ result = @db.get_first_value( "select b, a from foo where a=?", 1 )
435
+ assert_equal "foo", result
436
+ end
437
+
438
+ define_method( "test_last_insert_row_id" ) do
439
+ @db.execute "insert into foo ( b ) values ( 'test' )"
440
+ assert_equal 4, @db.last_insert_row_id
441
+ @db.execute "insert into foo ( b ) values ( 'again' )"
442
+ assert_equal 5, @db.last_insert_row_id
443
+ end
444
+
445
+ define_method( "test_changes" ) do
446
+ @db.execute "insert into foo ( b ) values ( 'test' )"
447
+ assert_equal 1, @db.changes
448
+ @db.execute "delete from foo where 1=1"
449
+ assert_equal 4, @db.changes
450
+ end
451
+
452
+ define_method( "test_total_changes" ) do
453
+ assert_equal 3, @db.total_changes
454
+ @db.execute "insert into foo ( b ) values ( 'test' )"
455
+ @db.execute "delete from foo where 1=1"
456
+ assert_equal 8, @db.total_changes
457
+ end
458
+
459
+ define_method( "test_transaction_nest" ) do
460
+ assert_raise( SQLite3::SQLException ) do
461
+ @db.transaction do
462
+ @db.transaction do
463
+ end
464
+ end
465
+ end
466
+ end
467
+
468
+ define_method( "test_transaction_rollback" ) do
469
+ @db.transaction
470
+ @db.execute_batch <<-SQL
471
+ insert into foo (b) values ( 'test1' );
472
+ insert into foo (b) values ( 'test2' );
473
+ insert into foo (b) values ( 'test3' );
474
+ insert into foo (b) values ( 'test4' );
475
+ SQL
476
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
477
+ @db.rollback
478
+ assert_equal 3, @db.get_first_value("select count(*) from foo").to_i
479
+ end
480
+
481
+ define_method( "test_transaction_commit" ) do
482
+ @db.transaction
483
+ @db.execute_batch <<-SQL
484
+ insert into foo (b) values ( 'test1' );
485
+ insert into foo (b) values ( 'test2' );
486
+ insert into foo (b) values ( 'test3' );
487
+ insert into foo (b) values ( 'test4' );
488
+ SQL
489
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
490
+ @db.commit
491
+ assert_equal 7, @db.get_first_value("select count(*) from foo").to_i
492
+ end
493
+
494
+ define_method( "test_transaction_rollback_in_block" ) do
495
+ assert_raise( SQLite3::SQLException ) do
496
+ @db.transaction do
497
+ @db.rollback
498
+ end
499
+ end
500
+ end
501
+
502
+ define_method( "test_transaction_commit_in_block" ) do
503
+ assert_raise( SQLite3::SQLException ) do
504
+ @db.transaction do
505
+ @db.commit
506
+ end
507
+ end
508
+ end
509
+
510
+ define_method( "test_transaction_active" ) do
511
+ assert !@db.transaction_active?
512
+ @db.transaction
513
+ assert @db.transaction_active?
514
+ @db.commit
515
+ assert !@db.transaction_active?
516
+ end
517
+
518
+ define_method( "no_tests_at" ) do |file,line,method|
519
+ warn "[(#{self.class}):#{file}:#{line}] no tests for #{method}"
520
+ end
521
+
522
+ define_method( "test_interrupt" ) do
523
+ @db.create_function( "abort", 1 ) do |func,x|
524
+ @db.interrupt
525
+ func.result = x
526
+ end
527
+
528
+ assert_raise( SQLite3::SQLException ) do
529
+ @db.execute "select abort(a) from foo"
530
+ end
531
+ end
532
+
533
+ define_method( "test_busy_handler_outwait" ) do
534
+ busy = Mutex.new
535
+ busy.lock
536
+ handler_call_count = 0
537
+
538
+ t = Thread.new do
539
+ begin
540
+ db2 = SQLite3::Database.open( "test.db", :driver=>driver )
541
+ db2.transaction( :exclusive ) do
542
+ busy.lock
543
+ end
544
+ ensure
545
+ db2.close if db2
546
+ end
547
+ end
548
+
549
+ @db.busy_handler do |data,count|
550
+ handler_call_count += 1
551
+ busy.unlock
552
+ true
553
+ end
554
+
555
+ assert_nothing_raised do
556
+ @db.execute "insert into foo (b) values ( 'from 2' )"
557
+ end
558
+
559
+ t.join
560
+
561
+ assert_equal 1, handler_call_count
562
+ end
563
+
564
+ define_method( "test_busy_handler_impatient" ) do
565
+ busy = Mutex.new
566
+ busy.lock
567
+ handler_call_count = 0
568
+
569
+ t = Thread.new do
570
+ begin
571
+ db2 = SQLite3::Database.open( "test.db", :driver=>driver )
572
+ db2.transaction( :exclusive ) do
573
+ busy.lock
574
+ end
575
+ ensure
576
+ db2.close if db2
577
+ end
578
+ end
579
+
580
+ @db.busy_handler do |data, count|
581
+ handler_call_count += 1
582
+ false
583
+ end
584
+
585
+ assert_raise( SQLite3::BusyException ) do
586
+ @db.execute "insert into foo (b) values ( 'from 2' )"
587
+ end
588
+
589
+ busy.unlock
590
+ t.join
591
+
592
+ assert_equal 1, handler_call_count
593
+ end
594
+
595
+ define_method( "test_busy_timeout" ) do
596
+ @db.busy_timeout 1000
597
+ busy = Mutex.new
598
+ busy.lock
599
+
600
+ t = Thread.new do
601
+ begin
602
+ db2 = SQLite3::Database.open( "test.db", :driver=>driver )
603
+ db2.transaction( :exclusive ) do
604
+ busy.lock
605
+ end
606
+ ensure
607
+ db2.close if db2
608
+ end
609
+ end
610
+
611
+ time = Benchmark.measure do
612
+ assert_raise( SQLite3::BusyException ) do
613
+ @db.execute "insert into foo (b) values ( 'from 2' )"
614
+ end
615
+ end
616
+
617
+ busy.unlock
618
+ t.join
619
+
620
+ assert time.real*1000 >= 1000
621
+ end
622
+
623
+ define_method( "test_create_function" ) do
624
+ @db.create_function( "munge", 1 ) do |func,x|
625
+ func.result = ">>>#{x}<<<"
626
+ end
627
+
628
+ value = @db.get_first_value( "select munge(b) from foo where a=1" )
629
+ assert_match( />>>.*<<</, value )
630
+ end
631
+
632
+ define_method( "test_create_aggregate_without_block" ) do
633
+ step = proc do |ctx,a|
634
+ ctx[:sum] ||= 0
635
+ ctx[:sum] += a.to_i
636
+ end
637
+
638
+ final = proc { |ctx| ctx.result = ctx[:sum] }
639
+
640
+ @db.create_aggregate( "accumulate", 1, step, final )
641
+
642
+ value = @db.get_first_value( "select accumulate(a) from foo" )
643
+ assert_equal "6", value
644
+ end
645
+
646
+ define_method( "test_create_aggregate_with_block" ) do
647
+ @db.create_aggregate( "accumulate", 1 ) do
648
+ step do |ctx,a|
649
+ ctx[:sum] ||= 0
650
+ ctx[:sum] += a.to_i
651
+ end
652
+
653
+ finalize { |ctx| ctx.result = ctx[:sum] }
654
+ end
655
+
656
+ value = @db.get_first_value( "select accumulate(a) from foo" )
657
+ assert_equal "6", value
658
+ end
659
+
660
+ define_method( "test_create_aggregate_with_no_data" ) do
661
+ @db.create_aggregate( "accumulate", 1 ) do
662
+ step do |ctx,a|
663
+ ctx[:sum] ||= 0
664
+ ctx[:sum] += a.to_i
665
+ end
666
+
667
+ finalize { |ctx| ctx.result = ctx[:sum] || 0 }
668
+ end
669
+
670
+ value = @db.get_first_value(
671
+ "select accumulate(a) from foo where a = 100" )
672
+ assert_equal "0", value
673
+ end
674
+
675
+ define_method( "test_create_aggregate_handler" ) do
676
+ handler = Class.new do
677
+ class << self
678
+ define_method( "arity" ) { 1 }
679
+ define_method( "text_rep" ) { SQLite3::Constants::TextRep::ANY }
680
+ define_method( "name" ) { "multiply" }
681
+ end
682
+ define_method( "step" ) do |ctx,a|
683
+ ctx[:buffer] ||= 1
684
+ ctx[:buffer] *= a.to_i
685
+ end
686
+ define_method( "finalize" ) { |ctx| ctx.result = ctx[:buffer] }
687
+ end
688
+
689
+ @db.create_aggregate_handler( handler )
690
+ value = @db.get_first_value( "select multiply(a) from foo" )
691
+ assert_equal "6", value
692
+ end
693
+
694
+ define_method( "test_bind_array_parameter" ) do
695
+ result = @db.get_first_value( "select b from foo where a=? and b=?",
696
+ [ 1, "foo" ] )
697
+ assert_equal "foo", result
698
+ end
699
+ end
700
+ const_set( "TC_Database_#{driver}", test_case )
701
+
702
+ # == TC_Statement =========================================================
703
+
704
+ test_case = Class.new( Test::Unit::TestCase ) do
705
+ define_method( "setup" ) do
706
+ @db = SQLite3::Database.new( "test.db", :driver=>driver )
707
+ @db.transaction do
708
+ @db.execute "create table foo ( a integer primary key, b text )"
709
+ @db.execute "insert into foo ( b ) values ( 'foo' )"
710
+ @db.execute "insert into foo ( b ) values ( 'bar' )"
711
+ @db.execute "insert into foo ( b ) values ( 'baz' )"
712
+ end
713
+ @stmt = @db.prepare( "select * from foo where a in ( ?, :named )" )
714
+ end
715
+
716
+ define_method( "teardown" ) do
717
+ @stmt.close
718
+ @db.close
719
+ File.delete( "test.db" )
720
+ end
721
+
722
+ define_method( "test_remainder_empty" ) do
723
+ assert_equal "", @stmt.remainder
724
+ end
725
+
726
+ define_method( "test_remainder_nonempty" ) do
727
+ called = false
728
+ @db.prepare( "select * from foo;\n blah" ) do |stmt|
729
+ called = true
730
+ assert_equal "\n blah", stmt.remainder
731
+ end
732
+ assert called
733
+ end
734
+
735
+ define_method( "test_bind_params_empty" ) do
736
+ assert_nothing_raised { @stmt.bind_params }
737
+ assert @stmt.execute!.empty?
738
+ end
739
+
740
+ define_method( "test_bind_params_array" ) do
741
+ @stmt.bind_params 1, 2
742
+ assert_equal 2, @stmt.execute!.length
743
+ end
744
+
745
+ define_method( "test_bind_params_hash" ) do
746
+ @stmt.bind_params ":named" => 2
747
+ assert_equal 1, @stmt.execute!.length
748
+ end
749
+
750
+ define_method( "test_bind_params_hash_without_colon" ) do
751
+ @stmt.bind_params "named" => 2
752
+ assert_equal 1, @stmt.execute!.length
753
+ end
754
+
755
+ define_method( "test_bind_params_hash_as_symbol" ) do
756
+ @stmt.bind_params :named => 2
757
+ assert_equal 1, @stmt.execute!.length
758
+ end
759
+
760
+ define_method( "test_bind_params_mixed" ) do
761
+ @stmt.bind_params( 1, ":named" => 2 )
762
+ assert_equal 2, @stmt.execute!.length
763
+ end
764
+
765
+ define_method( "test_bind_param_by_index" ) do
766
+ @stmt.bind_params( 1, 2 )
767
+ assert_equal 2, @stmt.execute!.length
768
+ end
769
+
770
+ define_method( "test_bind_param_by_name_bad" ) do
771
+ assert_raise( SQLite3::Exception ) { @stmt.bind_param( "@named", 2 ) }
772
+ end
773
+
774
+ define_method( "test_bind_param_by_name_good" ) do
775
+ @stmt.bind_param( ":named", 2 )
776
+ assert_equal 1, @stmt.execute!.length
777
+ end
778
+
779
+ define_method( "test_bind_param_with_various_types" ) do
780
+ @db.transaction do
781
+ @db.execute "create table all_types ( a integer primary key, b float, c string, d integer )"
782
+ @db.execute "insert into all_types ( b, c, d ) values ( 1.4, 'hello', 68719476735 )"
783
+ end
784
+
785
+ assert_equal 1, @db.execute( "select * from all_types where b = ?", 1.4 ).length
786
+ assert_equal 1, @db.execute( "select * from all_types where c = ?", 'hello').length
787
+ assert_equal 1, @db.execute( "select * from all_types where d = ?", 68719476735).length
788
+ end
789
+
790
+ define_method( "test_execute_no_bind_no_block" ) do
791
+ assert_instance_of SQLite3::ResultSet, @stmt.execute
792
+ end
793
+
794
+ define_method( "test_execute_with_bind_no_block" ) do
795
+ assert_instance_of SQLite3::ResultSet, @stmt.execute( 1, 2 )
796
+ end
797
+
798
+ define_method( "test_execute_no_bind_with_block" ) do
799
+ called = false
800
+ @stmt.execute { |row| called = true }
801
+ assert called
802
+ end
803
+
804
+ define_method( "test_execute_with_bind_with_block" ) do
805
+ called = 0
806
+ @stmt.execute( 1, 2 ) { |row| called += 1 }
807
+ assert_equal 1, called
808
+ end
809
+
810
+ define_method( "test_reexecute" ) do
811
+ r = @stmt.execute( 1, 2 )
812
+ assert_equal 2, r.to_a.length
813
+ assert_nothing_raised { r = @stmt.execute( 1, 2 ) }
814
+ assert_equal 2, r.to_a.length
815
+ end
816
+
817
+ define_method( "test_execute_bang_no_bind_no_block" ) do
818
+ assert @stmt.execute!.empty?
819
+ end
820
+
821
+ define_method( "test_execute_bang_with_bind_no_block" ) do
822
+ assert_equal 2, @stmt.execute!( 1, 2 ).length
823
+ end
824
+
825
+ define_method( "test_execute_bang_no_bind_with_block" ) do
826
+ called = 0
827
+ @stmt.execute! { |row| called += 1 }
828
+ assert_equal 0, called
829
+ end
830
+
831
+ define_method( "test_execute_bang_with_bind_with_block" ) do
832
+ called = 0
833
+ @stmt.execute!( 1, 2 ) { |row| called += 1 }
834
+ assert_equal 2, called
835
+ end
836
+
837
+ define_method( "test_columns" ) do
838
+ c1 = @stmt.columns
839
+ c2 = @stmt.columns
840
+ assert_same c1, c2
841
+ assert_equal 2, c1.length
842
+ end
843
+
844
+ define_method( "test_columns_computed" ) do
845
+ called = false
846
+ @db.prepare( "select count(*) from foo" ) do |stmt|
847
+ called = true
848
+ assert_equal [ "count(*)" ], stmt.columns
849
+ end
850
+ assert called
851
+ end
852
+
853
+ define_method( "test_types" ) do
854
+ t1 = @stmt.types
855
+ t2 = @stmt.types
856
+ assert_same t1, t2
857
+ assert_equal 2, t1.length
858
+ end
859
+
860
+ define_method( "test_types_computed" ) do
861
+ called = false
862
+ @db.prepare( "select count(*) from foo" ) do |stmt|
863
+ called = true
864
+ assert_equal [ nil ], stmt.types
865
+ end
866
+ assert called
867
+ end
868
+
869
+ define_method( "test_close" ) do
870
+ stmt = @db.prepare( "select * from foo" )
871
+ assert !stmt.closed?
872
+ stmt.close
873
+ assert stmt.closed?
874
+ assert_raise( SQLite3::Exception ) { stmt.execute }
875
+ assert_raise( SQLite3::Exception ) { stmt.execute! }
876
+ assert_raise( SQLite3::Exception ) { stmt.close }
877
+ assert_raise( SQLite3::Exception ) { stmt.bind_params 5 }
878
+ assert_raise( SQLite3::Exception ) { stmt.bind_param 1, 5 }
879
+ assert_raise( SQLite3::Exception ) { stmt.columns }
880
+ assert_raise( SQLite3::Exception ) { stmt.types }
881
+ end
882
+
883
+ define_method( "test_committing_tx_with_statement_active" ) do
884
+ called = false
885
+ @db.prepare( "select count(*) from foo" ) do |stmt|
886
+ called = true
887
+ count = stmt.execute!.first.first.to_i
888
+ @db.transaction do
889
+ @db.execute "insert into foo ( b ) values ( 'hello' )"
890
+ end
891
+ new_count = stmt.execute!.first.first.to_i
892
+ assert_equal new_count, count+1
893
+ end
894
+ assert called
895
+ end
896
+ end
897
+ const_set( "TC_Statement_#{driver}", test_case )
898
+
899
+ # == TC_ResultSet =========================================================
900
+
901
+ test_case = Class.new( Test::Unit::TestCase ) do
902
+ define_method( "setup" ) do
903
+ @db = SQLite3::Database.new( "test.db", :driver=>driver )
904
+ @db.transaction do
905
+ @db.execute "create table foo ( a integer primary key, b text )"
906
+ @db.execute "insert into foo ( b ) values ( 'foo' )"
907
+ @db.execute "insert into foo ( b ) values ( 'bar' )"
908
+ @db.execute "insert into foo ( b ) values ( 'baz' )"
909
+ end
910
+ @stmt = @db.prepare( "select * from foo where a in ( ?, ? )" )
911
+ @result = @stmt.execute
912
+ end
913
+
914
+ define_method( "teardown" ) do
915
+ @stmt.close
916
+ @db.close
917
+ File.delete( "test.db" )
918
+ end
919
+
920
+ define_method( "test_reset_unused" ) do
921
+ assert_nothing_raised { @result.reset }
922
+ assert @result.to_a.empty?
923
+ end
924
+
925
+ define_method( "test_reset_used" ) do
926
+ @result.to_a
927
+ assert_nothing_raised { @result.reset }
928
+ assert @result.to_a.empty?
929
+ end
930
+
931
+ define_method( "test_reset_with_bind" ) do
932
+ @result.to_a
933
+ assert_nothing_raised { @result.reset( 1, 2 ) }
934
+ assert_equal 2, @result.to_a.length
935
+ end
936
+
937
+ define_method( "test_eof_inner" ) do
938
+ @result.reset( 1 )
939
+ assert !@result.eof?
940
+ end
941
+
942
+ define_method( "test_eof_edge" ) do
943
+ @result.reset( 1 )
944
+ @result.next # to first row
945
+ @result.next # to end of result set
946
+ assert @result.eof?
947
+ end
948
+
949
+ define_method( "test_next_eof" ) do
950
+ @result.reset( 1 )
951
+ assert_not_nil @result.next
952
+ assert_nil @result.next
953
+ end
954
+
955
+ define_method( "test_next_no_type_translation_no_hash" ) do
956
+ @result.reset( 1 )
957
+ assert_equal [ "1", "foo" ], @result.next
958
+ end
959
+
960
+ define_method( "test_next_type_translation" ) do
961
+ @db.type_translation = true
962
+ @result.reset( 1 )
963
+ assert_equal [ 1, "foo" ], @result.next
964
+ end
965
+
966
+ define_method( "test_next_type_translation_with_untyped_column" ) do
967
+ @db.type_translation = true
968
+ @db.query( "select count(*) from foo" ) do |result|
969
+ assert_equal ["3"], result.next
970
+ end
971
+ end
972
+
973
+ define_method( "test_type_translation_with_null_column" ) do
974
+ @db.type_translation = true
975
+ @db.execute "create table bar ( a integer, b time, c string )"
976
+ @db.execute "insert into bar (a, b, c) values (NULL, '1974-07-25 14:39:00', 'hello')"
977
+ @db.execute "insert into bar (a, b, c) values (1, NULL, 'hello')"
978
+ @db.execute "insert into bar (a, b, c) values (2, '1974-07-25 14:39:00', NULL)"
979
+ @db.query( "select * from bar" ) do |result|
980
+ assert_equal [nil, Time.local(1974, 7, 25, 14, 39, 0), 'hello'], result.next
981
+ assert_equal [1, nil, 'hello'], result.next
982
+ assert_equal [2, Time.local(1974, 7, 25, 14, 39, 0), nil], result.next
983
+ end
984
+ end
985
+
986
+ define_method( "test_date_and_time_translation" ) do
987
+ @db.type_translation = true
988
+ @db.execute "create table bar ( a date, b datetime, c time, d timestamp )"
989
+ @db.execute "insert into bar (a, b, c, d) values ('1999-01-08', '1997-12-17 07:37:16', '07:37:16', '2004-10-19 10:23:54')"
990
+ @db.query( "select * from bar" ) do |result|
991
+ result = result.next
992
+ assert result[0].is_a?(Date)
993
+ assert result[1].is_a?(DateTime)
994
+ assert result[2].is_a?(Time)
995
+ assert result[3].is_a?(Time)
996
+ end
997
+ end
998
+
999
+ define_method( "test_next_results_as_hash" ) do
1000
+ @db.results_as_hash = true
1001
+ @result.reset( 1 )
1002
+ assert_equal( { "a" => "1", "b" => "foo", 0 => "1", 1 => "foo" },
1003
+ @result.next )
1004
+ end
1005
+
1006
+ define_method( "test_each" ) do
1007
+ called = 0
1008
+ @result.reset( 1, 2 )
1009
+ @result.each { |row| called += 1 }
1010
+ assert_equal 2, called
1011
+ end
1012
+
1013
+ define_method( "test_enumerable" ) do
1014
+ @result.reset( 1, 2 )
1015
+ assert_equal 2, @result.to_a.length
1016
+ end
1017
+
1018
+ define_method( "test_types" ) do
1019
+ assert_equal [ "integer", "text" ], @result.types
1020
+ end
1021
+
1022
+ define_method( "test_columns" ) do
1023
+ assert_equal [ "a", "b" ], @result.columns
1024
+ end
1025
+
1026
+ define_method( "test_close" ) do
1027
+ stmt = @db.prepare( "select * from foo" )
1028
+ result = stmt.execute
1029
+ assert !result.closed?
1030
+ result.close
1031
+ assert result.closed?
1032
+ assert stmt.closed?
1033
+ assert_raise( SQLite3::Exception ) { result.reset }
1034
+ assert_raise( SQLite3::Exception ) { result.next }
1035
+ assert_raise( SQLite3::Exception ) { result.each }
1036
+ assert_raise( SQLite3::Exception ) { result.close }
1037
+ assert_raise( SQLite3::Exception ) { result.types }
1038
+ assert_raise( SQLite3::Exception ) { result.columns }
1039
+ end
1040
+ end
1041
+ const_set( "TC_ResultSet_#{driver}", test_case )
1042
+ end
1043
+
1044
+ end