Added extra error handling for handling invalid views.

This commit is contained in:
Alexander K. Hudek 2014-12-01 22:52:19 -05:00
parent fe8f222eab
commit e67aa2508a
3 changed files with 33 additions and 14 deletions

View file

@ -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"

View file

@ -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.

View file

@ -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))