|
|
@@ -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)
|