Explorar el Código

enhance: add db migration

Tienson Qin hace 4 años
padre
commit
b2c720d247
Se han modificado 3 ficheros con 57 adiciones y 37 borrados
  1. 6 2
      src/main/frontend/db.cljs
  2. 18 0
      src/main/frontend/db/migrate.cljs
  3. 33 35
      src/main/frontend/handler.cljs

+ 6 - 2
src/main/frontend/db.cljs

@@ -6,6 +6,7 @@
             [frontend.db.react]
             [frontend.db.query-custom]
             [frontend.db.query-react]
+            [frontend.db.migrate :as migrate]
             [frontend.util :as util]
             [datascript.core :as d]
             [frontend.state :as state]
@@ -133,8 +134,10 @@
                        :listen-handler listen-and-persist!))))
 
 (defn restore!
-  [{:keys [repos] :as me} restore-config-handler]
-  (let [logged? (:name me)]
+  [{:keys [repos] :as me} old-db-schema restore-config-handler]
+  (let [logged? (:name me)
+        ;; TODO: switch to use the db version
+        old-db? (and old-db-schema (:block/name old-db-schema))]
     (doall
      (for [{:keys [url]} repos]
        (let [repo url]
@@ -145,6 +148,7 @@
                  stored (idb/get-item db-name)
                  _ (if stored
                      (let [stored-db (string->db stored)
+                           stored-db (if old-db? (migrate/migrate stored-db) stored-db)
                            attached-db (d/db-with stored-db (concat
                                                              [(me-tx stored-db me)]
                                                              default-db/built-in-pages))]

+ 18 - 0
src/main/frontend/db/migrate.cljs

@@ -0,0 +1,18 @@
+(ns frontend.db.migrate
+  (:require [clojure.walk :as walk]))
+
+(defonce debug-db (atom nil))
+(defn migrate
+  [db]
+  (prn "migrate")
+  (reset! debug-db db)
+  (walk/postwalk
+   (fn [f]
+     (if (and (keyword? f) (= :page (namespace f)))
+       (let [k (keyword "block" (name f))]
+         (case k
+           :block/ref-pages
+           :block/refs
+           k))
+       f))
+   db))

+ 33 - 35
src/main/frontend/handler.cljs

@@ -67,16 +67,18 @@
      :repos repos}))
 
 (defn restore-and-setup!
-  [me repos logged?]
+  [me repos logged? old-db-schema]
   (let [interval (atom nil)
         inner-fn (fn []
                    (when (and @interval js/window.pfs)
                      (js/clearInterval @interval)
                      (reset! interval nil)
-                     (-> (p/all (db/restore! (assoc me :repos repos)
-                                             (fn [repo]
-                                               (file-handler/restore-config! repo false)
-                                               (ui-handler/add-style-if-exists!))))
+                     (-> (p/all (db/restore!
+                                 old-db-schema
+                                 (assoc me :repos repos)
+                                 (fn [repo]
+                                   (file-handler/restore-config! repo false)
+                                   (ui-handler/add-style-if-exists!))))
                          (p/then
                           (fn []
                             (cond
@@ -165,36 +167,32 @@
 (defn start!
   [render]
   (set-global-error-notification!)
-  (let [db-schema (storage/get :db-schema)]
-    (if (or (nil? db-schema) (:block/name db-schema))
-      (let [{:keys [me logged? repos]} (get-me-and-repos)]
-        (when me (state/set-state! :me me))
-        (register-components-fns!)
-        (state/set-db-restoring! true)
-        (render)
-        (on-load-events)
-        (set-network-watcher!)
-
-        (util/indexeddb-check?
-         (fn [_error]
-           (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)))
-
-        (events/run!)
-
-        (p/let [repos (get-repos)]
-          (state/set-repos! repos)
-          (restore-and-setup! me repos logged?))
-
-        (reset! db/*sync-search-indice-f search/sync-search-indice!)
-        (db/run-batch-txs!)
-        (file-handler/run-writes-chan!)
-        (shortcut/install-shortcuts!)
-        (when (util/electron?)
-          (el/listen!)))
-
-      ;; before refactoring
-      (clear-cache!))))
+  (let [db-schema (storage/get :db-schema)
+        {:keys [me logged? repos]} (get-me-and-repos)]
+    (when me (state/set-state! :me me))
+    (register-components-fns!)
+    (state/set-db-restoring! true)
+    (render)
+    (on-load-events)
+    (set-network-watcher!)
+
+    (util/indexeddb-check?
+     (fn [_error]
+       (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)))
+
+    (events/run!)
+
+    (p/let [repos (get-repos)]
+      (state/set-repos! repos)
+      (restore-and-setup! me repos logged? db-schema))
+
+    (reset! db/*sync-search-indice-f search/sync-search-indice!)
+    (db/run-batch-txs!)
+    (file-handler/run-writes-chan!)
+    (shortcut/install-shortcuts!)
+    (when (util/electron?)
+      (el/listen!))))
 
 (defn stop! []
   (prn "stop!"))