/
utils.clj
38 lines (31 loc) · 1.06 KB
/
utils.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(ns lipas.backend.db.utils
(:require
[camel-snake-kebab.core :refer [->kebab-case ->snake_case]]
[camel-snake-kebab.extras :refer [transform-keys]]
[cheshire.core :as j]
[clojure.java.jdbc :as jdbc])
(:import [org.postgresql.util PGobject]))
(comment (<-json (->json {:kissa "koira"})))
(def <-json #(j/decode % true))
(def ->json j/encode)
(defn ->kebab-case-keywords [user]
(transform-keys ->kebab-case user))
(defn ->snake-case-keywords [user]
(transform-keys ->snake_case user))
;;; Automatically transform clojure maps -> jsonb ;;;
(defn ->pgobject [m]
(doto (PGobject.)
;; eventually we should properly determine the actual type
(.setType "jsonb")
(.setValue (->json m))))
(extend-protocol jdbc/ISQLValue
clojure.lang.IPersistentMap
(sql-value [m] (->pgobject m)))
(extend-protocol jdbc/IResultSetReadColumn
org.postgresql.util.PGobject
(result-set-read-column [pgobj metadata idx]
(let [type (.getType pgobj)
value (.getValue pgobj)]
(if (#{"jsonb" "json"} type)
(<-json value)
value))))