From efcee05e0a5f751fb6f6c2e0ece8b77b98bb235d Mon Sep 17 00:00:00 2001 From: Sean Corfield Date: Sun, 7 Mar 2021 22:13:25 -0800 Subject: [PATCH] Beginnings of generic create #301 #306 --- src/honey/sql.cljc | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/honey/sql.cljc b/src/honey/sql.cljc index 0fe7e47..152999d 100644 --- a/src/honey/sql.cljc +++ b/src/honey/sql.cljc @@ -575,14 +575,29 @@ (str " " (str/join ", " (map #'format-simple-clause clauses)))))] [(str (sql-kw k) " " (format-entity x))])) -(defn- format-create-table [k table] - (let [[table if-not-exists] (if (sequential? table) table [table])] - [(str (sql-kw k) " " - (when if-not-exists (str (sql-kw :if-not-exists) " ")) - (format-entity table))])) +(defn- destructure-create-item [table] + (let [coll + (if (sequential? table) + table + [table]) + ine (last coll) + [prequel table ine] + (if (= :if-not-exists (sym->kw ine)) + [(butlast (butlast coll)) (last (butlast coll)) ine] + [(butlast coll) (last coll) nil])] + [(str/join " " (map sql-kw prequel)) + (format-entity table) + (when ine (sql-kw ine))])) -(defn- format-create-view [k x] - [(str (sql-kw k) " " (format-entity x) " AS")]) +(defn- format-create [k item as] + (let [[pre i ine] (destructure-create-item item)] + [(str/join " " (remove nil? + [(sql-kw :create) + (when (seq pre) pre) + (sql-kw k) + ine + i + (when as (sql-kw as))]))])) (defn- format-drop-table [k params] @@ -639,10 +654,10 @@ :add-index (fn [_ x] (format-on-expr :add x)) :drop-index #'format-selector :rename-table (fn [_ x] (format-selector :rename-to x)) - :create-table #'format-create-table - :create-extension #'format-create-table + :create-table (fn [_ x] (format-create :table x nil)) + :create-extension (fn [_ x] (format-create :extension x nil)) :with-columns #'format-table-columns - :create-view #'format-create-view + :create-view (fn [_ x] (format-create :view x :as)) :drop-table #'format-drop-table :drop-extension #'format-drop-table :nest (fn [_ x] (format-expr x))