(ns clojure-sql.core (:refer-clojure :exclude [sort]) (:require [clojure.set :as set] [clojure-sql.compiler :as c] [clojure-sql.dsl :as d] [clojure-sql.query :as q] [clojure-sql.util :as u] [clojure.walk])) (def ^:private ^:dynamic *database-type* nil) (defn set-database-type! [new-type] (alter-var-root #'*database-type* (constantly new-type)) nil) (def ^:private ^:dynamic *query-executor* nil) (defn set-query-executor! [exec-fn] (alter-var-root #'*query-executor* (constantly exec-fn)) nil) (q/set-query-deref-behaviour! #(let [compiled (c/compile *database-type* %)] (if *query-executor* (*query-executor* compiled) compiled))) (defmethod print-method clojure_sql.query.Query [query writer] (binding [*out* writer] (pr (c/compile *database-type* query)))) (def table #'d/table) (def project #'d/project) (def rename #'d/rename) (def join #'d/join) (def select #'d/select) (def group #'d/group) (def having #'d/having) (def sort #'d/sort) ;(def take #'d/take) ;(def drop #'d/drop) (def insert! (fn [query & records] (let [compiled (apply c/insert! *database-type* query records)] (if *query-executor* (*query-executor* compiled) compiled)))) (def update! (fn [query partial-record] (let [compiled (c/update! *database-type* query partial-record)] (if *query-executor* (*query-executor* compiled) compiled)))) (def delete! (fn [query] (let [compiled (c/delete! *database-type* query)] (if *query-executor* (*query-executor* compiled) compiled)))) (let [users (-> (table :users) (project [:id :username :password-hash]))] (insert! (-> users (project [:username])) {:username "john"} {:username "not-john"} {:username "bleep bloop"}))