diff --git a/src/main/frontend/handler/worker.cljs b/src/main/frontend/handler/worker.cljs index 0ab3d2f339..059b818f4b 100644 --- a/src/main/frontend/handler/worker.cljs +++ b/src/main/frontend/handler/worker.cljs @@ -42,6 +42,9 @@ (defmethod handle :export-current-db [_] (state/pub-event! [:db/export-sqlite])) +(defmethod handle :capture-error [_ _worker data] + (state/pub-event! [:capture-error data])) + (defmethod handle :default [_ _worker data] (prn :debug "Worker data not handled: " data)) diff --git a/src/main/frontend/worker/db_worker.cljs b/src/main/frontend/worker/db_worker.cljs index 0b62e56357..27038e8317 100644 --- a/src/main/frontend/worker/db_worker.cljs +++ b/src/main/frontend/worker/db_worker.cljs @@ -37,7 +37,8 @@ [logseq.outliner.op :as outliner-op] [me.tonsky.persistent-sorted-set :as set :refer [BTSet]] [promesa.core :as p] - [shadow.cljs.modern :refer [defclass]])) + [shadow.cljs.modern :refer [defclass]] + [clojure.set])) (defonce *sqlite worker-state/*sqlite) (defonce *sqlite-conns worker-state/*sqlite-conns) @@ -139,7 +140,7 @@ [addr (bean/->clj (js/JSON.parse addresses))]))) used-addresses (set (concat (mapcat second result) [0 1 (:eavt schema) (:avet schema) (:aevt schema)])) - unused-addresses (set/difference (set (map first result)) used-addresses)] + unused-addresses (clojure.set/difference (set (map first result)) used-addresses)] (when unused-addresses (prn :debug :db-gc :unused-addresses unused-addresses) (.transaction db (fn [tx] @@ -147,6 +148,27 @@ (.exec tx #js {:sql "Delete from kvs where addr = ?" :bind #js [addr]})))))))) +(defn- find-missing-addresses + [^Object db] + (let [schema (some->> (.exec db #js {:sql "select content from kvs where addr = 0" + :rowMode "array"}) + bean/->clj + ffirst + sqlite-util/transit-read) + result (->> (.exec db #js {:sql "select addr, addresses from kvs" + :rowMode "array"}) + bean/->clj + (map (fn [[addr addresses]] + [addr (bean/->clj (js/JSON.parse addresses))]))) + used-addresses (set (concat (mapcat second result) + [0 1 (:eavt schema) (:avet schema) (:aevt schema)])) + missing-addresses (clojure.set/difference used-addresses (set (map first result)))] + (when (seq missing-addresses) + (worker-util/post-message :capture-error + {:error "db-missing-addresses" + :payload {:missing-addresses missing-addresses}}) + (prn :error :missing-addresses missing-addresses)))) + (defn upsert-addr-content! "Upsert addr+data-seq. Update sqlite-cli/upsert-addr-content! when making changes" [repo data delete-addrs & {:keys [client-ops-db?] :or {client-ops-db? false}}] @@ -331,7 +353,9 @@ (ldb/transact! conn (sqlite-create-graph/build-initial-views))) (catch :default _e))) + (find-missing-addresses db) ;; (gc-kvs-table! db) + (try (db-migrate/migrate conn search-db) (catch :default _e