Method: DataObjects::Connection.new

Defined in:
lib/data_objects/connection.rb

.new(uri_s) ⇒ Object

Make a connection to the database using the DataObjects::URI given. Note that the physical connection may be delayed until the first command is issued, so success here doesn’t necessarily mean you can connect.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/data_objects/connection.rb', line 14

def self.new(uri_s)
  uri = DataObjects::URI::parse(uri_s)

  case uri.scheme.to_sym
  when :java
    warn 'JNDI URLs (connection strings) are only for use with JRuby' unless RUBY_PLATFORM =~ /java/

    driver   = uri.query.delete('scheme')
    driver   = uri.query.delete('driver')

    conn_uri = uri.to_s.gsub(/\?$/, '')
  when :jdbc
    warn 'JDBC URLs (connection strings) are only for use with JRuby' unless RUBY_PLATFORM =~ /java/

    path = uri.subscheme
    driver = if path.split(':').first == 'sqlite'
      'sqlite3'
    elsif path.split(':').first == 'postgresql'
      'postgres'
    else
      path.split(':').first
    end

    conn_uri = uri_s # NOTE: for now, do not reformat this JDBC connection
                     # string -- or, in other words, do not let
                     # DataObjects::URI#to_s be called -- as it is not
                     # correctly handling JDBC URLs, and in doing so, causing
                     # java.sql.DriverManager.getConnection to throw a
                     # 'No suitable driver found for...' exception.
  else
    driver   = uri.scheme
    conn_uri = uri
  end

  # Exceptions to how a driver class is determined for a given URI
  driver_class = if driver == 'sqlserver'
    'SqlServer'
  else
    driver.capitalize
  end

  clazz = DataObjects.const_get(driver_class)::Connection
  unless clazz.method_defined? :close
    if (uri.scheme.to_sym == :java)
      clazz.class_eval do
        alias close dispose
      end
    else
      clazz.class_eval do
        include Pooling
        alias close release
      end
    end
  end
  clazz.new(conn_uri)
end