diff --git a/deps/db/src/logseq/db/frontend/schema.cljs b/deps/db/src/logseq/db/frontend/schema.cljs index f320330fff..c55b1bbc43 100644 --- a/deps/db/src/logseq/db/frontend/schema.cljs +++ b/deps/db/src/logseq/db/frontend/schema.cljs @@ -2,7 +2,7 @@ "Main datascript schemas for the Logseq app" (:require [clojure.set :as set])) -(def version 12) +(def version 13) ;; A page is a special block, a page can corresponds to multiple files with the same ":block/name". (def ^:large-vars/data-var schema {:db/ident {:db/unique :db.unique/identity} diff --git a/src/main/frontend/worker/db/migrate.cljs b/src/main/frontend/worker/db/migrate.cljs index 8fffe8a051..18d3d3e21b 100644 --- a/src/main/frontend/worker/db/migrate.cljs +++ b/src/main/frontend/worker/db/migrate.cljs @@ -5,7 +5,9 @@ [logseq.db.frontend.property :as db-property] [logseq.db :as ldb] [logseq.db.frontend.schema :as db-schema] - [frontend.worker.search :as search])) + [frontend.worker.search :as search] + [cljs-bean.core :as bean] + [logseq.db.sqlite.util :as sqlite-util])) ;; TODO: fixes/rollback @@ -125,6 +127,26 @@ (d/reset-schema! conn (update schema :block/type #(assoc % :db/cardinality :db.cardinality/one))) [])) +(defn- separate-addresses-in-kvs-table + [_conn _search-db ^Object sqlite-db] + (let [data (some->> (.exec sqlite-db #js {:sql "select addr, content from kvs where addr = 0" + :rowMode "array"}) + bean/->clj + (map (fn [[addr content]] + (let [content' (sqlite-util/transit-read content) + [content' addresses] (if (map? content') + [(dissoc content' :addresses) (:addresses content')] + [content' nil])] + #js {:$addr addr + :$content content' + :$addresses addresses}))))] + (.exec sqlite-db #js [:sql "alter table kvs add column addresses JSON"]) + (.transaction sqlite-db + (fn [tx] + (doseq [item data] + (.exec tx #js {:sql "INSERT INTO kvs (addr, content, addresses) values ($addr, $content, $addresses) on conflict(addr) do update set content = $content, addresses = $addresses" + :bind item})))))) + (def schema-version->updates [[3 {:properties [:logseq.property/table-sorting :logseq.property/table-filters :logseq.property/table-hidden-columns :logseq.property/table-ordered-columns] @@ -145,7 +167,8 @@ [9 {:fix update-task-ident}] [10 {:fix update-table-properties}] [11 {:fix property-checkbox-type-non-ref}] - [12 {:fix update-block-type-many->one}]]) + [12 {:fix update-block-type-many->one}] + [13 {:fix separate-addresses-in-kvs-table}]]) (let [max-schema-version (apply max (map first schema-version->updates))] (assert (<= db-schema/version max-schema-version)) @@ -153,7 +176,7 @@ (js/console.warn (str "Current db schema-version is " db-schema/version ", max available schema-version is " max-schema-version)))) (defn migrate - [conn search-db] + [conn search-db sqlite-db] (let [db @conn version-in-db (or (:kv/value (d/entity db :logseq.kv/schema-version)) 0)] (cond @@ -185,7 +208,7 @@ (fn [update] (when-let [fix (:fix update)] (when (fn? fix) - (fix conn search-db)))) updates) + (fix conn search-db sqlite-db)))) updates) tx-data' (if db-based? (concat new-properties fixes) fixes)] (when (seq tx-data') (let [tx-data' (concat tx-data' [(sqlite-create-graph/kv :logseq.kv/schema-version db-schema/version)])] diff --git a/src/main/frontend/worker/db_worker.cljs b/src/main/frontend/worker/db_worker.cljs index 1059a74c92..bfb1c70107 100644 --- a/src/main/frontend/worker/db_worker.cljs +++ b/src/main/frontend/worker/db_worker.cljs @@ -262,11 +262,11 @@ (try (when-not (ldb/page-exists? @conn common-config/views-page-name "hidden") - (ldb/create-views-page! conn)) + (ldb/create-views-page! conn)) (catch :default _e)) ;; (gc-kvs-table! db) - (db-migrate/migrate conn search-db) + (db-migrate/migrate conn search-db db) (db-listener/listen-db-changes! repo conn)))))