dbd-sqlanywhere 0.1.2 → 1.0.0
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/CHANGELOG +21 -12
- data/LICENSE +23 -23
- data/README +150 -150
- data/lib/dbd/SQLAnywhere.rb +176 -176
- data/lib/dbd/sqlanywhere/database.rb +266 -255
- data/lib/dbd/sqlanywhere/driver.rb +108 -102
- data/lib/dbd/sqlanywhere/statement.rb +216 -211
- data/test/dbd/sqlanywhere/base.rb +26 -26
- data/test/dbd/sqlanywhere/down.sql +19 -19
- data/test/dbd/sqlanywhere/up.sql +28 -28
- metadata +77 -67
- data/test/DBD_TESTS +0 -48
- data/test/dbd/general/test_database.rb +0 -157
- data/test/dbd/general/test_statement.rb +0 -249
- data/test/dbd/general/test_types.rb +0 -253
- data/test/ts_dbd.rb +0 -118
@@ -1,249 +0,0 @@
|
|
1
|
-
@class = Class.new(DBDConfig.testbase(DBDConfig.current_dbtype)) do
|
2
|
-
|
3
|
-
def test_execute
|
4
|
-
assert_nothing_raised do
|
5
|
-
@dbh.execute("select * from names order by age") do |sth|
|
6
|
-
assert_equal([["Joe", 19], ["Bob", 21], ["Jim", 30]], sth.fetch_all)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
def test_quoting # FIXME breaks sqlite-ruby to a segfault - research
|
12
|
-
@sth = nil
|
13
|
-
|
14
|
-
assert_nothing_raised do
|
15
|
-
if dbtype == "postgresql"
|
16
|
-
@sth = @dbh.prepare('select E\'\\\\\'')
|
17
|
-
else
|
18
|
-
@sth = @dbh.prepare('select \'\\\\\'')
|
19
|
-
end
|
20
|
-
@sth.execute
|
21
|
-
row = @sth.fetch
|
22
|
-
assert_equal ['\\'], row
|
23
|
-
@sth.finish
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def test_duplicate_columns
|
28
|
-
assert_nothing_raised do
|
29
|
-
@sth = @dbh.prepare("select name, name from names where name = ?")
|
30
|
-
@sth.execute("Bob")
|
31
|
-
assert_equal [["Bob", "Bob"]], @sth.fetch_all
|
32
|
-
@sth.finish
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def test_columninfo
|
37
|
-
@sth = nil
|
38
|
-
|
39
|
-
assert_nothing_raised do
|
40
|
-
@sth = @dbh.prepare("select * from precision_test")
|
41
|
-
@sth.execute
|
42
|
-
|
43
|
-
cols = @sth.column_info
|
44
|
-
|
45
|
-
assert(cols)
|
46
|
-
assert_kind_of(Array, cols)
|
47
|
-
assert_equal(2, cols.length)
|
48
|
-
|
49
|
-
# the first column should always be "text_field" and have the following
|
50
|
-
# properties:
|
51
|
-
assert_equal("text_field", cols[0]["name"])
|
52
|
-
assert_equal(20, cols[0]["precision"])
|
53
|
-
# scale can be either nil or 0 for character types.
|
54
|
-
case cols[0]["scale"]
|
55
|
-
when nil
|
56
|
-
assert_equal(nil, cols[0]["scale"])
|
57
|
-
when 0
|
58
|
-
assert_equal(0, cols[0]["scale"])
|
59
|
-
else
|
60
|
-
flunk "scale can be either 0 or nil for character types"
|
61
|
-
end
|
62
|
-
|
63
|
-
assert_equal(
|
64
|
-
DBI::Type::Varchar,
|
65
|
-
DBI::TypeUtil.type_name_to_module(cols[0]["type_name"])
|
66
|
-
)
|
67
|
-
|
68
|
-
# the second column should always be "integer_field" and have the following
|
69
|
-
# properties:
|
70
|
-
assert_equal("integer_field", cols[1]["name"])
|
71
|
-
assert_equal(1, cols[1]["scale"])
|
72
|
-
assert_equal(2, cols[1]["precision"])
|
73
|
-
assert_equal(
|
74
|
-
DBI::Type::Decimal,
|
75
|
-
DBI::TypeUtil.type_name_to_module(cols[1]["type_name"])
|
76
|
-
)
|
77
|
-
|
78
|
-
cols.each { |col| assert_kind_of(DBI::ColumnInfo, col) }
|
79
|
-
@sth.finish
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_duplicate_columns
|
84
|
-
assert_nothing_raised do
|
85
|
-
@sth = @dbh.prepare("select name, name from names where name = ?")
|
86
|
-
@sth.execute("Bob")
|
87
|
-
assert_equal [["Bob", "Bob"]], @sth.fetch_all
|
88
|
-
@sth.finish
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def test_rows
|
93
|
-
@sth = nil
|
94
|
-
|
95
|
-
assert_nothing_raised do
|
96
|
-
@sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
|
97
|
-
@sth.execute("Bill", 22);
|
98
|
-
end
|
99
|
-
|
100
|
-
assert 1, @sth.rows
|
101
|
-
|
102
|
-
@sth.finish
|
103
|
-
@sth = nil
|
104
|
-
|
105
|
-
assert_nothing_raised do
|
106
|
-
@sth = @dbh.prepare("delete from names where name = ?")
|
107
|
-
@sth.execute("Bill");
|
108
|
-
end
|
109
|
-
|
110
|
-
assert 1, @sth.rows
|
111
|
-
|
112
|
-
@sth.finish
|
113
|
-
|
114
|
-
assert_nothing_raised do
|
115
|
-
@sth = @dbh.prepare("select * from names")
|
116
|
-
@sth.execute
|
117
|
-
end
|
118
|
-
|
119
|
-
assert_equal 0, @sth.rows
|
120
|
-
assert @sth.fetchable?
|
121
|
-
assert @sth.any?
|
122
|
-
assert @sth.rows.zero?
|
123
|
-
@sth.finish
|
124
|
-
end
|
125
|
-
|
126
|
-
def test_prepare_execute
|
127
|
-
assert_nothing_raised do
|
128
|
-
@sth = @dbh.prepare("select * from names")
|
129
|
-
@sth.execute
|
130
|
-
@sth.finish
|
131
|
-
end
|
132
|
-
|
133
|
-
assert_nothing_raised do
|
134
|
-
@sth = @dbh.prepare("select * from names where name = ?")
|
135
|
-
@sth.execute("Bob")
|
136
|
-
@sth.finish
|
137
|
-
end
|
138
|
-
|
139
|
-
assert_nothing_raised do
|
140
|
-
@sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
|
141
|
-
@sth.execute("Bill", 22);
|
142
|
-
@sth.finish
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_prepare_execute_with_transactions
|
147
|
-
@dbh["AutoCommit"] = false
|
148
|
-
config = DBDConfig.get_config['sqlite3']
|
149
|
-
|
150
|
-
# rollback 1 (the right way)
|
151
|
-
@sth = nil
|
152
|
-
@sth2 = nil
|
153
|
-
|
154
|
-
assert_nothing_raised do
|
155
|
-
@sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
|
156
|
-
@sth.execute("Billy", 23)
|
157
|
-
@sth2 = @dbh.prepare("select * from names where name = ?")
|
158
|
-
@sth2.execute("Billy")
|
159
|
-
end
|
160
|
-
assert_equal ["Billy", 23 ], @sth2.fetch
|
161
|
-
@sth2.finish
|
162
|
-
@sth.finish
|
163
|
-
assert_nothing_raised { @dbh.rollback }
|
164
|
-
|
165
|
-
@sth = @dbh.prepare("select * from names where name = ?")
|
166
|
-
@sth.execute("Billy")
|
167
|
-
assert_nil @sth.fetch
|
168
|
-
@sth.finish
|
169
|
-
|
170
|
-
# rollback 2 (without closing statements first)
|
171
|
-
|
172
|
-
@sth = nil
|
173
|
-
@sth2 = nil
|
174
|
-
|
175
|
-
assert_nothing_raised do
|
176
|
-
@sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
|
177
|
-
@sth.execute("Billy", 23)
|
178
|
-
@sth2 = @dbh.prepare("select * from names where name = ?")
|
179
|
-
@sth2.execute("Billy")
|
180
|
-
end
|
181
|
-
|
182
|
-
assert_equal ["Billy", 23], @sth2.fetch
|
183
|
-
|
184
|
-
# FIXME some throw here, some don't. we should probably normalize this
|
185
|
-
@dbh.rollback rescue true
|
186
|
-
|
187
|
-
@sth2.finish
|
188
|
-
@sth.finish
|
189
|
-
assert_nothing_raised { @dbh.rollback }
|
190
|
-
|
191
|
-
@sth = @dbh.prepare("select * from names where name = ?")
|
192
|
-
@sth.execute("Billy")
|
193
|
-
assert_nil @sth.fetch
|
194
|
-
@sth.finish
|
195
|
-
|
196
|
-
# commit
|
197
|
-
|
198
|
-
@sth = nil
|
199
|
-
@sth2 = nil
|
200
|
-
|
201
|
-
assert_nothing_raised do
|
202
|
-
@sth = @dbh.prepare("insert into names (name, age) values (?, ?)")
|
203
|
-
@sth.execute("Billy", 23)
|
204
|
-
@sth2 = @dbh.prepare("select * from names where name = ?")
|
205
|
-
@sth2.execute("Billy")
|
206
|
-
end
|
207
|
-
assert_equal ["Billy", 23 ], @sth2.fetch
|
208
|
-
@sth2.finish
|
209
|
-
@sth.finish
|
210
|
-
assert_nothing_raised { @dbh.commit }
|
211
|
-
|
212
|
-
@sth = @dbh.prepare("select * from names where name = ?")
|
213
|
-
@sth.execute("Billy")
|
214
|
-
assert_equal ["Billy", 23 ], @sth.fetch
|
215
|
-
@sth.finish
|
216
|
-
end
|
217
|
-
|
218
|
-
def test_fetch
|
219
|
-
@sth = nil
|
220
|
-
assert_nothing_raised do
|
221
|
-
@sth = @dbh.prepare("select * from names order by age")
|
222
|
-
@sth.execute
|
223
|
-
end
|
224
|
-
|
225
|
-
# this tests that we're getting the rows in the right order,
|
226
|
-
# and that the types are being converted.
|
227
|
-
assert_equal ["Joe", 19], @sth.fetch
|
228
|
-
assert_equal ["Bob", 21], @sth.fetch
|
229
|
-
assert_equal ["Jim", 30], @sth.fetch
|
230
|
-
assert_nil @sth.fetch
|
231
|
-
|
232
|
-
@sth.finish
|
233
|
-
end
|
234
|
-
|
235
|
-
def test_transaction_block
|
236
|
-
@dbh["AutoCommit"] = false
|
237
|
-
# this transaction should not fail because it called return early
|
238
|
-
@dbh.transaction do |dbh|
|
239
|
-
dbh.do('INSERT INTO names (name, age) VALUES (?, ?)', "Cooter", 69)
|
240
|
-
return 42
|
241
|
-
end
|
242
|
-
@sth = @dbh.prepare("select * from names where name = ?")
|
243
|
-
@sth.execute("Cooter")
|
244
|
-
row = @sth.fetch
|
245
|
-
assert row
|
246
|
-
assert_equal ["Cooter", 69], row
|
247
|
-
@sth.finish
|
248
|
-
end
|
249
|
-
end
|
@@ -1,253 +0,0 @@
|
|
1
|
-
@class = Class.new(DBDConfig.testbase(DBDConfig.current_dbtype)) do
|
2
|
-
def skip_bit
|
3
|
-
# FIXME this test fails because DBI's type system blows goats.
|
4
|
-
@sth = nil
|
5
|
-
|
6
|
-
assert_nothing_raised do
|
7
|
-
@sth = @dbh.prepare("insert into bit_test (mybit) values (?)")
|
8
|
-
@sth.bind_param(1, 0, DBI::SQL_TINYINT)
|
9
|
-
@sth.execute
|
10
|
-
# if dbtype == "postgresql"
|
11
|
-
# @sth.execute("0")
|
12
|
-
# else
|
13
|
-
# @sth.execute(0)
|
14
|
-
# end
|
15
|
-
@sth.finish
|
16
|
-
end
|
17
|
-
|
18
|
-
assert_nothing_raised do
|
19
|
-
@sth = @dbh.prepare("select * from bit_test")
|
20
|
-
@sth.execute
|
21
|
-
row = @sth.fetch
|
22
|
-
@sth.finish
|
23
|
-
|
24
|
-
assert_equal [0], row
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# FIXME
|
29
|
-
# Ideally, this test should be split across the DBI tests and DBD, but for
|
30
|
-
# now testing against the DBDs really doesn't cost us anything other than
|
31
|
-
# debugging time if something breaks.
|
32
|
-
def test_bind_coltype
|
33
|
-
# ensure type conv didn't get turned off somewhere.
|
34
|
-
assert(DBI.convert_types)
|
35
|
-
assert(@dbh.convert_types)
|
36
|
-
|
37
|
-
assert_nothing_raised do
|
38
|
-
@sth = @dbh.prepare("select name, age from names order by age")
|
39
|
-
assert(@sth.convert_types) # again
|
40
|
-
@sth.execute
|
41
|
-
@sth.bind_coltype(2, DBI::Type::Varchar)
|
42
|
-
assert_equal(
|
43
|
-
[
|
44
|
-
["Joe", "19"],
|
45
|
-
["Bob", "21"],
|
46
|
-
["Jim", "30"],
|
47
|
-
], @sth.fetch_all
|
48
|
-
)
|
49
|
-
@sth.finish
|
50
|
-
end
|
51
|
-
|
52
|
-
# just to be sure..
|
53
|
-
assert_nothing_raised do
|
54
|
-
@sth = @dbh.prepare("select name, age from names order by age")
|
55
|
-
@sth.execute
|
56
|
-
@sth.bind_coltype(2, DBI::Type::Float)
|
57
|
-
@sth.fetch_all.collect { |x| assert_kind_of(Float, x[1]) }
|
58
|
-
@sth.finish
|
59
|
-
end
|
60
|
-
|
61
|
-
# now, let's check some failure cases
|
62
|
-
@sth = @dbh.prepare("select name, age from names order by age")
|
63
|
-
|
64
|
-
# can't bind_coltype before execute
|
65
|
-
assert_raise(DBI::InterfaceError) { @sth.bind_coltype(1, DBI::Type::Float) }
|
66
|
-
# can't index < 1
|
67
|
-
assert_raise(DBI::InterfaceError) { @sth.bind_coltype(0, DBI::Type::Float) }
|
68
|
-
end
|
69
|
-
|
70
|
-
def test_noconv
|
71
|
-
# XXX this test will fail the whole test suite miserably if it fails at any point.
|
72
|
-
assert(DBI.convert_types)
|
73
|
-
|
74
|
-
DBI.convert_types = false
|
75
|
-
@sth.finish rescue nil
|
76
|
-
@dbh.disconnect
|
77
|
-
set_base_dbh
|
78
|
-
|
79
|
-
assert(!@dbh.convert_types)
|
80
|
-
|
81
|
-
assert_nothing_raised do
|
82
|
-
@sth = @dbh.prepare("select * from names order by age")
|
83
|
-
assert(!@sth.convert_types)
|
84
|
-
@sth.execute
|
85
|
-
assert_equal(
|
86
|
-
[
|
87
|
-
["Joe", "19"],
|
88
|
-
["Bob", "21"],
|
89
|
-
["Jim", "30"],
|
90
|
-
], @sth.fetch_all
|
91
|
-
)
|
92
|
-
@sth.finish
|
93
|
-
end
|
94
|
-
|
95
|
-
DBI.convert_types = true
|
96
|
-
@sth.finish rescue nil
|
97
|
-
@dbh.disconnect
|
98
|
-
set_base_dbh
|
99
|
-
|
100
|
-
assert(DBI.convert_types)
|
101
|
-
assert(@dbh.convert_types)
|
102
|
-
|
103
|
-
assert_nothing_raised do
|
104
|
-
@sth = @dbh.prepare("select * from names order by age")
|
105
|
-
assert(@sth.convert_types)
|
106
|
-
@sth.execute
|
107
|
-
assert_equal(
|
108
|
-
[
|
109
|
-
["Joe", 19],
|
110
|
-
["Bob", 21],
|
111
|
-
["Jim", 30],
|
112
|
-
], @sth.fetch_all
|
113
|
-
)
|
114
|
-
@sth.finish
|
115
|
-
end
|
116
|
-
|
117
|
-
@dbh.convert_types = false
|
118
|
-
|
119
|
-
assert_nothing_raised do
|
120
|
-
@sth = @dbh.prepare("select * from names order by age")
|
121
|
-
assert(!@sth.convert_types)
|
122
|
-
@sth.execute
|
123
|
-
assert_equal(
|
124
|
-
[
|
125
|
-
["Joe", "19"],
|
126
|
-
["Bob", "21"],
|
127
|
-
["Jim", "30"],
|
128
|
-
], @sth.fetch_all
|
129
|
-
)
|
130
|
-
@sth.finish
|
131
|
-
end
|
132
|
-
|
133
|
-
@dbh.convert_types = true
|
134
|
-
|
135
|
-
assert_nothing_raised do
|
136
|
-
@sth = @dbh.prepare("select * from names order by age")
|
137
|
-
assert(@sth.convert_types)
|
138
|
-
@sth.convert_types = false
|
139
|
-
@sth.execute
|
140
|
-
assert_equal(
|
141
|
-
[
|
142
|
-
["Joe", "19"],
|
143
|
-
["Bob", "21"],
|
144
|
-
["Jim", "30"],
|
145
|
-
], @sth.fetch_all
|
146
|
-
)
|
147
|
-
@sth.finish
|
148
|
-
end
|
149
|
-
rescue Exception => e
|
150
|
-
DBI.convert_types = true
|
151
|
-
@sth.finish
|
152
|
-
@dbh.disconnect
|
153
|
-
set_base_dbh
|
154
|
-
raise e
|
155
|
-
end
|
156
|
-
|
157
|
-
def test_null
|
158
|
-
assert_nothing_raised do
|
159
|
-
@sth = @dbh.prepare('insert into names (name, age) values (?, ?)')
|
160
|
-
@sth.execute("'NULL'", 201)
|
161
|
-
@sth.execute(nil, 202)
|
162
|
-
@sth.execute("NULL", 203)
|
163
|
-
@sth.finish
|
164
|
-
end
|
165
|
-
|
166
|
-
assert_nothing_raised do
|
167
|
-
@sth = @dbh.prepare('select * from names where age > 200 order by age')
|
168
|
-
@sth.execute
|
169
|
-
assert_equal(["'NULL'", 201], @sth.fetch)
|
170
|
-
assert_equal([nil, 202], @sth.fetch)
|
171
|
-
assert_equal(["NULL", 203], @sth.fetch)
|
172
|
-
@sth.finish
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
def test_time
|
177
|
-
@sth = nil
|
178
|
-
t = nil
|
179
|
-
assert_nothing_raised do
|
180
|
-
@sth = @dbh.prepare("insert into time_test (mytime) values (?)")
|
181
|
-
t = Time.now
|
182
|
-
@sth.execute(t)
|
183
|
-
@sth.finish
|
184
|
-
end
|
185
|
-
|
186
|
-
assert_nothing_raised do
|
187
|
-
@sth = @dbh.prepare("select * from time_test")
|
188
|
-
@sth.execute
|
189
|
-
row = @sth.fetch
|
190
|
-
assert_kind_of DateTime, row[0]
|
191
|
-
assert_equal t.hour, row[0].hour
|
192
|
-
assert_equal t.min, row[0].min
|
193
|
-
assert_equal t.sec, row[0].sec
|
194
|
-
@sth.finish
|
195
|
-
end
|
196
|
-
end
|
197
|
-
|
198
|
-
def test_timestamp
|
199
|
-
@sth = nil
|
200
|
-
# We omit fractional second testing here -- timestamp precision
|
201
|
-
# is a very slippery, dependent on driver and driver version.
|
202
|
-
t = DBI::Timestamp.new(2008, 3, 8, 10, 39, 1)
|
203
|
-
assert_nothing_raised do
|
204
|
-
@sth = @dbh.prepare("insert into timestamp_test (mytimestamp) values (?)")
|
205
|
-
@sth.execute(t)
|
206
|
-
@sth.finish
|
207
|
-
end
|
208
|
-
|
209
|
-
assert_nothing_raised do
|
210
|
-
@sth = @dbh.prepare("select * from timestamp_test")
|
211
|
-
@sth.execute
|
212
|
-
row = @sth.fetch
|
213
|
-
assert_kind_of DateTime, row[0]
|
214
|
-
assert_equal t.year, row[0].year
|
215
|
-
assert_equal t.month, row[0].month
|
216
|
-
assert_equal t.day, row[0].day
|
217
|
-
assert_equal t.hour, row[0].hour
|
218
|
-
assert_equal t.min, row[0].min
|
219
|
-
assert_equal t.sec, row[0].sec
|
220
|
-
# omit fractional tests
|
221
|
-
@sth.finish
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
def test_boolean_return
|
226
|
-
@sth = nil
|
227
|
-
|
228
|
-
unless dbtype == "odbc" # ODBC has no boolean type
|
229
|
-
assert_nothing_raised do
|
230
|
-
@sth = @dbh.prepare("insert into boolean_test (num, mybool) values (?, ?)")
|
231
|
-
@sth.execute(1, true)
|
232
|
-
@sth.execute(2, false)
|
233
|
-
@sth.finish
|
234
|
-
end
|
235
|
-
|
236
|
-
assert_nothing_raised do
|
237
|
-
@sth = @dbh.prepare("select * from boolean_test order by num")
|
238
|
-
@sth.execute
|
239
|
-
|
240
|
-
pairs = @sth.fetch_all
|
241
|
-
|
242
|
-
assert_equal(
|
243
|
-
[
|
244
|
-
[1, true],
|
245
|
-
[2, false],
|
246
|
-
], pairs
|
247
|
-
)
|
248
|
-
|
249
|
-
@sth.finish
|
250
|
-
end
|
251
|
-
end
|
252
|
-
end
|
253
|
-
end
|