rubyfb 0.5.9 → 0.6
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 +36 -0
- data/Manifest +1 -0
- data/README +75 -175
- data/Rakefile +1 -1
- data/ext/Blob.c +1 -1
- data/ext/Connection.c +40 -126
- data/ext/FireRubyException.c +27 -41
- data/ext/Generator.c +61 -339
- data/ext/Generator.h +0 -5
- data/ext/ResultSet.c +201 -381
- data/ext/ResultSet.h +8 -9
- data/ext/Statement.c +495 -426
- data/ext/Statement.h +8 -11
- data/ext/Transaction.c +3 -2
- data/ext/TypeMap.c +44 -43
- data/ext/TypeMap.h +1 -1
- data/lib/active_record/connection_adapters/rubyfb_adapter.rb +370 -120
- data/lib/arel/visitors/rubyfb.rb +7 -3
- data/lib/arel/visitors/rubyfb_15compat.rb +8 -4
- data/lib/rubyfb_lib.so +0 -0
- data/lib/src.rb +76 -39
- data/rubyfb.gemspec +3 -3
- data/test/AddRemoveUserTest.rb +7 -0
- data/test/BackupRestoreTest.rb +1 -1
- data/test/BlobTest.rb +5 -5
- data/test/GeneratorTest.rb +8 -8
- data/test/KeyTest.rb +1 -2
- data/test/ResultSetTest.rb +14 -16
- data/test/RoleTest.rb +2 -2
- data/test/RowCountTest.rb +19 -19
- data/test/RowTest.rb +7 -8
- data/test/SQLTest.rb +7 -8
- data/test/StatementTest.rb +18 -24
- data/test/StoredProcedureTest.rb +80 -0
- data/test/TransactionTest.rb +1 -1
- data/test/TypeTest.rb +4 -5
- metadata +5 -5
data/test/StatementTest.rb
CHANGED
@@ -40,25 +40,19 @@ class StatementTest < Test::Unit::TestCase
|
|
40
40
|
@connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
|
41
41
|
@transactions.push(@connections.last.start_transaction)
|
42
42
|
|
43
|
-
s1 =
|
44
|
-
@transactions[0],
|
45
|
-
"SELECT RDB$FIELD_NAME FROM RDB$FIELDS", 3)
|
43
|
+
s1 = @connections[0].create_statement("SELECT RDB$FIELD_NAME FROM RDB$FIELDS")
|
46
44
|
assert(s1 != nil)
|
47
45
|
assert(s1.sql == "SELECT RDB$FIELD_NAME FROM RDB$FIELDS")
|
48
46
|
assert(s1.connection == @connections[0])
|
49
|
-
assert(s1.transaction == @transactions[0])
|
50
47
|
assert(s1.dialect == 3)
|
51
48
|
assert(s1.type == Statement::SELECT_STATEMENT)
|
52
49
|
s1.close
|
53
50
|
|
54
|
-
s2 =
|
55
|
-
@transactions[0],
|
56
|
-
"DELETE FROM RDB$EXCEPTIONS", 1)
|
51
|
+
s2 = @connections[0].create_statement("DELETE FROM RDB$EXCEPTIONS")
|
57
52
|
assert(s2 != nil)
|
58
53
|
assert(s2.sql == "DELETE FROM RDB$EXCEPTIONS")
|
59
54
|
assert(s2.connection == @connections[0])
|
60
|
-
assert(s2.
|
61
|
-
assert(s2.dialect == 1)
|
55
|
+
assert(s2.dialect == 3)
|
62
56
|
assert(s2.type == Statement::DELETE_STATEMENT)
|
63
57
|
s2.close
|
64
58
|
end
|
@@ -67,12 +61,12 @@ class StatementTest < Test::Unit::TestCase
|
|
67
61
|
@connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
|
68
62
|
@transactions.push(@connections[0].start_transaction)
|
69
63
|
|
70
|
-
s =
|
64
|
+
s = @connections[0].create_statement(
|
71
65
|
"SELECT RDB$FIELD_NAME FROM RDB$FIELDS "\
|
72
|
-
"WHERE RDB$FIELD_NAME LIKE ?"
|
66
|
+
"WHERE RDB$FIELD_NAME LIKE ?")
|
73
67
|
|
74
68
|
begin
|
75
|
-
r = s.execute
|
69
|
+
r = s.execute(@transactions[0])
|
76
70
|
r.close
|
77
71
|
assert(false,
|
78
72
|
"Executed statement that required parameter without the "\
|
@@ -81,7 +75,7 @@ class StatementTest < Test::Unit::TestCase
|
|
81
75
|
end
|
82
76
|
|
83
77
|
begin
|
84
|
-
r = s.
|
78
|
+
r = s.exec([], @transactions[0])
|
85
79
|
r.close
|
86
80
|
assert(false,
|
87
81
|
"Executed statement that required a parameter with an empty "\
|
@@ -90,7 +84,7 @@ class StatementTest < Test::Unit::TestCase
|
|
90
84
|
end
|
91
85
|
|
92
86
|
begin
|
93
|
-
r = s.
|
87
|
+
r = s.exec(['LALALA', 25], @transactions[0])
|
94
88
|
r.close
|
95
89
|
assert(false,
|
96
90
|
"Executed statement that required a parameter with too many "\
|
@@ -98,16 +92,16 @@ class StatementTest < Test::Unit::TestCase
|
|
98
92
|
rescue Exception => error
|
99
93
|
end
|
100
94
|
|
101
|
-
r = s.
|
102
|
-
|
103
|
-
|
95
|
+
r = s.exec(['LALALA'], @transactions[0])
|
96
|
+
assert_not_nil(r)
|
97
|
+
assert_equal(ResultSet, r.class)
|
104
98
|
r.close
|
105
99
|
|
106
100
|
total = 0
|
107
|
-
s.
|
108
|
-
total
|
101
|
+
s.exec(["%"], @transactions[0]) do |row|
|
102
|
+
total += 1
|
109
103
|
end
|
110
|
-
|
104
|
+
assert_equal(88, total)
|
111
105
|
s.close
|
112
106
|
end
|
113
107
|
|
@@ -117,8 +111,8 @@ class StatementTest < Test::Unit::TestCase
|
|
117
111
|
cxn.execute_immediate('CREATE TABLE STRING_TEST(TEXT VARCHAR(10))')
|
118
112
|
cxn.start_transaction do |tx|
|
119
113
|
# Perform an truncated insert.
|
120
|
-
s =
|
121
|
-
s.
|
114
|
+
s = cxn.create_statement('INSERT INTO STRING_TEST VALUES(?)')
|
115
|
+
s.exec(['012345678901234'], tx)
|
122
116
|
|
123
117
|
# Perform a select of the value inserted.
|
124
118
|
r = cxn.execute('SELECT * FROM STRING_TEST', tx)
|
@@ -140,8 +134,8 @@ class StatementTest < Test::Unit::TestCase
|
|
140
134
|
cxn.execute_immediate('CREATE TABLE STRING_TEST(TEXT VARCHAR(100) CHARACTER SET UTF8)')
|
141
135
|
cxn.start_transaction do |tx|
|
142
136
|
# Perform an truncated insert.
|
143
|
-
s =
|
144
|
-
s.
|
137
|
+
s = cxn.create_statement('INSERT INTO STRING_TEST VALUES(?)')
|
138
|
+
s.exec([utf_str], tx)
|
145
139
|
|
146
140
|
# Perform a select of the value inserted.
|
147
141
|
r = cxn.execute('SELECT * FROM STRING_TEST', tx)
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: utf-8
|
3
|
+
|
4
|
+
require './TestSetup'
|
5
|
+
require 'test/unit'
|
6
|
+
require 'rubygems'
|
7
|
+
require 'rubyfb'
|
8
|
+
|
9
|
+
include Rubyfb
|
10
|
+
|
11
|
+
class StoredProcedureTest < Test::Unit::TestCase
|
12
|
+
DB_FILE = File.join(DB_DIR, "sp_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
|
+
@database = Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
|
20
|
+
@connections = []
|
21
|
+
@transactions = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def teardown
|
25
|
+
@transactions.each do |tx|
|
26
|
+
tx.rollback if tx.active?
|
27
|
+
end
|
28
|
+
@transactions.clear
|
29
|
+
@connections.each do |cxn|
|
30
|
+
cxn.close if cxn.open?
|
31
|
+
end
|
32
|
+
@connections.clear
|
33
|
+
if File::exist?(DB_FILE)
|
34
|
+
Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
|
35
|
+
end
|
36
|
+
puts "#{self.class.name} finished." if TEST_LOGGING
|
37
|
+
end
|
38
|
+
|
39
|
+
def test01
|
40
|
+
d = nil
|
41
|
+
@database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
|
42
|
+
cxn.execute_immediate('
|
43
|
+
create procedure SP1 (
|
44
|
+
SP_IN_1 VARCHAR(10),
|
45
|
+
SP_IN_2 integer
|
46
|
+
)
|
47
|
+
returns (
|
48
|
+
SP_OUT_1 VARCHAR(20),
|
49
|
+
SP_OUT_2 INTEGER
|
50
|
+
)
|
51
|
+
as
|
52
|
+
begin
|
53
|
+
SP_OUT_1 = :SP_IN_1;
|
54
|
+
SP_OUT_2 = SP_IN_2;
|
55
|
+
end
|
56
|
+
')
|
57
|
+
cxn.start_transaction do |tx|
|
58
|
+
# Perform an truncated insert.
|
59
|
+
test_data = ["SP1", 7]
|
60
|
+
|
61
|
+
s = cxn.create_statement('execute procedure SP1(?, ?)')
|
62
|
+
result = s.exec(test_data, tx)
|
63
|
+
|
64
|
+
assert_equal(Rubyfb::ResultSet, result.class)
|
65
|
+
row = result.fetch
|
66
|
+
assert_not_nil(row)
|
67
|
+
assert_nil(result.fetch)
|
68
|
+
assert_equal(result.exhausted?, true)
|
69
|
+
|
70
|
+
assert_equal(test_data[0], row[0])
|
71
|
+
assert_equal(test_data[1], row[1])
|
72
|
+
|
73
|
+
# Clean up.
|
74
|
+
result.close
|
75
|
+
s.close
|
76
|
+
end
|
77
|
+
cxn.execute_immediate('DROP PROCEDURE SP1')
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/test/TransactionTest.rb
CHANGED
@@ -96,7 +96,7 @@ class TransactionTest < Test::Unit::TestCase
|
|
96
96
|
sql.push("SELECT * FROM RDB$DATABASE")
|
97
97
|
@transactions.push(Transaction.new(@connections[0]))
|
98
98
|
|
99
|
-
|
99
|
+
assert_equal(0, @transactions[0].execute(sql[0]))
|
100
100
|
r = @transactions[0].execute(sql[1])
|
101
101
|
assert(r != nil)
|
102
102
|
assert(r.class == ResultSet)
|
data/test/TypeTest.rb
CHANGED
@@ -27,11 +27,11 @@ class TypeTest < Test::Unit::TestCase
|
|
27
27
|
end
|
28
28
|
|
29
29
|
cxn.start_transaction do |tx|
|
30
|
-
stmt =
|
31
|
-
"(?, ?, ?, ?, ?, ?, ?, ?, ?)"
|
32
|
-
stmt.
|
30
|
+
stmt = cxn.create_statement("insert into types_table values "\
|
31
|
+
"(?, ?, ?, ?, ?, ?, ?, ?, ?)")
|
32
|
+
stmt.exec([10, 100.2, 2378.65, 192.345,
|
33
33
|
Date.new(2005, 10, 21), Time.new, 'La la la',
|
34
|
-
Time.new, "Oobly Joobly"])
|
34
|
+
Time.new, "Oobly Joobly"], tx)
|
35
35
|
stmt.close
|
36
36
|
end
|
37
37
|
cxn.close
|
@@ -81,7 +81,6 @@ class TypeTest < Test::Unit::TestCase
|
|
81
81
|
assert(row[6].instance_of?(String))
|
82
82
|
assert(row[7].instance_of?(Time))
|
83
83
|
assert(row[8].instance_of?(String))
|
84
|
-
rows.close
|
85
84
|
ensure
|
86
85
|
rows.close if rows != nil
|
87
86
|
cxn.close if cxn != nil
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubyfb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 0.5.9
|
8
|
+
- 6
|
9
|
+
version: "0.6"
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- George Georgiev
|
@@ -15,7 +14,7 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-
|
17
|
+
date: 2011-08-22 00:00:00 Z
|
19
18
|
dependencies: []
|
20
19
|
|
21
20
|
description: Firebird SQL access library
|
@@ -121,6 +120,7 @@ files:
|
|
121
120
|
- test/SQLTypeTest.rb
|
122
121
|
- test/ServiceManagerTest.rb
|
123
122
|
- test/StatementTest.rb
|
123
|
+
- test/StoredProcedureTest.rb
|
124
124
|
- test/TestSetup.rb
|
125
125
|
- test/TransactionTest.rb
|
126
126
|
- test/TypeTest.rb
|