Skip to content

Commit da5f9b3

Browse files
committed
fix: more invalid data cases for old db graphs
1 parent 71a25e6 commit da5f9b3

File tree

4 files changed

+62
-16
lines changed

4 files changed

+62
-16
lines changed

deps/db/src/logseq/db/frontend/malli_schema.cljs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@
246246

247247
(def block-tags
248248
[:and
249-
;; FIXME: Display error message instead of 'unknown error'
250249
property-tuple
251250
;; Important to keep data integrity of built-in entities. Ensure UI doesn't accidentally modify them
252251
[:fn {:error/message "should only have one tag for a built-in entity"}

src/main/frontend/components/repo.cljs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,6 @@
9898

9999
(let [db-graph? (config/db-based-graph? url)
100100
manager? (and db-graph? (user-handler/manager? url))]
101-
(prn "debug"
102-
":repo " (str repo)
103-
":db-graph? " db-graph?
104-
"manager? " manager?)
105101
(shui/dropdown-menu
106102
(shui/dropdown-menu-trigger
107103
{:asChild true}

src/main/frontend/worker/db/migrate.cljs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -471,13 +471,12 @@
471471
(fn [data [k existing-value]]
472472
(update data k
473473
(fn [v]
474-
(cond
475-
(and (vector? v) (= :block/uuid (first v)))
474+
(if (coll? v)
476475
v
477-
(and (coll? v) (not (map? v)))
478-
(concat v (if (coll? existing-value) existing-value [existing-value]))
479-
:else
480-
(if (some? existing-value) existing-value v)))))
476+
(let [existing-value (if (and (coll? existing-value) (not (map? existing-value)))
477+
(remove nil? existing-value)
478+
existing-value)]
479+
(if (some? existing-value) existing-value v))))))
481480
data
482481
existing-data)))
483482
data)
@@ -498,6 +497,8 @@
498497
data)
499498
r (d/transact! conn data' {:fix-db? true
500499
:db-migrate? true})]
500+
(when (seq (:tx-data r))
501+
(prn :debug :ensure-built-in-data-exists? :tx-data (:tx-data r)))
501502
(assoc r :migrate-updates
502503
;; fake it as a normal :fix type migration
503504
{:fix (constantly :ensure-built-in-data-exists!)})))

src/main/frontend/worker/db/validate.cljs

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"Validate db"
33
(:require [clojure.string :as string]
44
[datascript.core :as d]
5+
[datascript.impl.entity :as de]
56
[frontend.worker.db.migrate :as db-migrate]
67
[frontend.worker.shared-service :as shared-service]
78
[logseq.db :as ldb]
@@ -20,16 +21,31 @@
2021
(fn [{:keys [entity dispatch-key]}]
2122
(let [entity (d/entity db (:db/id entity))]
2223
(cond
24+
(and (:db/ident entity)
25+
(:logseq.property/built-in? entity)
26+
(:block/parent entity))
27+
[[:db/retract (:db/id entity) :block/parent]]
28+
(:block/format entity)
29+
[[:db/retract (:db/id entity) :block/format]]
30+
(:block/warning entity)
31+
[[:db/retract (:db/id entity) :block/warning]]
32+
(= :whiteboard-shape (:logseq.property/ls-type entity))
33+
[[:db/retractEntity (:db/id entity)]]
34+
(not (de/entity? (:logseq.property/created-by-ref entity)))
35+
[[:db/retractEntity (:db/id entity)]]
36+
(vector? (:logseq.property/value entity))
37+
[[:db/retractEntity (:db/id entity)]]
2338
(and (:block/tx-id entity) (nil? (:block/title entity)))
2439
[[:db/retractEntity (:db/id entity)]]
2540
(= :block/path-refs (:db/ident entity))
2641
(try
2742
(db-migrate/remove-block-path-refs db)
2843
(catch :default _e
2944
nil))
45+
(and (= dispatch-key :normal-page) (:block/page entity))
46+
[[:db/retract (:db/id entity) :block/page]]
3047
(and (= dispatch-key :block) (nil? (:block/title entity)))
3148
[[:db/retractEntity (:db/id entity)]]
32-
3349
(and (= dispatch-key :block) (nil? (:block/page entity)))
3450
(let [latest-journal-id (:db/id (first (ldb/get-latest-journals db)))
3551
page-id (:db/id (:block/page (:block/parent entity)))]
@@ -62,7 +78,8 @@
6278
[[:db/retractEntity (:db/id entity)]]
6379
(and (= dispatch-key :property-value-block) (:block/title entity))
6480
[[:db/retract (:db/id entity) :block/title]]
65-
(and (ldb/class? entity) (not (:logseq.property.class/extends entity)))
81+
(and (ldb/class? entity) (not (:logseq.property.class/extends entity))
82+
(not= (:db/ident entity) :logseq.class/Root))
6683
[[:db/add (:db/id entity) :logseq.property.class/extends :logseq.class/Root]]
6784
(and (or (ldb/class? entity) (ldb/property? entity)) (ldb/internal-page? entity))
6885
[[:db/retract (:db/id entity) :block/tags :logseq.class/Page]]
@@ -94,7 +111,8 @@
94111
[[:db/retract (:e d) (:a d) (:v d)]
95112
[:db/add (:e d) (:db/ident property) (:v d)]]
96113
[[:db/retract (:e d) (:a d) (:v d)]]))))))
97-
tx-data (concat fix-tx-data class-as-properties)]
114+
tx-data (concat fix-tx-data
115+
class-as-properties)]
98116
(when (seq tx-data)
99117
(d/transact! conn tx-data {:fix-db? true}))))
100118

@@ -125,16 +143,48 @@
125143
(when (seq tx-data')
126144
(ldb/transact! conn tx-data'))))
127145

146+
(defn- fix-non-closed-values!
147+
[conn]
148+
(let [db @conn
149+
properties (->> (ldb/get-all-properties db)
150+
(filter :block/_closed-value-property))
151+
tx-data (mapcat
152+
(fn [property]
153+
(let [closed-values (:block/_closed-value-property property)
154+
matches (if (every? de/entity? closed-values)
155+
(set (map :db/id closed-values))
156+
(set closed-values))
157+
values (d/q
158+
'[:find ?b ?v
159+
:in $ ?p
160+
:where
161+
[?b ?p ?v]]
162+
db
163+
(:db/ident property))]
164+
(keep
165+
(fn [[b v]]
166+
(when-not (matches v)
167+
[:db/retract b (:db/ident property) v]))
168+
values)))
169+
properties)]
170+
(when (seq tx-data)
171+
(prn :debug :fix-non-closed-values tx-data)
172+
(d/transact! conn tx-data {:fix-db? true}))))
173+
128174
(defn validate-db
129175
[conn]
176+
(db-migrate/ensure-built-in-data-exists! conn)
177+
(fix-non-closed-values! conn)
130178
(fix-num-prefix-db-idents! conn)
131179

132180
(let [db @conn
133181
{:keys [errors datom-count entities]} (db-validate/validate-db! db)
134182
invalid-entity-ids (distinct (map (fn [e] (:db/id (:entity e))) errors))]
135183

136-
(doseq [id invalid-entity-ids]
137-
(prn :debug :id id :entity (into {} (d/entity db id))))
184+
(doseq [error errors]
185+
(prn :debug
186+
:entity (:entity error)
187+
:error error))
138188

139189
(if errors
140190
(do

0 commit comments

Comments
 (0)