data_objects 0.10.1 → 0.10.2

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.
data/ChangeLog.markdown CHANGED
@@ -1,10 +1,14 @@
1
- ## 0.10.1 (unreleased, in git)
1
+ ## 0.10.2 2010-05-19
2
+ * Support for Encoding.default_internal
3
+ * Rework logging to adding a callback is possible
4
+
5
+ ## 0.10.1 2010-01-08
2
6
 
3
7
  * Removal of Extlib dependency: Pooling and Utilities code moved to DataObjects.
4
8
  * Switch to Jeweler for Gem building tasks (this change may be temporary).
5
9
  * Switch to using Bacon for running specs: This should make specs friendlier to
6
10
  new Ruby implementations that are not yet 100% MRI-compatible, and in turn,
7
- prepared the road for our own IronRuby and MacRuby support.
11
+ pave the road for our own IronRuby and MacRuby support.
8
12
  * Make DataObjects::Reader Enumerable.
9
13
 
10
14
  ## 0.10.0 2009-09-15
@@ -7,6 +7,8 @@ module DataObjects
7
7
  # An abstract connection to a DataObjects resource. The physical connection may be broken and re-established from time to time.
8
8
  class Connection
9
9
 
10
+ include Logging
11
+
10
12
  # Make a connection to the database using the DataObjects::URI given.
11
13
  # Note that the physical connection may be delayed until the first command is issued, so success here doesn't necessarily mean you can connect.
12
14
  def self.new(uri_s)
@@ -116,7 +118,16 @@ module DataObjects
116
118
  concrete_command.new(self, text)
117
119
  end
118
120
 
121
+ def extension
122
+ driver_namespace.const_get('Extension').new(self)
123
+ end
124
+
119
125
  private
126
+
127
+ def driver_namespace
128
+ DataObjects::const_get(self.class.name.split('::')[-2])
129
+ end
130
+
120
131
  def concrete_command
121
132
  @concrete_command || begin
122
133
 
@@ -0,0 +1,11 @@
1
+ module DataObjects
2
+ class Extension
3
+
4
+ attr_reader :connection
5
+
6
+ def initialize(connection)
7
+ @connection = connection
8
+ end
9
+
10
+ end
11
+ end
@@ -2,6 +2,18 @@ require "time" # httpdate
2
2
 
3
3
  module DataObjects
4
4
 
5
+ module Logging
6
+
7
+ def log(message)
8
+ logger = driver_namespace.logger
9
+ if logger.level <= DataObjects::Logger::LEVELS[:debug]
10
+ message = "(%.6f) %s" % [message.duration / 1000000.0, message.query]
11
+ logger.debug message
12
+ end
13
+ end
14
+
15
+ end
16
+
5
17
  class << self
6
18
  # The global logger for DataObjects
7
19
  attr_accessor :logger
@@ -51,6 +63,8 @@ module DataObjects
51
63
  # The name of the log file
52
64
  attr_reader :log
53
65
 
66
+ Message = Struct.new(:query, :start, :duration)
67
+
54
68
  #
55
69
  # Ruby (standard) logger levels:
56
70
  # off: absolutely nothing
@@ -85,7 +85,7 @@ shared 'a Connection' do
85
85
  @user,
86
86
  @password,
87
87
  @host,
88
- @port.to_i,
88
+ @port && @port.to_i,
89
89
  @database,
90
90
  nil, nil
91
91
  )
@@ -8,7 +8,6 @@ shared 'a driver supporting different encodings' do
8
8
  @connection.close
9
9
  end
10
10
 
11
-
12
11
  it 'should respond to #character_set' do @connection.should.respond_to(:character_set) end
13
12
 
14
13
  describe 'character_set' do
@@ -44,25 +43,88 @@ shared 'a driver supporting different encodings' do
44
43
  end
45
44
  end
46
45
 
47
- shared 'returning correctly encoded strings for the default encoding' do
46
+ shared 'returning correctly encoded strings for the default database encoding' do
48
47
 
48
+ if defined?(::Encoding)
49
49
 
50
- setup_test_environment
50
+ setup_test_environment
51
51
 
52
- before do
53
- @connection = DataObjects::Connection.new(CONFIG.uri)
54
- end
52
+ before do
53
+ @connection.close if @connection
54
+ @connection = DataObjects::Connection.new(CONFIG.uri)
55
+ end
55
56
 
56
- after do
57
- @connection.close
57
+ after do
58
+ @connection.close
59
+ end
60
+
61
+ describe 'with encoded string support' do
62
+
63
+ describe 'reading a String' do
64
+ before do
65
+ @reader = @connection.create_command("SELECT name, whitepaper_text FROM widgets WHERE ad_description = ?").execute_reader('Buy this product now!')
66
+ @reader.next!
67
+ @values = @reader.values
68
+ end
69
+
70
+ after do
71
+ @reader.close
72
+ end
73
+
74
+ it 'should return UTF-8 encoded String' do
75
+ @values.first.should.be.kind_of(String)
76
+ @values.first.encoding.name.should == 'UTF-8'
77
+ @values.last.should.be.kind_of(String)
78
+ @values.last.encoding.name.should == 'UTF-8'
79
+ end
80
+ end
81
+
82
+ describe 'reading a ByteArray' do
83
+ before do
84
+ @command = @connection.create_command("SELECT ad_image FROM widgets WHERE ad_description = ?")
85
+ @command.set_types(Extlib::ByteArray)
86
+ @reader = @command.execute_reader('Buy this product now!')
87
+ @reader.next!
88
+ @values = @reader.values
89
+ end
90
+
91
+ after do
92
+ @reader.close
93
+ end
94
+
95
+ it 'should return ASCII-8BIT encoded ByteArray' do
96
+ @values.first.should.be.kind_of(::Extlib::ByteArray)
97
+ @values.first.encoding.name.should == 'ASCII-8BIT'
98
+ end
99
+ end
100
+ end
58
101
  end
59
102
 
103
+ end
104
+
105
+ shared 'returning correctly encoded strings for the default internal encoding' do
106
+
60
107
  if defined?(::Encoding)
108
+
109
+ setup_test_environment
110
+
111
+ before do
112
+ @connection.close if @connection
113
+ @encoding_before = Encoding.default_internal
114
+ Encoding.default_internal = 'ISO-8859-1'
115
+ @connection = DataObjects::Connection.new(CONFIG.uri)
116
+ end
117
+
118
+ after do
119
+ @connection.close
120
+ Encoding.default_internal = @encoding_before
121
+ end
122
+
61
123
  describe 'with encoded string support' do
62
124
 
63
125
  describe 'reading a String' do
64
126
  before do
65
- @reader = @connection.create_command("SELECT name FROM widgets WHERE ad_description = ?").execute_reader('Buy this product now!')
127
+ @reader = @connection.create_command("SELECT name, whitepaper_text FROM widgets WHERE ad_description = ?").execute_reader('Buy this product now!')
66
128
  @reader.next!
67
129
  @values = @reader.values
68
130
  end
@@ -73,7 +135,9 @@ shared 'returning correctly encoded strings for the default encoding' do
73
135
 
74
136
  it 'should return UTF-8 encoded String' do
75
137
  @values.first.should.be.kind_of(String)
76
- @values.first.encoding.name.should == 'UTF-8'
138
+ @values.first.encoding.name.should == 'ISO-8859-1'
139
+ @values.last.should.be.kind_of(String)
140
+ @values.last.encoding.name.should == 'ISO-8859-1'
77
141
  end
78
142
  end
79
143
 
@@ -5,10 +5,12 @@ shared 'a Reader' do
5
5
  before do
6
6
  @connection = DataObjects::Connection.new(CONFIG.uri)
7
7
  @reader = @connection.create_command("SELECT code, name FROM widgets WHERE ad_description = ? order by id").execute_reader('Buy this product now!')
8
+ @reader2 = @connection.create_command("SELECT code FROM widgets WHERE ad_description = ? order by id").execute_reader('Buy this product now!')
8
9
  end
9
10
 
10
11
  after do
11
12
  @reader.close
13
+ @reader2.close
12
14
  @connection.close
13
15
  end
14
16
 
@@ -153,7 +155,7 @@ shared 'a Reader' do
153
155
 
154
156
  describe 'each' do
155
157
 
156
- it 'should yield each row to the block' do
158
+ it 'should yield each row to the block for multiple columns' do
157
159
  rows_yielded = 0
158
160
  @reader.each do |row|
159
161
  row.should.respond_to(:[])
@@ -170,6 +172,22 @@ shared 'a Reader' do
170
172
  rows_yielded.should == 15
171
173
  end
172
174
 
175
+ it 'should yield each row to the block for a single column' do
176
+ rows_yielded = 0
177
+ @reader2.each do |row|
178
+ row.should.respond_to(:[])
179
+
180
+ row.size.should == 1
181
+
182
+ # the field names need to be case insensitive as some drivers such as
183
+ # do_derby, do_h2, do_hsqldb return the field names as uppercase
184
+ (row['code'] || row['CODE']).should.be.kind_of(String)
185
+
186
+ rows_yielded += 1
187
+ end
188
+ rows_yielded.should == 15
189
+ end
190
+
173
191
  it 'should return the reader' do
174
192
  @reader.each { |row| }.should.equal(@reader)
175
193
  end
@@ -23,7 +23,7 @@ shared 'a Result' do
23
23
 
24
24
  end
25
25
 
26
- shared 'a Result which returns inserted keys' do
26
+ shared 'a Result which returns inserted key with sequences' do
27
27
 
28
28
  before do
29
29
  setup_test_environment
@@ -50,3 +50,30 @@ shared 'a Result which returns inserted keys' do
50
50
  end
51
51
 
52
52
  end
53
+
54
+ shared 'a Result which returns nil without sequences' do
55
+
56
+ before do
57
+ setup_test_environment
58
+ @connection = DataObjects::Connection.new(CONFIG.uri)
59
+ command = @connection.create_command("INSERT INTO invoices (invoice_number) VALUES (?)")
60
+ # execute the command twice and expose the second result
61
+ @result = command.execute_non_query("monkey")
62
+ end
63
+
64
+ after do
65
+ @connection.close
66
+ end
67
+
68
+ it 'should respond to #affected_rows' do @result.should.respond_to(:affected_rows) end
69
+
70
+ describe 'insert_id' do
71
+
72
+ it 'should return the insert_id' do
73
+ # This is actually the 2nd record inserted
74
+ @result.insert_id.should.be.nil
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -36,6 +36,30 @@ shared 'supporting Boolean' do
36
36
 
37
37
  end
38
38
 
39
+ describe 'with manual typecasting a true value' do
40
+
41
+ before do
42
+ @command = @connection.create_command("SELECT flags FROM widgets WHERE id = ?")
43
+ @command.set_types(TrueClass)
44
+ @reader = @command.execute_reader(2)
45
+ @reader.next!
46
+ @values = @reader.values
47
+ end
48
+
49
+ after do
50
+ @reader.close
51
+ end
52
+
53
+ it 'should return the correctly typed result' do
54
+ @values.first.should.be.kind_of(TrueClass)
55
+ end
56
+
57
+ it 'should return the correct result' do
58
+ @values.first.should.be.true
59
+ end
60
+
61
+ end
62
+
39
63
  describe 'with manual typecasting a nil value' do
40
64
 
41
65
  before do
@@ -25,9 +25,9 @@ shared 'supporting other (unknown) type' do
25
25
  describe 'writing an object of unknown type' do
26
26
 
27
27
  before do
28
- @command = @connection.create_command("SELECT whitepaper_text FROM widgets WHERE whitepaper_text = ?")
28
+ @command = @connection.create_command("SELECT ad_description FROM widgets WHERE ad_description = ?")
29
29
  @command.set_types(::CustomTextType)
30
- @reader = @command.execute_reader('String')
30
+ @reader = @command.execute_reader('Buy this product now!')
31
31
  @reader.next!
32
32
  @values = @reader.values
33
33
  end
@@ -37,7 +37,7 @@ shared 'supporting other (unknown) type' do
37
37
  end
38
38
 
39
39
  it 'should return the correct entry' do
40
- @values.first.should == 'String'
40
+ @values.first.should == 'Buy this product now!'
41
41
  end
42
42
 
43
43
  end
@@ -1,3 +1,3 @@
1
1
  module DataObjects
2
- VERSION = '0.10.1'.freeze
2
+ VERSION = '0.10.2'
3
3
  end
data/lib/data_objects.rb CHANGED
@@ -10,6 +10,7 @@ require 'data_objects/command'
10
10
  require 'data_objects/result'
11
11
  require 'data_objects/reader'
12
12
  require 'data_objects/quoting'
13
+ require 'data_objects/extension'
13
14
  require 'data_objects/error'
14
15
  require 'data_objects/error/sql_error'
15
16
  require 'data_objects/error/connection_error'
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.1
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 10
8
+ - 2
9
+ version: 0.10.2
5
10
  platform: ruby
6
11
  authors:
7
12
  - Dirkjan Bussink
@@ -9,49 +14,61 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-01-09 00:00:00 +01:00
17
+ date: 2010-05-19 00:00:00 +02:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: addressable
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ~>
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 1
23
30
  version: "2.1"
24
- version:
31
+ type: :runtime
32
+ version_requirements: *id001
25
33
  - !ruby/object:Gem::Dependency
26
34
  name: bacon
27
- type: :development
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
30
37
  requirements:
31
38
  - - ~>
32
39
  - !ruby/object:Gem::Version
40
+ segments:
41
+ - 1
42
+ - 1
33
43
  version: "1.1"
34
- version:
44
+ type: :development
45
+ version_requirements: *id002
35
46
  - !ruby/object:Gem::Dependency
36
47
  name: mocha
37
- type: :development
38
- version_requirement:
39
- version_requirements: !ruby/object:Gem::Requirement
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
40
50
  requirements:
41
51
  - - ~>
42
52
  - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ - 9
43
56
  version: "0.9"
44
- version:
57
+ type: :development
58
+ version_requirements: *id003
45
59
  - !ruby/object:Gem::Dependency
46
60
  name: yard
47
- type: :development
48
- version_requirement:
49
- version_requirements: !ruby/object:Gem::Requirement
61
+ prerelease: false
62
+ requirement: &id004 !ruby/object:Gem::Requirement
50
63
  requirements:
51
64
  - - ~>
52
65
  - !ruby/object:Gem::Version
66
+ segments:
67
+ - 0
68
+ - 5
53
69
  version: "0.5"
54
- version:
70
+ type: :development
71
+ version_requirements: *id004
55
72
  description: Provide a standard and simplified API for communicating with RDBMS from Ruby
56
73
  email: d.bussink@gmail.com
57
74
  executables: []
@@ -76,6 +93,7 @@ files:
76
93
  - lib/data_objects/error/sql_error.rb
77
94
  - lib/data_objects/error/syntax_error.rb
78
95
  - lib/data_objects/error/transaction_error.rb
96
+ - lib/data_objects/extension.rb
79
97
  - lib/data_objects/logger.rb
80
98
  - lib/data_objects/pooling.rb
81
99
  - lib/data_objects/quoting.rb
@@ -138,18 +156,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
138
156
  requirements:
139
157
  - - ">="
140
158
  - !ruby/object:Gem::Version
159
+ segments:
160
+ - 0
141
161
  version: "0"
142
- version:
143
162
  required_rubygems_version: !ruby/object:Gem::Requirement
144
163
  requirements:
145
164
  - - ">="
146
165
  - !ruby/object:Gem::Version
166
+ segments:
167
+ - 0
147
168
  version: "0"
148
- version:
149
169
  requirements: []
150
170
 
151
171
  rubyforge_project: dorb
152
- rubygems_version: 1.3.5
172
+ rubygems_version: 1.3.6
153
173
  signing_key:
154
174
  specification_version: 3
155
175
  summary: DataObjects basic API and shared driver specifications