Class: JDBCHelper::Connection
- Inherits:
-
Object
- Object
- JDBCHelper::Connection
- Defined in:
- lib/jdbc-helper/connection.rb,
lib/jdbc-helper/connection/row.rb,
lib/jdbc-helper/connection/type_map.rb,
lib/jdbc-helper/connection/result_set.rb,
lib/jdbc-helper/connection/statement_pool.rb,
lib/jdbc-helper/connection/callable_statement.rb,
lib/jdbc-helper/connection/prepared_statement.rb,
lib/jdbc-helper/connection/parameterized_statement.rb
Overview
p_upd.close
Defined Under Namespace
Classes: CallableStatement, ParameterizedStatement, PreparedStatement, ResultSet, Row, StatementPool, Transaction
Constant Summary collapse
- RUBY_SQL_TYPE_MAP =
{ Fixnum => java.sql.Types::INTEGER, Bignum => java.sql.Types::BIGINT, String => java.sql.Types::VARCHAR, Float => java.sql.Types::DOUBLE, Time => java.sql.Types::TIMESTAMP }
- GETTER_MAP =
{ java.sql.Types::TINYINT => :getInt, java.sql.Types::SMALLINT => :getInt, java.sql.Types::INTEGER => :getInt, java.sql.Types::BIGINT => :getLong, java.sql.Types::CHAR => :getString, java.sql.Types::VARCHAR => :getString, java.sql.Types::LONGVARCHAR => :getString, (java.sql.Types::NCHAR rescue nil) => :getString, (java.sql.Types::NVARCHAR rescue nil) => :getString, (java.sql.Types::LONGNVARCHAR rescue nil) => :getString, # !! MySQL function returns VARBINARY type java.sql.Types::BINARY => :getBinaryStream, java.sql.Types::VARBINARY => :getBinaryStream, java.sql.Types::LONGVARBINARY => :getBinaryStream, java.sql.Types::REAL => :getDouble, java.sql.Types::FLOAT => :getFloat, java.sql.Types::DOUBLE => :getDouble, java.sql.Types::DATE => :getDate, java.sql.Types::TIME => :getTime, java.sql.Types::TIMESTAMP => :getTimestamp, java.sql.Types::BLOB => :getBlob, java.sql.Types::CLOB => :getString, (java.sql.Types::NCLOB rescue nil) => :getString, java.sql.Types::BOOLEAN => :getBoolean }
Instance Attribute Summary collapse
-
#driver ⇒ String
readonly
JDBC driver of the connection.
-
#fetch_size ⇒ Fixnum
Returns the fetch size of the connection.
-
#url ⇒ String
readonly
JDBC URL of the connection.
Instance Method Summary collapse
-
#add_batch(qstr) ⇒ NilClass
Adds a statement to be executed in batch Adds to the batch.
-
#clear_batch ⇒ NilClass
Clears the batched statements including prepared statements.
-
#clone ⇒ JDBCHelper::Connection
Creates another connection with the same parameters as this Connection.
-
#close ⇒ NilClass
Closes the connection.
-
#closed? ⇒ Boolean
Returns if this connection is closed or not.
-
#execute(qstr) ⇒ Fixnum|ResultSet
Executes an SQL and returns the count of the update rows or a ResultSet object depending on the type of the given statement.
-
#execute_batch ⇒ Fixnum
Executes batched statements including prepared statements.
-
#function(func_name) ⇒ JDBCHelper::FunctionWrapper
Returns a function wrapper for the given function name.
-
#initialize(args = {}) ⇒ Connection
constructor
Creates a database connection.
- #inspect ⇒ String
-
#jdbc_conn ⇒ Object
(also: #java_obj, #java)
Returns the underlying JDBC Connection object.
-
#prepare(qstr) ⇒ Object
Creates a prepared statement, which is also an encapsulation of Java PreparedStatement object.
-
#prepare_call(qstr) ⇒ Object
Creates a callable statement.
-
#prepared_statements ⇒ Array
Prepared statements currently opened for this connection.
-
#procedure(proc_name) ⇒ JDBCHelper::ProcedureWrapper
Returns a procedure wrapper for the given procedure name.
-
#query(qstr) {|JDBCHelper::Connection::Row| ... } ⇒ Array
(also: #enumerate)
Executes a select query.
-
#sequence(sequence_name) ⇒ JDBCHelper::SequenceWrapper
Returns a sequence wrapper for the given name.
-
#set_fetch_size(fsz) ⇒ NilClass
(also: #fetch_size=)
Gives the JDBC driver a hint of the number of rows to fetch from the database by a single interaction.
-
#table(table_name) ⇒ JDBCHelper::TableWrapper
(also: #[])
Returns a table wrapper for the given table name.
-
#transaction {|JDBCHelper::Connection::Transaction| ... } ⇒ Boolean
Executes the given code block as a transaction.
-
#update(qstr) ⇒ Fixnum
Executes an update and returns the count of the updated rows.
Constructor Details
#initialize(args = {}) ⇒ Connection
Creates a database connection.
-
‘args` hash must include :driver (or “driver”) and :url (or “url”)
-
and takes optional :user and :password tuples (or “user”, “password”)
-
You can also specify :timeout (or “timeout”) to override the default connection timeout (60 seconds)
Must be closed explicitly if not used. If a block is given, the connection is automatically closed after executing the block.
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/jdbc-helper/connection.rb', line 138 def initialize(args = {}) # Subsequent deletes should not affect the input @args = args args = InsensitiveHash[ @args ] raise ArgumentError.new("driver not given") unless args.has_key? :driver raise ArgumentError.new("url not given") unless args.has_key? :url @driver = args.delete :driver @url = args.delete :url # NameError will be thrown for invalid drivers Java::JavaClass.for_name @driver timeout = args.has_key?(:timeout) ? args.delete(:timeout) : Constants::DEFAULT_LOGIN_TIMEOUT if timeout if timeout.is_a?(Fixnum) == false || timeout <= 0 raise ArgumentError.new("Timeout must be a positive integer") end Java::java.sql.DriverManager.setLoginTimeout timeout end props = Java::java.util.Properties.new args.each do |k, v| props.setProperty(k.to_s, v.to_s) if v end @conn = Java::java.sql.DriverManager.get_connection(@url, props) @spool = StatementPool.send :new, self @bstmt = nil @fetch_size = nil @pstmts = [] @table_wrappers = {} if block_given? begin yield self ensure close rescue nil end end end |
Instance Attribute Details
#driver ⇒ String (readonly)
JDBC driver of the connection
120 121 122 |
# File 'lib/jdbc-helper/connection.rb', line 120 def driver @driver end |
#fetch_size ⇒ Fixnum
Returns the fetch size of the connection. If not set, nil is returned.
375 376 377 |
# File 'lib/jdbc-helper/connection.rb', line 375 def fetch_size @fetch_size end |
#url ⇒ String (readonly)
JDBC URL of the connection
116 117 118 |
# File 'lib/jdbc-helper/connection.rb', line 116 def url @url end |
Instance Method Details
#add_batch(qstr) ⇒ NilClass
Adds a statement to be executed in batch Adds to the batch
318 319 320 321 322 323 |
# File 'lib/jdbc-helper/connection.rb', line 318 def add_batch(qstr) check_closed @bstmt ||= @spool.take @bstmt.add_batch qstr end |
#clear_batch ⇒ NilClass
Clears the batched statements including prepared statements.
347 348 349 350 351 352 353 354 355 356 357 358 359 |
# File 'lib/jdbc-helper/connection.rb', line 347 def clear_batch check_closed if @bstmt @bstmt.clear_batch @spool.give @bstmt @bstmt = nil end @pstmts.each do |stmt| stmt.clear_batch end end |
#clone ⇒ JDBCHelper::Connection
Creates another connection with the same parameters as this Connection.
185 186 187 188 189 |
# File 'lib/jdbc-helper/connection.rb', line 185 def clone nc = JDBCHelper::Connection.new @args nc.fetch_size = @fetch_size if @fetch_size nc end |
#close ⇒ NilClass
Closes the connection
379 380 381 382 383 384 |
# File 'lib/jdbc-helper/connection.rb', line 379 def close return if closed? @spool.close @conn.close @conn = @spool = nil end |
#closed? ⇒ Boolean
Returns if this connection is closed or not
388 389 390 |
# File 'lib/jdbc-helper/connection.rb', line 388 def closed? @conn.nil? end |
#execute(qstr) ⇒ Fixnum|ResultSet
Executes an SQL and returns the count of the update rows or a ResultSet object depending on the type of the given statement. If a ResultSet is returned, it must be enumerated or closed.
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
# File 'lib/jdbc-helper/connection.rb', line 249 def execute(qstr) check_closed stmt = @spool.take begin if stmt.execute(qstr) ResultSet.send(:new, stmt.getResultSet) { @spool.give stmt } else rset = stmt.getUpdateCount @spool.give stmt rset end rescue Exception => e @spool.give stmt raise end end |
#execute_batch ⇒ Fixnum
Executes batched statements including prepared statements. No effect when no statement is added
327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 |
# File 'lib/jdbc-helper/connection.rb', line 327 def execute_batch check_closed cnt = 0 if @bstmt cnt += @bstmt.execute_batch.inject(:+) || 0 @spool.give @bstmt @bstmt = nil end @pstmts.each do |pstmt| cnt += pstmt.execute_batch end cnt end |
#function(func_name) ⇒ JDBCHelper::FunctionWrapper
Returns a function wrapper for the given function name
415 416 417 |
# File 'lib/jdbc-helper/connection.rb', line 415 def function func_name JDBCHelper::FunctionWrapper.new self, func_name end |
#inspect ⇒ String
428 429 430 431 432 |
# File 'lib/jdbc-helper/connection.rb', line 428 def inspect InsensitiveHash[@args].merge({ :closed? => closed? }).tap { |c| c.delete(:password) }.inspect end |
#jdbc_conn ⇒ Object Also known as: java_obj, java
Returns the underlying JDBC Connection object. Only use this when you really need to access it directly.
124 125 126 |
# File 'lib/jdbc-helper/connection.rb', line 124 def jdbc_conn @conn end |
#prepare(qstr) ⇒ Object
Creates a prepared statement, which is also an encapsulation of Java PreparedStatement object
193 194 195 196 197 198 199 200 201 |
# File 'lib/jdbc-helper/connection.rb', line 193 def prepare(qstr) check_closed pstmt = PreparedStatement.send(:new, self, qstr, @conn.prepare_statement(qstr)) pstmt.set_fetch_size @fetch_size if @fetch_size @pstmts << pstmt pstmt end |
#prepare_call(qstr) ⇒ Object
Creates a callable statement.
210 211 212 213 214 |
# File 'lib/jdbc-helper/connection.rb', line 210 def prepare_call(qstr) check_closed CallableStatement.send(:new, self, qstr, @conn.prepare_call(qstr)) end |
#prepared_statements ⇒ Array
Returns Prepared statements currently opened for this connection.
204 205 206 |
# File 'lib/jdbc-helper/connection.rb', line 204 def prepared_statements @pstmts end |
#procedure(proc_name) ⇒ JDBCHelper::ProcedureWrapper
Returns a procedure wrapper for the given procedure name
423 424 425 |
# File 'lib/jdbc-helper/connection.rb', line 423 def procedure proc_name JDBCHelper::ProcedureWrapper.new self, proc_name end |
#query(qstr) {|JDBCHelper::Connection::Row| ... } ⇒ Array Also known as: enumerate
Executes a select query. When a code block is given, each row of the result is passed to the block one by one. If not given, ResultSet is returned, which can be used to enumerate through the result set. ResultSet is closed automatically when all the rows in the result set is consumed.
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 |
# File 'lib/jdbc-helper/connection.rb', line 292 def query(qstr, &blk) check_closed stmt = @spool.take begin rset = stmt.execute_query(qstr) rescue Exception => e @spool.give stmt raise end enum = ResultSet.send(:new, rset) { @spool.give stmt } if block_given? enum.each do |row| yield row end else enum end end |
#sequence(sequence_name) ⇒ JDBCHelper::SequenceWrapper
Returns a sequence wrapper for the given name
407 408 409 |
# File 'lib/jdbc-helper/connection.rb', line 407 def sequence sequence_name JDBCHelper::SequenceWrapper.new self, sequence_name end |
#set_fetch_size(fsz) ⇒ NilClass Also known as: fetch_size=
Gives the JDBC driver a hint of the number of rows to fetch from the database by a single interaction. This is only a hint. It may have no effect at all.
365 366 367 368 369 370 |
# File 'lib/jdbc-helper/connection.rb', line 365 def set_fetch_size(fsz) check_closed @fetch_size = fsz @spool.each { | stmt | stmt.set_fetch_size @fetch_size } end |
#table(table_name) ⇒ JDBCHelper::TableWrapper Also known as: []
Returns a table wrapper for the given table name
396 397 398 399 400 |
# File 'lib/jdbc-helper/connection.rb', line 396 def table table_name table = JDBCHelper::TableWrapper.new(self, table_name) table = table.fetch_size(@fetch_size) if @fetch_size @table_wrappers[table_name] ||= table end |
#transaction {|JDBCHelper::Connection::Transaction| ... } ⇒ Boolean
Executes the given code block as a transaction. Returns true if the transaction is committed. A transaction object is passed to the block, which only has commit and rollback methods. The execution breaks out of the code block when either of the methods is called.
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 |
# File 'lib/jdbc-helper/connection.rb', line 221 def transaction check_closed raise ArgumentError.new("Transaction block not given") unless block_given? tx = Transaction.send :new, @conn ac = @conn.get_auto_commit status = :unknown begin @conn.set_auto_commit false yield tx @conn.commit status = :committed rescue Transaction::Commit status = :committed rescue Transaction::Rollback status = :rolledback ensure @conn.rollback if status == :unknown && @conn.get_auto_commit == false @conn.set_auto_commit ac end status == :committed end |
#update(qstr) ⇒ Fixnum
Executes an update and returns the count of the updated rows.
270 271 272 273 274 275 276 |
# File 'lib/jdbc-helper/connection.rb', line 270 def update(qstr) check_closed @spool.with do | stmt | ret = stmt.execute_update(qstr) end end |