summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlo Zancanaro <carlo@clearboxsystems.com.au>2013-06-20 18:15:43 +1000
committerCarlo Zancanaro <carlo@clearboxsystems.com.au>2013-06-20 18:15:43 +1000
commitb1906aca3e39b81e6b39db5dd1dce98996e3df76 (patch)
treedbb5559764d00a351d273de739c36ca7a2f64c60
parentd6c4a295a6458bb9243c2ba8008ad1c0c559ee15 (diff)
Fix updates, add "use-jdbc!" function to core.
-rw-r--r--README.md2
-rw-r--r--src/clojure_sql/compiler.clj23
-rw-r--r--src/clojure_sql/core.clj22
3 files changed, 30 insertions, 17 deletions
diff --git a/README.md b/README.md
index 401d37d..74c63bb 100644
--- a/README.md
+++ b/README.md
@@ -40,7 +40,7 @@ queries to be entirely special-cased per database. By default
(s/project [:username]))
; => ["SELECT \"u\".\"username\" FROM \"users\" AS \"u\" JOIN \"people\" AS \"p\" ON (\"u\".\"id\" = \"p\".\"id\") WHERE (\"p\".\"fname\" = ?)" "Henry")]
- (s/use-jdbc!) ; TODO
+ (s/use-jdbc! "postgres://user:pass@localhost:5432/db")
; => nil
diff --git a/src/clojure_sql/compiler.clj b/src/clojure_sql/compiler.clj
index a3666dd..881a794 100644
--- a/src/clojure_sql/compiler.clj
+++ b/src/clojure_sql/compiler.clj
@@ -1,6 +1,8 @@
(ns clojure-sql.compiler
(:refer-clojure :exclude [compile sequence])
- (:require [clojure.string :as string]
+ (:require [clojure.set :as set]
+ [clojure.string :as string]
+ [clojure.walk :as walk]
[clojure-sql.query :refer [query?]]
[clojure-sql.util :as u :refer [named?]]
[clojure-sql.writer :as w :refer [return lift p-lift sequence do-m tell >>]]))
@@ -275,21 +277,24 @@
(defn update! [db {:keys [tables fields where joins]} partial-record]
(assert (= (count tables) 1) "Cannot delete from a multiple-table query")
- (let [table-name (-> tables first val)
+ (assert (seq (set/intersection (keys partial-record)
+ (keys fields))) "At least one field must be being updated")
+ (let [fix-expr (partial walk/prewalk (fn [x]
+ (if (vector? x)
+ (second x)
+ x)))
where-expression (if where
($str (return " WHERE ")
- (compile-expression db where))
+ (compile-expression db (fix-expr where)))
(return nil))
updates (->> (for [[alias value] partial-record
:when (fields alias)]
- ($str (compile-expression db (fields alias))
+ ($str (compile-expression db (second (fields alias)))
(return " = ")
- (compile-expression db value)))
+ (compile-expression db (fix-expr value))))
(apply sequence))
- table (compile-tables db joins tables)
- combined ($str (return "UPDATE ")
- table
- (return " SET ")
+ table-name (-> tables first val name)
+ combined ($str (return (str "UPDATE " table-name " SET "))
((p-lift string/join ", ") updates)
where-expression)
[sql vars] (combined [])]
diff --git a/src/clojure_sql/core.clj b/src/clojure_sql/core.clj
index f10d968..e77eeb0 100644
--- a/src/clojure_sql/core.clj
+++ b/src/clojure_sql/core.clj
@@ -58,11 +58,19 @@
(q/set-query-deref-behaviour! run-query)
-(let [users (-> (table :users)
- (project [:id :username :password-hash]))]
- (insert! (-> users
- (project [:username]))
- {:username "john"}
- {:username "not-john"}
- {:username "bleep bloop"}))
+
+
+(try
+ (require '[clojure.java.jdbc :as jdbc])
+ (defn use-jdbc! [connection-string]
+ (set-query-executor! (fn [type query]
+ (jdbc/with-connection connection-string
+ (case type
+ :query (jdbc/with-query-results results query
+ (vec results))
+ :insert (jdbc/do-prepared-return-keys (first query) (next query))
+ (jdbc/do-prepared (first query) (next query)))))))
+
+ (catch Exception e
+ ))