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

View File

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

View File

@ -1,8 +1,10 @@
(ns frontend.handler (ns frontend.handler
(:require [frontend.state :as state] (:require [frontend.state :as state]
[frontend.db :as db] [frontend.db :as db]
[frontend.db-schema :as db-schema]
[frontend.util :as util :refer-macros [profile]] [frontend.util :as util :refer-macros [profile]]
[frontend.config :as config] [frontend.config :as config]
[frontend.storage :as storage]
[clojure.string :as string] [clojure.string :as string]
[promesa.core :as p] [promesa.core :as p]
[cljs-bean.core :as bean] [cljs-bean.core :as bean]
@ -33,7 +35,8 @@
(let [pfs-loaded? (atom js/window.pfs) (let [pfs-loaded? (atom js/window.pfs)
interval (atom nil) interval (atom nil)
db-schema-changed-handler (if (state/logged?) db-schema-changed-handler (if (state/logged?)
repo-handler/rebuild-index! (fn [repo]
(repo-handler/rebuild-index! repo))
(fn [_] nil)) (fn [_] nil))
inner-fn (fn [] inner-fn (fn []
(when (and @interval js/window.pfs) (when (and @interval js/window.pfs)
@ -115,6 +118,25 @@
(js/window.addEventListener "online" handle-connection-change) (js/window.addEventListener "online" handle-connection-change)
(js/window.addEventListener "offline" 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! (defn start!
[render] [render]
(let [me (and js/window.user (bean/->clj js/window.user)) (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) (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))) (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!) (periodically-persist-repo-to-indexeddb!)

View File

@ -58,19 +58,10 @@
(notification/show! "Workflow set successfully!" :success)) (notification/show! "Workflow set successfully!" :success))
(fn [_e]))))) (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! (defn sign-out!
[e] [e]
(-> (->
(do (db/clear-local-storage-and-idb!)
(storage/clear)
(clear-store!))
(p/catch (fn [e] (p/catch (fn [e]
(println "sign out error: ") (println "sign out error: ")
(js/console.dir e))) (js/console.dir e)))