diff --git a/src/honeysql/core.clj b/src/honeysql/core.clj index afa0fd0..61bb2bc 100644 --- a/src/honeysql/core.clj +++ b/src/honeysql/core.clj @@ -42,7 +42,12 @@ :having, :merge-having :limit :offset - :modifiers, :merge-modifiers" + :modifiers, :merge-modifiers + :insert-into + :values + :update + :set + :delete-from" [& clauses] (let [[base clauses] (if (map? (first clauses)) [(first clauses) (rest clauses)] diff --git a/src/honeysql/format.clj b/src/honeysql/format.clj index c1fd554..1977e0e 100644 --- a/src/honeysql/format.clj +++ b/src/honeysql/format.clj @@ -147,8 +147,8 @@ (def clause-order "Determines the order that clauses will be placed within generated SQL" - [:select :from :join :left-join :right-join :where :group-by :having - :order-by :limit :offset]) + [:select :insert-into :update :delete-from :set :from :join :left-join :right-join :where :group-by :having + :order-by :limit :offset :values]) (def known-clauses (set clause-order)) @@ -329,3 +329,23 @@ (defmethod format-clause :offset [[_ offset] _] (str "OFFSET " (to-sql offset))) + +(defmethod format-clause :insert-into [[_ table] _] + (str "INSERT INTO " (to-sql table))) + +(defmethod format-clause :values [[_ values] _] + (if (sequential? values) + (str "VALUES (" (comma-join (map to-sql values)) ")") + (str + "(" (comma-join (map to-sql (keys values))) ") VALUES (" + (comma-join (map to-sql (vals values))) ")"))) + +(defmethod format-clause :update [[_ table] _] + (str "UPDATE " (to-sql table))) + +(defmethod format-clause :set [[_ values] _] + (str "SET " (comma-join (for [[k v] values] + (str (to-sql k) " = " (to-sql v)))))) + +(defmethod format-clause :delete-from [[_ table] _] + (str "DELETE FROM " (to-sql table))) diff --git a/src/honeysql/helpers.clj b/src/honeysql/helpers.clj index a5294bb..96b8995 100644 --- a/src/honeysql/helpers.clj +++ b/src/honeysql/helpers.clj @@ -154,3 +154,38 @@ m (update-in m [:modifiers] concat (collify ms)))) +(defmethod build-clause :insert-into [_ m table] + (assoc m :insert-into table)) + +(defn insert-into + ([table] (insert-into nil table)) + ([m table] (build-clause :insert-into m table))) + +(defmethod build-clause :values [_ m values] + (assoc m :values values)) + +(defn values + ([vs] (values nil vs)) + ([m vs] (build-clause :values m vs))) + +(defmethod build-clause :update [_ m table] + (assoc m :update table)) + +(defn update + ([table] (update nil table)) + ([m table] (build-clause :update m table))) + +(defmethod build-clause :set [_ m values] + (assoc m :set values)) + +;; short for sql set, to avoid name collision with clojure.core/set +(defn sset + ([vs] (values nil vs)) + ([m vs] (build-clause :set m vs))) + +(defmethod build-clause :delete-from [_ m table] + (assoc m :delete-from table)) + +(defn delete-from + ([table] (delete-from nil table)) + ([m table] (build-clause :delete-from m table)))