fix: clear stores(before restoring) if db schema changed

pull/780/head
Tienson Qin 2020-11-29 22:01:18 +08:00
parent 60251b6bb4
commit dc0406ff38
4 changed files with 40 additions and 21 deletions

View File

@ -21,7 +21,9 @@
[frontend.extensions.sci :as sci]
[frontend.db-schema :as db-schema]
[clojure.core.async :as async]
[lambdaisland.glogi :as log]))
[frontend.storage :as storage]
[lambdaisland.glogi :as log]
[goog.object :as gobj]))
;; offline db
(def store-name "dbs")
@ -37,13 +39,17 @@
;; TODO: replace with LRUCache, only keep the latest 20 or 50 items?
(defonce query-state (atom {}))
;; (defn clear-store!
;; []
;; (p/let [_ (.clear localforage)
;; dbs (js/window.indexedDB.databases)]
;; (doseq [db dbs]
;; (js/window.indexedDB.deleteDatabase (gobj/get db "name")))))
(defn clear-idb!
[]
(p/let [_ (.clear localforage-instance)
dbs (js/window.indexedDB.databases)]
(doseq [db dbs]
(js/window.indexedDB.deleteDatabase (gobj/get db "name")))))
(defn clear-local-storage-and-idb!
[]
(storage/clear)
(clear-idb!))
(defn get-repo-path
[url]
@ -1896,7 +1902,7 @@
(let [stored-db (string->db stored)
attached-db (d/db-with stored-db [(me-tx stored-db me)])]
(reset-conn! db-conn attached-db)
(when (not= (:schema stored-db) db-schema/schema) ;; check for code update
(when (not= (:schema stored-db) db-schema/schema) ;; check for db schema changes
(db-schema-changed-handler {:url repo})))
(when logged?
(d/transact! db-conn [(me-tx (d/db db-conn) me)])))

View File

@ -97,7 +97,6 @@
;; For pages
:tag/name {:db/unique :db.unique/identity}
;; ;; Definitions, useful for tags and future anki cards
;; :definition/block {:db/valueType :db.type/ref}
;; ;; Why not make :definition/key unique?

View File

@ -1,8 +1,10 @@
(ns frontend.handler
(:require [frontend.state :as state]
[frontend.db :as db]
[frontend.db-schema :as db-schema]
[frontend.util :as util :refer-macros [profile]]
[frontend.config :as config]
[frontend.storage :as storage]
[clojure.string :as string]
[promesa.core :as p]
[cljs-bean.core :as bean]
@ -33,7 +35,8 @@
(let [pfs-loaded? (atom js/window.pfs)
interval (atom nil)
db-schema-changed-handler (if (state/logged?)
repo-handler/rebuild-index!
(fn [repo]
(repo-handler/rebuild-index! repo))
(fn [_] nil))
inner-fn (fn []
(when (and @interval js/window.pfs)
@ -115,6 +118,25 @@
(js/window.addEventListener "online" handle-connection-change)
(js/window.addEventListener "offline" handle-connection-change))
(defn store-schema!
[]
(storage/set :db-schema db-schema/schema))
(defn clear-stores-if-schema-changed!
[handler]
(if (not= (storage/get :db-schema) db-schema/schema)
(p/let [_ (db/clear-local-storage-and-idb!)]
(handler)
(store-schema!))
(do
(handler)
(store-schema!))))
(defn clear-stores-and-refresh!
[]
(p/let [_ (db/clear-local-storage-and-idb!)]
(js/window.location.reload)))
(defn start!
[render]
(let [me (and js/window.user (bean/->clj js/window.user))
@ -133,7 +155,8 @@
(notification/show! "Sorry, it seems that your browser doesn't support IndexedDB, we recommend to use latest Chrome(Chromium) or Firefox(Non-private mode)." :error false)
(state/set-indexedb-support! false)))
(restore-and-setup! me repos logged?)
(clear-stores-if-schema-changed!
#(restore-and-setup! me repos logged?))
(periodically-persist-repo-to-indexeddb!)

View File

@ -58,19 +58,10 @@
(notification/show! "Workflow set successfully!" :success))
(fn [_e])))))
(defn- clear-store!
[]
(p/let [_ (.clear db/localforage-instance)
dbs (js/window.indexedDB.databases)]
(doseq [db dbs]
(js/window.indexedDB.deleteDatabase (gobj/get db "name")))))
(defn sign-out!
[e]
(->
(do
(storage/clear)
(clear-store!))
(db/clear-local-storage-and-idb!)
(p/catch (fn [e]
(println "sign out error: ")
(js/console.dir e)))