summaryrefslogtreecommitdiff
path: root/src/clojure_sql/jdbc.clj
blob: 253f68048bddcb866ba40cbba83f30336f46042f (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
44
(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 & [db-type]]
  (let [db-type (or db-type
                    (keyword (second (re-find #"^([^:]+)" 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)))))))))