dbi-dbrc 1.1.7-x86-mingw32 → 1.1.8-x86-mingw32

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 (5) hide show
  1. data/CHANGES +4 -0
  2. data/dbi-dbrc.gemspec +1 -1
  3. data/lib/dbi/dbrc.rb +309 -305
  4. data/test/test_dbi_dbrc.rb +184 -184
  5. metadata +3 -3
data/CHANGES CHANGED
@@ -1,3 +1,7 @@
1
+ == 1.1.8 - 7-Oct-2010
2
+ * Fixed a logic bug in the constructor that primarily affected MS Windows with
3
+ regards to determining the user's home directory.
4
+
1
5
  == 1.1.7 - 6-Oct-2010
2
6
  * More robust file decryption/encryption for MS Windows.
3
7
  * Better platform checking for MS Windows.
@@ -2,7 +2,7 @@ require 'rubygems'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'dbi-dbrc'
5
- spec.version = '1.1.7'
5
+ spec.version = '1.1.8'
6
6
  spec.author = 'Daniel Berger'
7
7
  spec.email = 'djberg96@gmail.com'
8
8
  spec.license = 'Artistic 2.0'
@@ -1,305 +1,309 @@
1
- require 'rbconfig'
2
- require 'rubygems'
3
-
4
- if Config::CONFIG['host_os'] =~ /mswin|msdos|win32|mingw|cygwin/i
5
- require 'win32/dir'
6
- require 'win32/file'
7
- require 'win32/process'
8
- end
9
-
10
- require 'sys/admin'
11
-
12
- # The DBI module serves as a namespace only.
13
- module DBI
14
-
15
- # The DBRC class encapsulates a database resource config file.
16
- class DBRC
17
-
18
- # This error is raised if anything fails trying to read the config file.
19
- class Error < StandardError; end
20
-
21
- # The version of the dbi-dbrc library
22
- VERSION = '1.1.7'
23
-
24
- @@windows = Config::CONFIG['host_os'] =~ /mswin|msdos|win32|mingw|cygwin/i
25
-
26
- # The database or host to be connected to.
27
- attr_accessor :database
28
-
29
- # The user name used for the database or host connection.
30
- attr_accessor :user
31
-
32
- # The password associated with the database or host.
33
- attr_accessor :password
34
-
35
- # The driver associated with the database. This is used to internally to
36
- # construct the DSN.
37
- attr_accessor :driver
38
-
39
- # Data source name, e.g. "dbi:OCI8:your_database".
40
- attr_accessor :dsn
41
-
42
- # The maximum number of reconnects a program should make before giving up.
43
- attr_accessor :maximum_reconnects
44
-
45
- # The timeout, in seconds, for each connection attempt.
46
- attr_accessor :timeout
47
-
48
- # The interval, in seconds, between each connection attempt.
49
- attr_accessor :interval
50
-
51
- # The directory where the .dbrc file is stored.
52
- attr_accessor :dbrc_dir
53
-
54
- # The full path to the .dbrc file.
55
- attr_accessor :dbrc_file
56
-
57
- # Returns a new DBI::DBRC object. The contents of the object depend on
58
- # the arguments passed to the constructor. If only a database name is
59
- # passed, then the first entry found in the .dbrc file that matches that
60
- # database is parsed. If a user name is also included, then the first
61
- # entry that matches both the database and user name is parsed.
62
- #
63
- # If a directory is passed as the third argument, then DBRC will look
64
- # in that directory, instead of the default directory, for the .dbrc
65
- # file.
66
- #
67
- # If an entry cannot be found for the database, or database plus user
68
- # combination, then a Error is raised. If the .dbrc file cannot be
69
- # found, or is setup improperly with regards to permissions or properties
70
- # then a DBI::DBRC::Error is raised.
71
- #
72
- # See the README for the rules regarding .dbrc files and permissions.
73
- #
74
- # Note that this library can also be used as a general password
75
- # storage mechanism. In that case simply treat the 'database' as the
76
- # host name, and ignore the DBI::DBRC#dsn and DBI::DBRC#driver methods.
77
- #
78
- # Examples:
79
- #
80
- # # Find the first match for 'some_database'
81
- # DBI::DBRC.new('some_database')
82
- #
83
- # # Find the first match for 'foo_user@some_database'
84
- # DBI::DBRC.new('some_database', 'foo_user')
85
- #
86
- # # Find the first match for 'foo_user@some_database' under /usr/local
87
- # DBI::DBRC.new('some_database', 'foo_usr', '/usr/local')
88
- #
89
- def initialize(database, user=nil, dbrc_dir=nil)
90
- if dbrc_dir.nil?
91
- uid = Process.uid
92
- home = ENV['HOME'] || ENV['USERPROFILE']
93
-
94
- if home.nil?
95
- if @@windows
96
- home ||= Sys::Admin.get_user(uid, :localaccount => true).dir
97
- else
98
- home ||= Sys::Admin.get_user(uid).dir
99
- end
100
- end
101
-
102
- # Default to the app data directory on Windows if no home dir found
103
- if @@windows && home.nil?
104
- @dbrc_file = File.join(File.basename(Dir::APPDATA), '.dbrc')
105
- else
106
- uid = Process.uid
107
- @dbrc_file = File.join(Sys::Admin.get_user(uid).dir, '.dbrc')
108
- end
109
- else
110
- raise Error, 'bad directory' unless File.directory?(dbrc_dir)
111
- @dbrc_file = File.join(dbrc_dir, '.dbrc')
112
- end
113
-
114
- @dbrc_dir = dbrc_dir
115
- @database = database
116
- @user = user
117
- encrypted = false # Win32 only
118
-
119
- @driver = nil
120
- @interval = nil
121
- @timeout = nil
122
- @maximum_reconnects = nil
123
-
124
- check_file()
125
-
126
- # Decrypt and re-encrypt the file if we're on MS Windows and the
127
- # file is encrypted.
128
- begin
129
- if @@windows && File.encrypted?(@dbrc_file)
130
- file_was_encrypted = true
131
- File.decrypt(@dbrc_file)
132
- end
133
-
134
- parse_dbrc_config_file()
135
- validate_data()
136
- convert_numeric_strings()
137
- create_dsn_string()
138
- ensure
139
- if @@windows && file_was_encrypted
140
- File.encrypt(@dbrc_file)
141
- end
142
- end
143
- end
144
-
145
- # Inspection of the DBI::DBRC object. This is identical to the standard
146
- # Ruby Object#inspect, except that the password field is filtered.
147
- #
148
- def inspect
149
- str = instance_variables.map{ |iv|
150
- if iv == '@password'
151
- "#{iv}=[FILTERED]"
152
- else
153
- "#{iv}=#{instance_variable_get(iv).inspect}"
154
- end
155
- }.join(', ')
156
-
157
- "#<#{self.class}:0x#{(self.object_id*2).to_s(16)} " << str << ">"
158
- end
159
-
160
- private
161
-
162
- # Ensure that the user/password has been set
163
- def validate_data
164
- unless @user
165
- raise Error, "no user found associated with #{@database}"
166
- end
167
-
168
- unless @password
169
- raise Error, "password not defined for #{@user}@#{@database}"
170
- end
171
- end
172
-
173
- # Converts strings that should be numbers into actual numbers
174
- def convert_numeric_strings
175
- @interval = @interval.to_i if @interval
176
- @timeout = @timeout.to_i if @timeout
177
- @maximum_reconnects = @maximum_reconnects.to_i if @maximum_reconnects
178
- end
179
-
180
- # Create the dsn string if the driver is defined
181
- def create_dsn_string
182
- @dsn = "dbi:#{@driver}:#{@database}" if @driver
183
- end
184
-
185
- # Check ownership and permissions
186
- def check_file(file=@dbrc_file)
187
- File.open(file){ |f|
188
- # Permissions must be set to 600 or better on Unix systems.
189
- # Must be hidden on Win32 systems.
190
- if @@windows
191
- unless File.hidden?(file)
192
- raise Error, "The .dbrc file must be hidden"
193
- end
194
- else
195
- unless (f.stat.mode & 077) == 0
196
- raise Error, "Bad .dbrc file permissions"
197
- end
198
- end
199
-
200
- # Only the owner may use it
201
- unless f.stat.owned?
202
- raise Error, "Not owner of .dbrc file"
203
- end
204
- }
205
- end
206
-
207
- # Parse the text out of the .dbrc file. This is the only method you
208
- # need to redefine if writing your own config handler.
209
- def parse_dbrc_config_file(file=@dbrc_file)
210
- IO.foreach(file){ |line|
211
- next if line =~ /^#/ # Ignore comments
212
- db, user, pwd, driver, timeout, max, interval = line.split
213
-
214
- next unless @database == db
215
-
216
- if @user
217
- next unless @user == user
218
- end
219
-
220
- @user = user
221
- @password = pwd
222
- @driver = driver
223
- @timeout = timeout
224
- @maximum_reconnects = max
225
- @interval = interval
226
- return
227
- }
228
-
229
- # If we reach here it means the database and/or user wasn't found
230
- if @user
231
- err = "no record found for #{@user}@#{@database}"
232
- else
233
- err = "no record found for #{@database}"
234
- end
235
-
236
- raise Error, err
237
- end
238
-
239
- alias_method(:db, :database)
240
- alias_method(:db=, :database=)
241
- alias_method(:passwd, :password)
242
- alias_method(:passwd=, :password=)
243
- alias_method(:max_reconn, :maximum_reconnects)
244
- alias_method(:max_reconn=, :maximum_reconnects=)
245
- alias_method(:time_out, :timeout)
246
- alias_method(:time_out=, :timeout=)
247
- alias_method(:host, :database)
248
- end
249
-
250
- # A subclass of DBRC designed to handle .dbrc files in XML format. The
251
- # public methods of this class are identical to DBRC.
252
- class XML < DBRC
253
- require "rexml/document"
254
- include REXML
255
-
256
- private
257
-
258
- def parse_dbrc_config_file(file=@dbrc_file)
259
- doc = Document.new(File.new(file))
260
- fields = %w/user password driver interval timeout maximum_reconnects/
261
- doc.elements.each("/dbrc/database"){ |element|
262
- next unless element.attributes["name"] == database
263
- if @user
264
- next unless element.elements["user"].text == @user
265
- end
266
- fields.each{ |field|
267
- val = element.elements[field]
268
- unless val.nil?
269
- send("#{field}=",val.text)
270
- end
271
- }
272
- return
273
- }
274
- # If we reach here it means the database and/or user wasn't found
275
- raise Error, "No record found for #{@user}@#{@database}"
276
- end
277
- end
278
-
279
- # A subclass of DBRC designed to handle .dbrc files in YAML format. The
280
- # public methods of this class are identical to DBRC.
281
- class YML < DBRC
282
- require "yaml"
283
-
284
- private
285
-
286
- def parse_dbrc_config_file(file=@dbrc_file)
287
- config = YAML.load(File.open(file))
288
- config.each{ |hash|
289
- hash.each{ |db,info|
290
- next unless db == @database
291
- next unless @user == info["user"] if @user
292
- @user = info["user"]
293
- @password = info["password"]
294
- @driver = info["driver"]
295
- @interval = info["interval"]
296
- @timeout = info["timeout"]
297
- @maximum_reconnects = info["max_reconn"]
298
- return
299
- }
300
- }
301
- # If we reach this point, it means the database wasn't found
302
- raise Error, "No entry found for #{@user}@#{@database}"
303
- end
304
- end
305
- end
1
+ require 'rbconfig'
2
+ require 'rubygems'
3
+
4
+ if Config::CONFIG['host_os'] =~ /mswin|msdos|win32|mingw|cygwin/i
5
+ require 'win32/dir'
6
+ require 'win32/file'
7
+ require 'win32/process'
8
+ end
9
+
10
+ require 'sys/admin'
11
+
12
+ # The DBI module serves as a namespace only.
13
+ module DBI
14
+
15
+ # The DBRC class encapsulates a database resource config file.
16
+ class DBRC
17
+
18
+ # This error is raised if anything fails trying to read the config file.
19
+ class Error < StandardError; end
20
+
21
+ # The version of the dbi-dbrc library
22
+ VERSION = '1.1.8'
23
+
24
+ @@windows = Config::CONFIG['host_os'] =~ /mswin|msdos|win32|mingw|cygwin/i
25
+
26
+ # The database or host to be connected to.
27
+ attr_accessor :database
28
+
29
+ # The user name used for the database or host connection.
30
+ attr_accessor :user
31
+
32
+ # The password associated with the database or host.
33
+ attr_accessor :password
34
+
35
+ # The driver associated with the database. This is used to internally to
36
+ # construct the DSN.
37
+ attr_accessor :driver
38
+
39
+ # Data source name, e.g. "dbi:OCI8:your_database".
40
+ attr_accessor :dsn
41
+
42
+ # The maximum number of reconnects a program should make before giving up.
43
+ attr_accessor :maximum_reconnects
44
+
45
+ # The timeout, in seconds, for each connection attempt.
46
+ attr_accessor :timeout
47
+
48
+ # The interval, in seconds, between each connection attempt.
49
+ attr_accessor :interval
50
+
51
+ # The directory where the .dbrc file is stored.
52
+ attr_accessor :dbrc_dir
53
+
54
+ # The full path to the .dbrc file.
55
+ attr_accessor :dbrc_file
56
+
57
+ # Returns a new DBI::DBRC object. The contents of the object depend on
58
+ # the arguments passed to the constructor. If only a database name is
59
+ # passed, then the first entry found in the .dbrc file that matches that
60
+ # database is parsed. If a user name is also included, then the first
61
+ # entry that matches both the database and user name is parsed.
62
+ #
63
+ # If a directory is passed as the third argument, then DBRC will look
64
+ # in that directory, instead of the default directory, for the .dbrc
65
+ # file.
66
+ #
67
+ # If an entry cannot be found for the database, or database plus user
68
+ # combination, then a Error is raised. If the .dbrc file cannot be
69
+ # found, or is setup improperly with regards to permissions or properties
70
+ # then a DBI::DBRC::Error is raised.
71
+ #
72
+ # See the README for the rules regarding .dbrc files and permissions.
73
+ #
74
+ # Note that this library can also be used as a general password
75
+ # storage mechanism. In that case simply treat the 'database' as the
76
+ # host name, and ignore the DBI::DBRC#dsn and DBI::DBRC#driver methods.
77
+ #
78
+ # Examples:
79
+ #
80
+ # # Find the first match for 'some_database'
81
+ # DBI::DBRC.new('some_database')
82
+ #
83
+ # # Find the first match for 'foo_user@some_database'
84
+ # DBI::DBRC.new('some_database', 'foo_user')
85
+ #
86
+ # # Find the first match for 'foo_user@some_database' under /usr/local
87
+ # DBI::DBRC.new('some_database', 'foo_usr', '/usr/local')
88
+ #
89
+ def initialize(database, user=nil, dbrc_dir=nil)
90
+ if dbrc_dir.nil?
91
+ uid = Process.uid
92
+ home = ENV['HOME'] || ENV['USERPROFILE']
93
+
94
+ if home.nil?
95
+ if @@windows
96
+ home ||= Sys::Admin.get_user(uid, :localaccount => true).dir
97
+ else
98
+ home ||= Sys::Admin.get_user(uid).dir
99
+ end
100
+ end
101
+
102
+ # Default to the app data directory on Windows, or root on Unix, if
103
+ # no home dir can be found.
104
+ if home.nil?
105
+ if @@windows
106
+ home = Dir::APPDATA
107
+ else
108
+ home = '/'
109
+ end
110
+ end
111
+
112
+ @dbrc_file = File.join(home, '.dbrc')
113
+ else
114
+ raise Error, 'bad directory' unless File.directory?(dbrc_dir)
115
+ @dbrc_file = File.join(dbrc_dir, '.dbrc')
116
+ end
117
+
118
+ @dbrc_dir = dbrc_dir
119
+ @database = database
120
+ @user = user
121
+ encrypted = false # Win32 only
122
+
123
+ @driver = nil
124
+ @interval = nil
125
+ @timeout = nil
126
+ @maximum_reconnects = nil
127
+
128
+ check_file()
129
+
130
+ # Decrypt and re-encrypt the file if we're on MS Windows and the
131
+ # file is encrypted.
132
+ begin
133
+ if @@windows && File.encrypted?(@dbrc_file)
134
+ file_was_encrypted = true
135
+ File.decrypt(@dbrc_file)
136
+ end
137
+
138
+ parse_dbrc_config_file()
139
+ validate_data()
140
+ convert_numeric_strings()
141
+ create_dsn_string()
142
+ ensure
143
+ if @@windows && file_was_encrypted
144
+ File.encrypt(@dbrc_file)
145
+ end
146
+ end
147
+ end
148
+
149
+ # Inspection of the DBI::DBRC object. This is identical to the standard
150
+ # Ruby Object#inspect, except that the password field is filtered.
151
+ #
152
+ def inspect
153
+ str = instance_variables.map{ |iv|
154
+ if iv == '@password'
155
+ "#{iv}=[FILTERED]"
156
+ else
157
+ "#{iv}=#{instance_variable_get(iv).inspect}"
158
+ end
159
+ }.join(', ')
160
+
161
+ "#<#{self.class}:0x#{(self.object_id*2).to_s(16)} " << str << ">"
162
+ end
163
+
164
+ private
165
+
166
+ # Ensure that the user/password has been set
167
+ def validate_data
168
+ unless @user
169
+ raise Error, "no user found associated with #{@database}"
170
+ end
171
+
172
+ unless @password
173
+ raise Error, "password not defined for #{@user}@#{@database}"
174
+ end
175
+ end
176
+
177
+ # Converts strings that should be numbers into actual numbers
178
+ def convert_numeric_strings
179
+ @interval = @interval.to_i if @interval
180
+ @timeout = @timeout.to_i if @timeout
181
+ @maximum_reconnects = @maximum_reconnects.to_i if @maximum_reconnects
182
+ end
183
+
184
+ # Create the dsn string if the driver is defined
185
+ def create_dsn_string
186
+ @dsn = "dbi:#{@driver}:#{@database}" if @driver
187
+ end
188
+
189
+ # Check ownership and permissions
190
+ def check_file(file=@dbrc_file)
191
+ File.open(file){ |f|
192
+ # Permissions must be set to 600 or better on Unix systems.
193
+ # Must be hidden on Win32 systems.
194
+ if @@windows
195
+ unless File.hidden?(file)
196
+ raise Error, "The .dbrc file must be hidden"
197
+ end
198
+ else
199
+ unless (f.stat.mode & 077) == 0
200
+ raise Error, "Bad .dbrc file permissions"
201
+ end
202
+ end
203
+
204
+ # Only the owner may use it
205
+ unless f.stat.owned?
206
+ raise Error, "Not owner of .dbrc file"
207
+ end
208
+ }
209
+ end
210
+
211
+ # Parse the text out of the .dbrc file. This is the only method you
212
+ # need to redefine if writing your own config handler.
213
+ def parse_dbrc_config_file(file=@dbrc_file)
214
+ IO.foreach(file){ |line|
215
+ next if line =~ /^#/ # Ignore comments
216
+ db, user, pwd, driver, timeout, max, interval = line.split
217
+
218
+ next unless @database == db
219
+
220
+ if @user
221
+ next unless @user == user
222
+ end
223
+
224
+ @user = user
225
+ @password = pwd
226
+ @driver = driver
227
+ @timeout = timeout
228
+ @maximum_reconnects = max
229
+ @interval = interval
230
+ return
231
+ }
232
+
233
+ # If we reach here it means the database and/or user wasn't found
234
+ if @user
235
+ err = "no record found for #{@user}@#{@database}"
236
+ else
237
+ err = "no record found for #{@database}"
238
+ end
239
+
240
+ raise Error, err
241
+ end
242
+
243
+ alias_method(:db, :database)
244
+ alias_method(:db=, :database=)
245
+ alias_method(:passwd, :password)
246
+ alias_method(:passwd=, :password=)
247
+ alias_method(:max_reconn, :maximum_reconnects)
248
+ alias_method(:max_reconn=, :maximum_reconnects=)
249
+ alias_method(:time_out, :timeout)
250
+ alias_method(:time_out=, :timeout=)
251
+ alias_method(:host, :database)
252
+ end
253
+
254
+ # A subclass of DBRC designed to handle .dbrc files in XML format. The
255
+ # public methods of this class are identical to DBRC.
256
+ class XML < DBRC
257
+ require "rexml/document"
258
+ include REXML
259
+
260
+ private
261
+
262
+ def parse_dbrc_config_file(file=@dbrc_file)
263
+ doc = Document.new(File.new(file))
264
+ fields = %w/user password driver interval timeout maximum_reconnects/
265
+ doc.elements.each("/dbrc/database"){ |element|
266
+ next unless element.attributes["name"] == database
267
+ if @user
268
+ next unless element.elements["user"].text == @user
269
+ end
270
+ fields.each{ |field|
271
+ val = element.elements[field]
272
+ unless val.nil?
273
+ send("#{field}=",val.text)
274
+ end
275
+ }
276
+ return
277
+ }
278
+ # If we reach here it means the database and/or user wasn't found
279
+ raise Error, "No record found for #{@user}@#{@database}"
280
+ end
281
+ end
282
+
283
+ # A subclass of DBRC designed to handle .dbrc files in YAML format. The
284
+ # public methods of this class are identical to DBRC.
285
+ class YML < DBRC
286
+ require "yaml"
287
+
288
+ private
289
+
290
+ def parse_dbrc_config_file(file=@dbrc_file)
291
+ config = YAML.load(File.open(file))
292
+ config.each{ |hash|
293
+ hash.each{ |db,info|
294
+ next unless db == @database
295
+ next unless @user == info["user"] if @user
296
+ @user = info["user"]
297
+ @password = info["password"]
298
+ @driver = info["driver"]
299
+ @interval = info["interval"]
300
+ @timeout = info["timeout"]
301
+ @maximum_reconnects = info["max_reconn"]
302
+ return
303
+ }
304
+ }
305
+ # If we reach this point, it means the database wasn't found
306
+ raise Error, "No entry found for #{@user}@#{@database}"
307
+ end
308
+ end
309
+ end
@@ -12,190 +12,190 @@ require 'test/unit'
12
12
  include DBI
13
13
 
14
14
  class TC_DBI_DBRC < Test::Unit::TestCase
15
- def self.startup
16
- @@windows = File::ALT_SEPARATOR
17
- end
18
-
19
- def setup
20
- @dir = File.join(Dir.pwd, 'examples/plain')
21
- @file = File.join(@dir, '.dbrc')
22
- @db1 = 'foo'
23
- @db2 = 'bar'
24
- @user1 = 'user1'
25
- @user2 = 'user2'
26
- @db_bad = 'blah' # Doesn't exist
27
- @user_bad = 'user8' # Doesn't exist
15
+ def self.startup
16
+ @@windows = File::ALT_SEPARATOR
17
+ end
18
+
19
+ def setup
20
+ @dir = File.join(Dir.pwd, 'examples/plain')
21
+ @file = File.join(@dir, '.dbrc')
22
+ @db1 = 'foo'
23
+ @db2 = 'bar'
24
+ @user1 = 'user1'
25
+ @user2 = 'user2'
26
+ @db_bad = 'blah' # Doesn't exist
27
+ @user_bad = 'user8' # Doesn't exist
28
28
 
29
- if @@windows && File.respond_to?(:set_attr)
30
- File.set_attr(@file, File::HIDDEN)
31
- else
32
- File.chmod(0600, @file)
33
- end
29
+ if @@windows && File.respond_to?(:set_attr)
30
+ File.set_attr(@file, File::HIDDEN)
31
+ else
32
+ File.chmod(0600, @file)
33
+ end
34
34
 
35
- @dbrc = DBRC.new(@db1, nil, @dir)
36
- end
37
-
38
- def test_version
39
- assert_equal('1.1.7', DBRC::VERSION)
40
- end
41
-
42
- def test_bad_dbrc_properties
43
- if @@windows
44
- File.unset_attr(@file, File::HIDDEN)
45
- assert_raises(DBRC::Error){ DBRC.new(@db1, @user1, @dir) }
46
- else
47
- File.chmod(0555,@file)
48
- assert_raises(DBRC::Error){ DBRC.new(@db1, @user1, @dir) }
49
- end
50
- end
51
-
52
- def test_constructor
53
- assert_raises(ArgumentError){ DBRC.new }
54
- assert_nothing_raised{ DBRC.new(@db1, @user1, @dir) }
55
- assert_nothing_raised{ DBRC.new(@db1, nil, @dir) }
56
- end
57
-
58
- def test_bad_database
59
- assert_raise(DBRC::Error){ DBRC.new(@db_bad, nil, @dir) }
60
- end
61
-
62
- def test_bad_user
63
- assert_raise(DBRC::Error){ DBRC.new(@db1, @user_bad, @dir) }
64
- end
65
-
66
- def test_bad_dir
67
- assert_raise(DBI::DBRC::Error){ DBI::DBRC.new(@db1, @user1, '/bogusXX') }
68
- end
69
-
70
- def test_database
71
- assert_respond_to(@dbrc, :database)
72
- assert_respond_to(@dbrc, :database=)
73
- assert_respond_to(@dbrc, :db)
74
- assert_respond_to(@dbrc, :db=)
75
- assert_kind_of(String, @dbrc.db)
76
- end
77
-
78
- def test_host_alias
79
- assert_respond_to(@dbrc, :host)
80
- assert_equal(true, @dbrc.method(:host) == @dbrc.method(:database))
81
- end
82
-
83
- def test_dbrc_dir
84
- assert_respond_to(@dbrc, :dbrc_dir)
85
- assert_equal(@dir, @dbrc.dbrc_dir)
86
- end
87
-
88
- def test_dbrc_file
89
- assert_respond_to(@dbrc, :dbrc_file)
90
- assert_equal('.dbrc', File.basename(@dbrc.dbrc_file))
91
- end
92
-
93
- def test_dsn
94
- assert_respond_to(@dbrc, :dsn)
95
- assert_respond_to(@dbrc, :dsn=)
96
- end
97
-
98
- def test_user
99
- assert_respond_to(@dbrc, :user)
100
- assert_respond_to(@dbrc, :user=)
101
- assert_kind_of(String, @dbrc.user)
102
- end
103
-
104
- def test_password
105
- assert_respond_to(@dbrc, :password)
106
- assert_respond_to(@dbrc, :password=)
107
- assert_respond_to(@dbrc, :passwd)
108
- assert_respond_to(@dbrc, :passwd=)
109
- assert_kind_of(String, @dbrc.password)
110
- end
111
-
112
- def test_driver
113
- assert_respond_to(@dbrc, :driver)
114
- assert_respond_to(@dbrc, :driver=)
115
- assert_kind_of(String, @dbrc.driver)
116
- end
117
-
118
- def test_interval
119
- assert_respond_to(@dbrc, :interval)
120
- assert_respond_to(@dbrc, :interval=)
121
- assert_kind_of(Fixnum, @dbrc.interval)
122
- end
123
-
124
- def test_timeout
125
- assert_respond_to(@dbrc, :timeout)
126
- assert_respond_to(@dbrc, :timeout=)
127
- assert_respond_to(@dbrc, :time_out)
128
- assert_respond_to(@dbrc, :time_out=)
129
- assert_kind_of(Fixnum, @dbrc.timeout)
130
- end
131
-
132
- def test_max_reconn
133
- assert_respond_to(@dbrc, :max_reconn)
134
- assert_respond_to(@dbrc, :max_reconn=)
135
- assert_respond_to(@dbrc, :maximum_reconnects)
136
- assert_respond_to(@dbrc, :maximum_reconnects=)
137
- assert_kind_of(Fixnum, @dbrc.maximum_reconnects)
138
- end
139
-
140
- def test_sample_values
141
- assert_equal("foo", @dbrc.database)
142
- assert_equal("user1", @dbrc.user)
143
- assert_equal("pwd1", @dbrc.passwd)
144
- assert_equal("Oracle", @dbrc.driver)
145
- assert_equal(60, @dbrc.interval)
146
- assert_equal(40, @dbrc.timeout)
147
- assert_equal(3, @dbrc.max_reconn)
148
- assert_equal("dbi:Oracle:foo", @dbrc.dsn)
149
- end
150
-
151
- # Same database, different user
152
- def test_duplicate_database
153
- db = DBRC.new("foo", "user2", @dir)
154
- assert_equal("user2", db.user)
155
- assert_equal("pwd2", db.passwd)
156
- assert_equal("OCI8", db.driver)
157
- assert_equal(60, db.interval)
158
- assert_equal(60, db.timeout)
159
- assert_equal(4, db.max_reconn)
160
- assert_equal("dbi:OCI8:foo", db.dsn)
161
- end
162
-
163
- # Different database, different user
164
- def test_different_database
165
- db = DBRC.new("bar", "user1", @dir)
166
- assert_equal("user1", db.user)
167
- assert_equal("pwd3", db.passwd)
168
- assert_equal("Oracle", db.driver)
169
- assert_equal(30, db.interval)
170
- assert_equal(30, db.timeout)
171
- assert_equal(2, db.max_reconn)
172
- assert_equal("dbi:Oracle:bar", db.dsn)
173
- end
174
-
175
- # A database with only a couple fields defined
176
- def test_nil_values
177
- db = DBRC.new("baz", "user3", @dir)
178
- assert_equal("user3", db.user)
179
- assert_equal("pwd4", db.passwd)
180
- assert_nil(db.driver)
181
- assert_nil(db.interval)
182
- assert_nil(db.timeout)
183
- assert_nil(db.max_reconn)
184
- assert_nil(db.dsn)
185
- end
186
-
187
- def teardown
188
- @dir = nil
189
- @db1 = nil
190
- @db2 = nil
191
- @user1 = nil
192
- @user2 = nil
193
- @db_bad = nil
194
- @user_bad = nil
195
- @dbrc = nil
196
- end
197
-
198
- def self.shutdown
199
- @@windows = nil
200
- end
35
+ @dbrc = DBRC.new(@db1, nil, @dir)
36
+ end
37
+
38
+ def test_version
39
+ assert_equal('1.1.8', DBRC::VERSION)
40
+ end
41
+
42
+ def test_bad_dbrc_properties
43
+ if @@windows
44
+ File.unset_attr(@file, File::HIDDEN)
45
+ assert_raises(DBRC::Error){ DBRC.new(@db1, @user1, @dir) }
46
+ else
47
+ File.chmod(0555,@file)
48
+ assert_raises(DBRC::Error){ DBRC.new(@db1, @user1, @dir) }
49
+ end
50
+ end
51
+
52
+ def test_constructor
53
+ assert_raises(ArgumentError){ DBRC.new }
54
+ assert_nothing_raised{ DBRC.new(@db1, @user1, @dir) }
55
+ assert_nothing_raised{ DBRC.new(@db1, nil, @dir) }
56
+ end
57
+
58
+ def test_bad_database
59
+ assert_raise(DBRC::Error){ DBRC.new(@db_bad, nil, @dir) }
60
+ end
61
+
62
+ def test_bad_user
63
+ assert_raise(DBRC::Error){ DBRC.new(@db1, @user_bad, @dir) }
64
+ end
65
+
66
+ def test_bad_dir
67
+ assert_raise(DBI::DBRC::Error){ DBI::DBRC.new(@db1, @user1, '/bogusXX') }
68
+ end
69
+
70
+ def test_database
71
+ assert_respond_to(@dbrc, :database)
72
+ assert_respond_to(@dbrc, :database=)
73
+ assert_respond_to(@dbrc, :db)
74
+ assert_respond_to(@dbrc, :db=)
75
+ assert_kind_of(String, @dbrc.db)
76
+ end
77
+
78
+ def test_host_alias
79
+ assert_respond_to(@dbrc, :host)
80
+ assert_equal(true, @dbrc.method(:host) == @dbrc.method(:database))
81
+ end
82
+
83
+ def test_dbrc_dir
84
+ assert_respond_to(@dbrc, :dbrc_dir)
85
+ assert_equal(@dir, @dbrc.dbrc_dir)
86
+ end
87
+
88
+ def test_dbrc_file
89
+ assert_respond_to(@dbrc, :dbrc_file)
90
+ assert_equal('.dbrc', File.basename(@dbrc.dbrc_file))
91
+ end
92
+
93
+ def test_dsn
94
+ assert_respond_to(@dbrc, :dsn)
95
+ assert_respond_to(@dbrc, :dsn=)
96
+ end
97
+
98
+ def test_user
99
+ assert_respond_to(@dbrc, :user)
100
+ assert_respond_to(@dbrc, :user=)
101
+ assert_kind_of(String, @dbrc.user)
102
+ end
103
+
104
+ def test_password
105
+ assert_respond_to(@dbrc, :password)
106
+ assert_respond_to(@dbrc, :password=)
107
+ assert_respond_to(@dbrc, :passwd)
108
+ assert_respond_to(@dbrc, :passwd=)
109
+ assert_kind_of(String, @dbrc.password)
110
+ end
111
+
112
+ def test_driver
113
+ assert_respond_to(@dbrc, :driver)
114
+ assert_respond_to(@dbrc, :driver=)
115
+ assert_kind_of(String, @dbrc.driver)
116
+ end
117
+
118
+ def test_interval
119
+ assert_respond_to(@dbrc, :interval)
120
+ assert_respond_to(@dbrc, :interval=)
121
+ assert_kind_of(Fixnum, @dbrc.interval)
122
+ end
123
+
124
+ def test_timeout
125
+ assert_respond_to(@dbrc, :timeout)
126
+ assert_respond_to(@dbrc, :timeout=)
127
+ assert_respond_to(@dbrc, :time_out)
128
+ assert_respond_to(@dbrc, :time_out=)
129
+ assert_kind_of(Fixnum, @dbrc.timeout)
130
+ end
131
+
132
+ def test_max_reconn
133
+ assert_respond_to(@dbrc, :max_reconn)
134
+ assert_respond_to(@dbrc, :max_reconn=)
135
+ assert_respond_to(@dbrc, :maximum_reconnects)
136
+ assert_respond_to(@dbrc, :maximum_reconnects=)
137
+ assert_kind_of(Fixnum, @dbrc.maximum_reconnects)
138
+ end
139
+
140
+ def test_sample_values
141
+ assert_equal("foo", @dbrc.database)
142
+ assert_equal("user1", @dbrc.user)
143
+ assert_equal("pwd1", @dbrc.passwd)
144
+ assert_equal("Oracle", @dbrc.driver)
145
+ assert_equal(60, @dbrc.interval)
146
+ assert_equal(40, @dbrc.timeout)
147
+ assert_equal(3, @dbrc.max_reconn)
148
+ assert_equal("dbi:Oracle:foo", @dbrc.dsn)
149
+ end
150
+
151
+ # Same database, different user
152
+ def test_duplicate_database
153
+ db = DBRC.new("foo", "user2", @dir)
154
+ assert_equal("user2", db.user)
155
+ assert_equal("pwd2", db.passwd)
156
+ assert_equal("OCI8", db.driver)
157
+ assert_equal(60, db.interval)
158
+ assert_equal(60, db.timeout)
159
+ assert_equal(4, db.max_reconn)
160
+ assert_equal("dbi:OCI8:foo", db.dsn)
161
+ end
162
+
163
+ # Different database, different user
164
+ def test_different_database
165
+ db = DBRC.new("bar", "user1", @dir)
166
+ assert_equal("user1", db.user)
167
+ assert_equal("pwd3", db.passwd)
168
+ assert_equal("Oracle", db.driver)
169
+ assert_equal(30, db.interval)
170
+ assert_equal(30, db.timeout)
171
+ assert_equal(2, db.max_reconn)
172
+ assert_equal("dbi:Oracle:bar", db.dsn)
173
+ end
174
+
175
+ # A database with only a couple fields defined
176
+ def test_nil_values
177
+ db = DBRC.new("baz", "user3", @dir)
178
+ assert_equal("user3", db.user)
179
+ assert_equal("pwd4", db.passwd)
180
+ assert_nil(db.driver)
181
+ assert_nil(db.interval)
182
+ assert_nil(db.timeout)
183
+ assert_nil(db.max_reconn)
184
+ assert_nil(db.dsn)
185
+ end
186
+
187
+ def teardown
188
+ @dir = nil
189
+ @db1 = nil
190
+ @db2 = nil
191
+ @user1 = nil
192
+ @user2 = nil
193
+ @db_bad = nil
194
+ @user_bad = nil
195
+ @dbrc = nil
196
+ end
197
+
198
+ def self.shutdown
199
+ @@windows = nil
200
+ end
201
201
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dbi-dbrc
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 3
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 1
9
- - 7
10
- version: 1.1.7
9
+ - 8
10
+ version: 1.1.8
11
11
  platform: x86-mingw32
12
12
  authors:
13
13
  - Daniel Berger