Datafy parameter metadata

This commit is contained in:
Sean Corfield 2020-05-31 12:23:31 -07:00
parent 4be2b7130b
commit ab588070e6
2 changed files with 32 additions and 2 deletions

View file

@ -12,6 +12,7 @@
[next.jdbc.result-set :as rs]) [next.jdbc.result-set :as rs])
(:import (java.sql Connection (:import (java.sql Connection
DatabaseMetaData DatabaseMetaData
ParameterMetaData
ResultSet ResultSetMetaData ResultSet ResultSetMetaData
Statement))) Statement)))
@ -27,6 +28,7 @@
:scale (fn [^ResultSetMetaData o i] (.getScale o i)) :scale (fn [^ResultSetMetaData o i] (.getScale o i))
:schema (fn [^ResultSetMetaData o i] (.getSchemaName o i)) :schema (fn [^ResultSetMetaData o i] (.getSchemaName o i))
:table (fn [^ResultSetMetaData o i] (.getTableName o i)) :table (fn [^ResultSetMetaData o i] (.getTableName o i))
:type (fn [^ResultSetMetaData o i] (.getColumnTypeName o i))
;; the is* fields: ;; the is* fields:
:nullability (fn [^ResultSetMetaData o i] :nullability (fn [^ResultSetMetaData o i]
(condp = (.isNullable o i) (condp = (.isNullable o i)
@ -42,6 +44,25 @@
:signed (fn [^ResultSetMetaData o i] (.isSigned o i)) :signed (fn [^ResultSetMetaData o i] (.isSigned o i))
:writable (fn [^ResultSetMetaData o i] (.isWritable o i))}) :writable (fn [^ResultSetMetaData o i] (.isWritable o i))})
(def ^:private parameter-meta
{:class (fn [^ParameterMetaData o i] (.getParameterClassName o i))
:mode (fn [^ParameterMetaData o i]
(condp = (.getParameterMode o i)
ParameterMetaData/parameterModeIn :in
ParameterMetaData/parameterModeInOut :in-out
ParameterMetaData/parameterModeOut :out
:unknown))
:precision (fn [^ParameterMetaData o i] (.getPrecision o i))
:scale (fn [^ParameterMetaData o i] (.getScale o i))
:type (fn [^ParameterMetaData o i] (.getParameterTypeName o i))
;; the is* fields:
:nullability (fn [^ParameterMetaData o i]
(condp = (.isNullable o i)
ParameterMetaData/parameterNoNulls :not-null
ParameterMetaData/parameterNullable :null
:unknown))
:signed (fn [^ParameterMetaData o i] (.isSigned o i))})
(defn- safe-bean [o] (defn- safe-bean [o]
(try (try
;; ensure we return a basic hash map: ;; ensure we return a basic hash map:
@ -60,6 +81,13 @@
column-meta) column-meta)
(range 1 (inc (.getColumnCount this))))) (range 1 (inc (.getColumnCount this)))))
(defn- datafy-parameter-meta-data
[^ParameterMetaData this]
(mapv #(reduce-kv (fn [m k f] (assoc m k (f this %)))
{}
parameter-meta)
(range 1 (inc (.getParameterCount this)))))
(extend-protocol core-p/Datafiable (extend-protocol core-p/Datafiable
Connection Connection
(datafy [this] (safe-bean this)) (datafy [this] (safe-bean this))
@ -98,6 +126,8 @@
v))})) v))}))
ResultSetMetaData ResultSetMetaData
(datafy [this] (datafy-result-set-meta-data this)) (datafy [this] (datafy-result-set-meta-data this))
ParameterMetaData
(datafy [this] (datafy-parameter-meta-data this))
ResultSet ResultSet
(datafy [this] (datafy [this]
;; SQLite has a combination ResultSet/Metadata object... ;; SQLite has a combination ResultSet/Metadata object...
@ -108,4 +138,5 @@
(cond-> (safe-bean this) (cond-> (safe-bean this)
c (assoc :rows (rs/datafiable-result-set this c {})))))) c (assoc :rows (rs/datafiable-result-set this c {}))))))
Statement Statement
;; danger: .getMoreResults() is a mutating function!
(datafy [this] (safe-bean this))) (datafy [this] (safe-bean this)))

View file

@ -10,8 +10,7 @@
[next.jdbc.result-set :as rs] [next.jdbc.result-set :as rs]
[next.jdbc.specs :as specs] [next.jdbc.specs :as specs]
[next.jdbc.test-fixtures :refer [with-test-db db ds [next.jdbc.test-fixtures :refer [with-test-db db ds
derby? mysql? postgres? sqlite?]]) derby? mysql? postgres? sqlite?]]))
(:import (java.sql DatabaseMetaData)))
(set! *warn-on-reflection* true) (set! *warn-on-reflection* true)