Class: DataObjects::Connection

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/data_objects/connection.rb

Overview

An abstract connection to a DataObjects resource. The physical connection may be broken and re-established from time to time.

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Logging

#log

Constructor Details

#initialize(uri) ⇒ Connection

:nodoc:

Raises:

  • (NotImplementedError)


108
109
110
# File 'lib/data_objects/connection.rb', line 108

def initialize(uri) #:nodoc:
  raise NotImplementedError.new
end

Class Method Details

.inherited(target) ⇒ Object

Ensure that all Connection subclasses handle pooling and logging uniformly. See also DataObjects::Pooling and DataObjects::Logger



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/data_objects/connection.rb', line 70

def self.inherited(target)
  target.class_eval do

    # Allocate a Connection object from the pool, creating one if necessary. This method is active in Connection subclasses only.
    def self.new(*args)
      instance = allocate
      instance.send(:initialize, *args)
      instance
    end

    include Quoting
  end

  if driver_module_name = target.name.split('::')[-2]
    driver_module = DataObjects::const_get(driver_module_name)
    driver_module.class_eval <<-EOS, __FILE__, __LINE__
      def self.logger
        @logger
      end

      def self.logger=(logger)
        @logger = logger
      end
    EOS

    driver_module.logger = DataObjects::Logger.new(nil, :off)
  end
end

.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
# 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_name = uri.query.delete("scheme")
    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.path.sub(/jdbc:/, '')
    driver_name = 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_name = uri.scheme
    conn_uri = uri
  end

  # Exceptions to how a driver class is determined for a given URI
  driver_class = if driver_name == 'sqlserver'
    'SqlServer'
  else
    driver_name.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

Instance Method Details

#create_command(text) ⇒ Object

Create a Command object of the right subclass using the given text



117
118
119
# File 'lib/data_objects/connection.rb', line 117

def create_command(text)
  concrete_command.new(self, text)
end

#disposeObject

:nodoc:

Raises:

  • (NotImplementedError)


112
113
114
# File 'lib/data_objects/connection.rb', line 112

def dispose #:nodoc:
  raise NotImplementedError.new
end

#extensionObject



121
122
123
# File 'lib/data_objects/connection.rb', line 121

def extension
  driver_namespace.const_get('Extension').new(self)
end

#to_sObject

Show the URI for this connection



104
105
106
# File 'lib/data_objects/connection.rb', line 104

def to_s
  @uri.to_s
end