perf: use transit instead of edn for db storage

pull/11102/head
Tienson Qin 2024-03-04 18:14:38 +08:00
parent e13ae5fca2
commit 2e29918478
3 changed files with 33 additions and 9 deletions

View File

@ -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

View File

@ -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))

View File

@ -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