mirror of https://github.com/logseq/logseq
fix: clear stores(before restoring) if db schema changed
parent
60251b6bb4
commit
dc0406ff38
|
@ -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)])))
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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!)
|
||||
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Reference in New Issue