summaryrefslogtreecommitdiff
path: root/src/clojure_sql/jdbc.clj
blob: 5a3a55d48148bd9a349aa8190ed28786dd3db768 (about) (plain)
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
39
40
41
42
43
(ns clojure-sql.jdbc
  (:require [clojure.java.jdbc :as jdbc]
            [clojure-sql.query :refer [QueryExecutor fn->QueryExecutor]]
            [clojure-sql.compiler :as compiler]
            ;;[clojure-sql.core :refer [set-query-executor!]]
            [clojure.string :as string]))

(defn ^:private dotted-to-nested-map-one [obj]
  (reduce (fn [acc [key val]]
            (let [dotted (name key)
                  keys (string/split dotted #"\.")
                  keywords (map keyword keys)]
              (assert (nil? (get-in acc keywords nil))
                      "Error converting fields to maps: conflicting paths.")
              (assoc-in acc keywords val)))
          {} obj))

(defn ^:private dotted-to-nested-maps [objs]
  (mapv dotted-to-nested-map-one objs))

(defn jdbc-executor [connection-string]
  (let [[_ db-type] (re-find #"^jdbc:([^:]+)" connection-string)]
    (reify QueryExecutor
      (query [_ query]
        (let [compiled (compiler/compile-select db-type query)]
          (jdbc/with-connection connection-string
            (jdbc/with-query-results results compiled
              (dotted-to-nested-maps results)))))

      (insert! [_ query records]
        (let [compiled (compiler/compile-insert db-type query records)]
          (jdbc/with-connection connection-string
            (jdbc/do-prepared-return-keys (first query) (next query)))))

      (update! [_ query partial-record]
        (let [compiled (compiler/compile-update db-type query partial-record)]
          (jdbc/with-connection connection-string
            (jdbc/do-prepared-return-keys (first query) (next query)))))

      (delete! [_ query]
        (let [compiled (compiler/compile-delete db-type query)]
          (jdbc/with-connection connection-string
            (first (jdbc/do-prepared (first query) (next query)))))))))