ibruby 0.5.0-i586-linux
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/doc/README +456 -0
- data/doc/license.txt +411 -0
- data/examples/example01.rb +65 -0
- data/lib/SQLType.rb +230 -0
- data/lib/ib_lib.so +0 -0
- data/lib/ibruby.rb +22 -0
- data/lib/mkdoc +1 -0
- data/lib/src.rb +1795 -0
- data/test/AddRemoveUserTest.rb +55 -0
- data/test/BackupRestoreTest.rb +99 -0
- data/test/BooleanTest.rb +113 -0
- data/test/CharacterSetTest.rb +63 -0
- data/test/ConnectionTest.rb +111 -0
- data/test/DDLTest.rb +54 -0
- data/test/DatabaseTest.rb +83 -0
- data/test/GeneratorTest.rb +50 -0
- data/test/KeyTest.rb +140 -0
- data/test/ResultSetTest.rb +164 -0
- data/test/RoleTest.rb +104 -0
- data/test/RowCountTest.rb +65 -0
- data/test/RowTest.rb +205 -0
- data/test/SQLTest.rb +182 -0
- data/test/SQLTypeTest.rb +101 -0
- data/test/ServiceManagerTest.rb +29 -0
- data/test/StatementTest.rb +135 -0
- data/test/TestSetup.rb +11 -0
- data/test/TransactionTest.rb +112 -0
- data/test/TypeTest.rb +92 -0
- data/test/UnitTest.rb +64 -0
- metadata +77 -0
data/test/KeyTest.rb
ADDED
@@ -0,0 +1,140 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'TestSetup'
|
4
|
+
require 'test/unit'
|
5
|
+
#require 'rubygems'
|
6
|
+
require 'ibruby'
|
7
|
+
|
8
|
+
include IBRuby
|
9
|
+
|
10
|
+
class KeyTest < Test::Unit::TestCase
|
11
|
+
CURDIR = "#{Dir.getwd}"
|
12
|
+
DB_FILE = "#{CURDIR}#{File::SEPARATOR}key_unit_test.fdb"
|
13
|
+
|
14
|
+
def setup
|
15
|
+
puts "#{self.class.name} started." if TEST_LOGGING
|
16
|
+
if File::exist?(DB_FILE)
|
17
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Switch to the old way of keying.
|
21
|
+
$IBRubySettings[:ALIAS_KEYS] = false
|
22
|
+
|
23
|
+
database = Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
24
|
+
@connection = database.connect(DB_USER_NAME, DB_PASSWORD)
|
25
|
+
@transaction = @connection.start_transaction
|
26
|
+
@results = ResultSet.new(@connection, @transaction,
|
27
|
+
'SELECT * FROM RDB$FIELDS', 3, nil)
|
28
|
+
@empty = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
29
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0]
|
30
|
+
|
31
|
+
@connection.execute_immediate('create table keytest (COL01 integer, '\
|
32
|
+
'COL02 varchar(10), COL03 integer)')
|
33
|
+
@connection.execute_immediate("insert into keytest values (1, 'Two', 3)")
|
34
|
+
end
|
35
|
+
|
36
|
+
def teardown
|
37
|
+
@results.close
|
38
|
+
@transaction.rollback
|
39
|
+
@connection.close
|
40
|
+
if File::exist?(DB_FILE)
|
41
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
42
|
+
end
|
43
|
+
$IBRubySettings[:ALIAS_KEYS] = true
|
44
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_01
|
48
|
+
sql = 'select COL01 one, COL02 two, COL03 three from keytest'
|
49
|
+
rows = @connection.execute_immediate(sql)
|
50
|
+
data = rows.fetch
|
51
|
+
|
52
|
+
count = 0
|
53
|
+
data.each do |name, value|
|
54
|
+
assert(['COL01', 'COL02', 'COL03'].include?(name))
|
55
|
+
assert([1, 'Two', 3].include?(value))
|
56
|
+
count += 1
|
57
|
+
end
|
58
|
+
assert(count == 3)
|
59
|
+
|
60
|
+
count = 0
|
61
|
+
data.each_key do |name|
|
62
|
+
assert(['COL01', 'COL02', 'COL03'].include?(name))
|
63
|
+
count += 1
|
64
|
+
end
|
65
|
+
assert(count == 3)
|
66
|
+
|
67
|
+
count = 0
|
68
|
+
data.each_value do |value|
|
69
|
+
assert([1, 'Two', 3].include?(value))
|
70
|
+
count += 1
|
71
|
+
end
|
72
|
+
assert(count == 3)
|
73
|
+
|
74
|
+
assert(data.fetch('COL02') == 'Two')
|
75
|
+
assert(data.fetch('COL04', 'LALALA') == 'LALALA')
|
76
|
+
assert(data.fetch('COL00') {'NOT FOUND'} == 'NOT FOUND')
|
77
|
+
begin
|
78
|
+
data.fetch('COL05')
|
79
|
+
assert(false, 'Row#fetch succeeded for non-existent column name.')
|
80
|
+
rescue IndexError
|
81
|
+
end
|
82
|
+
|
83
|
+
assert(data.has_key?('COL01'))
|
84
|
+
assert(data.has_key?('COL10') == false)
|
85
|
+
|
86
|
+
assert(data.has_column?('COL02'))
|
87
|
+
assert(data.has_column?('COL22') == false)
|
88
|
+
|
89
|
+
assert(data.has_alias?('TWO'))
|
90
|
+
assert(data.has_alias?('FOUR') == false)
|
91
|
+
|
92
|
+
assert(data.has_value?(3))
|
93
|
+
assert(data.has_value?('LALALA') == false)
|
94
|
+
|
95
|
+
assert(data.keys.size == 3)
|
96
|
+
data.keys.each do |name|
|
97
|
+
assert(['COL01', 'COL02', 'COL03'].include?(name))
|
98
|
+
end
|
99
|
+
|
100
|
+
assert(data.names.size == 3)
|
101
|
+
data.names.each do |name|
|
102
|
+
assert(['COL01', 'COL02', 'COL03'].include?(name))
|
103
|
+
end
|
104
|
+
|
105
|
+
assert(data.aliases.size == 3)
|
106
|
+
data.aliases.each do |name|
|
107
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
108
|
+
end
|
109
|
+
|
110
|
+
assert(data.values.size == 3)
|
111
|
+
data.values.each do |value|
|
112
|
+
assert([1, 'Two', 3].include?(value))
|
113
|
+
end
|
114
|
+
|
115
|
+
array = data.select {|name, value| name == 'COL02'}
|
116
|
+
assert(array.size == 1)
|
117
|
+
assert(array[0][0] == 'COL02')
|
118
|
+
assert(array[0][1] == 'Two')
|
119
|
+
|
120
|
+
array = data.to_a
|
121
|
+
assert(array.size == 3)
|
122
|
+
assert(array.include?(['COL01', 1]))
|
123
|
+
assert(array.include?(['COL02', 'Two']))
|
124
|
+
assert(array.include?(['COL03', 3]))
|
125
|
+
|
126
|
+
hash = data.to_hash
|
127
|
+
assert(hash.length == 3)
|
128
|
+
assert(hash['COL01'] == 1)
|
129
|
+
assert(hash['COL02'] == 'Two')
|
130
|
+
assert(hash['COL03'] == 3)
|
131
|
+
|
132
|
+
array = data.values_at('COL10', 'COL02', 'COL03')
|
133
|
+
assert(array.size == 3)
|
134
|
+
assert(array.include?('Two'))
|
135
|
+
assert(array.include?(3))
|
136
|
+
assert(array.include?(nil))
|
137
|
+
|
138
|
+
rows.close
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,164 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'TestSetup'
|
4
|
+
require 'test/unit'
|
5
|
+
#require 'rubygems'
|
6
|
+
require 'ibruby'
|
7
|
+
|
8
|
+
include IBRuby
|
9
|
+
|
10
|
+
class ResultSetTest < Test::Unit::TestCase
|
11
|
+
CURDIR = "#{Dir.getwd}"
|
12
|
+
DB_FILE = "#{CURDIR}#{File::SEPARATOR}result_set_unit_test.ib"
|
13
|
+
|
14
|
+
def setup
|
15
|
+
puts "#{self.class.name} started." if TEST_LOGGING
|
16
|
+
if File::exist?(DB_FILE)
|
17
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
18
|
+
end
|
19
|
+
@database = Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
20
|
+
@connections = []
|
21
|
+
@transactions = []
|
22
|
+
|
23
|
+
@connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
|
24
|
+
|
25
|
+
@connections[0].start_transaction do |tx|
|
26
|
+
tx.execute("CREATE TABLE TEST_TABLE (TESTID INTEGER NOT NULL "\
|
27
|
+
"primary KEY, TESTINFO VARCHAR(100))")
|
28
|
+
tx.execute('create table all_types (col01 boolean, col02 blob, '\
|
29
|
+
'col03 char(100), col04 date, col05 decimal(5,2), '\
|
30
|
+
'col06 double precision, col07 float, col08 integer, '\
|
31
|
+
'col09 numeric(10,3), col10 smallint, col11 time, '\
|
32
|
+
'col12 timestamp, col13 varchar(23))')
|
33
|
+
end
|
34
|
+
|
35
|
+
@connections[0].start_transaction do |tx|
|
36
|
+
begin
|
37
|
+
tx.execute("INSERT INTO TEST_TABLE VALUES (10, 'Record One.')")
|
38
|
+
tx.execute("INSERT INTO TEST_TABLE VALUES (20, 'Record Two.')")
|
39
|
+
tx.execute("INSERT INTO TEST_TABLE VALUES (30, 'Record Three.')")
|
40
|
+
tx.execute("INSERT INTO TEST_TABLE VALUES (40, 'Record Four.')")
|
41
|
+
tx.execute("INSERT INTO TEST_TABLE VALUES (50, 'Record Five.')")
|
42
|
+
rescue Exception => error
|
43
|
+
puts error.message
|
44
|
+
error.backtrace.each {|step| puts " #{step}"}
|
45
|
+
raise
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@transactions.push(@connections[0].start_transaction)
|
50
|
+
end
|
51
|
+
|
52
|
+
def teardown
|
53
|
+
@transactions.each do |tx|
|
54
|
+
tx.rollback if tx.active?
|
55
|
+
end
|
56
|
+
@transactions.clear
|
57
|
+
@connections.each do |cxn|
|
58
|
+
cxn.close if cxn.open?
|
59
|
+
end
|
60
|
+
@connections.clear
|
61
|
+
if File::exist?(DB_FILE)
|
62
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
63
|
+
end
|
64
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
65
|
+
end
|
66
|
+
|
67
|
+
def test01
|
68
|
+
r = ResultSet.new(@connections[0], @transactions[0],
|
69
|
+
"SELECT * FROM TEST_TABLE ORDER BY TESTID", 3, nil)
|
70
|
+
|
71
|
+
assert(r.connection == @connections[0])
|
72
|
+
assert(r.transaction == @transactions[0])
|
73
|
+
assert(r.sql == "SELECT * FROM TEST_TABLE ORDER BY TESTID")
|
74
|
+
assert(r.dialect == 3)
|
75
|
+
|
76
|
+
assert(r.fetch != nil)
|
77
|
+
assert(r.fetch.class == Row)
|
78
|
+
assert(r.fetch[0] == 30)
|
79
|
+
assert(r.fetch[1] == 'Record Four.')
|
80
|
+
r.fetch
|
81
|
+
assert(r.fetch == nil)
|
82
|
+
r.close
|
83
|
+
|
84
|
+
r = ResultSet.new(@connections[0], @transactions[0],
|
85
|
+
"SELECT * FROM TEST_TABLE ORDER BY TESTID", 3, nil)
|
86
|
+
assert(r.column_count == 2)
|
87
|
+
assert(r.column_name(0) == 'TESTID')
|
88
|
+
assert(r.column_name(1) == 'TESTINFO')
|
89
|
+
assert(r.column_name(3) == nil)
|
90
|
+
assert(r.column_name(-1) == nil)
|
91
|
+
assert(r.column_table(0) == 'TEST_TABLE')
|
92
|
+
assert(r.column_table(1) == 'TEST_TABLE')
|
93
|
+
assert(r.column_table(2) == nil)
|
94
|
+
assert(r.column_table(-1) == nil)
|
95
|
+
assert(r.column_alias(0) == 'TESTID')
|
96
|
+
assert(r.column_alias(1) == 'TESTINFO')
|
97
|
+
assert(r.column_alias(3) == nil)
|
98
|
+
assert(r.column_alias(-1) == nil)
|
99
|
+
r.close
|
100
|
+
|
101
|
+
r = ResultSet.new(@connections[0], @transactions[0],
|
102
|
+
"SELECT * FROM TEST_TABLE ORDER BY TESTID", 3, nil)
|
103
|
+
total = 0
|
104
|
+
r.each do |row|
|
105
|
+
total += 1
|
106
|
+
end
|
107
|
+
assert(total == 5)
|
108
|
+
assert(r.exhausted?)
|
109
|
+
end
|
110
|
+
|
111
|
+
def test02
|
112
|
+
r = ResultSet.new(@connections[0], @transactions[0],
|
113
|
+
'select * from test_table where testid between ? and ?',
|
114
|
+
3, [20, 40])
|
115
|
+
assert(r.exhausted? == false)
|
116
|
+
total = 0
|
117
|
+
r.each {|row| total += 1}
|
118
|
+
assert(total == 3)
|
119
|
+
assert(r.exhausted?)
|
120
|
+
end
|
121
|
+
|
122
|
+
def test03
|
123
|
+
begin
|
124
|
+
ResultSet.new(@connections[0], @transactions[0],
|
125
|
+
"insert into test_table values(?, ?)", 3,
|
126
|
+
[100, 'Should fail.'])
|
127
|
+
assert(false, "Created result set with non-query SQL statement.")
|
128
|
+
rescue IBRubyException
|
129
|
+
end
|
130
|
+
|
131
|
+
begin
|
132
|
+
ResultSet.new(@connections[0], @transactions[0],
|
133
|
+
"select * from test_table where testid = ?", 3,
|
134
|
+
[])
|
135
|
+
assert(false, 'Created result set with insufficient parameters.')
|
136
|
+
rescue IBRubyException
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def test04
|
141
|
+
results = nil
|
142
|
+
begin
|
143
|
+
results = @transactions[0].execute('select * from all_types')
|
144
|
+
|
145
|
+
#assert(results.get_base_type(0) == SQLType::BIGINT)
|
146
|
+
puts "blob=#{results.get_base_type(0)}"
|
147
|
+
puts "blob=#{results.get_base_type(2)}"
|
148
|
+
assert(results.get_base_type(1) == SQLType::BLOB)
|
149
|
+
assert(results.get_base_type(2) == SQLType::CHAR)
|
150
|
+
assert(results.get_base_type(3) == SQLType::DATE)
|
151
|
+
assert(results.get_base_type(4) == SQLType::DECIMAL)
|
152
|
+
assert(results.get_base_type(5) == SQLType::DOUBLE)
|
153
|
+
assert(results.get_base_type(6) == SQLType::FLOAT)
|
154
|
+
assert(results.get_base_type(7) == SQLType::INTEGER)
|
155
|
+
assert(results.get_base_type(8) == SQLType::NUMERIC)
|
156
|
+
assert(results.get_base_type(9) == SQLType::SMALLINT)
|
157
|
+
assert(results.get_base_type(10) == SQLType::TIME)
|
158
|
+
assert(results.get_base_type(11) == SQLType::TIMESTAMP)
|
159
|
+
assert(results.get_base_type(12) == SQLType::VARCHAR)
|
160
|
+
ensure
|
161
|
+
results.close if results != nil
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
data/test/RoleTest.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'TestSetup'
|
4
|
+
require 'test/unit'
|
5
|
+
#require 'rubygems'
|
6
|
+
require 'ibruby'
|
7
|
+
|
8
|
+
include IBRuby
|
9
|
+
|
10
|
+
# This test case isn't working as I cannot get the basic operation of roles to work under ISQL so I am unsure
|
11
|
+
# how they are supposed to work.
|
12
|
+
|
13
|
+
class DatabaseTest < Test::Unit::TestCase
|
14
|
+
CURDIR = "#{Dir.getwd}"
|
15
|
+
DB_FILE = "#{CURDIR}#{File::SEPARATOR}role_unit_test.ib"
|
16
|
+
|
17
|
+
def setup
|
18
|
+
puts "#{self.class.name} started." if TEST_LOGGING
|
19
|
+
if File.exist?(DB_FILE)
|
20
|
+
db = Database.new(DB_FILE)
|
21
|
+
db.drop(DB_USER_NAME, DB_PASSWORD)
|
22
|
+
end
|
23
|
+
|
24
|
+
#connect "role_unit_test.ib" user "newuser" password "password" role sales;
|
25
|
+
#insert into sales_test values(1);
|
26
|
+
Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
27
|
+
createUser
|
28
|
+
createRoleAndAllocate
|
29
|
+
end
|
30
|
+
|
31
|
+
def createUser
|
32
|
+
#create the user we will use to grant permission to
|
33
|
+
sm = ServiceManager.new('localhost')
|
34
|
+
sm.connect(DB_USER_NAME, DB_PASSWORD)
|
35
|
+
|
36
|
+
au = AddUser.new('newuser', 'password', 'first', 'middle', 'last')
|
37
|
+
au.execute(sm)
|
38
|
+
sm.disconnect
|
39
|
+
end
|
40
|
+
|
41
|
+
def createRoleAndAllocate
|
42
|
+
database = Database::new(DB_FILE)
|
43
|
+
@connection = database.connect(DB_USER_NAME, DB_PASSWORD)
|
44
|
+
@connection.execute_immediate( 'create role sales' )
|
45
|
+
@connection.execute_immediate( 'create table sales_test(sales_drone integer)' )
|
46
|
+
@connection.execute_immediate( 'grant insert on sales_test to sales' )
|
47
|
+
# no permission to this table (notsales)
|
48
|
+
@connection.execute_immediate( 'create table notsales(sales_drone integer)' )
|
49
|
+
# add 'newuser' into sales role
|
50
|
+
@connection.execute_immediate( 'grant sales to newuser' )
|
51
|
+
@connection.close
|
52
|
+
end
|
53
|
+
|
54
|
+
def dropRole
|
55
|
+
database = Database::new(DB_FILE)
|
56
|
+
@connection = database.connect(DB_USER_NAME, DB_PASSWORD)
|
57
|
+
@connection.execute_immediate( 'drop role sales' )
|
58
|
+
@connection.close
|
59
|
+
end
|
60
|
+
|
61
|
+
def dropUser
|
62
|
+
sm = ServiceManager.new('localhost')
|
63
|
+
sm.connect(DB_USER_NAME, DB_PASSWORD)
|
64
|
+
|
65
|
+
au = RemoveUser.new('newuser')
|
66
|
+
au.execute(sm)
|
67
|
+
sm.disconnect
|
68
|
+
end
|
69
|
+
|
70
|
+
def teardown
|
71
|
+
dropRole
|
72
|
+
dropUser
|
73
|
+
|
74
|
+
#~ if File::exist?(DB_FILE)
|
75
|
+
#~ db = Database.new(DB_FILE)
|
76
|
+
#~ db.drop(DB_USER_NAME, DB_PASSWORD)
|
77
|
+
#~ end
|
78
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
79
|
+
end
|
80
|
+
|
81
|
+
#test we can connect with the role
|
82
|
+
def test02
|
83
|
+
database = Database::new(DB_FILE)
|
84
|
+
@connection = database.connect('newuser', 'password', Connection::ROLE => 'SALES' )
|
85
|
+
assert_nothing_raised() do
|
86
|
+
|
87
|
+
assert(@connection.execute_immediate( 'insert into sales_test values(1)' ) == 1 )
|
88
|
+
|
89
|
+
end
|
90
|
+
@connection.close
|
91
|
+
end
|
92
|
+
|
93
|
+
def test01
|
94
|
+
database = Database::new(DB_FILE)
|
95
|
+
@connection = database.connect('newuser', 'password' )
|
96
|
+
assert_raise(IBRuby::IBRubyException) do
|
97
|
+
@connection.execute_immediate( 'insert into sales_test values(10)' )
|
98
|
+
|
99
|
+
puts "No role passed but can insert into sales_test!" if TEST_LOGGING
|
100
|
+
end
|
101
|
+
@connection.close
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'TestSetup'
|
4
|
+
require 'test/unit'
|
5
|
+
#require 'rubygems'
|
6
|
+
require 'ibruby'
|
7
|
+
|
8
|
+
include IBRuby
|
9
|
+
|
10
|
+
class RowCountTest < Test::Unit::TestCase
|
11
|
+
CURDIR = "#{Dir.getwd}"
|
12
|
+
DB_FILE = "#{CURDIR}#{File::SEPARATOR}row_count_test.ib"
|
13
|
+
|
14
|
+
def setup
|
15
|
+
puts "#{self.class.name} started." if TEST_LOGGING
|
16
|
+
# Create the database for use in testing.
|
17
|
+
if File.exist?(DB_FILE)
|
18
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
19
|
+
end
|
20
|
+
@database = Database.create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
21
|
+
|
22
|
+
# Create the test table.
|
23
|
+
@database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
|
24
|
+
cxn.execute_immediate('create table test(id integer)')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def teardown
|
30
|
+
if File.exist?(DB_FILE)
|
31
|
+
@database.drop(DB_USER_NAME, DB_PASSWORD)
|
32
|
+
end
|
33
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
34
|
+
end
|
35
|
+
|
36
|
+
def test01
|
37
|
+
@database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
|
38
|
+
cxn.start_transaction do |tx|
|
39
|
+
assert(cxn.execute_immediate('insert into test values (1000)') == 1)
|
40
|
+
assert(cxn.execute_immediate('insert into test values (1000)') == 1)
|
41
|
+
assert(cxn.execute('insert into test values (2000)', tx) == 1)
|
42
|
+
assert(cxn.execute('insert into test values (2000)', tx) == 1)
|
43
|
+
assert(tx.execute('insert into test values (3000)') == 1)
|
44
|
+
assert(tx.execute('insert into test values (3000)') == 1)
|
45
|
+
assert(tx.execute('insert into test values (4000)') == 1)
|
46
|
+
assert(tx.execute('insert into test values (4000)') == 1)
|
47
|
+
|
48
|
+
assert(cxn.execute_immediate('update test set id = 10000 where '\
|
49
|
+
'id = 1000') == 2)
|
50
|
+
assert(cxn.execute('update test set id = 20000 where id = 2000',
|
51
|
+
tx) == 2)
|
52
|
+
assert(tx.execute('update test set id = 30000 where id = 3000') == 2)
|
53
|
+
|
54
|
+
s = Statement.new(cxn, tx, 'update test set id = 40000 where id = ?',
|
55
|
+
3)
|
56
|
+
assert(s.execute_for([4000]) == 2)
|
57
|
+
|
58
|
+
|
59
|
+
assert(cxn.execute_immediate('delete from test where id = 10000') == 2)
|
60
|
+
assert(cxn.execute('delete from test where id = 20000', tx) == 2)
|
61
|
+
assert(tx.execute('delete from test where id = 30000') == 2)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/test/RowTest.rb
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'TestSetup'
|
4
|
+
require 'test/unit'
|
5
|
+
#require 'rubygems'
|
6
|
+
require 'ibruby'
|
7
|
+
|
8
|
+
include IBRuby
|
9
|
+
|
10
|
+
class RowTest < Test::Unit::TestCase
|
11
|
+
CURDIR = "#{Dir.getwd}"
|
12
|
+
DB_FILE = "#{CURDIR}#{File::SEPARATOR}row_unit_test.ib"
|
13
|
+
|
14
|
+
def setup
|
15
|
+
puts "#{self.class.name} started." if TEST_LOGGING
|
16
|
+
if File::exist?(DB_FILE)
|
17
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
18
|
+
end
|
19
|
+
|
20
|
+
database = Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
21
|
+
@connection = database.connect(DB_USER_NAME, DB_PASSWORD)
|
22
|
+
@transaction = @connection.start_transaction
|
23
|
+
@results = ResultSet.new(@connection, @transaction,
|
24
|
+
'SELECT * FROM RDB$FIELDS', 3, nil)
|
25
|
+
@empty = [[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
26
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
27
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
28
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
29
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
30
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
31
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
32
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
33
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
34
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
35
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
36
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
37
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER],
|
38
|
+
[0, SQLType::INTEGER], [0, SQLType::INTEGER]]
|
39
|
+
|
40
|
+
@connection.start_transaction do |tx|
|
41
|
+
tx.execute('create table rowtest (COL01 integer, COL02 varchar(10), '\
|
42
|
+
'COL03 integer)')
|
43
|
+
tx.execute('create table all_types (col01 boolean, col02 blob, '\
|
44
|
+
'col03 char(100), col04 date, col05 decimal(5,2), '\
|
45
|
+
'col06 double precision, col07 float, col08 integer, '\
|
46
|
+
'col09 numeric(10,3), col10 smallint, col11 time, '\
|
47
|
+
'col12 timestamp, col13 varchar(23))')
|
48
|
+
end
|
49
|
+
@connection.start_transaction do |tx|
|
50
|
+
tx.execute("insert into rowtest values (1, 'Two', 3)")
|
51
|
+
|
52
|
+
stmt = Statement.new(@connection, tx,
|
53
|
+
"insert into all_types values(?, ?, ?, ?, ?, ?, "\
|
54
|
+
"?, ?, ?, ?, ?, ?, ?)",
|
55
|
+
3)
|
56
|
+
#stmt.execute_for([nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil])
|
57
|
+
stmt.execute_for([false, nil, 'La la la', Date.new(2005, 10, 29),
|
58
|
+
10.23, 100.751, 56.25, 12345, 19863.21, 123,
|
59
|
+
Time.new, Time.new, 'The End!'])
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def teardown
|
64
|
+
@results.close
|
65
|
+
@transaction.rollback
|
66
|
+
@connection.close
|
67
|
+
if File::exist?(DB_FILE)
|
68
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
69
|
+
end
|
70
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
71
|
+
end
|
72
|
+
|
73
|
+
def test01
|
74
|
+
row = Row.new(@results, @empty, 100)
|
75
|
+
|
76
|
+
assert(row.column_count == 28)
|
77
|
+
assert(row.number == 100)
|
78
|
+
assert(row.column_name(0) == 'RDB$FIELD_NAME')
|
79
|
+
assert(row.column_alias(10) == 'RDB$FIELD_TYPE')
|
80
|
+
assert(row[0] == 0)
|
81
|
+
assert(row['RDB$FIELD_TYPE'] == 0)
|
82
|
+
end
|
83
|
+
|
84
|
+
def test02
|
85
|
+
sql = 'select COL01 one, COL02 two, COL03 three from rowtest'
|
86
|
+
rows = @connection.execute_immediate(sql)
|
87
|
+
data = rows.fetch
|
88
|
+
|
89
|
+
count = 0
|
90
|
+
data.each do |name, value|
|
91
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
92
|
+
assert([1, 'Two', 3].include?(value))
|
93
|
+
count += 1
|
94
|
+
end
|
95
|
+
assert(count == 3)
|
96
|
+
|
97
|
+
count = 0
|
98
|
+
data.each_key do |name|
|
99
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
100
|
+
count += 1
|
101
|
+
end
|
102
|
+
assert(count == 3)
|
103
|
+
|
104
|
+
count = 0
|
105
|
+
data.each_value do |value|
|
106
|
+
assert([1, 'Two', 3].include?(value))
|
107
|
+
count += 1
|
108
|
+
end
|
109
|
+
assert(count == 3)
|
110
|
+
|
111
|
+
assert(data.fetch('TWO') == 'Two')
|
112
|
+
assert(data.fetch('FOUR', 'LALALA') == 'LALALA')
|
113
|
+
assert(data.fetch('ZERO') {'NOT FOUND'} == 'NOT FOUND')
|
114
|
+
begin
|
115
|
+
data.fetch('FIVE')
|
116
|
+
assert(false, 'Row#fetch succeeded for non-existent column name.')
|
117
|
+
rescue IndexError
|
118
|
+
end
|
119
|
+
|
120
|
+
assert(data.has_key?('ONE'))
|
121
|
+
assert(data.has_key?('TEN') == false)
|
122
|
+
|
123
|
+
assert(data.has_column?('COL02'))
|
124
|
+
assert(data.has_column?('COL22') == false)
|
125
|
+
|
126
|
+
assert(data.has_alias?('TWO'))
|
127
|
+
assert(data.has_alias?('FOUR') == false)
|
128
|
+
|
129
|
+
assert(data.has_value?(3))
|
130
|
+
assert(data.has_value?('LALALA') == false)
|
131
|
+
|
132
|
+
assert(data.keys.size == 3)
|
133
|
+
data.keys.each do |name|
|
134
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
135
|
+
end
|
136
|
+
|
137
|
+
assert(data.names.size == 3)
|
138
|
+
data.names.each do |name|
|
139
|
+
assert(['COL01', 'COL02', 'COL03'].include?(name))
|
140
|
+
end
|
141
|
+
|
142
|
+
assert(data.aliases.size == 3)
|
143
|
+
data.aliases.each do |name|
|
144
|
+
assert(['ONE', 'TWO', 'THREE'].include?(name))
|
145
|
+
end
|
146
|
+
|
147
|
+
assert(data.values.size == 3)
|
148
|
+
data.values.each do |value|
|
149
|
+
assert([1, 'Two', 3].include?(value))
|
150
|
+
end
|
151
|
+
|
152
|
+
array = data.select {|name, value| name == 'TWO'}
|
153
|
+
assert(array.size == 1)
|
154
|
+
assert(array[0][0] == 'TWO')
|
155
|
+
assert(array[0][1] == 'Two')
|
156
|
+
|
157
|
+
array = data.to_a
|
158
|
+
assert(array.size == 3)
|
159
|
+
assert(array.include?(['ONE', 1]))
|
160
|
+
assert(array.include?(['TWO', 'Two']))
|
161
|
+
assert(array.include?(['THREE', 3]))
|
162
|
+
|
163
|
+
hash = data.to_hash
|
164
|
+
assert(hash.length == 3)
|
165
|
+
assert(hash['ONE'] == 1)
|
166
|
+
assert(hash['TWO'] == 'Two')
|
167
|
+
assert(hash['THREE'] == 3)
|
168
|
+
|
169
|
+
array = data.values_at('TEN', 'TWO', 'THREE')
|
170
|
+
assert(array.size == 3)
|
171
|
+
assert(array.include?('Two'))
|
172
|
+
assert(array.include?(3))
|
173
|
+
assert(array.include?(nil))
|
174
|
+
|
175
|
+
rows.close
|
176
|
+
end
|
177
|
+
|
178
|
+
def test03
|
179
|
+
results = nil
|
180
|
+
row = nil
|
181
|
+
|
182
|
+
begin
|
183
|
+
results = @connection.execute_immediate('select * from all_types')
|
184
|
+
|
185
|
+
row = results.fetch
|
186
|
+
|
187
|
+
assert(row.get_base_type(0) == SQLType::BOOLEAN)
|
188
|
+
assert(row.get_base_type(1) == SQLType::BLOB)
|
189
|
+
assert(row.get_base_type(2) == SQLType::CHAR)
|
190
|
+
assert(row.get_base_type(3) == SQLType::DATE)
|
191
|
+
assert(row.get_base_type(4) == SQLType::DECIMAL)
|
192
|
+
assert(row.get_base_type(5) == SQLType::DOUBLE)
|
193
|
+
assert(row.get_base_type(6) == SQLType::FLOAT)
|
194
|
+
assert(row.get_base_type(7) == SQLType::INTEGER)
|
195
|
+
assert(row.get_base_type(8) == SQLType::NUMERIC)
|
196
|
+
assert(row.get_base_type(9) == SQLType::SMALLINT)
|
197
|
+
assert(row.get_base_type(10) == SQLType::TIME)
|
198
|
+
assert(row.get_base_type(11) == SQLType::TIMESTAMP)
|
199
|
+
assert(row.get_base_type(12) == SQLType::VARCHAR)
|
200
|
+
|
201
|
+
ensure
|
202
|
+
results.close if results != nil
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|