Implementations of | (ns metabase.driver.sql-jdbc.execute.legacy-impl (:require [java-time.api :as t] [metabase.driver :as driver] [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute] [metabase.util.date-2 :as u.date] [metabase.util.log :as log]) (:import (java.sql PreparedStatement ResultSet Types) (java.time LocalDate LocalDateTime LocalTime OffsetDateTime OffsetTime ZonedDateTime) (java.util Calendar TimeZone))) |
(set! *warn-on-reflection* true) | |
TODO - need to do a legacy implementation using the new methods as well... | |
method impls for JDBC drivers that aren't fully JDBC 4.2 compliant/don't support the new | (driver/register! ::use-legacy-classes-for-read-and-set, :abstract? true) |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set LocalDate] [_ ^PreparedStatement ps ^Integer i t] (let [t (t/sql-date t)] (log/tracef "(.setDate ps %d ^%s %s)" i (.getName (class t)) (pr-str t)) (.setDate ps i t))) | |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set LocalDateTime] [_ ^PreparedStatement ps ^Integer i t] (let [t (t/sql-timestamp t)] (log/tracef "(.setTimestamp %d ^%s %s)" i (.getName (class t)) (pr-str t)) (.setTimestamp ps i t))) | |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set LocalTime] [_ ^PreparedStatement ps ^Integer i t] (let [t (t/sql-time t)] (log/tracef "(.setTime %d ^%s %s)" i (.getName (class t)) (pr-str t)) (.setTime ps i t))) | |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set OffsetTime] [_ ^PreparedStatement ps ^Integer i t] (let [cal (Calendar/getInstance (TimeZone/getTimeZone (t/zone-id t))) t (t/sql-time t)] (log/tracef "(.setTime %d ^%s %s <%s Calendar>)" i (.getName (class t)) (pr-str t) (.. cal getTimeZone getID)) (.setTime ps i t cal))) | |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set OffsetDateTime] [_ ^PreparedStatement ps ^Integer i t] (let [cal (Calendar/getInstance (TimeZone/getTimeZone (t/zone-id t))) t (t/sql-timestamp t)] (log/tracef "(.setTimestamp %d ^%s %s <%s Calendar>)" i (.getName (class t)) (pr-str t) (.. cal getTimeZone getID)) (.setTimestamp ps i t cal))) | |
(defmethod sql-jdbc.execute/set-parameter [::use-legacy-classes-for-read-and-set ZonedDateTime] [_ ^PreparedStatement ps ^Integer i t] (let [cal (Calendar/getInstance (TimeZone/getTimeZone (t/zone-id t))) t (t/sql-timestamp t)] (log/tracef "(.setTimestamp %d ^%s %s <%s Calendar>)" i (.getName (class t)) (pr-str t) (.. cal getTimeZone getID)) (.setTimestamp ps i t cal))) | |
(defmethod sql-jdbc.execute/read-column-thunk [::use-legacy-classes-for-read-and-set Types/TIME] [_driver ^ResultSet rs _rsmeta ^Integer i] (fn [] (when-let [s (.getString rs i)] (let [t (u.date/parse s)] (log/tracef "(.getString rs i) [TIME] -> %s -> %s" (pr-str s) (pr-str t)) t)))) | |
(defmethod sql-jdbc.execute/read-column-thunk [::use-legacy-classes-for-read-and-set Types/TIME_WITH_TIMEZONE] [_driver ^ResultSet rs _rsmeta ^Integer i] (fn [] (when-let [s (.getString rs i)] (let [t (u.date/parse s)] (log/tracef "(.getString rs i) [TIME_WITH_TIMEZONE] -> %s -> %s" (pr-str s) (pr-str t)) t)))) | |
(defmethod sql-jdbc.execute/read-column-thunk [::use-legacy-classes-for-read-and-set Types/DATE] [_driver ^ResultSet rs _rsmeta ^Integer i] (fn [] (when-let [s (.getString rs i)] (let [t (u.date/parse s)] (log/tracef "(.getString rs i) [DATE] -> %s -> %s" (pr-str s) (pr-str t)) t)))) | |
(defmethod sql-jdbc.execute/read-column-thunk [::use-legacy-classes-for-read-and-set Types/TIMESTAMP] [_driver ^ResultSet rs _rsmeta ^Integer i] (fn [] (when-let [s (.getString rs i)] (let [t (u.date/parse s)] (log/tracef "(.getString rs i) [TIMESTAMP] -> %s -> %s" (pr-str s) (pr-str t)) t)))) | |
(defmethod sql-jdbc.execute/read-column-thunk [::use-legacy-classes-for-read-and-set Types/TIMESTAMP_WITH_TIMEZONE] [_driver ^ResultSet rs _rsmeta ^Integer i] (fn [] (when-let [s (.getString rs i)] (let [t (u.date/parse s)] (log/tracef "(.getString rs i) [TIMESTAMP_WITH_TIMEZONE] -> %s -> %s" (pr-str s) (pr-str t)) t)))) | |
(doseq [dispatch-val (keys (methods sql-jdbc.execute/read-column-thunk)) :when (sequential? dispatch-val) :let [[driver jdbc-type] dispatch-val] :when (= driver ::use-legacy-classes-for-read-and-set)] (prefer-method sql-jdbc.execute/read-column-thunk dispatch-val [:sql-jdbc jdbc-type])) | |