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.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)])))
|
||||||
|
|
|
@ -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?
|
||||||
|
|
|
@ -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!)
|
||||||
|
|
||||||
|
|
|
@ -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)))
|
||||||
|
|
Loading…
Reference in New Issue