dbi 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -14,11 +14,11 @@ task :package => (map_task("package") + map_task("gem"))
14
14
  task :clobber_package => map_task("clobber_package")
15
15
 
16
16
  task :test_dbi do
17
- ruby "test/ts_dbi.rb"
17
+ ruby("test/ts_dbi.rb")
18
18
  end
19
19
 
20
20
  task :test_dbd do
21
- ruby "test/ts_dbd.rb"
21
+ ruby("test/ts_dbd.rb")
22
22
  end
23
23
 
24
24
  task :test => [:test_dbi, :test_dbd]
data/lib/dbi.rb CHANGED
@@ -90,7 +90,7 @@ Deprecate.set_action(
90
90
 
91
91
  #++
92
92
  module DBI
93
- VERSION = "0.4.0"
93
+ VERSION = "0.4.1"
94
94
 
95
95
  module DBD # :nodoc:
96
96
  API_VERSION = "0.3"
@@ -269,9 +269,10 @@ module DBI
269
269
  # driver handle.
270
270
 
271
271
  dr = nil
272
+ dr_error = nil
272
273
  begin
273
274
  dr = DBI::DBD.const_get(driver_name.intern)
274
- rescue NameError
275
+ rescue NameError => dr_error
275
276
  # caseless look for constants to find actual constant
276
277
  dc = driver_name.downcase
277
278
  found = DBI::DBD.constants.find { |e| e.downcase == dc }
@@ -283,6 +284,13 @@ module DBI
283
284
  # can fail for other reasons.
284
285
  if dr.nil?
285
286
  err = "Unable to load driver '#{driver_name}'"
287
+
288
+ if dr_error
289
+ err += " (underlying error: #{dr_error.message})"
290
+ else
291
+ err += " (BUG: could not determine underlying error)"
292
+ end
293
+
286
294
  raise DBI::InterfaceError, err
287
295
  end
288
296
 
@@ -8,6 +8,9 @@ module DBI
8
8
  # Optional" are defined in DBI::BaseDatabase.
9
9
  #
10
10
  class BaseStatement < Base
11
+
12
+ attr_accessor :raise_error
13
+
11
14
  def initialize(attr=nil)
12
15
  @attr = attr || {}
13
16
  end
@@ -154,6 +157,7 @@ module DBI
154
157
  # Get statement attributes.
155
158
  #
156
159
  def [](attr)
160
+ @attr ||= { }
157
161
  @attr[attr]
158
162
  end
159
163
 
@@ -1,6 +1,7 @@
1
1
  require 'delegate'
2
- require 'rubygems'
2
+
3
3
  begin
4
+ require 'rubygems'
4
5
  gem 'deprecated'
5
6
  rescue LoadError => e
6
7
  end
@@ -8,6 +8,9 @@ module DBI
8
8
  # Note: almost all methods in this class will raise InterfaceError if the
9
9
  # database is not connected.
10
10
  class DatabaseHandle < Handle
11
+
12
+ attr_accessor :raise_error
13
+
11
14
  # This is the driver name as supplied by the DBD's driver_name method.
12
15
  # Its primary utility is in DBI::TypeUtil#convert.
13
16
  def driver_name
@@ -34,7 +37,7 @@ module DBI
34
37
  # already done prior.
35
38
  #
36
39
  def disconnect
37
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
40
+ sanity_check
38
41
  @handle.disconnect
39
42
  @handle = nil
40
43
  end
@@ -45,10 +48,11 @@ module DBI
45
48
  # BaseStatement#finish it when the block is done executing.
46
49
  #
47
50
  def prepare(stmt)
48
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
51
+ sanity_check(stmt)
49
52
  sth = StatementHandle.new(@handle.prepare(stmt), false, true, @convert_types)
50
53
  # FIXME trace sth.trace(@trace_mode, @trace_output)
51
54
  sth.dbh = self
55
+ sth.raise_error = raise_error
52
56
 
53
57
  if block_given?
54
58
  begin
@@ -65,15 +69,16 @@ module DBI
65
69
  # Prepare and execute a statement. It has block semantics equivalent to #prepare.
66
70
  #
67
71
  def execute(stmt, *bindvars)
68
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
72
+ sanity_check(stmt)
69
73
 
70
74
  if @convert_types
71
75
  bindvars = DBI::Utils::ConvParam.conv_param(driver_name, *bindvars)
72
76
  end
73
77
 
74
- sth = StatementHandle.new(@handle.execute(stmt, *bindvars), true, false, @convert_types)
78
+ sth = StatementHandle.new(@handle.execute(stmt, *bindvars), true, true, @convert_types, true)
75
79
  # FIXME trace sth.trace(@trace_mode, @trace_output)
76
80
  sth.dbh = self
81
+ sth.raise_error = raise_error
77
82
 
78
83
  if block_given?
79
84
  begin
@@ -92,7 +97,8 @@ module DBI
92
97
  # #execute and #prepare. Should return a row modified count.
93
98
  #
94
99
  def do(stmt, *bindvars)
95
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
100
+ sanity_check(stmt)
101
+
96
102
  @handle.do(stmt, *DBI::Utils::ConvParam.conv_param(driver_name, *bindvars))
97
103
  end
98
104
 
@@ -100,7 +106,7 @@ module DBI
100
106
  # Executes a statement and returns the first row from the result.
101
107
  #
102
108
  def select_one(stmt, *bindvars)
103
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
109
+ sanity_check(stmt)
104
110
  row = nil
105
111
  execute(stmt, *bindvars) do |sth|
106
112
  row = sth.fetch
@@ -113,7 +119,7 @@ module DBI
113
119
  # is given, it is executed for each row.
114
120
  #
115
121
  def select_all(stmt, *bindvars, &p)
116
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
122
+ sanity_check(stmt)
117
123
  rows = nil
118
124
  execute(stmt, *bindvars) do |sth|
119
125
  if block_given?
@@ -129,7 +135,7 @@ module DBI
129
135
  # Return the tables available to this DatabaseHandle as an array of strings.
130
136
  #
131
137
  def tables
132
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
138
+ sanity_check
133
139
  @handle.tables
134
140
  end
135
141
 
@@ -139,7 +145,7 @@ module DBI
139
145
  # this method must provide.
140
146
  #
141
147
  def columns( table )
142
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
148
+ sanity_check
143
149
  @handle.columns( table ).collect {|col| ColumnInfo.new(col) }
144
150
  end
145
151
 
@@ -149,7 +155,7 @@ module DBI
149
155
  # is an active operation that will contact the database.
150
156
  #
151
157
  def ping
152
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
158
+ sanity_check
153
159
  @handle.ping
154
160
  end
155
161
 
@@ -157,7 +163,7 @@ module DBI
157
163
  # Attempt to escape the value, rendering it suitable for inclusion in a SQL statement.
158
164
  #
159
165
  def quote(value)
160
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
166
+ sanity_check
161
167
  @handle.quote(value)
162
168
  end
163
169
 
@@ -165,7 +171,7 @@ module DBI
165
171
  # Force a commit to the database immediately.
166
172
  #
167
173
  def commit
168
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
174
+ sanity_check
169
175
  @handle.commit
170
176
  end
171
177
 
@@ -173,7 +179,7 @@ module DBI
173
179
  # Force a rollback to the database immediately.
174
180
  #
175
181
  def rollback
176
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
182
+ sanity_check
177
183
  @handle.rollback
178
184
  end
179
185
 
@@ -183,7 +189,7 @@ module DBI
183
189
  # Otherwise, commit occurs.
184
190
  #
185
191
  def transaction
186
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
192
+ sanity_check
187
193
  raise InterfaceError, "No block given" unless block_given?
188
194
 
189
195
  commit
@@ -198,14 +204,26 @@ module DBI
198
204
 
199
205
  # Get an attribute from the DatabaseHandle.
200
206
  def [] (attr)
201
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
207
+ sanity_check
202
208
  @handle[attr]
203
209
  end
204
210
 
205
211
  # Set an attribute on the DatabaseHandle.
206
212
  def []= (attr, val)
207
- raise InterfaceError, "Database connection was already closed!" if @handle.nil?
213
+ sanity_check
208
214
  @handle[attr] = val
209
215
  end
216
+
217
+ protected
218
+
219
+ def sanity_check(stmt=nil)
220
+ raise InterfaceError, "Database connection was already closed!" if @handle.nil?
221
+ check_statement(stmt) if stmt
222
+ end
223
+
224
+ # basic sanity checks for statements
225
+ def check_statement(stmt)
226
+ raise InterfaceError, "Statement is empty, or contains nothing but whitespace" if stmt !~ /\S/
227
+ end
210
228
  end
211
229
  end
@@ -12,11 +12,13 @@ module DBI
12
12
  include Enumerable
13
13
 
14
14
  attr_accessor :dbh
15
+ attr_accessor :raise_error
15
16
 
16
- def initialize(handle, fetchable=false, prepared=true, convert_types=true)
17
+ def initialize(handle, fetchable=false, prepared=true, convert_types=true, executed=false)
17
18
  super(handle)
18
19
  @fetchable = fetchable
19
20
  @prepared = prepared # only false if immediate execute was used
21
+ @executed = executed # only true if the statement was already executed.
20
22
  @cols = nil
21
23
  @coltypes = nil
22
24
  @convert_types = convert_types
@@ -68,8 +70,8 @@ module DBI
68
70
  # sth.finish
69
71
  #
70
72
  def bind_coltype(pos, type)
71
- raise InterfaceError, "statement must be executed before using this command" unless @executed
72
-
73
+ sanity_check({:prepared => true, :executed => true})
74
+
73
75
  coltypes = column_types
74
76
 
75
77
  if (pos - 1) < 1
@@ -85,8 +87,7 @@ module DBI
85
87
  # type if it's supposed to, adhering to the DBD's current ruleset.
86
88
  #
87
89
  def bind_param(param, value, attribs=nil)
88
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
89
- raise InterfaceError, "Statement wasn't prepared before." unless @prepared
90
+ sanity_check({ :prepared => true })
90
91
 
91
92
  if @convert_types
92
93
  value = DBI::Utils::ConvParam.conv_param(dbh.driver_name, value)[0]
@@ -105,8 +106,7 @@ module DBI
105
106
  # If arguments are supplied, these are fed to #bind_param.
106
107
  def execute(*bindvars)
107
108
  cancel # cancel before
108
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
109
- raise InterfaceError, "Statement wasn't prepared before." unless @prepared
109
+ sanity_check({:prepared => true })
110
110
 
111
111
  if @convert_types
112
112
  bindvars = DBI::Utils::ConvParam.conv_param(dbh.driver_name, *bindvars)
@@ -132,7 +132,7 @@ module DBI
132
132
  # inoperable and unavailable for further use.
133
133
  #
134
134
  def finish
135
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
135
+ sanity_check
136
136
  @handle.finish
137
137
  @handle = nil
138
138
  end
@@ -144,7 +144,7 @@ module DBI
144
144
  # may be re-executed.
145
145
  #
146
146
  def cancel
147
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
147
+ sanity_check
148
148
  @handle.cancel if @fetchable
149
149
  @fetchable = false
150
150
  end
@@ -153,7 +153,7 @@ module DBI
153
153
  # Obtains the column names for this query as an array.
154
154
  #
155
155
  def column_names
156
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
156
+ sanity_check
157
157
  return @cols unless @cols.nil?
158
158
  @cols = @handle.column_info.collect {|col| col['name'] }
159
159
  end
@@ -166,7 +166,7 @@ module DBI
166
166
  # to the DBI::Type calling syntax.
167
167
  #
168
168
  def column_types
169
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
169
+ sanity_check
170
170
  return @coltypes unless @coltypes.nil?
171
171
  @coltypes = @handle.column_info.collect do |col|
172
172
  if col['dbi_type']
@@ -181,7 +181,7 @@ module DBI
181
181
  # See BaseStatement#column_info.
182
182
  #
183
183
  def column_info
184
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
184
+ sanity_check
185
185
  @handle.column_info.collect {|col| ColumnInfo.new(col) }
186
186
  end
187
187
 
@@ -193,7 +193,7 @@ module DBI
193
193
  # statements, f.e.)
194
194
  #
195
195
  def rows
196
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
196
+ sanity_check
197
197
  @handle.rows
198
198
  end
199
199
 
@@ -205,7 +205,7 @@ module DBI
205
205
  # similar fashion to Enumerable#collect. See #each.
206
206
  #
207
207
  def fetch(&p)
208
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
208
+ sanity_check({ :fetchable => true, :prepared => true, :executed => true })
209
209
 
210
210
  if block_given?
211
211
  while (res = @handle.fetch) != nil
@@ -234,8 +234,7 @@ module DBI
234
234
  # Synonym for #fetch with a block.
235
235
  #
236
236
  def each(&p)
237
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
238
- raise InterfaceError, "Statement must first be executed" unless @fetchable
237
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
239
238
  raise InterfaceError, "No block given" unless block_given?
240
239
 
241
240
  fetch(&p)
@@ -247,8 +246,7 @@ module DBI
247
246
  # is basically a way to get the raw data from the DBD.
248
247
  #
249
248
  def fetch_array
250
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
251
- raise InterfaceError, "Statement must first be executed" unless @fetchable
249
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
252
250
 
253
251
  if block_given?
254
252
  while (res = @handle.fetch) != nil
@@ -273,8 +271,7 @@ module DBI
273
271
  # No type conversion is performed here. Expect this to change in 0.6.0.
274
272
  #
275
273
  def fetch_hash
276
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
277
- raise InterfaceError, "Statement must first be executed" unless @fetchable
274
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
278
275
 
279
276
  cols = column_names
280
277
 
@@ -305,12 +302,11 @@ module DBI
305
302
  # Fetch `cnt` rows. Result is array of DBI::Row
306
303
  #
307
304
  def fetch_many(cnt)
308
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
309
- raise InterfaceError, "Statement must first be executed" unless @fetchable
305
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
310
306
 
311
307
  cols = column_names
312
308
  rows = @handle.fetch_many(cnt)
313
- if rows.nil?
309
+ if rows.nil? or rows.empty?
314
310
  @handle.cancel
315
311
  @fetchable = false
316
312
  return []
@@ -323,8 +319,7 @@ module DBI
323
319
  # Fetch the entire result set. Result is array of DBI::Row.
324
320
  #
325
321
  def fetch_all
326
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
327
- raise InterfaceError, "Statement must first be executed" unless @fetchable
322
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
328
323
 
329
324
  cols = column_names
330
325
  fetched_rows = []
@@ -346,8 +341,7 @@ module DBI
346
341
  # See BaseStatement#fetch_scroll.
347
342
  #
348
343
  def fetch_scroll(direction, offset=1)
349
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
350
- raise InterfaceError, "Statement must first be executed" unless @fetchable
344
+ sanity_check({:fetchable => true, :prepared => true, :executed => true})
351
345
 
352
346
  row = @handle.fetch_scroll(direction, offset)
353
347
  if row.nil?
@@ -362,14 +356,53 @@ module DBI
362
356
 
363
357
  # Get an attribute from the StatementHandle object.
364
358
  def [] (attr)
365
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
359
+ sanity_check
366
360
  @handle[attr]
367
361
  end
368
362
 
369
363
  # Set an attribute on the StatementHandle object.
370
364
  def []= (attr, val)
371
- raise InterfaceError, "Statement was already closed!" if @handle.nil?
365
+ sanity_check
372
366
  @handle[attr] = val
373
367
  end
368
+
369
+ protected
370
+
371
+ def sanity_check(params={})
372
+ raise InterfaceError, "Statement was already closed!" if @handle.nil?
373
+
374
+ params.each_key do |key|
375
+ case key
376
+ when :fetchable
377
+ check_fetchable
378
+ when :executed
379
+ check_executed
380
+ when :prepared
381
+ check_prepared
382
+ when :statement
383
+ check_statement(params[:statement])
384
+ end
385
+ end
386
+ end
387
+
388
+ def check_prepared
389
+ raise InterfaceError, "Statement wasn't prepared before." unless @prepared
390
+ end
391
+
392
+ def check_fetchable
393
+ if !@fetchable and @raise_error
394
+ raise InterfaceError, "Statement does not have any data for fetching."
395
+ end
396
+ end
397
+
398
+ def check_executed
399
+ raise InterfaceError, "Statement hasn't been executed yet." unless @executed
400
+ end
401
+
402
+ # basic sanity checks for statements
403
+ def check_statement(stmt)
404
+ raise InterfaceError, "Statement is empty, or contains nothing but whitespace" if stmt !~ /\S/
405
+ end
406
+
374
407
  end # class StatementHandle
375
408
  end
@@ -98,7 +98,7 @@ module DBI
98
98
  # Create a new row with 'new_values', reusing the field name hash.
99
99
  # Initial cloning is done deeply, via Marshal.
100
100
  def clone_with(new_values)
101
- obj = Marshal.load(Marshal.dump(self))
101
+ obj = clone
102
102
  obj.set_values(new_values)
103
103
 
104
104
  return obj
@@ -208,16 +208,27 @@ module DBI
208
208
  end
209
209
  end
210
210
 
211
- #
212
- # See Object#clone.
213
- #
214
- # #clone and #dup here, however, are both deep copies via Marshal.
215
- #
216
- def clone
217
- Marshal.load(Marshal.dump(self))
218
- end
219
211
 
220
- alias dup clone
212
+ if RUBY_VERSION =~ /^1\.9/
213
+ def __getobj__
214
+ @arr
215
+ end
216
+
217
+ def __setobj__(obj)
218
+ @delegate_dc_obj = @arr = obj
219
+ end
220
+ else
221
+ #
222
+ # See Object#clone.
223
+ #
224
+ # #clone and #dup here, however, are both deep copies via Marshal.
225
+ #
226
+ def clone
227
+ Marshal.load(Marshal.dump(self))
228
+ end
229
+
230
+ alias dup clone
231
+ end
221
232
 
222
233
  private
223
234
 
@@ -5,7 +5,6 @@
5
5
  #
6
6
 
7
7
  require "dbi/utils"
8
- require "parsedate"
9
8
  require "time"
10
9
 
11
10
  module DBI
@@ -93,7 +93,7 @@ DBI::TypeUtil.register_conversion("default") do |obj|
93
93
  when ::FalseClass
94
94
  "'0'"
95
95
  when ::Time, ::Date, ::DateTime
96
- "'#{::DateTime.parse(obj.to_s).strftime("%m/%d/%Y %H:%M:%S")}'"
96
+ "'#{::DateTime.parse(obj.to_s).strftime("%Y-%m-%dT%H:%M:%S")}'"
97
97
  when ::String
98
98
  obj = obj.gsub(/\\/) { "\\\\" }
99
99
  obj = obj.gsub(/'/) { "''" }
@@ -39,7 +39,7 @@ class TC_DBI_ColumnInfo < Test::Unit::TestCase
39
39
  DBI::ColumnInfo.new({:foo => "bar", :baz => "quux"})
40
40
  end
41
41
 
42
- assert_raise(TypeError) do
42
+ assert_raises(TypeError) do
43
43
  DBI::ColumnInfo.new({"foo" => "bar", :foo => "quux"})
44
44
  end
45
45
  end
@@ -22,7 +22,7 @@ class TC_DBI < Test::Unit::TestCase
22
22
  end
23
23
 
24
24
  def test_dbi_version
25
- assert_equal("0.4.0", DBI::VERSION)
25
+ assert_equal("0.4.1", DBI::VERSION)
26
26
  end
27
27
 
28
28
  def test_dbd_module
@@ -22,13 +22,13 @@ class TestSqlBind < Test::Unit::TestCase
22
22
  end
23
23
 
24
24
  def test_too_many
25
- assert_raise (RuntimeError) {
25
+ assert_raises (RuntimeError) {
26
26
  bind(self, "age=?", [10, 11])
27
27
  }
28
28
  end
29
29
 
30
30
  def test_too_few
31
- assert_raise (RuntimeError) {
31
+ assert_raises (RuntimeError) {
32
32
  bind(self, "age in (?, ?, ?)", [10, 11])
33
33
  }
34
34
  end
@@ -8,7 +8,20 @@ class TC_DBI_StatementHandle < Test::Unit::TestCase
8
8
  def mock_handle.cancel; end
9
9
  def mock_handle.column_info; {}; end
10
10
  def mock_handle.fetch; nil; end
11
- sth = DBI::StatementHandle.new( mock_handle, true, false )
11
+ sth = DBI::StatementHandle.new( mock_handle, true, true, false, true)
12
+
13
+ 10.times do
14
+ assert_nil sth.fetch
15
+ end
16
+
17
+ sth.raise_error = true
18
+
19
+ assert_raises(DBI::InterfaceError) do
20
+ sth.fetch
21
+ end
22
+
23
+ sth.raise_error = false
24
+
12
25
  10.times do
13
26
  assert_nil sth.fetch
14
27
  end
@@ -114,9 +114,15 @@ class TC_DBI_Type < Test::Unit::TestCase
114
114
  d = Date.today
115
115
  assert_equal(DateTime.parse(d.to_s), klass.parse(d))
116
116
 
117
+ md = "10-11"
118
+
119
+ if RUBY_VERSION =~ /^1\.9/
120
+ md = "11-10"
121
+ end
122
+
117
123
  # be sure we're actually getting the right data back
118
124
  assert_equal(
119
- "2008-10-11",
125
+ "2008-#{md}",
120
126
  klass.parse(Date.parse("10/11/2008")).strftime("%Y-%m-%d")
121
127
  )
122
128
 
@@ -126,8 +132,8 @@ class TC_DBI_Type < Test::Unit::TestCase
126
132
  )
127
133
 
128
134
  assert_equal(
129
- "10/11/2008 10:01:02",
130
- klass.parse(DateTime.parse("10/11/2008 10:01:02")).strftime("%m/%d/%Y %H:%M:%S")
135
+ "#{md}-2008 10:01:02",
136
+ klass.parse(DateTime.parse("10/11/2008 10:01:02")).strftime("%m-%d-%Y %H:%M:%S")
131
137
  )
132
138
  end
133
139
  end
@@ -138,7 +144,7 @@ class TC_DBI_TypeUtil < Test::Unit::TestCase
138
144
  end
139
145
 
140
146
  def datecast(obj)
141
- "'#{::DateTime.parse(obj.to_s).strftime("%m/%d/%Y %H:%M:%S")}'"
147
+ "'#{::DateTime.parse(obj.to_s).strftime("%Y-%m-%dT%H:%M:%S")}'"
142
148
  end
143
149
 
144
150
  def test_default_unknown_cast
metadata CHANGED
@@ -1,108 +1,100 @@
1
1
  --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
2
4
  name: dbi
3
5
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
6
+ version: 0.4.1
7
+ date: 2008-11-28 00:00:00 -08:00
8
+ summary: A vendor independent interface for accessing databases, similar to Perl's DBI
9
+ require_paths:
10
+ - lib
11
+ email: ruby-dbi-users@rubyforge.org
12
+ homepage: http://www.rubyforge.org/projects/ruby-dbi
13
+ rubyforge_project: ruby-dbi
14
+ description: A vendor independent interface for accessing databases, similar to Perl's DBI
15
+ autorequire:
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.0
24
+ version:
5
25
  platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
6
29
  authors:
7
30
  - Erik Hollensbe
8
31
  - Christopher Maujean
9
- autorequire:
10
- bindir: bin
11
- cert_chain: []
12
-
13
- date: 2008-08-23 00:00:00 -07:00
14
- default_executable:
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: deprecated
18
- type: :runtime
19
- version_requirement:
20
- version_requirements: !ruby/object:Gem::Requirement
21
- requirements:
22
- - - ">="
23
- - !ruby/object:Gem::Version
24
- version: 2.0.0
25
- version:
26
- description: A vendor independent interface for accessing databases, similar to Perl's DBI
27
- email: ruby-dbi-users@rubyforge.org
28
- executables:
29
- - dbi
30
- extensions: []
31
-
32
- extra_rdoc_files:
33
- - README
34
- - LICENSE
35
- - ChangeLog
36
32
  files:
37
- - examples/xmltest.rb
38
- - examples/test1.rb
39
33
  - examples/test1.pl
34
+ - examples/test1.rb
35
+ - examples/xmltest.rb
40
36
  - bin/dbi
41
37
  - build/Rakefile.dbi.rb
42
38
  - lib/dbi.rb
39
+ - lib/dbi/row.rb
40
+ - lib/dbi/columninfo.rb
41
+ - lib/dbi/sql/preparedstatement.rb
42
+ - lib/dbi/typeutil.rb
43
+ - lib/dbi/utils/time.rb
44
+ - lib/dbi/utils/xmlformatter.rb
43
45
  - lib/dbi/utils/timestamp.rb
44
46
  - lib/dbi/utils/date.rb
45
47
  - lib/dbi/utils/tableformatter.rb
46
- - lib/dbi/utils/xmlformatter.rb
47
- - lib/dbi/utils/time.rb
48
+ - lib/dbi/binary.rb
49
+ - lib/dbi/base_classes/database.rb
50
+ - lib/dbi/base_classes/driver.rb
51
+ - lib/dbi/base_classes/statement.rb
48
52
  - lib/dbi/sql_type_constants.rb
49
- - lib/dbi/sql/preparedstatement.rb
50
- - lib/dbi/handles/driver.rb
51
- - lib/dbi/handles/database.rb
52
- - lib/dbi/handles/statement.rb
53
53
  - lib/dbi/handles.rb
54
- - lib/dbi/sql.rb
55
- - lib/dbi/typeutil.rb
56
54
  - lib/dbi/exceptions.rb
55
+ - lib/dbi/types.rb
57
56
  - lib/dbi/trace.rb
58
- - lib/dbi/binary.rb
59
- - lib/dbi/utils.rb
60
- - lib/dbi/base_classes/driver.rb
61
- - lib/dbi/base_classes/database.rb
62
- - lib/dbi/base_classes/statement.rb
63
- - lib/dbi/row.rb
64
- - lib/dbi/columninfo.rb
65
57
  - lib/dbi/base_classes.rb
66
- - lib/dbi/types.rb
58
+ - lib/dbi/utils.rb
59
+ - lib/dbi/sql.rb
60
+ - lib/dbi/handles/database.rb
61
+ - lib/dbi/handles/driver.rb
62
+ - lib/dbi/handles/statement.rb
67
63
  - test/ts_dbi.rb
68
- - test/dbi/tc_date.rb
64
+ - test/dbi/tc_time.rb
65
+ - test/dbi/tc_row.rb
66
+ - test/dbi/tc_dbi.rb
69
67
  - test/dbi/tc_statementhandle.rb
70
- - test/dbi/tc_columninfo.rb
71
- - test/dbi/tc_timestamp.rb
72
68
  - test/dbi/tc_sqlbind.rb
69
+ - test/dbi/tc_columninfo.rb
73
70
  - test/dbi/trace.rb
74
- - test/dbi/tc_dbi.rb
71
+ - test/dbi/tc_timestamp.rb
75
72
  - test/dbi/tc_types.rb
76
- - test/dbi/tc_row.rb
77
- - test/dbi/tc_time.rb
73
+ - test/dbi/tc_date.rb
78
74
  - README
79
75
  - LICENSE
80
76
  - ChangeLog
81
- has_rdoc: true
82
- homepage: http://www.rubyforge.org/projects/ruby-dbi
83
- post_install_message:
77
+ test_files:
78
+ - test/ts_dbi.rb
84
79
  rdoc_options: []
85
80
 
86
- require_paths:
87
- - lib
88
- required_ruby_version: !ruby/object:Gem::Requirement
89
- requirements:
90
- - - ">="
91
- - !ruby/object:Gem::Version
92
- version: 1.8.0
93
- version:
94
- required_rubygems_version: !ruby/object:Gem::Requirement
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- version: "0"
99
- version:
81
+ extra_rdoc_files:
82
+ - README
83
+ - LICENSE
84
+ - ChangeLog
85
+ executables:
86
+ - dbi
87
+ extensions: []
88
+
100
89
  requirements: []
101
90
 
102
- rubyforge_project: ruby-dbi
103
- rubygems_version: 1.2.0
104
- signing_key:
105
- specification_version: 2
106
- summary: A vendor independent interface for accessing databases, similar to Perl's DBI
107
- test_files:
108
- - test/ts_dbi.rb
91
+ dependencies:
92
+ - !ruby/object:Gem::Dependency
93
+ name: deprecated
94
+ version_requirement:
95
+ version_requirements: !ruby/object:Gem::Version::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: 2.0.0
100
+ version: