rubyfb 0.5.2-x86-mswin32-60

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/CHANGELOG +6 -0
  2. data/LICENSE +411 -0
  3. data/Manifest +75 -0
  4. data/README +460 -0
  5. data/Rakefile +21 -0
  6. data/examples/example01.rb +65 -0
  7. data/ext/AddUser.c +464 -0
  8. data/ext/AddUser.h +37 -0
  9. data/ext/Backup.c +783 -0
  10. data/ext/Backup.h +37 -0
  11. data/ext/Blob.c +421 -0
  12. data/ext/Blob.h +65 -0
  13. data/ext/Common.c +54 -0
  14. data/ext/Common.h +37 -0
  15. data/ext/Connection.c +863 -0
  16. data/ext/Connection.h +50 -0
  17. data/ext/DataArea.c +274 -0
  18. data/ext/DataArea.h +38 -0
  19. data/ext/Database.c +449 -0
  20. data/ext/Database.h +48 -0
  21. data/ext/FireRuby.c +240 -0
  22. data/ext/FireRuby.h +50 -0
  23. data/ext/FireRubyException.c +268 -0
  24. data/ext/FireRubyException.h +51 -0
  25. data/ext/Generator.c +689 -0
  26. data/ext/Generator.h +53 -0
  27. data/ext/RemoveUser.c +212 -0
  28. data/ext/RemoveUser.h +37 -0
  29. data/ext/Restore.c +855 -0
  30. data/ext/Restore.h +37 -0
  31. data/ext/ResultSet.c +810 -0
  32. data/ext/ResultSet.h +60 -0
  33. data/ext/Row.c +965 -0
  34. data/ext/Row.h +55 -0
  35. data/ext/ServiceManager.c +316 -0
  36. data/ext/ServiceManager.h +48 -0
  37. data/ext/Services.c +124 -0
  38. data/ext/Services.h +42 -0
  39. data/ext/Statement.c +785 -0
  40. data/ext/Statement.h +62 -0
  41. data/ext/Transaction.c +684 -0
  42. data/ext/Transaction.h +50 -0
  43. data/ext/TypeMap.c +1182 -0
  44. data/ext/TypeMap.h +51 -0
  45. data/ext/extconf.rb +30 -0
  46. data/lib/SQLType.rb +224 -0
  47. data/lib/active_record/connection_adapters/rubyfb_adapter.rb +805 -0
  48. data/lib/mkdoc +1 -0
  49. data/lib/rubyfb.rb +2 -0
  50. data/lib/rubyfb_lib.so +0 -0
  51. data/lib/src.rb +1800 -0
  52. data/mswin32fb/fbclient_ms.lib +0 -0
  53. data/mswin32fb/ibase.h +2555 -0
  54. data/mswin32fb/iberror.h +1741 -0
  55. data/rubyfb.gemspec +31 -0
  56. data/test/AddRemoveUserTest.rb +56 -0
  57. data/test/BackupRestoreTest.rb +99 -0
  58. data/test/BlobTest.rb +57 -0
  59. data/test/CharacterSetTest.rb +63 -0
  60. data/test/ConnectionTest.rb +111 -0
  61. data/test/DDLTest.rb +54 -0
  62. data/test/DatabaseTest.rb +83 -0
  63. data/test/GeneratorTest.rb +50 -0
  64. data/test/KeyTest.rb +140 -0
  65. data/test/ResultSetTest.rb +162 -0
  66. data/test/RoleTest.rb +73 -0
  67. data/test/RowCountTest.rb +65 -0
  68. data/test/RowTest.rb +203 -0
  69. data/test/SQLTest.rb +182 -0
  70. data/test/SQLTypeTest.rb +101 -0
  71. data/test/ServiceManagerTest.rb +29 -0
  72. data/test/StatementTest.rb +135 -0
  73. data/test/TestSetup.rb +11 -0
  74. data/test/TransactionTest.rb +112 -0
  75. data/test/TypeTest.rb +92 -0
  76. data/test/UnitTest.rb +65 -0
  77. metadata +143 -0
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'TestSetup'
4
+ require 'test/unit'
5
+ require 'rubygems'
6
+ require 'fireruby'
7
+
8
+ include FireRuby
9
+
10
+ class RowCountTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}row_count_test.fdb"
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,203 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'TestSetup'
4
+ require 'test/unit'
5
+ require 'rubygems'
6
+ require 'fireruby'
7
+
8
+ include FireRuby
9
+
10
+ class RowTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}row_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
+ 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 bigint, 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([100000, 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
+ row = results.fetch
185
+
186
+ assert(row.get_base_type(0) == SQLType::BIGINT)
187
+ assert(row.get_base_type(1) == SQLType::BLOB)
188
+ assert(row.get_base_type(2) == SQLType::CHAR)
189
+ assert(row.get_base_type(3) == SQLType::DATE)
190
+ assert(row.get_base_type(4) == SQLType::DECIMAL)
191
+ assert(row.get_base_type(5) == SQLType::DOUBLE)
192
+ assert(row.get_base_type(6) == SQLType::FLOAT)
193
+ assert(row.get_base_type(7) == SQLType::INTEGER)
194
+ assert(row.get_base_type(8) == SQLType::NUMERIC)
195
+ assert(row.get_base_type(9) == SQLType::SMALLINT)
196
+ assert(row.get_base_type(10) == SQLType::TIME)
197
+ assert(row.get_base_type(11) == SQLType::TIMESTAMP)
198
+ assert(row.get_base_type(12) == SQLType::VARCHAR)
199
+ ensure
200
+ results.close if results != nil
201
+ end
202
+ end
203
+ end
data/test/SQLTest.rb ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'TestSetup'
4
+ require 'test/unit'
5
+ require 'rubygems'
6
+ require 'fireruby'
7
+
8
+ include FireRuby
9
+
10
+ class SQLTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}sql_unit_test.fdb"
13
+ ITERATIONS = 100
14
+
15
+ INSERT_SQL = "INSERT INTO TEST_TABLE VALUES(?, ?, ?, ?, ?, ?)"
16
+
17
+ def setup
18
+ puts "#{self.class.name} started." if TEST_LOGGING
19
+ if File::exist?(DB_FILE)
20
+ Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
21
+ end
22
+ @database = Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
23
+ @connections = []
24
+ @transactions = []
25
+
26
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
27
+ cxn.execute_immediate('CREATE TABLE TEST_TABLE (TESTID INTEGER '\
28
+ 'NOT NULL PRIMARY KEY, TESTTEXT VARCHAR(100), '\
29
+ 'TESTFLOAT NUMERIC(8,2), TESTDATE DATE, TESTTIME '\
30
+ 'TIME, TESTSTAMP TIMESTAMP)')
31
+ end
32
+ end
33
+
34
+ def teardown
35
+ @transactions.each do |tx|
36
+ tx.rollback if tx.active?
37
+ end
38
+
39
+ @connections.each do |cxn|
40
+ cxn.close if cxn.open?
41
+ end
42
+
43
+ if File::exist?(DB_FILE)
44
+ Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
45
+ end
46
+ puts "#{self.class.name} finished." if TEST_LOGGING
47
+ end
48
+
49
+ def test01
50
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
51
+ cxn.start_transaction do |tx|
52
+ s = Statement.new(cxn, tx, INSERT_SQL, 3)
53
+ f = 0.0
54
+ t = Time.new
55
+
56
+ 1.upto(ITERATIONS) do |i|
57
+ f += 0.321
58
+ t = Time.at(t.to_i + 5)
59
+ s.execute_for([i, i.to_s, f, t, nil, t])
60
+ end
61
+
62
+ s.close
63
+ end
64
+ end
65
+
66
+ @connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
67
+ @connections[0].start_transaction do |tx|
68
+ r = tx.execute("SELECT COUNT(*) FROM TEST_TABLE")
69
+ assert(r.fetch[0] == ITERATIONS)
70
+ r.close
71
+ end
72
+ end
73
+
74
+ def test02
75
+ f = 0.0
76
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
77
+ 1.upto(20) do |i|
78
+ f += i
79
+ sql = "INSERT INTO TEST_TABLE VALUES (#{i}, "\
80
+ "#{f.to_s}, #{f}, NULL, NULL, 'NOW')"
81
+ cxn.execute_immediate(sql)
82
+ end
83
+ end
84
+
85
+ @connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
86
+ @transactions.push(@connections[0].start_transaction)
87
+ r = @transactions[0].execute("SELECT COUNT(*) FROM TEST_TABLE")
88
+ assert(r.fetch[0] == 20)
89
+ r.close
90
+
91
+ r = @transactions[0].execute("SELECT * FROM TEST_TABLE WHERE TESTID IN "\
92
+ "(2, 4, 6, 8, 10) ORDER BY TESTID ASCENDING")
93
+ a = r.fetch
94
+ assert(a[0] == 2)
95
+ assert(a[1] == '3.0')
96
+ assert(a[2] == 3.0)
97
+ assert(a[3] == nil)
98
+ assert(a[4] == nil)
99
+
100
+ a = r.fetch
101
+ assert(a[0] == 4)
102
+ assert(a[1] == '10.0')
103
+ assert(a[2] == 10.0)
104
+ assert(a[3] == nil)
105
+ assert(a[4] == nil)
106
+
107
+ a = r.fetch
108
+ assert(a[0] == 6)
109
+ assert(a[1] == '21.0')
110
+ assert(a[2] == 21.0)
111
+ assert(a[3] == nil)
112
+ assert(a[4] == nil)
113
+
114
+ a = r.fetch
115
+ assert(a[0] == 8)
116
+ assert(a[1] == '36.0')
117
+ assert(a[2] == 36.0)
118
+ assert(a[3] == nil)
119
+ assert(a[4] == nil)
120
+
121
+ a = r.fetch
122
+ assert(a[0] == 10)
123
+ assert(a[1] == '55.0')
124
+ assert(a[2] == 55.0)
125
+ assert(a[3] == nil)
126
+ assert(a[4] == nil)
127
+
128
+ r.close
129
+
130
+ @transactions[0].commit
131
+
132
+ @connections[0].start_transaction do |tx|
133
+ s = Statement.new(@connections[0], tx,
134
+ "UPDATE TEST_TABLE SET TESTSTAMP = NULL", 3)
135
+ s.execute()
136
+ s.close
137
+
138
+ r = tx.execute("SELECT TESTSTAMP FROM TEST_TABLE")
139
+ total = 0
140
+ r.each do |row|
141
+ assert(row[0] == nil)
142
+ total = total + 1
143
+ end
144
+ assert(total == 20)
145
+ r.close
146
+ end
147
+
148
+ a = []
149
+ t = nil
150
+ @connections[0].start_transaction do |tx|
151
+ # Perform an insert via a parameterized statement.
152
+ s = Statement.new(@connections[0], tx,
153
+ "INSERT INTO TEST_TABLE (TESTID, TESTTEXT, "\
154
+ "TESTFLOAT, TESTSTAMP) VALUES(?, ?, ?, ?)", 3)
155
+ t = Time.new
156
+ s.execute_for([25000, 'La la la', 3.14, t])
157
+ s.close
158
+
159
+ # Fetch the record and check the data.
160
+ r = tx.execute("SELECT TESTTEXT, TESTFLOAT, TESTSTAMP FROM "\
161
+ "TEST_TABLE WHERE TESTID = 25000")
162
+ a = r.fetch
163
+ r.close
164
+ end
165
+ assert(a[0] == 'La la la')
166
+ assert(a[1] == 3.14)
167
+ assert(a[2].to_i == t.to_i)
168
+
169
+ @connections[0].execute_immediate("DELETE FROM TEST_TABLE WHERE TESTID "\
170
+ "IN (1, 3, 5, 7, 9, 12, 14, 16, 18, 20)")
171
+ @database.connect(DB_USER_NAME, DB_PASSWORD) do |cxn|
172
+ a = []
173
+ cxn.start_transaction do |tx|
174
+ r = tx.execute("SELECT COUNT(*) FROM TEST_TABLE")
175
+ a = r.fetch
176
+ r.close
177
+ end
178
+ assert(a[0] == 11)
179
+ end
180
+ end
181
+ end
182
+