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 (defn restore-data-from-addr
[db addr] [db addr]
(-> (query db (str "select content from kvs where addr = " addr)) (when-let [content (-> (query db (str "select content from kvs where addr = " addr))
first first
(gobj/get "content"))) (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 (defn new-sqlite-storage
"Creates a datascript storage for sqlite. Should be functionally equivalent to db-worker/new-sqlite-storage" "Creates a datascript storage for sqlite. Should be functionally equivalent to db-worker/new-sqlite-storage"
@ -68,13 +75,12 @@
(map (map
(fn [[addr data]] (fn [[addr data]]
#js {:addr addr #js {:addr addr
:content (pr-str data)}) :content (sqlite-util/transit-write data)})
addr+data-seq) addr+data-seq)
(to-array))] (to-array))]
(upsert-addr-content! db data delete-addrs))) (upsert-addr-content! db data delete-addrs)))
(-restore [_ addr] (-restore [_ addr]
(let [content (restore-data-from-addr db addr)] (restore-data-from-addr db addr))))
(edn/read-string content)))))
(defn open-db! (defn open-db!
"For a given database name, opens a sqlite db connection for it, creates "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" "Utils fns for backend sqlite db"
(:require [clojure.string :as string] (:require [clojure.string :as string]
[logseq.db.frontend.schema :as db-schema] [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 db-version-prefix "logseq_db_")
(defonce file-version-prefix "logseq_local_") (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? (defn db-based-graph?
[graph-name] [graph-name]
(string/starts-with? graph-name db-version-prefix)) (string/starts-with? graph-name db-version-prefix))

View File

@ -99,7 +99,13 @@
:bind #js [addr] :bind #js [addr]
:rowMode "array"}) :rowMode "array"})
ffirst)] 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 (defn new-sqlite-storage
[repo _opts] [repo _opts]
@ -108,7 +114,7 @@
(let [data (map (let [data (map
(fn [[addr data]] (fn [[addr data]]
#js {:$addr addr #js {:$addr addr
:$content (pr-str data)}) :$content (sqlite-util/transit-write data)})
addr+data-seq)] addr+data-seq)]
(if (worker-state/rtc-downloading-graph?) (if (worker-state/rtc-downloading-graph?)
(upsert-addr-content! repo data delete-addrs) ; sync writes when downloading whole graph (upsert-addr-content! repo data delete-addrs) ; sync writes when downloading whole graph