rubyfb 0.5.2-x86-mswin32-60

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.
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,83 @@
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 DatabaseTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}db_unit_test.fdb"
13
+ CREATE_FILE = "#{CURDIR}#{File::SEPARATOR}db_create_test.fdb"
14
+
15
+ def setup
16
+ puts "#{self.class.name} started." if TEST_LOGGING
17
+ if File.exist?(DB_FILE)
18
+ db = Database.new(DB_FILE)
19
+ db.drop(DB_USER_NAME, DB_PASSWORD)
20
+ end
21
+ if File.exist?(CREATE_FILE)
22
+ db = Database.new(CREATE_FILE)
23
+ db.drop(DB_USER_NAME, DB_PASSWORD)
24
+ end
25
+
26
+ Database::create(DB_FILE, DB_USER_NAME, DB_PASSWORD, 1024, 'ASCII')
27
+ end
28
+
29
+ def teardown
30
+ if File::exist?(DB_FILE)
31
+ db = Database.new(DB_FILE)
32
+ db.drop(DB_USER_NAME, DB_PASSWORD)
33
+ end
34
+ if File::exist?(CREATE_FILE)
35
+ db = Database.new(CREATE_FILE)
36
+ db.drop(DB_USER_NAME, DB_PASSWORD)
37
+ end
38
+ puts "#{self.class.name} finished." if TEST_LOGGING
39
+ end
40
+
41
+
42
+ def test01
43
+ db = Database.create(CREATE_FILE, DB_USER_NAME, DB_PASSWORD, 2048, 'ASCII')
44
+
45
+ assert(File.exist?(CREATE_FILE))
46
+ assert(db.file == CREATE_FILE)
47
+
48
+ begin
49
+ Database.create(CREATE_FILE, DB_USER_NAME, DB_PASSWORD, 2048, 'ASCII')
50
+ assert(false,
51
+ "Successfully created a database file that already exists.")
52
+ rescue Exception
53
+ end
54
+
55
+ db.drop(DB_USER_NAME, DB_PASSWORD)
56
+ assert(File.exist?(CREATE_FILE) == false)
57
+ end
58
+
59
+ def test02
60
+ db = Database.new(DB_FILE);
61
+
62
+ assert(db.file == DB_FILE)
63
+
64
+ c = db.connect(DB_USER_NAME, DB_PASSWORD)
65
+ assert(c != nil)
66
+ c.close
67
+ end
68
+
69
+ def test03
70
+ db = Database.new(DB_FILE);
71
+ c = nil
72
+
73
+ db.connect(DB_USER_NAME, DB_PASSWORD) do |connection|
74
+ assert(connection != nil)
75
+ assert(connection.class == Connection)
76
+ assert(connection.open?)
77
+ c = connection
78
+ end
79
+ assert(c != nil)
80
+ assert(c.class == Connection)
81
+ assert(c.closed?)
82
+ end
83
+ end
@@ -0,0 +1,50 @@
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 GeneratorTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}generator_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
+
22
+ @connections.push(@database.connect(DB_USER_NAME, DB_PASSWORD))
23
+ end
24
+
25
+ def teardown
26
+ @connections.each do |cxn|
27
+ cxn.close if cxn.open?
28
+ end
29
+ @connections.clear
30
+ if File::exist?(DB_FILE)
31
+ Database.new(DB_FILE).drop(DB_USER_NAME, DB_PASSWORD)
32
+ end
33
+ puts "#{self.class.name} finished." if TEST_LOGGING
34
+ end
35
+
36
+ def test01
37
+ assert(Generator::exists?('TEST_GEN', @connections[0]) == false)
38
+ g = Generator::create('TEST_GEN', @connections[0])
39
+ assert(Generator::exists?('TEST_GEN', @connections[0]))
40
+ assert(g.last == 0)
41
+ assert(g.next(1) == 1)
42
+ assert(g.last == 1)
43
+ assert(g.next(10) == 11)
44
+ assert(g.connection == @connections[0])
45
+ assert(g.name == 'TEST_GEN')
46
+
47
+ g.drop
48
+ assert(Generator::exists?('TEST_GEN', @connections[0]) == false)
49
+ end
50
+ end
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 'fireruby'
7
+
8
+ include FireRuby
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
+ $FireRubySettings[: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
+ $FireRubySettings[: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,162 @@
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 ResultSetTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}result_set_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
+
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 bigint, 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 FireRubyException
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 FireRubyException
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
+ assert(results.get_base_type(1) == SQLType::BLOB)
147
+ assert(results.get_base_type(2) == SQLType::CHAR)
148
+ assert(results.get_base_type(3) == SQLType::DATE)
149
+ assert(results.get_base_type(4) == SQLType::DECIMAL)
150
+ assert(results.get_base_type(5) == SQLType::DOUBLE)
151
+ assert(results.get_base_type(6) == SQLType::FLOAT)
152
+ assert(results.get_base_type(7) == SQLType::INTEGER)
153
+ assert(results.get_base_type(8) == SQLType::NUMERIC)
154
+ assert(results.get_base_type(9) == SQLType::SMALLINT)
155
+ assert(results.get_base_type(10) == SQLType::TIME)
156
+ assert(results.get_base_type(11) == SQLType::TIMESTAMP)
157
+ assert(results.get_base_type(12) == SQLType::VARCHAR)
158
+ ensure
159
+ results.close if results != nil
160
+ end
161
+ end
162
+ end
data/test/RoleTest.rb ADDED
@@ -0,0 +1,73 @@
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 RoleTest < Test::Unit::TestCase
11
+ CURDIR = "#{Dir.getwd}"
12
+ DB_FILE = "#{CURDIR}#{File::SEPARATOR}role_unit_test.fdb"
13
+
14
+ def setup
15
+ puts "#{self.class.name} started." if TEST_LOGGING
16
+ # Remove existing database files.
17
+ @database = Database.new(DB_FILE)
18
+ if File.exist?(DB_FILE)
19
+ @database.drop(DB_USER_NAME, DB_PASSWORD)
20
+ end
21
+ Database.create(DB_FILE, DB_USER_NAME, DB_PASSWORD)
22
+
23
+ @sm = ServiceManager.new('localhost')
24
+ @sm.connect(DB_USER_NAME, DB_PASSWORD)
25
+
26
+ au = AddUser.new('user1', 'password', 'first', 'middle', 'last')
27
+ au.execute(@sm)
28
+ sleep(3)
29
+ end
30
+
31
+ def teardown
32
+ ru = RemoveUser.new('user1')
33
+ ru.execute(@sm)
34
+ sleep(3)
35
+
36
+ @sm.disconnect
37
+
38
+ # Remove existing database files.
39
+ if File.exist?(DB_FILE)
40
+ @database.drop(DB_USER_NAME, DB_PASSWORD)
41
+ end
42
+ puts "#{self.class.name} finished." if TEST_LOGGING
43
+ end
44
+
45
+ def test01
46
+ cxn = @database.connect(DB_USER_NAME, DB_PASSWORD)
47
+ cxn.execute_immediate('CREATE TABLE TEST (field1 INTEGER)')
48
+ cxn.execute_immediate('CREATE role myrole')
49
+ cxn.execute_immediate('GRANT myrole to user1')
50
+ cxn.execute_immediate('GRANT ALL on TEST to myrole')
51
+ cxn.close
52
+
53
+ cxn = @database.connect('user1', 'password')
54
+ assert_raise FireRubyException do
55
+ t1 = cxn.start_transaction
56
+ r = ResultSet.new(cxn, t1, "select * from test", 3, nil)
57
+ r.fetch
58
+ r.close
59
+ t1.commit
60
+ end
61
+ cxn.close
62
+
63
+ cxn = @database.connect('user1', 'password', {Connection::SQL_ROLE_NAME => "myrole"})
64
+ assert_nothing_raised do
65
+ t1 = cxn.start_transaction
66
+ r = ResultSet.new(cxn, t1, "select * from test", 3, nil)
67
+ r.fetch
68
+ r.close
69
+ t1.commit
70
+ end
71
+ cxn.close
72
+ end
73
+ end