Просмотр исходного кода

perf: use transit instead of edn for db storage

Tienson Qin 1 год назад
Родитель
Сommit
2e29918478

+ 12 - 6
deps/db/src/logseq/db/sqlite/db.cljs

@@ -55,9 +55,16 @@
 
 (defn restore-data-from-addr
   [db addr]
-  (-> (query db (str "select content from kvs where addr = " addr))
-      first
-      (gobj/get "content")))
+  (when-let [content (-> (query db (str "select content from kvs where addr = " addr))
+                         first
+                         (gobj/get "content"))]
+    (try
+        (let [data (sqlite-util/transit-read content)]
+         (if-let [addresses (:addresses data)]
+           (assoc data :addresses (clj->js addresses))
+           data))
+        (catch :default _e              ; TODO: remove this once db goes to test
+          (edn/read-string content)))))
 
 (defn new-sqlite-storage
   "Creates a datascript storage for sqlite. Should be functionally equivalent to db-worker/new-sqlite-storage"
@@ -68,13 +75,12 @@
                   (map
                    (fn [[addr data]]
                      #js {:addr addr
-                          :content (pr-str data)})
+                          :content (sqlite-util/transit-write data)})
                    addr+data-seq)
                   (to-array))]
         (upsert-addr-content! db data delete-addrs)))
     (-restore [_ addr]
-      (let [content (restore-data-from-addr db addr)]
-        (edn/read-string content)))))
+      (restore-data-from-addr db addr))))
 
 (defn open-db!
   "For a given database name, opens a sqlite db connection for it, creates

+ 13 - 1
deps/db/src/logseq/db/sqlite/util.cljs

@@ -2,11 +2,23 @@
   "Utils fns for backend sqlite db"
   (:require [clojure.string :as string]
             [logseq.db.frontend.schema :as db-schema]
-            [logseq.common.util :as common-util]))
+            [logseq.common.util :as common-util]
+            [cognitect.transit :as transit]))
 
 (defonce db-version-prefix "logseq_db_")
 (defonce file-version-prefix "logseq_local_")
 
+(def transit-w (transit/writer :json))
+(def transit-r (transit/reader :json))
+(defn transit-write
+  [data]
+  (transit/write transit-w data))
+
+(defn transit-read
+  [str]
+  (transit/read transit-r str))
+
+
 (defn db-based-graph?
   [graph-name]
   (string/starts-with? graph-name db-version-prefix))

+ 8 - 2
src/main/frontend/db_worker.cljs

@@ -99,7 +99,13 @@
                                           :bind #js [addr]
                                           :rowMode "array"})
                            ffirst)]
-      (edn/read-string content))))
+      (try
+        (let [data (sqlite-util/transit-read content)]
+         (if-let [addresses (:addresses data)]
+           (assoc data :addresses (bean/->js addresses))
+           data))
+        (catch :default _e              ; TODO: remove this once db goes to test
+          (edn/read-string content))))))
 
 (defn new-sqlite-storage
   [repo _opts]
@@ -108,7 +114,7 @@
       (let [data (map
                   (fn [[addr data]]
                     #js {:$addr addr
-                         :$content (pr-str data)})
+                         :$content (sqlite-util/transit-write data)})
                   addr+data-seq)]
         (if (worker-state/rtc-downloading-graph?)
           (upsert-addr-content! repo data delete-addrs) ; sync writes when downloading whole graph