Browse Source

fix: remove unused addr+data from sqlite

Tienson Qin 1 year ago
parent
commit
222b2f84bc
5 changed files with 44 additions and 28 deletions
  1. 1 1
      deps.edn
  2. 1 1
      deps/db/deps.edn
  3. 9 5
      deps/db/src/logseq/db/sqlite/db.cljs
  4. 1 1
      deps/outliner/deps.edn
  5. 32 20
      src/main/frontend/db_worker.cljs

+ 1 - 1
deps.edn

@@ -4,7 +4,7 @@
   rum/rum                               {:mvn/version "0.12.9"}
 
   datascript/datascript        {:git/url "https://github.com/logseq/datascript" ;; fork
-                                :sha     "ec937bc2bc932f0e1fdbbc1f67413d55c18ddc4a"}
+                                :sha     "36f42d700bdbb35220ad4cf9423788041bcecb30"}
 
   datascript-transit/datascript-transit {:mvn/version "0.3.0"}
   borkdude/rewrite-edn                  {:mvn/version "0.4.7"}

+ 1 - 1
deps/db/deps.edn

@@ -1,7 +1,7 @@
 {:deps
  ;; External deps should be kept in sync with https://github.com/logseq/nbb-logseq/blob/main/bb.edn
  {datascript/datascript {:git/url "https://github.com/logseq/datascript" ;; fork
-                         :sha     "3b578bb4b39efda730cdae5f8e679060101b5110"}
+                         :sha     "36f42d700bdbb35220ad4cf9423788041bcecb30"}
   com.cognitect/transit-cljs   {:mvn/version "0.8.280"}
   cljs-bean/cljs-bean          {:mvn/version "1.5.0"}}
  :aliases

+ 9 - 5
deps/db/src/logseq/db/sqlite/db.cljs

@@ -36,12 +36,16 @@
 
 (defn upsert-addr-content!
   "Upsert addr+data-seq"
-  [db data]
+  [db data delete-addrs]
   (let [insert (.prepare db "INSERT INTO kvs (addr, content) values (@addr, @content) on conflict(addr) do update set content = @content")
+        delete (.prepare db "DELETE from kvs where addr = ?")
         insert-many (.transaction ^object db
                                   (fn [data]
                                     (doseq [item data]
-                                      (.run ^object insert item))))]
+                                      (.run ^object insert item))
+                                    (doseq [addr delete-addrs]
+                                      (when addr
+                                        (.run ^object delete addr)))))]
     (insert-many data)))
 
 (defn restore-data-from-addr
@@ -54,7 +58,7 @@
   "Creates a datascript storage for sqlite. Should be functionally equivalent to db-worker/new-sqlite-storage"
   [db]
   (reify IStorage
-    (-store [_ addr+data-seq]
+    (-store [_ addr+data-seq delete-addrs]
       (let [data (->>
                   (map
                    (fn [[addr data]]
@@ -62,7 +66,7 @@
                           :content (pr-str data)})
                    addr+data-seq)
                   (to-array))]
-        (upsert-addr-content! db data)))
+        (upsert-addr-content! db data delete-addrs)))
     (-restore [_ addr]
       (let [content (restore-data-from-addr db addr)]
         (edn/read-string content)))))
@@ -77,4 +81,4 @@
     (sqlite-common-db/create-kvs-table! db)
     (let [storage (new-sqlite-storage db)
           conn (sqlite-common-db/get-storage-conn storage)]
-      conn)))
+      conn)))

+ 1 - 1
deps/outliner/deps.edn

@@ -1,7 +1,7 @@
 {:deps
  ;; External deps should be kept in sync with https://github.com/logseq/nbb-logseq/blob/main/bb.edn
  {datascript/datascript {:git/url "https://github.com/logseq/datascript" ;; fork
-                         :sha     "3b578bb4b39efda730cdae5f8e679060101b5110"}
+                         :sha     "36f42d700bdbb35220ad4cf9423788041bcecb30"}
   logseq/db             {:local/root "../db"}
   com.cognitect/transit-cljs {:mvn/version "0.8.280"}}
  :aliases

+ 32 - 20
src/main/frontend/db_worker.cljs

@@ -11,7 +11,8 @@
             ["@logseq/sqlite-wasm" :default sqlite3InitModule]
             ["comlink" :as Comlink]
             [clojure.string :as string]
-            [cljs-bean.core :as bean]))
+            [cljs-bean.core :as bean]
+            [frontend.util :as util]))
 
 (defonce *sqlite (atom nil))
 (defonce *sqlite-conns (atom nil))
@@ -69,13 +70,18 @@
 
 (defn upsert-addr-content!
   "Upsert addr+data-seq"
-  [repo data]
+  [repo data delete-addrs]
+  ;; (prn :debug :delete-addrs delete-addrs :data data)
   (let [^Object db (get-sqlite-conn repo)]
     (assert (some? db) "sqlite db not exists")
     (.transaction db (fn [tx]
                        (doseq [item data]
                          (.exec tx #js {:sql "INSERT INTO kvs (addr, content) values ($addr, $content) on conflict(addr) do update set content = $content"
-                                        :bind item}))))))
+                                        :bind item}))
+
+                       (doseq [addr delete-addrs]
+                         (.exec db #js {:sql "Delete from kvs where addr = ?"
+                                        :bind #js [addr]}))))))
 
 (defn restore-data-from-addr
   [repo addr]
@@ -92,16 +98,20 @@
          :or {threshold 4096}}]
   (let [_cache (cache/lru-cache-factory {} :threshold threshold)]
     (reify IStorage
-      (-store [_ addr+data-seq]
-        (let [data (map
-                    (fn [[addr data]]
-                      #js {:$addr addr
-                           :$content (pr-str data)})
-                    addr+data-seq)]
-          (upsert-addr-content! repo data)))
+      (-store [_ addr+data-seq delete-addrs]
+        (util/profile
+         "SQLite store"
+         (let [data (map
+                     (fn [[addr data]]
+                       #js {:$addr addr
+                            :$content (pr-str data)})
+                     addr+data-seq)]
+           (upsert-addr-content! repo data delete-addrs))))
 
       (-restore [_ addr]
-        (restore-data-from-addr repo addr)))))
+        (util/profile
+         "SQLite restore"
+         (restore-data-from-addr repo addr))))))
 
 (defn- close-db!
   [repo ^js db]
@@ -223,14 +233,16 @@
   (transact
    [_this repo tx-data tx-meta]
    (when-let [conn (get-datascript-conn repo)]
-     (try
-       (let [tx-data (edn/read-string tx-data)
-             tx-meta (edn/read-string tx-meta)]
-         (d/transact! conn tx-data tx-meta)
-         nil)
-       (catch :default e
-         (prn :debug :error)
-         (js/console.error e)))))
+     (util/profile
+      "DB transact!"
+      (try
+        (let [tx-data (edn/read-string tx-data)
+              tx-meta (edn/read-string tx-meta)]
+          (d/transact! conn tx-data tx-meta)
+          nil)
+        (catch :default e
+          (prn :debug :error)
+          (js/console.error e))))))
 
   (getInitialData
    [_this repo]
@@ -249,7 +261,7 @@
   (releaseAccessHandles
    [_this repo]
    (when-let [^js pool (get-opfs-pool repo)]
-    (.releaseAccessHandles pool)))
+     (.releaseAccessHandles pool)))
 
   (exportDB
    [_this repo]