Added extra error handling for handling invalid views.
This commit is contained in:
parent
fe8f222eab
commit
e67aa2508a
|
@ -1,4 +1,4 @@
|
|||
(defproject views "0.4.2"
|
||||
(defproject views "0.4.3"
|
||||
:description "You underestimate the power of the SQL side"
|
||||
|
||||
:url "https://github.com/diligenceengine/views"
|
||||
|
|
|
@ -7,7 +7,8 @@
|
|||
[honeysql.helpers :as hh]
|
||||
[views.db.load :as vdbl]
|
||||
[views.db.checks :as vc]
|
||||
[views.db.honeysql :as vh]))
|
||||
[views.db.honeysql :as vh]
|
||||
[views.db.util :refer [safe-map log-exception]]))
|
||||
|
||||
;;
|
||||
;; Terminology and data structures used throughout this code
|
||||
|
@ -114,11 +115,11 @@
|
|||
|
||||
(defn compute-insert-delete-deltas-for-views
|
||||
[schema db views table record]
|
||||
(doall (map #(compute-delete-deltas-for-insert schema db % table record) views)))
|
||||
(safe-map #(compute-delete-deltas-for-insert schema db % table record) views))
|
||||
|
||||
(defn compute-insert-insert-deltas-for-views
|
||||
[schema db views table record]
|
||||
(doall (map #(compute-insert-deltas-for-insert schema db % table record) views)))
|
||||
(safe-map #(compute-insert-deltas-for-insert schema db % table record) views))
|
||||
|
||||
(defn compute-deltas-for-insert
|
||||
"This takes a *single* insert and a view, applies the insert and computes
|
||||
|
@ -169,16 +170,16 @@
|
|||
(defn- update-and-append-deltas!
|
||||
"Handles update and calculation of delete (before update) and insert (after update) deltas."
|
||||
[db views action table pkey]
|
||||
(let [views-pre (doall (map #(calculate-delete-deltas db %) views))
|
||||
(let [views-pre (safe-map #(calculate-delete-deltas db %) views)
|
||||
pkey-val (get-action-row-key db pkey table action)
|
||||
update (j/execute! db (hsql/format action))]
|
||||
{:views-with-deltas (doall (map #(calculate-insert-deltas db action [:= pkey pkey-val] %) views-pre))
|
||||
{:views-with-deltas (safe-map #(calculate-insert-deltas db action [:= pkey pkey-val] %) views-pre)
|
||||
:result-set update}))
|
||||
|
||||
(defn- delete-and-append-deltas!
|
||||
"Handles deletion and calculation of delete (before update) delta."
|
||||
[db views action table pkey]
|
||||
(let [views-pre (doall (map #(calculate-delete-deltas db %) views))]
|
||||
(let [views-pre (safe-map #(calculate-delete-deltas db %) views)]
|
||||
{:views-with-deltas views-pre
|
||||
:result-set (j/execute! db (hsql/format action))}))
|
||||
|
||||
|
@ -213,11 +214,15 @@
|
|||
"For refresh-only views, calculates the refresh-set and adds it to the view's delta update collection."
|
||||
[deltas db templates refresh-only-views]
|
||||
(reduce
|
||||
(fn [d {:keys [view-sig view] :as rov}]
|
||||
(let [refresh-set (get (vdbl/initial-view db view-sig templates view) view-sig)]
|
||||
(update-in d [view-sig] (update-deltas-with-refresh-set refresh-set))))
|
||||
deltas
|
||||
refresh-only-views))
|
||||
(fn [d {:keys [view-sig view] :as rov}]
|
||||
(try
|
||||
(let [refresh-set (get (vdbl/initial-view db view-sig templates view) view-sig)]
|
||||
(update-in d [view-sig] (update-deltas-with-refresh-set refresh-set)))
|
||||
(catch Exception e ;; ignore any failed view deltas
|
||||
(log-exception e)
|
||||
d)))
|
||||
deltas
|
||||
refresh-only-views))
|
||||
|
||||
(defn format-deltas
|
||||
"Removes extraneous data from view delta response collections.
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
(:import
|
||||
[java.sql SQLException])
|
||||
(:require
|
||||
[clojure.tools.logging :refer [debug]]))
|
||||
[clojure.stacktrace :refer [print-stack-trace]]
|
||||
[clojure.tools.logging :refer [debug error]]))
|
||||
|
||||
;; Need to catch this and retry:
|
||||
;; java.sql.SQLException: ERROR: could not serialize access due to concurrent update
|
||||
|
@ -38,4 +39,17 @@
|
|||
"Retry a transaction forever."
|
||||
[ & body]
|
||||
`(let [tfn# (fn [] ~@body)]
|
||||
(retry-on-transaction-failure tfn#)))
|
||||
(retry-on-transaction-failure tfn#)))
|
||||
|
||||
(defn log-exception
|
||||
[e]
|
||||
(error "views internal"
|
||||
(str
|
||||
"e: " e
|
||||
" msg: " (.getMessage e)
|
||||
" trace: " (with-out-str (print-stack-trace e)))))
|
||||
|
||||
(defn safe-map
|
||||
"A non-lazy map that skips any results that throw exeptions."
|
||||
[f items]
|
||||
(reduce #(try (conj %1 (f %2)) (catch Exception e %1)) [] items))
|
||||
|
|
Loading…
Reference in a new issue