Skip to content

Commit d0086d3

Browse files
authored
Always default :identifiers to u/lower-case (#74)
If we don't, and options are set via `db/set-default-jdbc-options!`, clojure.jdbc will default back to locale-aware `clojure.string/lower-case`. Unless the user specifies something else, `u/lower-case` is always preferable.
1 parent e7900c9 commit d0086d3

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/toucan/db.clj

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,18 @@
105105
[db-connection-map]
106106
(reset! default-db-connection db-connection-map))
107107

108-
(defonce ^:private default-jdbc-options
108+
(defonce ^:private default-default-jdbc-options
109109
;; FIXME: This has already been fixed in `clojure.java.jdbc`, so
110110
;; this option can be removed when using >= 0.7.10.
111-
(atom {:identifiers u/lower-case}))
111+
{:identifiers u/lower-case})
112+
113+
(defonce ^:private default-jdbc-options
114+
(atom default-default-jdbc-options))
112115

113116
(defn set-default-jdbc-options!
114117
"Set the default options to be used for all calls to `clojure.java.jdbc/query` or `execute!`."
115118
[jdbc-options]
116-
(reset! default-jdbc-options jdbc-options))
119+
(reset! default-jdbc-options (merge default-default-jdbc-options jdbc-options)))
117120

118121

119122

test/toucan/db_test.clj

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
(ns toucan.db-test
22
(:require [clojure.java.jdbc :as jdbc]
3+
[clojure.string :as str]
34
[expectations :refer :all]
45
[honeysql.core :as hsql]
56
[toucan
67
[db :as db]
7-
[test-setup :as test]]
8+
[test-setup :as test]
9+
[util :as u]]
810
[toucan.test-models
911
[address :refer [Address]]
1012
[category :refer [Category]]
@@ -57,6 +59,34 @@
5759
(binding [db/*automatically-convert-dashes-and-underscores* true]
5860
(db/select-one-field :street-name Address)))
5961

62+
;; Ensure that (:identifiers @default-jdbc-options) defaults to `u/lower-case`
63+
(defn- mangle-a-chars
64+
[s]
65+
(-> s u/lower-case (str/replace "a" "â")))
66+
67+
(expect
68+
[mangle-a-chars #{:first-nâme :lâst-nâme :id}] ; Note the circumflexes over a's
69+
(let [original-options @@(var db/default-jdbc-options)]
70+
(try
71+
(db/set-default-jdbc-options! {:identifiers mangle-a-chars})
72+
[(:identifiers @@(var db/default-jdbc-options))
73+
(-> (db/select-one 'User) keys set)]
74+
(finally
75+
(db/set-default-jdbc-options! original-options)))))
76+
77+
(expect
78+
[u/lower-case #{:first-name :last-name :id}] ; Note the absence of circumflexes over a's
79+
(let [original-options @@(var db/default-jdbc-options)]
80+
(try
81+
(db/set-default-jdbc-options! {:identifiers mangle-a-chars})
82+
;; Setting default options without `:identifiers` should default to u/lower-case. If it doesn't, we can expect
83+
;; either the current value `mangle-a-chars` (:identifiers wasn't updated), or nil (overwritten).
84+
(db/set-default-jdbc-options! {})
85+
[(:identifiers @@(var db/default-jdbc-options))
86+
(-> (db/select-one 'User) keys set)]
87+
(finally
88+
(db/set-default-jdbc-options! original-options)))))
89+
6090
;; Test replace-underscores
6191
(expect
6292
:2-cans

0 commit comments

Comments
 (0)