data_objects 0.9.12 → 0.10.0

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 (37) hide show
  1. data/{History.txt → HISTORY.markdown} +0 -0
  2. data/Manifest.txt +2 -2
  3. data/{README.txt → README.markdown} +2 -1
  4. data/Rakefile +2 -2
  5. data/lib/data_objects.rb +16 -17
  6. data/lib/data_objects/command.rb +2 -1
  7. data/lib/data_objects/connection.rb +8 -3
  8. data/lib/data_objects/error.rb +4 -0
  9. data/lib/data_objects/error/connection_error.rb +4 -0
  10. data/lib/data_objects/error/data_error.rb +4 -0
  11. data/lib/data_objects/error/integrity_error.rb +4 -0
  12. data/lib/data_objects/error/sql_error.rb +22 -0
  13. data/lib/data_objects/error/syntax_error.rb +4 -0
  14. data/lib/data_objects/error/transaction_error.rb +4 -0
  15. data/lib/data_objects/logger.rb +1 -1
  16. data/lib/data_objects/quoting.rb +2 -2
  17. data/lib/data_objects/spec/command_spec.rb +32 -1
  18. data/lib/data_objects/spec/connection_spec.rb +22 -0
  19. data/lib/data_objects/spec/encoding_spec.rb +15 -3
  20. data/lib/data_objects/spec/result_spec.rb +4 -1
  21. data/lib/data_objects/spec/typecast/bigdecimal_spec.rb +26 -1
  22. data/lib/data_objects/spec/typecast/boolean_spec.rb +24 -0
  23. data/lib/data_objects/spec/typecast/date_spec.rb +25 -1
  24. data/lib/data_objects/spec/typecast/datetime_spec.rb +28 -1
  25. data/lib/data_objects/spec/typecast/float_spec.rb +24 -1
  26. data/lib/data_objects/spec/typecast/nil_spec.rb +22 -7
  27. data/lib/data_objects/spec/typecast/time_spec.rb +25 -1
  28. data/lib/data_objects/transaction.rb +18 -8
  29. data/lib/data_objects/uri.rb +0 -1
  30. data/lib/data_objects/version.rb +1 -1
  31. data/spec/lib/ssl_helpers.rb +20 -0
  32. data/spec/spec_helper.rb +5 -1
  33. data/spec/transaction_spec.rb +1 -1
  34. data/tasks/gem.rake +1 -42
  35. data/tasks/release.rake +6 -6
  36. data/tasks/spec.rake +1 -0
  37. metadata +14 -6
File without changes
data/Manifest.txt CHANGED
@@ -1,8 +1,8 @@
1
1
  .gitignore
2
- History.txt
2
+ HISTORY.markdown
3
3
  LICENSE
4
4
  Manifest.txt
5
- README.txt
5
+ README.markdown
6
6
  Rakefile
7
7
  lib/data_objects.rb
8
8
  lib/data_objects/command.rb
@@ -1,3 +1,4 @@
1
- = data_objects
1
+ data_objects
2
+ ============
2
3
 
3
4
  A unified Ruby API for popular databases.
data/Rakefile CHANGED
@@ -8,8 +8,8 @@ require 'lib/data_objects/version'
8
8
  ROOT = Pathname(__FILE__).dirname.expand_path
9
9
  JRUBY = RUBY_PLATFORM =~ /java/
10
10
  WINDOWS = Gem.win_platform?
11
- SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
11
+ SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
12
12
 
13
- Dir['tasks/*.rake'].each { |f| import f }
13
+ Dir['tasks/*.rake'].sort.each { |f| import f }
14
14
 
15
15
  CLEAN.include(%w[ pkg/ **/*.rbc ])
data/lib/data_objects.rb CHANGED
@@ -1,19 +1,18 @@
1
- require 'rubygems'
2
-
3
- gem 'extlib', '~>0.9.11'
4
1
  require 'extlib'
5
2
 
6
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'version'))
7
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'logger'))
8
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'connection'))
9
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'uri'))
10
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'transaction'))
11
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'command'))
12
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'result'))
13
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'reader'))
14
- require File.expand_path(File.join(File.dirname(__FILE__), 'data_objects', 'quoting'))
15
-
16
-
17
- module DataObjects
18
- class LengthMismatchError < StandardError; end
19
- end
3
+ require 'data_objects/version'
4
+ require 'data_objects/logger'
5
+ require 'data_objects/connection'
6
+ require 'data_objects/uri'
7
+ require 'data_objects/transaction'
8
+ require 'data_objects/command'
9
+ require 'data_objects/result'
10
+ require 'data_objects/reader'
11
+ require 'data_objects/quoting'
12
+ require 'data_objects/error'
13
+ require 'data_objects/error/sql_error'
14
+ require 'data_objects/error/connection_error'
15
+ require 'data_objects/error/data_error'
16
+ require 'data_objects/error/integrity_error'
17
+ require 'data_objects/error/syntax_error'
18
+ require 'data_objects/error/transaction_error'
@@ -58,7 +58,8 @@ module DataObjects
58
58
  replacements = 0
59
59
  mismatch = false
60
60
 
61
- sql.gsub!(/\?/) do |x|
61
+ sql.gsub!(/'[^']*'|"[^"]*"|`[^`]*`|\?/) do |x|
62
+ next x unless x == '?'
62
63
  replacements += 1
63
64
  if vars.empty?
64
65
  mismatch = true
@@ -1,5 +1,3 @@
1
- require 'set'
2
-
3
1
  begin
4
2
  require 'fastthread'
5
3
  rescue LoadError
@@ -40,7 +38,14 @@ module DataObjects
40
38
  conn_uri = uri
41
39
  end
42
40
 
43
- DataObjects.const_get(driver_name.capitalize)::Connection.new(conn_uri)
41
+ # Exceptions to how a driver class is determined for a given URI
42
+ driver_class = if driver_name == 'sqlserver'
43
+ 'SqlServer'
44
+ else
45
+ driver_name.capitalize
46
+ end
47
+
48
+ DataObjects.const_get(driver_class)::Connection.new(conn_uri)
44
49
  end
45
50
 
46
51
  # Ensure that all Connection subclasses handle pooling and logging uniformly.
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class Error < StandardError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class ConnectionError < SQLError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class DataError < SQLError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class IntegrityError < SQLError
3
+ end
4
+ end
@@ -0,0 +1,22 @@
1
+ module DataObjects
2
+ class SQLError < Error
3
+
4
+ attr_reader :message
5
+ attr_reader :code
6
+ attr_reader :sqlstate
7
+ attr_reader :query
8
+ attr_reader :uri
9
+
10
+ def initialize(message, code = nil, sqlstate = nil, query = nil, uri = nil)
11
+ @message = message
12
+ @code = code
13
+ @sqlstate = sqlstate
14
+ @query = query
15
+ @uri = uri
16
+ end
17
+
18
+ def to_s
19
+ "#{message} (code: #{code}, sql state: #{sqlstate}, query: #{query}, uri: #{uri})"
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class SyntaxError < SQLError
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module DataObjects
2
+ class TransactionError < SQLError
3
+ end
4
+ end
@@ -187,7 +187,7 @@ module DataObjects
187
187
  #
188
188
  def flush
189
189
  return unless @buffer.size > 0
190
- @log.write_method(@buffer.slice!(0..-1).to_s)
190
+ @log.write_method(@buffer.slice!(0..-1).join)
191
191
  end
192
192
 
193
193
  # Close and remove the current log object.
@@ -8,6 +8,7 @@ module DataObjects
8
8
 
9
9
  case value
10
10
  when Numeric then quote_numeric(value)
11
+ when ::Extlib::ByteArray then quote_byte_array(value)
11
12
  when String then quote_string(value)
12
13
  when Time then quote_time(value)
13
14
  when DateTime then quote_datetime(value)
@@ -17,7 +18,6 @@ module DataObjects
17
18
  when Range then quote_range(value)
18
19
  when Symbol then quote_symbol(value)
19
20
  when Regexp then quote_regexp(value)
20
- when ::Extlib::ByteArray then quote_byte_array(value)
21
21
  when Class then quote_class(value)
22
22
  else
23
23
  if value.respond_to?(:to_sql)
@@ -91,7 +91,7 @@ module DataObjects
91
91
  end
92
92
 
93
93
  def quote_byte_array(value)
94
- quote_string(value.source)
94
+ quote_string(value)
95
95
  end
96
96
 
97
97
  end
@@ -52,6 +52,18 @@ share_examples_for 'a Command' do
52
52
 
53
53
  end
54
54
 
55
+ describe 'with a valid statement and ? inside quotes' do
56
+
57
+ before :each do
58
+ @command_with_quotes = @connection.create_command("INSERT INTO users (name) VALUES ('will it work? ')")
59
+ end
60
+
61
+ it 'should not raise an error' do
62
+ lambda { @command_with_quotes.execute_non_query }.should_not raise_error
63
+ end
64
+
65
+ end
66
+
55
67
  end
56
68
 
57
69
  it { @command.should respond_to(:execute_reader) }
@@ -86,6 +98,19 @@ share_examples_for 'a Command' do
86
98
 
87
99
  end
88
100
 
101
+ describe 'with a valid reader and ? inside column alias' do
102
+
103
+ before :each do
104
+ @reader_with_quotes = @connection.create_command("SELECT code AS \"code?\", name FROM widgets WHERE ad_description = ?")
105
+ end
106
+
107
+ it 'should not raise an error' do
108
+ lambda { @reader_with_quotes.execute_reader(nil) }.should_not raise_error
109
+ end
110
+
111
+ end
112
+
113
+
89
114
  end
90
115
 
91
116
  it { @command.should respond_to(:set_types) }
@@ -168,7 +193,13 @@ share_examples_for 'a Command with async' do
168
193
  threads << Thread.new do
169
194
  connection = DataObjects::Connection.new(CONFIG.uri)
170
195
  command = connection.create_command(CONFIG.sleep)
171
- result = command.execute_non_query
196
+ if CONFIG.sleep =~ /^SELECT/i
197
+ reader = command.execute_reader
198
+ reader.next!
199
+ reader.close
200
+ else
201
+ result = command.execute_non_query
202
+ end
172
203
  connection.close
173
204
  end
174
205
  end
@@ -104,3 +104,25 @@ share_examples_for 'a Connection with authentication support' do
104
104
  end
105
105
 
106
106
  end
107
+
108
+ share_examples_for 'a Connection with SSL support' do
109
+
110
+ if DataObjectsSpecHelpers.test_environment_supports_ssl?
111
+ describe 'connecting with SSL' do
112
+
113
+ it 'should connect securely' do
114
+ DataObjects::Connection.new("#{CONFIG.uri}?#{CONFIG.ssl}").secure?.should be_true
115
+ end
116
+
117
+ end
118
+ end
119
+
120
+ describe 'connecting without SSL' do
121
+
122
+ it 'should not connect securely' do
123
+ DataObjects::Connection.new(CONFIG.uri).secure?.should be_false
124
+ end
125
+
126
+ end
127
+
128
+ end
@@ -14,18 +14,30 @@ share_examples_for 'a driver supporting encodings' do
14
14
  describe 'character_set' do
15
15
 
16
16
  it 'uses utf8 by default' do
17
- @connection.character_set.should == 'utf8'
17
+ @connection.character_set.should == 'UTF-8'
18
18
  end
19
19
 
20
20
  describe 'sets the character set through the URI' do
21
21
  before do
22
- @latin1_connection = DataObjects::Connection.new("#{CONFIG.scheme}://#{CONFIG.user}:#{CONFIG.pass}@#{CONFIG.host}:#{CONFIG.port}#{CONFIG.database}?encoding=latin1")
22
+ # @latin1_connection = DataObjects::Connection.new("#{CONFIG.uri}?encoding=latin1")
23
+ @latin1_connection = DataObjects::Connection.new("#{CONFIG.scheme}://#{CONFIG.user}:#{CONFIG.pass}@#{CONFIG.host}:#{CONFIG.port}#{CONFIG.database}?encoding=ISO-8859-1")
23
24
  end
24
25
 
25
26
  after { @latin1_connection.close }
26
27
 
27
- it { @latin1_connection.character_set.should == 'latin1' }
28
+ it { @latin1_connection.character_set.should == 'ISO-8859-1' }
28
29
  end
29
30
 
31
+ describe 'uses UTF-8 when an invalid encoding is given' do
32
+ before do
33
+ @latin1_connection = DataObjects::Connection.new("#{CONFIG.scheme}://#{CONFIG.user}:#{CONFIG.pass}@#{CONFIG.host}:#{CONFIG.port}#{CONFIG.database}?encoding=ISO-INVALID")
34
+ end
35
+
36
+ after { @latin1_connection.close }
37
+
38
+ it { @latin1_connection.character_set.should == 'UTF-8' }
39
+ end
40
+
41
+
30
42
  end
31
43
  end
@@ -37,7 +37,10 @@ share_examples_for 'a Result which returns inserted keys' do
37
37
 
38
38
  before :each do
39
39
  @connection = DataObjects::Connection.new(CONFIG.uri)
40
- @result = @connection.create_command("INSERT INTO users (name) VALUES (?)").execute_non_query("monkey")
40
+ command = @connection.create_command("INSERT INTO users (name) VALUES (?)")
41
+ # execute the command twice and expose the second result
42
+ command.execute_non_query("monkey")
43
+ @result = command.execute_non_query("monkey")
41
44
  end
42
45
 
43
46
  after :each do
@@ -35,7 +35,32 @@ share_examples_for 'supporting BigDecimal' do
35
35
  end
36
36
 
37
37
  it 'should return the correct result' do
38
- @values.first.should == 10.23
38
+ # rounding seems necessary for the jruby do_derby driver
39
+ @values.first.round(2).should == 10.23
40
+ end
41
+
42
+ end
43
+
44
+ describe 'with manual typecasting a nil value' do
45
+
46
+ before do
47
+ @command = @connection.create_command("SELECT cost2 FROM widgets WHERE id = ?")
48
+ @command.set_types(BigDecimal)
49
+ @reader = @command.execute_reader(6)
50
+ @reader.next!
51
+ @values = @reader.values
52
+ end
53
+
54
+ after do
55
+ @reader.close
56
+ end
57
+
58
+ it 'should return the correctly typed result' do
59
+ @values.first.should be_kind_of(NilClass)
60
+ end
61
+
62
+ it 'should return the correct result' do
63
+ @values.first.should be_nil
39
64
  end
40
65
 
41
66
  end
@@ -40,6 +40,30 @@ share_examples_for 'supporting Boolean' do
40
40
 
41
41
  end
42
42
 
43
+ describe 'with manual typecasting a nil value' do
44
+
45
+ before do
46
+ @command = @connection.create_command("SELECT flags FROM widgets WHERE id = ?")
47
+ @command.set_types(TrueClass)
48
+ @reader = @command.execute_reader(4)
49
+ @reader.next!
50
+ @values = @reader.values
51
+ end
52
+
53
+ after do
54
+ @reader.close
55
+ end
56
+
57
+ it 'should return the correctly typed result' do
58
+ @values.first.should be_kind_of(NilClass)
59
+ end
60
+
61
+ it 'should return the correct result' do
62
+ @values.first.should be_nil
63
+ end
64
+
65
+ end
66
+
43
67
  end
44
68
 
45
69
  describe 'writing an Boolean' do
@@ -40,12 +40,36 @@ share_examples_for 'supporting Date' do
40
40
 
41
41
  end
42
42
 
43
+ describe 'with manual typecasting a nil value' do
44
+
45
+ before do
46
+ @command = @connection.create_command("SELECT release_date FROM widgets WHERE id = ?")
47
+ @command.set_types(Date)
48
+ @reader = @command.execute_reader(7)
49
+ @reader.next!
50
+ @values = @reader.values
51
+ end
52
+
53
+ after do
54
+ @reader.close
55
+ end
56
+
57
+ it 'should return a nil class' do
58
+ @values.first.should be_kind_of(NilClass)
59
+ end
60
+
61
+ it 'should return nil' do
62
+ @values.first.should be_nil
63
+ end
64
+
65
+ end
66
+
43
67
  end
44
68
 
45
69
  describe 'writing an Date' do
46
70
 
47
71
  before do
48
- @reader = @connection.create_command("SELECT id FROM widgets WHERE release_date = ?").execute_reader(Date.civil(2008, 2, 14))
72
+ @reader = @connection.create_command("SELECT id FROM widgets WHERE release_date = ? ORDER BY id").execute_reader(Date.civil(2008, 2, 14))
49
73
  @reader.next!
50
74
  @values = @reader.values
51
75
  end
@@ -1,3 +1,5 @@
1
+ JRUBY = RUBY_PLATFORM =~ /java/ unless defined?(JRUBY)
2
+
1
3
  share_examples_for 'supporting DateTime' do
2
4
 
3
5
  include DataObjectsSpecHelpers
@@ -41,12 +43,37 @@ share_examples_for 'supporting DateTime' do
41
43
 
42
44
  end
43
45
 
46
+ describe 'with manual typecasting a nil value' do
47
+
48
+ before do
49
+ @command = @connection.create_command("SELECT release_datetime FROM widgets WHERE id = ?")
50
+ @command.set_types(DateTime)
51
+ @reader = @command.execute_reader(8)
52
+ @reader.next!
53
+ @values = @reader.values
54
+ end
55
+
56
+ after do
57
+ @reader.close
58
+ end
59
+
60
+ it 'should return a nil class' do
61
+ @values.first.should be_kind_of(NilClass)
62
+ end
63
+
64
+ it 'should return nil' do
65
+ @values.first.should be_nil
66
+ end
67
+
68
+ end
69
+
44
70
  end
45
71
 
46
72
  describe 'writing an DateTime' do
47
73
 
48
74
  before do
49
- @reader = @connection.create_command("SELECT id FROM widgets WHERE release_datetime = ?").execute_reader(DateTime.civil(2008, 2, 14, 00, 31, 12, 0))
75
+ local_offset = Rational(Time.local(2008, 2, 14).utc_offset, 86400)
76
+ @reader = @connection.create_command("SELECT id FROM widgets WHERE release_datetime = ? ORDER BY id").execute_reader(DateTime.civil(2008, 2, 14, 00, 31, 12, local_offset))
50
77
  @reader.next!
51
78
  @values = @reader.values
52
79
  end
@@ -41,6 +41,29 @@ share_examples_for 'supporting Float' do
41
41
 
42
42
  end
43
43
 
44
+ describe 'with manual typecasting a nil' do
45
+
46
+ before do
47
+ @command = @connection.create_command("SELECT cost1 FROM widgets WHERE id = ?")
48
+ @command.set_types(Float)
49
+ @reader = @command.execute_reader(5)
50
+ @reader.next!
51
+ @values = @reader.values
52
+ end
53
+
54
+ after do
55
+ @reader.close
56
+ end
57
+
58
+ it 'should return the correctly typed result' do
59
+ @values.first.should be_kind_of(NilClass)
60
+ end
61
+
62
+ it 'should return the correct result' do
63
+ @values.first.should be_nil
64
+ end
65
+
66
+ end
44
67
  end
45
68
 
46
69
  describe 'writing an Float' do
@@ -101,7 +124,7 @@ share_examples_for 'supporting Float autocasting' do
101
124
 
102
125
  it 'should return the correct result' do
103
126
  @values.first.should == 13.4
104
- @values.last.should == 10.23
127
+ BigDecimal.new(@values.last.to_s).round(2).should == 10.23
105
128
  end
106
129
 
107
130
  end
@@ -46,23 +46,38 @@ end
46
46
 
47
47
  share_examples_for 'supporting writing an Nil' do
48
48
 
49
- describe 'supporting writing an Nil' do
49
+ include DataObjectsSpecHelpers
50
+
51
+ before :all do
52
+ setup_test_environment
53
+ end
54
+
55
+ before :each do
56
+ @connection = DataObjects::Connection.new(CONFIG.uri)
57
+ end
58
+
59
+ after :each do
60
+ @connection.close
61
+ end
62
+
63
+
64
+ describe 'supporting writing an Nil' do
65
+ # see as an example oracle
66
+ # http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements005.htm#sthref487
67
+ # http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/conditions013.htm#i1050801
50
68
 
51
69
  describe 'as a parameter' do
52
70
 
53
71
  before do
54
- @reader = @connection.create_command("SELECT id FROM widgets WHERE ad_description IS ?").execute_reader(nil)
55
- @reader.next!
56
- @values = @reader.values
57
- end
72
+ @reader = @connection.create_command("SELECT id FROM widgets WHERE ad_description IN (?) ORDER BY id").execute_reader(nil)
73
+ end
58
74
 
59
75
  after do
60
76
  @reader.close
61
77
  end
62
78
 
63
79
  it 'should return the correct entry' do
64
- #Some of the drivers starts autoincrementation from 0 not 1
65
- @values.first.should satisfy { |val| val == 3 or val == 2 }
80
+ @reader.next!.should be_false
66
81
  end
67
82
 
68
83
  end
@@ -40,12 +40,36 @@ share_examples_for 'supporting Time' do
40
40
 
41
41
  end
42
42
 
43
+ describe 'with manual typecasting a nil value' do
44
+
45
+ before do
46
+ @command = @connection.create_command("SELECT release_timestamp FROM widgets WHERE id = ?")
47
+ @command.set_types(Time)
48
+ @reader = @command.execute_reader(9)
49
+ @reader.next!
50
+ @values = @reader.values
51
+ end
52
+
53
+ after do
54
+ @reader.close
55
+ end
56
+
57
+ it 'should return a nil class' do
58
+ @values.first.should be_kind_of(NilClass)
59
+ end
60
+
61
+ it 'should return nil' do
62
+ @values.first.should be_nil
63
+ end
64
+
65
+ end
66
+
43
67
  end
44
68
 
45
69
  describe 'writing an Time' do
46
70
 
47
71
  before do
48
- @reader = @connection.create_command("SELECT id FROM widgets WHERE release_datetime = ?").execute_reader(Time.utc(2008, 2, 14, 00, 31, 12))
72
+ @reader = @connection.create_command("SELECT id FROM widgets WHERE release_datetime = ? ORDER BY id").execute_reader(Time.local(2008, 2, 14, 00, 31, 12))
49
73
  @reader.next!
50
74
  @values = @reader.values
51
75
  end
@@ -33,16 +33,26 @@ module DataObjects
33
33
  @connection.close
34
34
  end
35
35
 
36
- # Begin the Transaction
37
- def begin; not_implemented; end
38
- # Commit changes made in this Transaction
39
- def commit; not_implemented; end
40
- # Rollback changes made in this Transaction
41
- def rollback; not_implemented; end;
42
- # Prepare this Transaction for the second phase of a two-phase commit
36
+ def begin
37
+ cmd = "BEGIN"
38
+ connection.create_command(cmd).execute_non_query
39
+ end
40
+
41
+ def commit
42
+ cmd = "COMMIT"
43
+ connection.create_command(cmd).execute_non_query
44
+ end
45
+
46
+ def rollback
47
+ cmd = "ROLLBACK"
48
+ connection.create_command(cmd).execute_non_query
49
+ end
50
+
43
51
  def prepare; not_implemented; end;
44
- # Abandon the second phase of a two-phase commit and roll back the changes
52
+ def begin_prepared; not_implemented; end;
53
+ def commit_prepared; not_implemented; end;
45
54
  def rollback_prepared; not_implemented; end;
55
+ def prepare; not_implemented; end;
46
56
 
47
57
  private
48
58
  def not_implemented
@@ -1,4 +1,3 @@
1
- gem 'addressable', '~>2.0'
2
1
  require 'addressable/uri'
3
2
 
4
3
  module DataObjects
@@ -1,4 +1,4 @@
1
1
  module DataObjects
2
2
  # Current DataObjects Gem version
3
- VERSION = "0.9.12" unless defined?(DataObjects::VERSION)
3
+ VERSION = "0.10.0" unless defined?(DataObjects::VERSION)
4
4
  end
@@ -0,0 +1,20 @@
1
+ require 'cgi'
2
+
3
+ module SSLHelpers
4
+
5
+ CERTS_DIR = Pathname(__FILE__).dirname.join('ssl_certs').to_s
6
+
7
+ CONFIG = OpenStruct.new
8
+ CONFIG.ca_cert = CERTS_DIR / 'ca-cert.pem'
9
+ CONFIG.ca_key = CERTS_DIR / 'ca-key.pem'
10
+ CONFIG.server_cert = CERTS_DIR / 'server-cert.pem'
11
+ CONFIG.server_key = CERTS_DIR / 'server-key.pem'
12
+ CONFIG.client_cert = CERTS_DIR / 'client-cert.pem'
13
+ CONFIG.client_key = CERTS_DIR / 'client-key.pem'
14
+ CONFIG.cipher = 'AES128-SHA'
15
+
16
+ def self.query(*keys)
17
+ keys.map { |key| "ssl[#{key}]=#{CGI::escape(CONFIG.send(key))}" }.join('&')
18
+ end
19
+
20
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'spec'
3
3
 
4
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'data_objects'))
4
+ dir = File.dirname(__FILE__)
5
+ lib_path = File.expand_path("#{dir}/../lib")
6
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
7
+ require 'data_objects'
8
+
5
9
  require File.expand_path(File.join(File.dirname(__FILE__), 'do_mock'))
@@ -30,7 +30,7 @@ describe DataObjects::Transaction do
30
30
  @transaction.close
31
31
  end
32
32
  end
33
- [:begin, :commit, :rollback, :rollback_prepared, :prepare].each do |meth|
33
+ [:prepare, :commit_prepared, :rollback_prepared].each do |meth|
34
34
  it "should raise NotImplementedError on #{meth}" do
35
35
  lambda do @transaction.send(meth) end.should raise_error(NotImplementedError)
36
36
  end
data/tasks/gem.rake CHANGED
@@ -1,49 +1,8 @@
1
1
  require 'rubygems/package_task'
2
2
 
3
- GEM_SPEC = Gem::Specification.new do |s|
4
- # basic information
5
- s.name = "data_objects"
6
- s.version = DataObjects::VERSION
7
- s.platform = Gem::Platform::RUBY
8
-
9
- # description and details
10
- s.summary = 'DataObjects basic API and shared driver specifications'
11
- s.description = "Provide a standard and simplified API for communicating with RDBMS from Ruby"
12
-
13
- # dependencies
14
- s.add_dependency "addressable", "~>2.0.0"
15
- s.add_dependency "extlib", "~>0.9.12"
16
-
17
- # development dependencies
18
- s.add_development_dependency 'rspec', '~>1.2.0'
19
-
20
- # components, files and paths
21
- s.files = FileList["lib/**/*.rb", "spec/**/*.rb", "tasks/**/*.rake",
22
- "LICENSE", "Rakefile", "*.{rdoc,txt,yml}"]
23
-
24
- s.require_path = 'lib'
25
-
26
- # documentation
27
- s.has_rdoc = false
28
-
29
- # project information
30
- s.homepage = 'http://github.com/datamapper/do'
31
- s.rubyforge_project = 'dorb'
32
-
33
- # author and contributors
34
- s.author = 'Dirkjan Bussink'
35
- s.email = 'd.bussink@gmail.com'
36
- end
3
+ GEM_SPEC = eval(File.read('data_objects.gemspec'))
37
4
 
38
5
  gem_package = Gem::PackageTask.new(GEM_SPEC) do |pkg|
39
6
  pkg.need_tar = false
40
7
  pkg.need_zip = false
41
8
  end
42
-
43
- file "#{GEM_SPEC.name}.gemspec" => ['Rakefile', 'tasks/gem.rake'] do |t|
44
- puts "Generating #{t.name}"
45
- File.open(t.name, 'w') { |f| f.puts GEM_SPEC.to_yaml }
46
- end
47
-
48
- desc "Generate or update the standalone gemspec file for the project"
49
- task :gemspec => ["#{GEM_SPEC.name}.gemspec"]
data/tasks/release.rake CHANGED
@@ -26,19 +26,19 @@ if defined?(RubyForge) then
26
26
 
27
27
  # read project info and overview
28
28
  notes = begin
29
- r = File.read("README.rdoc")
30
- r.split(/^(=+ .*)/)[1..4].join.strip
29
+ r = File.read("README.markdown")
30
+ r.split(/^(.*\n\-+)/)[1..4].join.strip
31
31
  rescue
32
- warn "Missing README.rdoc"
32
+ warn "Missing README.markdown"
33
33
  ''
34
34
  end
35
35
 
36
36
  # read changes
37
37
  changes = begin
38
- h = File.read("History.txt")
39
- h.split(/^(==+ .*)/)[1..2].join.strip
38
+ h = File.read("HISTORY.markdown")
39
+ h.split(/^(##+ .*)/)[1..2].join.strip
40
40
  rescue
41
- warn "Missing History.txt"
41
+ warn "Missing HISTORY.markdown"
42
42
  ''
43
43
  end
44
44
 
data/tasks/spec.rake CHANGED
@@ -5,6 +5,7 @@ desc 'Run specifications'
5
5
  Spec::Rake::SpecTask.new(:spec) do |t|
6
6
  t.spec_opts << '--options' << ROOT + 'spec/spec.opts'
7
7
  t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }
8
+ t.libs << 'lib'
8
9
 
9
10
  begin
10
11
  # RCov is run by default, except on the JRuby platform
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: data_objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dirkjan Bussink
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-17 00:00:00 +02:00
12
+ date: 2009-09-16 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 2.0.0
23
+ version: "2.0"
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: extlib
@@ -53,6 +53,13 @@ extra_rdoc_files: []
53
53
  files:
54
54
  - lib/data_objects/command.rb
55
55
  - lib/data_objects/connection.rb
56
+ - lib/data_objects/error/connection_error.rb
57
+ - lib/data_objects/error/data_error.rb
58
+ - lib/data_objects/error/integrity_error.rb
59
+ - lib/data_objects/error/sql_error.rb
60
+ - lib/data_objects/error/syntax_error.rb
61
+ - lib/data_objects/error/transaction_error.rb
62
+ - lib/data_objects/error.rb
56
63
  - lib/data_objects/logger.rb
57
64
  - lib/data_objects/quoting.rb
58
65
  - lib/data_objects/reader.rb
@@ -86,6 +93,7 @@ files:
86
93
  - spec/do_mock.rb
87
94
  - spec/lib/pending_helpers.rb
88
95
  - spec/lib/rspec_immediate_feedback_formatter.rb
96
+ - spec/lib/ssl_helpers.rb
89
97
  - spec/reader_spec.rb
90
98
  - spec/result_spec.rb
91
99
  - spec/spec_helper.rb
@@ -97,9 +105,9 @@ files:
97
105
  - tasks/spec.rake
98
106
  - LICENSE
99
107
  - Rakefile
100
- - History.txt
108
+ - HISTORY.markdown
109
+ - README.markdown
101
110
  - Manifest.txt
102
- - README.txt
103
111
  has_rdoc: true
104
112
  homepage: http://github.com/datamapper/do
105
113
  licenses: []
@@ -124,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
132
  requirements: []
125
133
 
126
134
  rubyforge_project: dorb
127
- rubygems_version: 1.3.3
135
+ rubygems_version: 1.3.4
128
136
  signing_key:
129
137
  specification_version: 3
130
138
  summary: DataObjects basic API and shared driver specifications