Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/arjdbc/abstract/core.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name =
binds.map do |bind|
if bind.respond_to?(:value_for_database)
bind.value_for_database
elsif bind.is_a?(Time)
time_for_database(bind)
else
bind
end
Expand Down
14 changes: 14 additions & 0 deletions lib/arjdbc/abstract/quoting.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

module ArJdbc
module Abstract
module Quoting

# Helper to get local/UTC time (based on `ActiveRecord::default_timezone`).
def time_for_database(value)
get = ::ActiveRecord.default_timezone == :utc ? :getutc : :getlocal
value.respond_to?(get) ? value.send(get) : value
end
end
end
end
2 changes: 2 additions & 0 deletions lib/arjdbc/jdbc/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
require 'arjdbc/abstract/connection_management'
require 'arjdbc/abstract/database_statements'
require 'arjdbc/abstract/transaction_support'
require 'arjdbc/abstract/quoting'

module ActiveRecord
module ConnectionAdapters
Expand Down Expand Up @@ -43,6 +44,7 @@ class JdbcAdapter < AbstractAdapter
include ArJdbc::Abstract::ConnectionManagement
include ArJdbc::Abstract::DatabaseStatements
include ArJdbc::Abstract::TransactionSupport
include ArJdbc::Abstract::Quoting

attr_reader :prepared_statements

Expand Down
2 changes: 2 additions & 0 deletions lib/arjdbc/mssql/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
require 'arjdbc/abstract/database_statements'
require 'arjdbc/abstract/statement_cache'
require 'arjdbc/abstract/transaction_support'
require 'arjdbc/abstract/quoting'

require 'arjdbc/mssql/utils'
require 'arjdbc/mssql/server_version'
Expand Down Expand Up @@ -46,6 +47,7 @@ class MSSQLAdapter < AbstractAdapter
# include ArJdbc::Abstract::DatabaseStatements
# include ArJdbc::Abstract::StatementCache
include ArJdbc::Abstract::TransactionSupport
include ArJdbc::Abstract::Quoting
include ArJdbc::MSSQLConfig

include MSSQL::Quoting
Expand Down
18 changes: 1 addition & 17 deletions lib/arjdbc/mssql/quoting.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def quote(value)
# The JDBC drivers does not work with 6 digits microseconds
def quoted_date(value)
if value.acts_like?(:time)
value = time_with_db_timezone(value)
value = time_for_database(value)
end

result = value.to_fs(:db)
Expand Down Expand Up @@ -143,22 +143,6 @@ def quoted_time(value)
# @private
# @see #quote in old adapter
BLOB_VALUE_MARKER = "''"

private

def time_with_db_timezone(value)
zone_conv_method = if ActiveRecord.default_timezone == :utc
:getutc
else
:getlocal
end

if value.respond_to?(zone_conv_method)
value = value.send(zone_conv_method)
else
value
end
end
end
end
end
Expand Down
4 changes: 3 additions & 1 deletion lib/arjdbc/mysql/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
require 'arjdbc/abstract/database_statements'
require 'arjdbc/abstract/statement_cache'
require 'arjdbc/abstract/transaction_support'
require 'arjdbc/abstract/quoting'

require "arjdbc/mysql/adapter_hash_config"

Expand All @@ -34,6 +35,7 @@ class Mysql2Adapter < AbstractMysqlAdapter
# NOTE: do not include MySQL::DatabaseStatements
include ArJdbc::Abstract::StatementCache
include ArJdbc::Abstract::TransactionSupport
include ArJdbc::Abstract::Quoting

include ArJdbc::MySQL
include ArJdbc::MysqlConfig
Expand Down Expand Up @@ -137,7 +139,7 @@ def build_explain_clause(options = [])
return "EXPLAIN" if options.empty?

explain_clause = "EXPLAIN #{options.join(" ").upcase}"

if analyze_without_explain? && explain_clause.include?("ANALYZE")
explain_clause.sub("EXPLAIN ", "")
else
Expand Down
3 changes: 3 additions & 0 deletions lib/arjdbc/postgresql/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
require 'arjdbc/abstract/database_statements'
require 'arjdbc/abstract/statement_cache'
require 'arjdbc/abstract/transaction_support'
require 'arjdbc/abstract/quoting'

require 'arjdbc/postgresql/base/array_decoder'
require 'arjdbc/postgresql/base/array_encoder'
require 'arjdbc/postgresql/name'
Expand Down Expand Up @@ -864,6 +866,7 @@ class PostgreSQLAdapter < AbstractAdapter
include ArJdbc::Abstract::DatabaseStatements
include ArJdbc::Abstract::StatementCache
include ArJdbc::Abstract::TransactionSupport
include ArJdbc::Abstract::Quoting
include ArJdbc::PostgreSQLConfig

# NOTE: after AR refactor quote_column_name became class and instance method
Expand Down
3 changes: 3 additions & 0 deletions lib/arjdbc/sqlite3/adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
require "arjdbc/abstract/database_statements"
require 'arjdbc/abstract/statement_cache'
require "arjdbc/abstract/transaction_support"
require "arjdbc/abstract/quoting"

require "active_record/connection_adapters/abstract_adapter"
require "active_record/connection_adapters/statement_pool"
require "active_record/connection_adapters/sqlite3/explain_pretty_printer"
Expand Down Expand Up @@ -846,6 +848,7 @@ def jdbc_connection_class
include ArJdbc::Abstract::DatabaseStatements
include ArJdbc::Abstract::StatementCache
include ArJdbc::Abstract::TransactionSupport
include ArJdbc::Abstract::Quoting


##
Expand Down
6 changes: 5 additions & 1 deletion src/java/arjdbc/jdbc/RubyJdbcConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -2445,7 +2445,7 @@ protected void setStatementParameter(final ThreadContext context,
value = valueForDatabase(context, attribute);
} else if (timeZoneClass.isInstance(attribute)) {
type = jdbcTypeFor("timestamp");
value = attribute;
value = timeForDatabase(context, attribute);
} else {
type = jdbcTypeForPrimitiveAttribute(context, attribute);
value = attribute;
Expand Down Expand Up @@ -3686,6 +3686,10 @@ protected IRubyObject valueForDatabase(final ThreadContext context, final IRubyO
return attribute.callMethod(context, "value_for_database");
}

protected IRubyObject timeForDatabase(final ThreadContext context, final IRubyObject attribute) {
return adapter.callMethod(context, "time_for_database", attribute);
}

// FIXME: This should not be static and will be exposed via api in connection as instance method.
public static final StringCache STRING_CACHE = new StringCache();

Expand Down
10 changes: 10 additions & 0 deletions test/simple.rb
Original file line number Diff line number Diff line change
Expand Up @@ -847,6 +847,16 @@ def test_create_bind_param_with_q_mark
assert_equal 'bar?', entry.content
end

def test_time_bind_param
with_timezone_config default: :utc, zone: 'Australia/Melbourne' do
time = Time.zone.local(2000, 1, 1, 16)
entry = Entry.create! updated_on: time + 1.hour
sql = 'updated_on >= ?'
entries = Entry.where(sql, time)
assert_equal 1, entries.size
end
end

class ChangeEntriesTable < ActiveRecord::Migration[4.2]
def self.up
change_table :entries do |t|
Expand Down