Преглед изворни кода

fix: ensure built-in data exists

Tienson Qin пре 1 година
родитељ
комит
985365a274

+ 5 - 2
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -260,9 +260,12 @@
         idents (mapcat (fn [id]
                          (when-let [e (d/entity db id)]
                            (d/datoms db :eavt (:db/id e))))
-                       [:logseq.kv/db-type :logseq.kv/graph-uuid :logseq.property/empty-placeholder
+                       [:logseq.kv/db-type
+                        :logseq.kv/schema-version
+                        :logseq.kv/graph-uuid
                         :logseq.kv/latest-code-lang
-                        :logseq.kv/graph-backup-folder])
+                        :logseq.kv/graph-backup-folder
+                        :logseq.property/empty-placeholder])
         favorites (when db-graph? (get-favorites db))
         views (when db-graph? (get-views-data db))
         latest-journals (get-latest-journals db 1)

+ 49 - 31
src/main/frontend/worker/db/migrate.cljs

@@ -1,25 +1,26 @@
 (ns frontend.worker.db.migrate
   "Handles SQLite and datascript migrations for DB graphs"
-  (:require [datascript.core :as d]
-            [logseq.db.sqlite.create-graph :as sqlite-create-graph]
-            [logseq.db.frontend.property :as db-property]
-            [logseq.db.frontend.class :as db-class]
-            [logseq.db :as ldb]
-            [logseq.db.frontend.schema :as db-schema]
+  (:require [cljs-bean.core :as bean]
+            [cljs-time.coerce :as tc]
+            [clojure.string :as string]
+            [clojure.walk :as walk]
+            [datascript.core :as d]
+            [datascript.impl.entity :as de]
             [frontend.worker.search :as search]
-            [cljs-bean.core :as bean]
-            [logseq.db.sqlite.util :as sqlite-util]
             [logseq.common.config :as common-config]
             [logseq.common.util :as common-util]
-            [logseq.db.frontend.property.build :as db-property-build]
-            [logseq.db.frontend.order :as db-order]
+            [logseq.common.util.date-time :as date-time-util]
+            [logseq.common.util.page-ref :as page-ref]
             [logseq.common.uuid :as common-uuid]
-            [clojure.string :as string]
+            [logseq.db :as ldb]
+            [logseq.db.frontend.class :as db-class]
             [logseq.db.frontend.content :as db-content]
-            [logseq.common.util.page-ref :as page-ref]
-            [datascript.impl.entity :as de]
-            [logseq.common.util.date-time :as date-time-util]
-            [cljs-time.coerce :as tc]))
+            [logseq.db.frontend.order :as db-order]
+            [logseq.db.frontend.property :as db-property]
+            [logseq.db.frontend.property.build :as db-property-build]
+            [logseq.db.frontend.schema :as db-schema]
+            [logseq.db.sqlite.create-graph :as sqlite-create-graph]
+            [logseq.db.sqlite.util :as sqlite-util]))
 
 ;; TODO: fixes/rollback
 ;; Frontend migrations
@@ -585,22 +586,38 @@
   (when (< db-schema/version max-schema-version)
     (js/console.warn (str "Current db schema-version is " db-schema/version ", max available schema-version is " max-schema-version))))
 
-(defn- ensure-built-in-class-exists!
+(defn- ensure-built-in-data-exists!
   [conn]
-  (let [classes' [:logseq.class/Property :logseq.class/Tag :logseq.class/Page :logseq.class/Journal :logseq.class/Whiteboard]
-        new-classes (->> (select-keys db-class/built-in-classes classes')
-                         ;; class already exists, this should never happen
-                         (remove (fn [[k _]] (d/entity @conn k)))
-                         (into {})
-                         (#(sqlite-create-graph/build-initial-classes* % {}))
-                         (map (fn [b] (assoc b :logseq.property/built-in? true))))
-        new-class-idents (keep (fn [class]
-                                 (when-let [db-ident (:db/ident class)]
-                                   {:db/ident db-ident})) new-classes)
-        tx-data (concat new-class-idents new-classes)]
-    (when (seq tx-data)
-      (d/transact! conn tx-data {:fix-db? true
-                                 :db-migrate? true}))))
+  (let [*uuids (atom {})
+        data (->> (sqlite-create-graph/build-db-initial-data "")
+                  (keep (fn [data]
+                          (if (map? data)
+                            (cond
+                              (= (:db/ident data) :logseq.kv/schema-version)
+                              nil
+
+                              (:db/ident data)
+                              data
+
+                              (:block/name data)
+                              (if-let [page (ldb/get-page @conn (:block/name data))]
+                                (do
+                                  (swap! *uuids assoc (:block/uuid data) (:block/uuid page))
+                                  (assoc data :block/uuid (:block/uuid page)))
+                                data)
+
+                              :else
+                              data)
+                            data))))
+        ;; using existing page's uuid
+        data' (walk/postwalk
+               (fn [f]
+                 (if (and (vector? f) (= :block/uuid (first f)) (@*uuids (second f)))
+                   [:block/uuid (@*uuids (second f))]
+                   f))
+               data)]
+    (d/transact! conn data' {:fix-db? true
+                             :db-migrate? true})))
 
 (defn- upgrade-version!
   [conn search-db db-based? version {:keys [properties classes fix]}]
@@ -729,6 +746,7 @@
             (println "DB schema migrated from" version-in-db)
             (doseq [[v m] updates]
               (upgrade-version! conn search-db db-based? v m))
+            (ensure-built-in-data-exists! conn)
             (fix-missing-page-tag! conn))
           (catch :default e
             (prn :error (str "DB migration failed to migrate to " db-schema/version " from " version-in-db ":"))
@@ -737,7 +755,7 @@
 
 (defn fix-db!
   [conn]
-  (ensure-built-in-class-exists! conn)
+  (ensure-built-in-data-exists! conn)
   (fix-path-refs! conn)
   (fix-missing-title! conn)
   (fix-properties! conn)

+ 4 - 3
src/main/frontend/worker/db_worker.cljs

@@ -4,6 +4,7 @@
             ["comlink" :as Comlink]
             [cljs-bean.core :as bean]
             [clojure.edn :as edn]
+            [clojure.set]
             [clojure.string :as string]
             [datascript.core :as d]
             [datascript.storage :refer [IStorage] :as storage]
@@ -37,8 +38,7 @@
             [logseq.outliner.op :as outliner-op]
             [me.tonsky.persistent-sorted-set :as set :refer [BTSet]]
             [promesa.core :as p]
-            [shadow.cljs.modern :refer [defclass]]
-            [clojure.set]))
+            [shadow.cljs.modern :refer [defclass]]))
 
 (defonce *sqlite worker-state/*sqlite)
 (defonce *sqlite-conns worker-state/*sqlite-conns)
@@ -360,7 +360,8 @@
           (db-migrate/migrate conn search-db)
           (catch :default _e
             (when db-based?
-              (rebuild-db-from-datoms! conn db import-type))))
+              (rebuild-db-from-datoms! conn db import-type)
+              (db-migrate/migrate conn search-db))))
 
         (db-listener/listen-db-changes! repo (get @*datascript-conns repo))))))