From 0a77bae8a7b3f50919904cd3ee8962f49f30f1c4 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 30 Nov 2023 13:11:36 +0100 Subject: [PATCH] :sparkles: Improve options handling on db module --- backend/src/app/db.clj | 35 ++++++++++--------- backend/src/app/db/sql.clj | 20 +++++++++-- backend/src/app/rpc/commands/binfile.clj | 4 +-- backend/src/app/rpc/commands/teams.clj | 3 +- backend/src/app/rpc/commands/verify_token.clj | 2 +- 5 files changed, 41 insertions(+), 23 deletions(-) diff --git a/backend/src/app/db.clj b/backend/src/app/db.clj index 6c7d321fd..7ab340e21 100644 --- a/backend/src/app/db.clj +++ b/backend/src/app/db.clj @@ -268,7 +268,7 @@ (jdbc/execute! sv default-opts))) ([ds sv opts] (-> (get-connectable ds) - (jdbc/execute! sv (merge default-opts opts))))) + (jdbc/execute! sv (into default-opts (sql/adapt-opts opts)))))) (defn exec-one! ([ds sv] @@ -276,33 +276,31 @@ (jdbc/execute-one! sv default-opts))) ([ds sv opts] (-> (get-connectable ds) - (jdbc/execute-one! sv - (-> (merge default-opts opts) - (assoc :return-keys (::return-keys? opts false))))))) + (jdbc/execute-one! sv (into default-opts (sql/adapt-opts opts)))))) (defn insert! - [ds table params & {:as opts}] + [ds table params & {:as opts :keys [::return-keys?] :or {return-keys? true}}] (-> (get-connectable ds) (exec-one! (sql/insert table params opts) - (merge {::return-keys? true} opts)))) + (assoc opts ::return-keys? return-keys?)))) (defn insert-multi! - [ds table cols rows & {:as opts}] + [ds table cols rows & {:as opts :keys [::return-keys?] :or {return-keys? true}}] (-> (get-connectable ds) (exec! (sql/insert-multi table cols rows opts) - (merge {::return-keys? true} opts)))) + (assoc opts ::return-keys? return-keys?)))) (defn update! - [ds table params where & {:as opts}] + [ds table params where & {:as opts :keys [::return-keys?] :or {return-keys? true}}] (-> (get-connectable ds) (exec-one! (sql/update table params where opts) - (merge {::return-keys? true} opts)))) + (assoc opts ::return-keys? return-keys?)))) (defn delete! - [ds table params & {:as opts}] + [ds table params & {:as opts :keys [::return-keys?] :or {return-keys? true}}] (-> (get-connectable ds) (exec-one! (sql/delete table params opts) - (merge {::return-keys? true} opts)))) + (assoc opts ::return-keys? return-keys?)))) (defn is-row-deleted? [{:keys [deleted-at]}] @@ -416,10 +414,14 @@ (.releaseSavepoint conn sp)) (defn rollback! - ([^Connection conn] - (.rollback conn)) - ([^Connection conn ^Savepoint sp] - (.rollback conn sp))) + ([conn] + (let [^Connection conn (get-connection conn)] + (l/trc :hint "explicit rollback requested") + (.rollback conn))) + ([conn ^Savepoint sp] + (let [^Connection conn (get-connection conn)] + (l/trc :hint "explicit rollback requested") + (.rollback conn sp)))) (defn tx-run! [system f & params] @@ -446,7 +448,6 @@ (let [system (assoc system ::conn conn) result (apply f system params)] (when (::rollback system) - (l/dbg :hint "explicit rollback requested") (rollback! conn)) result)) diff --git a/backend/src/app/db/sql.clj b/backend/src/app/db/sql.clj index 854b2211c..4b002f41b 100644 --- a/backend/src/app/db/sql.clj +++ b/backend/src/app/db/sql.clj @@ -8,6 +8,7 @@ (:refer-clojure :exclude [update]) (:require [app.db :as-alias db] + [clojure.set :as set] [clojure.string :as str] [next.jdbc.optional :as jdbc-opt] [next.jdbc.sql.builder :as sql])) @@ -19,6 +20,14 @@ {:table-fn snake-case :column-fn snake-case}) +(def params-mapping + {::db/return-keys? :return-keys + ::db/columns :columns}) + +(defn adapt-opts + [opts] + (set/rename-keys opts params-mapping)) + (defn as-kebab-maps [rs opts] (jdbc-opt/as-unqualified-modified-maps rs (assoc opts :label-fn kebab-case))) @@ -29,7 +38,7 @@ ([table key-map opts] (let [opts (merge default-opts opts) opts (cond-> opts - (:on-conflict-do-nothing opts) + (::db/on-conflict-do-nothing? opts) (assoc :suffix "ON CONFLICT DO NOTHING"))] (sql/for-insert table key-map opts)))) @@ -44,6 +53,7 @@ ([table where-params opts] (let [opts (merge default-opts opts) opts (cond-> opts + (::db/columns opts) (assoc :columns (::db/columns opts)) (::db/for-update? opts) (assoc :suffix "FOR UPDATE") (::db/for-share? opts) (assoc :suffix "FOR KEY SHARE") (:for-update opts) (assoc :suffix "FOR UPDATE") @@ -54,7 +64,13 @@ ([table key-map where-params] (update table key-map where-params nil)) ([table key-map where-params opts] - (let [opts (merge default-opts opts)] + (let [opts (into default-opts opts) + opts (if-let [columns (::db/columns opts)] + (let [columns (if (seq columns) + (sql/as-cols columns opts) + "*")] + (assoc opts :suffix (str "RETURNING " columns))) + opts)] (sql/for-update table key-map where-params opts)))) (defn delete diff --git a/backend/src/app/rpc/commands/binfile.clj b/backend/src/app/rpc/commands/binfile.clj index 614a138f9..4cbd1e0b3 100644 --- a/backend/src/app/rpc/commands/binfile.clj +++ b/backend/src/app/rpc/commands/binfile.clj @@ -899,7 +899,7 @@ (assoc :file-id file-id) (d/update-when :media-id lookup-index) (d/update-when :thumbnail-id lookup-index)) - {:on-conflict-do-nothing overwrite?})))) + {::db/on-conflict-do-nothing? overwrite?})))) (doseq [item (:thumbnails @*state*)] (let [item (update item :media-id lookup-index)] @@ -909,7 +909,7 @@ :object-id (:object-id item) ::l/sync? true) (db/insert! conn :file-tagged-object-thumbnail item - {:on-conflict-do-nothing overwrite?}))))) + {::db/on-conflict-do-nothing? overwrite?}))))) (defn- lookup-index [id] diff --git a/backend/src/app/rpc/commands/teams.clj b/backend/src/app/rpc/commands/teams.clj index 68b81dc25..c2a188c18 100644 --- a/backend/src/app/rpc/commands/teams.clj +++ b/backend/src/app/rpc/commands/teams.clj @@ -729,7 +729,8 @@ (role->params role))] ;; Insert the invited member to the team - (db/insert! conn :team-profile-rel params {:on-conflict-do-nothing true}) + (db/insert! conn :team-profile-rel params + {::db/on-conflict-do-nothing? true}) ;; If profile is not yet verified, mark it as verified because ;; accepting an invitation link serves as verification. diff --git a/backend/src/app/rpc/commands/verify_token.clj b/backend/src/app/rpc/commands/verify_token.clj index 0d8ef8391..559933a13 100644 --- a/backend/src/app/rpc/commands/verify_token.clj +++ b/backend/src/app/rpc/commands/verify_token.clj @@ -105,7 +105,7 @@ ::quotes/team-id team-id}) ;; Insert the invited member to the team - (db/insert! conn :team-profile-rel params {:on-conflict-do-nothing true}) + (db/insert! conn :team-profile-rel params {::db/on-conflict-do-nothing? true}) ;; If profile is not yet verified, mark it as verified because ;; accepting an invitation link serves as verification.