|
2 | 2 | "Validate db" |
3 | 3 | (:require [clojure.string :as string] |
4 | 4 | [datascript.core :as d] |
| 5 | + [datascript.impl.entity :as de] |
5 | 6 | [frontend.worker.db.migrate :as db-migrate] |
6 | 7 | [frontend.worker.shared-service :as shared-service] |
7 | 8 | [logseq.db :as ldb] |
|
20 | 21 | (fn [{:keys [entity dispatch-key]}] |
21 | 22 | (let [entity (d/entity db (:db/id entity))] |
22 | 23 | (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)]] |
23 | 38 | (and (:block/tx-id entity) (nil? (:block/title entity))) |
24 | 39 | [[:db/retractEntity (:db/id entity)]] |
25 | 40 | (= :block/path-refs (:db/ident entity)) |
26 | 41 | (try |
27 | 42 | (db-migrate/remove-block-path-refs db) |
28 | 43 | (catch :default _e |
29 | 44 | nil)) |
| 45 | + (and (= dispatch-key :normal-page) (:block/page entity)) |
| 46 | + [[:db/retract (:db/id entity) :block/page]] |
30 | 47 | (and (= dispatch-key :block) (nil? (:block/title entity))) |
31 | 48 | [[:db/retractEntity (:db/id entity)]] |
32 | | - |
33 | 49 | (and (= dispatch-key :block) (nil? (:block/page entity))) |
34 | 50 | (let [latest-journal-id (:db/id (first (ldb/get-latest-journals db))) |
35 | 51 | page-id (:db/id (:block/page (:block/parent entity)))] |
|
62 | 78 | [[:db/retractEntity (:db/id entity)]] |
63 | 79 | (and (= dispatch-key :property-value-block) (:block/title entity)) |
64 | 80 | [[: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)) |
66 | 83 | [[:db/add (:db/id entity) :logseq.property.class/extends :logseq.class/Root]] |
67 | 84 | (and (or (ldb/class? entity) (ldb/property? entity)) (ldb/internal-page? entity)) |
68 | 85 | [[:db/retract (:db/id entity) :block/tags :logseq.class/Page]] |
|
94 | 111 | [[:db/retract (:e d) (:a d) (:v d)] |
95 | 112 | [:db/add (:e d) (:db/ident property) (:v d)]] |
96 | 113 | [[: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)] |
98 | 116 | (when (seq tx-data) |
99 | 117 | (d/transact! conn tx-data {:fix-db? true})))) |
100 | 118 |
|
|
125 | 143 | (when (seq tx-data') |
126 | 144 | (ldb/transact! conn tx-data')))) |
127 | 145 |
|
| 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 | + |
128 | 174 | (defn validate-db |
129 | 175 | [conn] |
| 176 | + (db-migrate/ensure-built-in-data-exists! conn) |
| 177 | + (fix-non-closed-values! conn) |
130 | 178 | (fix-num-prefix-db-idents! conn) |
131 | 179 |
|
132 | 180 | (let [db @conn |
133 | 181 | {:keys [errors datom-count entities]} (db-validate/validate-db! db) |
134 | 182 | invalid-entity-ids (distinct (map (fn [e] (:db/id (:entity e))) errors))] |
135 | 183 |
|
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)) |
138 | 188 |
|
139 | 189 | (if errors |
140 | 190 | (do |
|
0 commit comments