rdbi-driver-mysql 0.9.1 → 0.9.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.1
1
+ 0.9.2
@@ -0,0 +1,2 @@
1
+ require 'rdbi'
2
+ require 'rdbi/driver/mysql'
@@ -144,11 +144,16 @@ class RDBI::Driver::MySQL < RDBI::Driver
144
144
  end
145
145
 
146
146
  def table_schema( table_name )
147
- info_row = execute(
147
+ info_row = nil
148
+
149
+ execute(
148
150
  "SELECT table_type FROM information_schema.tables WHERE table_schema = ? and table_name = ?",
149
151
  self.database_name,
150
152
  table_name.to_s
151
- ).fetch( :first )
153
+ ) do |res|
154
+ info_row = res.fetch(1)[0]
155
+ end
156
+
152
157
  if info_row.nil?
153
158
  return nil
154
159
  end
@@ -166,14 +171,16 @@ class RDBI::Driver::MySQL < RDBI::Driver
166
171
  execute( "SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_schema = ? and table_name = ?",
167
172
  self.database_name,
168
173
  table_name.to_s
169
- ).fetch( :all ).each do |row|
170
- col = RDBI::Column.new
171
- col.name = row[0].to_sym
172
- col.type = row[1].to_sym
173
- # TODO: ensure this ruby_type is solid, especially re: dates and times
174
- col.ruby_type = row[1].to_sym
175
- col.nullable = row[2] == "YES"
176
- sch.columns << col
174
+ ) do |res|
175
+ res.fetch( :all ).each do |row|
176
+ col = RDBI::Column.new
177
+ col.name = row[0].to_sym
178
+ col.type = row[1].to_sym
179
+ # TODO: ensure this ruby_type is solid, especially re: dates and times
180
+ col.ruby_type = row[1].to_sym
181
+ col.nullable = row[2] == "YES"
182
+ sch.columns << col
183
+ end
177
184
  end
178
185
 
179
186
  sch
@@ -181,10 +188,11 @@ class RDBI::Driver::MySQL < RDBI::Driver
181
188
 
182
189
  def schema
183
190
  schemata = []
184
- execute( "SELECT table_name FROM information_schema.tables where table_schema = ?", self.database_name ).fetch( :all ).each do |row|
185
- schemata << table_schema( row[0] )
191
+ execute( "SELECT table_name FROM information_schema.tables where table_schema = ?", self.database_name ) do |res|
192
+ schemata = res.fetch( :all )
186
193
  end
187
- schemata
194
+
195
+ schemata.collect { |x| table_schema(x[0]) }
188
196
  end
189
197
 
190
198
  def ping
@@ -249,11 +257,11 @@ class RDBI::Driver::MySQL < RDBI::Driver
249
257
  if @array_handle
250
258
  @array_handle.first
251
259
  else
252
- cnt = @handle.row_tell
260
+ cur = @handle.row_tell
253
261
  @handle.data_seek(0)
254
262
  res = @handle.fetch
255
- @handle.data_seek(cnt)
256
- res
263
+ @handle.row_seek(cur)
264
+ return res
257
265
  end
258
266
  end
259
267
 
@@ -261,21 +269,33 @@ class RDBI::Driver::MySQL < RDBI::Driver
261
269
  if @array_handle
262
270
  @array_handle.last
263
271
  else
264
- cnt = @handle.row_tell
265
- @handle.data_seek(@handle.num_rows)
272
+ #raise RDBI::Cursor::NotRewindableError, "last requires a rewindable result in mysql"
273
+ cur = @handle.row_tell
274
+ @handle.data_seek(@handle.num_rows - 1)
266
275
  res = @handle.fetch
267
- @handle.data_seek(cnt)
268
- res
276
+ @handle.row_seek(cur)
277
+ return res
269
278
  end
270
279
  end
271
280
 
272
281
  def rest
273
- oindex, @index = [@index, @handle.num_rows] rescue [@index, @array_handle.size]
282
+ oindex = nil
283
+
284
+ if @array_handle
285
+ oindex, @index = @index, @array_handle.size
286
+ else
287
+ oindex, @index = @index, @handle.num_rows
288
+ end
289
+
274
290
  fetch_range(oindex, @index)
275
291
  end
276
292
 
277
293
  def all
278
- fetch_range(0, (@handle.num_rows rescue @array_handle.size))
294
+ if @array_handle
295
+ fetch_range(0, @array_handle.size)
296
+ else
297
+ fetch_range(0, @handle.num_rows)
298
+ end
279
299
  end
280
300
 
281
301
  def [](index)
@@ -286,7 +306,7 @@ class RDBI::Driver::MySQL < RDBI::Driver
286
306
  if @array_handle
287
307
  @index == @array_handle.size
288
308
  else
289
- @handle.eof?
309
+ @index == @handle.num_rows
290
310
  end
291
311
  end
292
312
 
@@ -298,7 +318,11 @@ class RDBI::Driver::MySQL < RDBI::Driver
298
318
  end
299
319
 
300
320
  def empty?
301
- @array_handle.empty?
321
+ if @array_handle
322
+ @array_handle.empty?
323
+ else
324
+ @handle.num_rows == 0
325
+ end
302
326
  end
303
327
 
304
328
  def finish
@@ -319,14 +343,16 @@ class RDBI::Driver::MySQL < RDBI::Driver
319
343
 
320
344
  def fetch_range(start, stop)
321
345
  if @array_handle
322
- @array_handle[start, stop]
346
+ return @array_handle[start, stop]
323
347
  else
324
348
  ary = []
325
349
 
326
350
  @handle.data_seek(start)
327
351
  (stop - start).times do
328
- @handle.fetch
352
+ ary.push @handle.fetch
329
353
  end
354
+
355
+ return ary
330
356
  end
331
357
  end
332
358
  end
@@ -350,6 +376,23 @@ class RDBI::Driver::MySQL < RDBI::Driver
350
376
  @output_type_map = RDBI::Type.create_type_hash( RDBI::Type::Out )
351
377
 
352
378
  manipulate_type_maps
379
+
380
+ prep_finalizer { @my_query.close rescue nil }
381
+ end
382
+
383
+ def new_modification(*binds)
384
+ # FIXME move to RDBI::Util or something.
385
+ hashes, binds = binds.partition { |x| x.kind_of?(Hash) }
386
+ hash = hashes.inject({}) { |x, y| x.merge(y) }
387
+ hash.keys.each do |key|
388
+ if index = @index_map.index(key)
389
+ binds.insert(index, hash[key])
390
+ end
391
+ end
392
+
393
+ res = @my_query.execute(*binds)
394
+
395
+ return res.affected_rows
353
396
  end
354
397
 
355
398
  def new_execution(*binds)
@@ -384,11 +427,6 @@ class RDBI::Driver::MySQL < RDBI::Driver
384
427
  [ Cursor.new(res), schema, @output_type_map ]
385
428
  end
386
429
 
387
- def finish
388
- @my_query.close rescue nil
389
- super
390
- end
391
-
392
430
  protected
393
431
 
394
432
  def map_type(col)
@@ -405,23 +443,23 @@ class RDBI::Driver::MySQL < RDBI::Driver
405
443
  # XXX yep. slow as snot.
406
444
  datetime_conv = proc { |x| DateTime.parse(x.to_s + " #{zone}") }
407
445
 
408
- @output_type_map[:datetime] = RDBI::Type.filterlist(TypeLib::Filter.new(datetime_check, datetime_conv))
446
+ @output_type_map[:datetime] = [TypeLib::Filter.new(datetime_check, datetime_conv)]
409
447
 
410
- @input_type_map[TrueClass] = TypeLib::Filter.new(
448
+ @input_type_map[TrueClass] = [TypeLib::Filter.new(
411
449
  RDBI::Type::Checks::IS_BOOLEAN,
412
450
  proc { |x| 1 }
413
- )
451
+ )]
414
452
 
415
- @input_type_map[FalseClass] = TypeLib::Filter.new(
453
+ @input_type_map[FalseClass] = [TypeLib::Filter.new(
416
454
  RDBI::Type::Checks::IS_BOOLEAN,
417
455
  proc { |x| 0 }
418
- )
456
+ )]
419
457
 
420
458
  if dbh.cast_booleans
421
- boolean_filter = TypeLib::Filter.new(
459
+ boolean_filter = [TypeLib::Filter.new(
422
460
  proc { |x| x == 1 or x == 0 },
423
461
  proc { |x| x == 1 }
424
- )
462
+ )]
425
463
 
426
464
  @output_type_map[:boolean] = boolean_filter
427
465
  end
@@ -0,0 +1,71 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rdbi-driver-mysql}
8
+ s.version = "0.9.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Erik Hollensbe"]
12
+ s.date = %q{2010-12-10}
13
+ s.description = %q{mysql gem-based driver for RDBI}
14
+ s.email = %q{erik@hollensbe.org}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ "LICENSE",
22
+ "README.rdoc",
23
+ "Rakefile",
24
+ "VERSION",
25
+ "lib/rdbi-driver-mysql.rb",
26
+ "lib/rdbi/driver/mysql.rb",
27
+ "rdbi-driver-mysql.gemspec",
28
+ "test/helper.rb",
29
+ "test/test_connect.rb",
30
+ "test/test_database.rb",
31
+ "test/test_statement.rb",
32
+ "test/test_types.rb"
33
+ ]
34
+ s.homepage = %q{http://github.com/RDBI/rdbi-driver-mysql}
35
+ s.require_paths = ["lib"]
36
+ s.rubygems_version = %q{1.3.7}
37
+ s.summary = %q{mysql gem-based driver for RDBI}
38
+ s.test_files = [
39
+ "test/helper.rb",
40
+ "test/test_connect.rb",
41
+ "test/test_database.rb",
42
+ "test/test_statement.rb",
43
+ "test/test_types.rb"
44
+ ]
45
+
46
+ if s.respond_to? :specification_version then
47
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<rdbi>, [">= 0"])
52
+ s.add_runtime_dependency(%q<mysql>, [">= 2.8.1"])
53
+ s.add_development_dependency(%q<test-unit>, [">= 0"])
54
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
55
+ s.add_development_dependency(%q<rdbi-dbrc>, [">= 0"])
56
+ else
57
+ s.add_dependency(%q<rdbi>, [">= 0"])
58
+ s.add_dependency(%q<mysql>, [">= 2.8.1"])
59
+ s.add_dependency(%q<test-unit>, [">= 0"])
60
+ s.add_dependency(%q<rdoc>, [">= 0"])
61
+ s.add_dependency(%q<rdbi-dbrc>, [">= 0"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<rdbi>, [">= 0"])
65
+ s.add_dependency(%q<mysql>, [">= 2.8.1"])
66
+ s.add_dependency(%q<test-unit>, [">= 0"])
67
+ s.add_dependency(%q<rdoc>, [">= 0"])
68
+ s.add_dependency(%q<rdbi-dbrc>, [">= 0"])
69
+ end
70
+ end
71
+
@@ -29,27 +29,26 @@ class TestDatabase < Test::Unit::TestCase
29
29
 
30
30
  def test_03_execute
31
31
  self.dbh = init_database
32
- res = dbh.execute( "insert into foo (bar) values (?)", 1 )
33
- assert res
34
- assert_kind_of( RDBI::Result, res )
35
- assert_equal( 1, res.affected_count )
32
+ assert_equal(1, dbh.execute_modification( "insert into foo (bar) values (?)", 1 ))
36
33
 
37
- res = dbh.execute( "select * from foo" )
38
- assert res
39
- assert_kind_of( RDBI::Result, res )
40
- assert_equal( [[1]], res.fetch(:all) )
34
+ dbh.execute( "select * from foo" ) do |res|
35
+ assert res
36
+ assert_kind_of( RDBI::Result, res )
37
+ assert_equal( [[1]], res.fetch(:all) )
41
38
 
42
- rows = res.as( :Struct ).fetch( :all )
43
- row = rows[ 0 ]
44
- assert_equal( 1, row.bar )
39
+ rows = res.as( :Struct ).fetch( :all )
40
+ row = rows[ 0 ]
41
+ assert_equal( 1, row.bar )
42
+ end
45
43
  end
46
44
 
47
45
  def test_04_transaction
48
46
  self.dbh = init_database
47
+ dbh.rewindable_result = true
49
48
 
50
49
  dbh.transaction do
51
50
  assert dbh.in_transaction?
52
- 5.times { dbh.execute( "insert into foo (bar) values (?)", 1 ) }
51
+ 5.times { dbh.execute_modification( "insert into foo (bar) values (?)", 1 ) }
53
52
  dbh.rollback
54
53
  assert ! dbh.in_transaction?
55
54
  end
@@ -60,7 +59,7 @@ class TestDatabase < Test::Unit::TestCase
60
59
 
61
60
  dbh.transaction do
62
61
  assert dbh.in_transaction?
63
- 5.times { dbh.execute("insert into foo (bar) values (?)", 1) }
62
+ 5.times { dbh.execute_modification("insert into foo (bar) values (?)", 1) }
64
63
  assert_equal( [[1]] * 5, dbh.execute("select * from foo").fetch(:all) )
65
64
  dbh.commit
66
65
  assert ! dbh.in_transaction?
@@ -100,7 +99,7 @@ class TestDatabase < Test::Unit::TestCase
100
99
  def test_06_schema
101
100
  self.dbh = init_database
102
101
 
103
- dbh.execute( "insert into bar (foo, bar) values (?, ?)", "foo", 1 )
102
+ dbh.execute_modification( "insert into bar (foo, bar) values (?, ?)", "foo", 1 )
104
103
  res = dbh.execute( "select * from bar" )
105
104
 
106
105
  assert res
@@ -17,6 +17,35 @@ class TestStatement < Test::Unit::TestCase
17
17
  sth.execute(1)
18
18
  # FIXME affected rows
19
19
  sth.finish
20
- assert_equal([[1]], dbh.execute("select * from integer_test").fetch(:all))
20
+
21
+ dbh.execute("select * from integer_test") do |res|
22
+ assert_equal([[1]], res.fetch(:all))
23
+ end
24
+ end
25
+
26
+ def test_03_rewindables
27
+
28
+ dbh.execute("select * from integer_test") do |res|
29
+ assert(res.empty?)
30
+ end
31
+
32
+ sth = dbh.prepare("insert into integer_test (id) values (?)")
33
+ sth.execute(1)
34
+ sth.execute(2)
35
+ sth.finish
36
+
37
+ sth = dbh.prepare("select * from integer_test")
38
+ res = sth.execute
39
+
40
+ assert_equal([1], res.fetch(:first))
41
+ assert_equal([2], res.fetch(:last))
42
+ assert_equal([[1], [2]], res.fetch(:rest))
43
+ assert_equal([], res.fetch(:rest))
44
+
45
+ res.rewind
46
+
47
+ assert_equal([[1], [2]], res.fetch(:rest))
48
+
49
+ sth.finish
21
50
  end
22
51
  end
@@ -1,6 +1,12 @@
1
1
  require 'helper'
2
2
 
3
3
  class TestTypes < Test::Unit::TestCase
4
+
5
+ def setup
6
+ super
7
+ dbh.rewindable_result = true
8
+ end
9
+
4
10
  def test_01_booleans
5
11
  dbh.cast_booleans = true
6
12
  res = dbh.execute( "SELECT true" )
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rdbi-driver-mysql
3
3
  version: !ruby/object:Gem::Version
4
- hash: 57
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 9
9
- - 1
10
- version: 0.9.1
8
+ - 2
9
+ version: 0.9.2
11
10
  platform: ruby
12
11
  authors:
13
12
  - Erik Hollensbe
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-08-21 00:00:00 -04:00
17
+ date: 2010-12-10 00:00:00 -05:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 3
30
28
  segments:
31
29
  - 0
32
30
  version: "0"
@@ -40,7 +38,6 @@ dependencies:
40
38
  requirements:
41
39
  - - ">="
42
40
  - !ruby/object:Gem::Version
43
- hash: 45
44
41
  segments:
45
42
  - 2
46
43
  - 8
@@ -56,7 +53,6 @@ dependencies:
56
53
  requirements:
57
54
  - - ">="
58
55
  - !ruby/object:Gem::Version
59
- hash: 3
60
56
  segments:
61
57
  - 0
62
58
  version: "0"
@@ -70,7 +66,6 @@ dependencies:
70
66
  requirements:
71
67
  - - ">="
72
68
  - !ruby/object:Gem::Version
73
- hash: 3
74
69
  segments:
75
70
  - 0
76
71
  version: "0"
@@ -84,7 +79,6 @@ dependencies:
84
79
  requirements:
85
80
  - - ">="
86
81
  - !ruby/object:Gem::Version
87
- hash: 3
88
82
  segments:
89
83
  - 0
90
84
  version: "0"
@@ -101,12 +95,13 @@ extra_rdoc_files:
101
95
  - README.rdoc
102
96
  files:
103
97
  - .document
104
- - .gitignore
105
98
  - LICENSE
106
99
  - README.rdoc
107
100
  - Rakefile
108
101
  - VERSION
102
+ - lib/rdbi-driver-mysql.rb
109
103
  - lib/rdbi/driver/mysql.rb
104
+ - rdbi-driver-mysql.gemspec
110
105
  - test/helper.rb
111
106
  - test/test_connect.rb
112
107
  - test/test_database.rb
@@ -117,8 +112,8 @@ homepage: http://github.com/RDBI/rdbi-driver-mysql
117
112
  licenses: []
118
113
 
119
114
  post_install_message:
120
- rdoc_options:
121
- - --charset=UTF-8
115
+ rdoc_options: []
116
+
122
117
  require_paths:
123
118
  - lib
124
119
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -126,7 +121,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
121
  requirements:
127
122
  - - ">="
128
123
  - !ruby/object:Gem::Version
129
- hash: 3
130
124
  segments:
131
125
  - 0
132
126
  version: "0"
@@ -135,7 +129,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
129
  requirements:
136
130
  - - ">="
137
131
  - !ruby/object:Gem::Version
138
- hash: 3
139
132
  segments:
140
133
  - 0
141
134
  version: "0"
data/.gitignore DELETED
@@ -1,21 +0,0 @@
1
- ## MAC OS
2
- .DS_Store
3
-
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
-
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
-
13
- ## VIM
14
- *.swp
15
-
16
- ## PROJECT::GENERAL
17
- coverage
18
- rdoc
19
- pkg
20
-
21
- ## PROJECT::SPECIFIC