class Baza::JdbcDriver
Attributes
conn[R]
conns[R]
Public Class Methods
new(db)
click to toggle source
Calls superclass method
Baza::BaseSqlDriver::new
# File lib/baza/jdbc_driver.rb, line 4 def initialize(db) @java_rs_data = {} @mutex = ::Mutex.new super end
Public Instance Methods
close()
click to toggle source
Closes the connection threadsafe.
# File lib/baza/jdbc_driver.rb, line 43 def close @mutex.synchronize { @conn.close } end
query(str)
click to toggle source
Executes a query and returns the result.
# File lib/baza/jdbc_driver.rb, line 21 def query(str) query_with_statement(str, @preload_results) do @conn.create_statement end end
query_ubuf(str)
click to toggle source
Executes an unbuffered query and returns the result that can be used to access the data.
# File lib/baza/jdbc_driver.rb, line 28 def query_ubuf(str) query_with_statement(str, false) do stmt = @conn.create_statement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY) if @db.opts[:type] == :sqlite3_java stmt.fetch_size = 1 else stmt.fetch_size = java.lang.Integer::MIN_VALUE end stmt end end
result_set_killer(id)
click to toggle source
This method handels the closing of statements and results for the Java MySQL-mode.
# File lib/baza/jdbc_driver.rb, line 11 def result_set_killer(id) data = @java_rs_data[id] return nil unless data data[:res].close data[:stmt].close @java_rs_data.delete(id) end
Private Instance Methods
query_no_result_set(sql)
click to toggle source
# File lib/baza/jdbc_driver.rb, line 81 def query_no_result_set(sql) stmt = @conn.create_statement stmt.execute(sql) return nil ensure stmt.close if stmt end
query_with_statement(sql, preload_results) { || ... }
click to toggle source
# File lib/baza/jdbc_driver.rb, line 49 def query_with_statement(sql, preload_results) @mutex.synchronize do begin if sql =~ /^\s*(delete|update|create|drop|insert\s+into|alter|truncate)\s+/i return query_no_result_set(sql) else stmt = yield result_set = stmt.execute_query(sql) result = Baza::JdbcResult.new(self, stmt, result_set, preload_results) id = result.__id__ result_set_killer(id) if @java_rs_data.key?(id) @java_rs_data[id] = {res: result_set, stmt: stmt} ObjectSpace.define_finalizer(result, method(:result_set_killer)) return result end rescue java.sql.SQLException => e result_set.close if result_set stmt.close if stmt @java_rs_data.delete(id) if result && id if e.message == "query does not return ResultSet" return query_no_result_set(sql) else raise e end end end end