ソースを参照

Merge branch 'feat/db' into refactor/worker-search

Tienson Qin 1 年間 前
コミット
cd36c1a0ce

+ 10 - 0
bb.edn

@@ -57,6 +57,16 @@
   {:doc "Transact against a DB graph's datascript db"
    :task (apply shell {:dir "deps/outliner"} "yarn -s nbb-logseq script/transact.cljs" *command-line-args*)}
 
+  dev:db-datoms
+  {:doc "Write db's datoms to a file"
+   :requires ([babashka.fs :as fs])
+   :task (apply shell {:dir "deps/db" :extra-env {"ORIGINAL_PWD" (fs/cwd)}}
+                "yarn -s nbb-logseq script/dump_datoms.cljs"
+                *command-line-args*)}
+
+  dev:diff-datoms
+  logseq.tasks.dev/diff-datoms
+
   dev:npx-cap-run-ios
   logseq.tasks.dev.mobile/npx-cap-run-ios
 

+ 1 - 1
deps/common/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3"
   },
   "scripts": {
     "test": "yarn nbb-logseq -cp test -m nextjournal.test-runner"

+ 3 - 3
deps/common/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 1 - 1
deps/db/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3"
   },
   "dependencies": {
     "better-sqlite3": "8.0.1"

+ 32 - 0
deps/db/script/dump_datoms.cljs

@@ -0,0 +1,32 @@
+  (ns dump-datoms
+    "An example script that dumps all eavt datoms to a specified edn file
+
+     $ yarn -s nbb-logseq script/dump_datoms.cljs db-name datoms.edn"
+    (:require [datascript.core :as d]
+              [clojure.pprint :as pprint]
+              [logseq.db.sqlite.db :as sqlite-db]
+              [nbb.core :as nbb]
+              ["path" :as path]
+              ["os" :as os]
+              ["fs" :as fs]))
+
+(defn read-graph
+  "The db graph bare version of gp-cli/parse-graph"
+  [graph-name]
+  (let [graphs-dir (path/join (os/homedir) "logseq/graphs")]
+    (sqlite-db/open-db! graphs-dir graph-name)))
+
+(defn -main [args]
+  (when (< (count args) 2)
+    (println "Usage: $0 GRAPH FILE")
+    (js/process.exit 1))
+  (let [[graph-name file*] args
+        conn (read-graph graph-name)
+        datoms (mapv #(vec %) (d/datoms @conn :eavt))
+        parent-dir (or js/process.env.ORIGINAL_PWD ".")
+        file (path/join parent-dir file*)]
+    (println "Writing" (count datoms) "datoms to" file)
+    (fs/writeFileSync file (with-out-str (pprint/pprint datoms)))))
+
+(when (= nbb/*file* (:file (meta #'-main)))
+  (-main *command-line-args*))

+ 2 - 1
deps/db/src/logseq/db/sqlite/common_db.cljs

@@ -31,9 +31,10 @@
   [db-name]
   (-> db-name
       (string/replace sqlite-util/db-version-prefix "")
+      (string/replace sqlite-util/file-version-prefix "")
       (string/replace "/" "_")
       (string/replace "\\" "_")
-      (string/replace ":" "_")))  ;; windows
+      (string/replace ":" "_")));; windows
 
 (defn get-db-full-path
   [graphs-dir db-name]

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

@@ -6,6 +6,7 @@
             [logseq.db.frontend.schema :as db-schema]))
 
 (defonce db-version-prefix "logseq_db_")
+(defonce file-version-prefix "logseq_local_")
 
 (defn db-based-graph?
   [graph-name]

+ 3 - 3
deps/db/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 1 - 1
deps/graph-parser/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2",
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3",
     "better-sqlite3": "8.0.1"
   },
   "dependencies": {

+ 3 - 3
deps/graph-parser/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 1 - 1
deps/outliner/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3"
   },
   "dependencies": {
     "better-sqlite3": "8.0.1"

+ 3 - 3
deps/outliner/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 1 - 1
deps/publishing/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2",
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3",
     "mldoc": "^1.5.1"
   },
   "dependencies": {

+ 3 - 3
deps/publishing/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 75 - 0
docs/dev-practices.md

@@ -377,6 +377,81 @@ These tasks are specific to database graphs. For these tasks there is a one time
   Updated 16 block(s) for graph test-db!
   ```
 
+* `dev:db-datoms` and `dev:diff-datoms` - Save a db's datoms to file and diff two datom files
+
+  ```sh
+  # Save a current datoms snapshot of a graph
+  $ bb dev:db-datoms woot w2.edn
+  # After some edits, save another datoms snapshot
+  $ bb dev:db-datoms woot w3.edn
+
+  # Diff the two datom snapshots
+  # This snapshot correctly shows an added block with content "b7" and a property using a closed :default value
+  $  bb dev:diff-datoms w2.edn w3.edn
+  [[]
+  [[162 :block/content "b7" 536871039 true]
+    [162 :block/created-at 1703004379103 536871037 true]
+    [162 :block/format :markdown 536871037 true]
+    [162 :block/page 149 536871037 true]
+    [162 :block/parent 149 536871037 true]
+    [162 :block/path-refs 108 536871044 true]
+    [162 :block/path-refs 149 536871044 true]
+    [162 :block/path-refs 160 536871044 true]
+    [162
+    :block/properties
+    {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"
+      #uuid "6581b09e-8b9c-4dca-a938-c900aedc8275"}
+    536871043
+    true]
+    [162 :block/refs 108 536871043 true]
+    [162 :block/refs 160 536871043 true]
+    [162
+    :block/uuid
+    #uuid "6581c8db-a2a2-4e09-b30d-cdea6ad69512"
+    536871037
+    true]]]
+  
+  # By default this task ignores commonly changing datascript attributes.
+  # To see all changed attributes, tell the task to ignore a nonexistent attribute:
+  $ bb dev:diff-datoms w2.edn w3.edn -i a
+  [[[nil nil 536871029 536871030]
+    [nil nil 1702998192728 536871029]
+    [nil nil 536871035 536871036]
+    [nil nil 1703000139716 536871035]
+    [nil nil 149 536871033]
+    [nil nil 536871035 536871036]]
+  [[nil nil 536871041 536871042]
+    [nil nil 1703004384793 536871041]
+    [nil nil 536871039 536871040]
+    [nil nil 1703004380918 536871039]
+    [nil nil 162 536871037]
+    [nil nil 536871037 536871038]
+    [162 :block/content "b7" 536871039 true]
+    [162 :block/created-at 1703004379103 536871037 true]
+    [162 :block/format :markdown 536871037 true]
+    [162 :block/left 149 536871037 true]
+    [162 :block/page 149 536871037 true]
+    [162 :block/parent 149 536871037 true]
+    [162 :block/path-refs 108 536871044 true]
+    [162 :block/path-refs 149 536871044 true]
+    [162 :block/path-refs 160 536871044 true]
+    [162
+    :block/properties
+    {#uuid "21be4275-bba9-48b8-9351-c9ca27883159"
+      #uuid "6581b09e-8b9c-4dca-a938-c900aedc8275"}
+    536871043
+    true]
+    [162 :block/refs 108 536871043 true]
+    [162 :block/refs 160 536871043 true]
+    [162 :block/tx-id 536871043 536871044 true]
+    [162 :block/updated-at 1703004380918 536871039 true]
+    [162
+    :block/uuid
+    #uuid "6581c8db-a2a2-4e09-b30d-cdea6ad69512"
+    536871037
+    true]]]
+  ```
+
 ### Dev Commands
 
 In the app, you can enable Dev commands under `Settings > Advanced > Developer

+ 1 - 1
scripts/package.json

@@ -3,7 +3,7 @@
   "version": "1.0.0",
   "private": true,
   "devDependencies": {
-    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v2"
+    "@logseq/nbb-logseq": "logseq/nbb-logseq#feat-db-v3"
   },
   "dependencies": {
     "better-sqlite3": "8.0.1",

+ 19 - 1
scripts/src/logseq/tasks/dev.clj

@@ -3,9 +3,11 @@
   namespaces"
   (:require [babashka.process :refer [shell]]
             [babashka.fs :as fs]
+            [babashka.cli :as cli]
             [clojure.java.io :as io]
             [clojure.pprint :as pp]
-            [clojure.edn :as edn]))
+            [clojure.edn :as edn]
+            [clojure.data :as data]))
 
 (defn lint
   "Run all lint tasks
@@ -49,3 +51,19 @@
       (println "Building publishing js asset...")
       (shell "clojure -M:cljs release publishing"))
     (println "Publishing js asset is up to date")))
+
+(defn diff-datoms
+  "Runs data/diff on two edn files written by dev:db-datoms"
+  [file1 file2 & args]
+  (let [spec {:ignored-attributes
+              ;; Ignores some attributes by default that are expected to change often
+              {:alias :i :coerce #{:keyword} :default #{:block/tx-id :block/left :block/updated-at}}}
+        {{:keys [ignored-attributes]} :opts} (cli/parse-args args {:spec spec})
+        datom-filter (fn [[e a _ _ _]] (contains? ignored-attributes a))
+        data-diff* (apply data/diff (map (fn [x] (->> x slurp edn/read-string (remove datom-filter))) [file1 file2]))
+        data-diff (->> data-diff*
+                       ;; Drop common as we're only interested in differences
+                       drop-last
+                       ;; Remove nils as we're only interested in diffs
+                       (mapv #(vec (remove nil? %))))]
+    (pp/pprint data-diff)))

+ 3 - 3
scripts/yarn.lock

@@ -2,9 +2,9 @@
 # yarn lockfile v1
 
 
-"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v2":
-  version "1.2.173-feat-db-v2"
-  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/9e891fd8a8a33ec78dd96a72bbdded191e1f0c1b"
+"@logseq/nbb-logseq@logseq/nbb-logseq#feat-db-v3":
+  version "1.2.173-feat-db-v3"
+  resolved "https://codeload.github.com/logseq/nbb-logseq/tar.gz/513314826b5cbb8564c83dfd2739f0fb680cb8e7"
   dependencies:
     import-meta-resolve "^2.1.0"
 

+ 7 - 0
src/electron/electron/db.cljs

@@ -46,6 +46,13 @@
                               :skip-backup-fn (fn [latest-backup-size]
                                                 (= latest-backup-size (.-length data)))})))
 
+(defn get-db
+  [db-name]
+  (let [_ (ensure-graph-dir! db-name)
+        [_db-name db-path] (sqlite-db/get-db-full-path (get-graphs-dir) db-name)]
+    (when (fs/existsSync db-path)
+      (fs/readFileSync db-path))))
+
 (def unlinked-graphs-dir "Unlinked graphs")
 
 (defn unlink-graph!

+ 3 - 0
src/electron/electron/handler.cljs

@@ -311,6 +311,9 @@
   (db/open-db! repo)
   nil)
 
+(defmethod handle :db-get [_window [_ repo]]
+  (db/get-db repo))
+
 (defmethod handle :db-transact [_window [_ repo tx-data-str tx-meta-str]]
   (when-let [conn (sqlite-db/get-conn repo)]
     (let [tx-data (edn/read-string tx-data-str)

+ 2 - 20
src/main/electron/listener.cljs

@@ -19,8 +19,7 @@
             [logseq.common.path :as path]
             [logseq.graph-parser.util :as gp-util]
             [promesa.core :as p]
-            [frontend.handler.property.util :as pu]
-            [frontend.persist-db :as persist-db]))
+            [frontend.handler.property.util :as pu]))
 
 (defn- safe-api-call
   "Force the callback result to be nil, otherwise, ipc calls could lead to
@@ -28,22 +27,6 @@
   [k f]
   (js/window.apis.on k (fn [data] (f data) nil)))
 
-(defn persist-dbs!
-  []
-  (when-let [repo (state/get-current-repo)]
-    (->
-     (p/let [_ (persist-db/<export-db repo {})]
-       (ipc/ipc "persistent-dbs-saved"))
-     (p/catch (fn [error]
-                (prn :debug :persist-db-failed :repo repo)
-                (js/console.error error)
-                (notification/show! error :error))))))
-
-
-
-(defn listen-persistent-dbs!
-  []
-  (safe-api-call "persistent-dbs" (fn [_data] (persist-dbs!))))
 
 (defn ^:large-vars/cleanup-todo listen-to-electron!
   []
@@ -171,5 +154,4 @@
 
 (defn listen!
   []
-  (listen-to-electron!)
-  (listen-persistent-dbs!))
+  (listen-to-electron!))

+ 29 - 10
src/main/frontend/components/repo.cljs

@@ -17,7 +17,9 @@
             [cljs.core.async :as async :refer [go <!]]
             [clojure.string :as string]
             [frontend.handler.file-sync :as file-sync]
-            [reitit.frontend.easy :as rfe]))
+            [reitit.frontend.easy :as rfe]
+            [frontend.handler.notification :as notification]
+            [frontend.util.fs :as fs-util]))
 
 (rum/defc normalized-graph-label
   [{:keys [url remote? GraphName GraphUUID] :as graph} on-click]
@@ -267,18 +269,35 @@
   (let [*graph-name (::graph-name state)
         new-db-f (fn []
                    (when-not (string/blank? @*graph-name)
-                     (repo-handler/new-db! @*graph-name)
-                     (state/close-modal!)))]
+                     (if (fs-util/include-reserved-chars? @*graph-name)
+                       (notification/show!
+                        [:div
+                         [:p "Graph name can't contain following reserved characters:"]
+                         [:ul
+                          [:li "< (less than)"]
+                          [:li "> (greater than)"]
+                          [:li ": (colon)"]
+                          [:li "\" (double quote)"]
+                          [:li "/ (forward slash)"]
+                          [:li "\\ (backslash)"]
+                          [:li "| (vertical bar or pipe)"]
+                          [:li "? (question mark)"]
+                          [:li "* (asterisk)"]
+                          [:li "# (hash)"]]]
+                        :warning false)
+                       (do
+                         (repo-handler/new-db! @*graph-name)
+                         (state/close-modal!)))))]
     [:div.new-graph.p-4
      [:h1.title "Create new graph: "]
      [:input.form-input.mb-4 {:value @*graph-name
                               :auto-focus true
                               :on-change #(reset! *graph-name (util/evalue %))
-                              :on-key-down   (fn [^js e]
-                                               (when (= (gobj/get e "key") "Enter")
-                                                 (new-db-f)))}]
+                              :on-key-down (fn [^js e]
+                                             (when (= (gobj/get e "key") "Enter")
+                                               (new-db-f)))}]
      (ui/button "Submit"
-       :on-click new-db-f
-       :on-key-down   (fn [^js e]
-                        (when (= (gobj/get e "key") "Enter")
-                          (new-db-f))))]))
+                :on-click new-db-f
+                :on-key-down   (fn [^js e]
+                                 (when (= (gobj/get e "key") "Enter")
+                                   (new-db-f))))]))

+ 7 - 5
src/main/frontend/db/persist.cljs

@@ -6,7 +6,8 @@
             [frontend.db.conn :as db-conn]
             [promesa.core :as p]
             [frontend.persist-db :as persist-db]
-            [cljs-bean.core :as bean]))
+            [cljs-bean.core :as bean]
+            [frontend.config :as config]))
 
 (defn get-all-graphs
   []
@@ -17,10 +18,11 @@
 
 (defn delete-graph!
   [graph]
-  (let [key (db-conn/datascript-db graph)]
-    (p/let [_ (persist-db/<export-db graph {})
-            _ (persist-db/<unsafe-delete graph)]
-      (when-not (util/electron?)
+  (let [key (db-conn/datascript-db graph)
+        db-based? (config/db-based-graph? graph)]
+    (p/let [_ (persist-db/<unsafe-delete graph)]
+      (if (util/electron?)
+        (ipc/ipc "deleteGraph" graph key db-based?)
         (idb/remove-item! key)))))
 
 (defn rename-graph!

+ 38 - 31
src/main/frontend/db_worker.cljs

@@ -23,14 +23,6 @@
 ;; repo -> pool
 (defonce *opfs-pools (atom nil))
 
-(defn sanitize-db-name
-  [db-name]
-  (-> db-name
-      (string/replace " " "_")
-      (string/replace "/" "_")
-      (string/replace "\\" "_")
-      (string/replace ":" "_")))
-
 (defn- get-sqlite-conn
   [repo & {:keys [search?]
            :or {search? false}
@@ -49,7 +41,7 @@
 (defn- <get-opfs-pool
   [graph]
   (or (get-opfs-pool graph)
-      (p/let [^js pool (.installOpfsSAHPoolVfs @*sqlite #js {:name (str "logseq-pool-" (sanitize-db-name graph))
+      (p/let [^js pool (.installOpfsSAHPoolVfs @*sqlite #js {:name (str "logseq-pool-" graph)
                                                              :initialCapacity 20})]
         (swap! *opfs-pools assoc graph pool)
         pool)))
@@ -68,20 +60,17 @@
       (reset! *sqlite sqlite)
       nil)))
 
-(defn- get-repo-path
-  [repo]
-  (str "/" (sanitize-db-name repo) ".sqlite"))
+(def repo-path "/db.sqlite")
 
 (defn- <export-db-file
   [repo]
-  (p/let [^js pool (<get-opfs-pool repo)
-          path (get-repo-path repo)]
+  (p/let [^js pool (<get-opfs-pool repo)]
     (when pool
-      (.exportFile ^js pool path))))
+      (.exportFile ^js pool repo-path))))
 
 (defn- <import-db
-  [^js pool repo data]
-  (.importDb ^js pool (get-repo-path repo) data))
+  [^js pool data]
+  (.importDb ^js pool repo-path data))
 
 (defn upsert-addr-content!
   "Upsert addr+data-seq"
@@ -151,9 +140,8 @@
             capacity (.getCapacity pool)
             _ (when (zero? capacity)   ; file handle already releases since pool will be initialized only once
                 (.acquireAccessHandles pool))
-            path (get-repo-path repo)
-            db (new (.-OpfsSAHPoolDb pool) path)
-            search-db (new (.-OpfsSAHPoolDb pool) (str "search-" path))
+            db (new (.-OpfsSAHPoolDb pool) repo-path)
+            search-db (new (.-OpfsSAHPoolDb pool) (str "search-" repo-path))
             storage (new-sqlite-storage repo {})]
       (swap! *sqlite-conns assoc repo {:db db
                                        :search search-db})
@@ -192,15 +180,15 @@
                         (rest dirs))]
             (p/recur result dirs)))))))
 
-(comment
-  (defn <remove-all-files!
-    "!! Dangerous: use it only for development."
-    []
-    (p/let [all-files (<list-all-files)
-            files (filter #(= (.-kind %) "file") all-files)
-            dirs (filter #(= (.-kind %) "directory") all-files)
-            _ (p/all (map (fn [file] (.remove file)) files))]
-      (p/all (map (fn [dir] (.remove dir)) dirs)))))
+(defn- <db-exists?
+  [graph]
+  (->
+   (p/let [^js root (.getDirectory js/navigator.storage)
+           _dir-handle (.getDirectoryHandle root (str ".logseq-pool-" graph))]
+     true)
+   (p/catch
+    (fn [_e]                           ; not found
+      false))))
 
 (defn- remove-vfs!
   [^js pool]
@@ -290,6 +278,10 @@
    (when-let [^js pool (get-opfs-pool repo)]
      (.releaseAccessHandles pool)))
 
+  (dbExists
+   [_this repo]
+   (<db-exists? repo))
+
   (exportDB
    [_this repo]
    (<export-db-file repo))
@@ -298,7 +290,7 @@
    [this repo data]
    (when-not (string/blank? repo)
      (p/let [pool (<get-opfs-pool repo)]
-       (<import-db pool repo data))))
+       (<import-db pool data))))
 
   ;; Search
   (search-blocks
@@ -323,10 +315,25 @@
    [this repo]
    (p/let [db (get-search-db repo)]
      (search/truncate-table! db)
-     nil)))
+     nil))
+
+  (dangeriousRemoveAllDbs
+   [this repo]
+   (p/let [dbs (.listDB this)]
+     (p/all (map #(.unsafeUnlinkDB this %) dbs)))))
 
 (defn init
   "web worker entry"
   []
   (let [^js obj (SQLiteDB.)]
     (Comlink/expose obj)))
+
+(comment
+  (defn <remove-all-files!
+   "!! Dangerous: use it only for development."
+   []
+   (p/let [all-files (<list-all-files)
+           files (filter #(= (.-kind %) "file") all-files)
+           dirs (filter #(= (.-kind %) "directory") all-files)
+           _ (p/all (map (fn [file] (.remove file)) files))]
+     (p/all (map (fn [dir] (.remove dir)) dirs)))))

+ 1 - 2
src/main/frontend/handler.cljs

@@ -265,6 +265,5 @@
 
 (defn quit-and-install-new-version!
   []
-  (p/let [_ (el/persist-dbs!)
-          _ (ipc/invoke "set-quit-dirty-state" false)]
+  (p/let [_ (ipc/invoke "set-quit-dirty-state" false)]
     (ipc/ipc :quitAndInstall)))

+ 6 - 16
src/main/frontend/handler/events.cljs

@@ -73,8 +73,7 @@
             [logseq.graph-parser.config :as gp-config]
             [promesa.core :as p]
             [rum.core :as rum]
-            [frontend.db.listener :as db-listener]
-            [frontend.persist-db :as persist-db]))
+            [frontend.db.listener :as db-listener]))
 
 ;; TODO: should we move all events here?
 
@@ -176,20 +175,11 @@
 ;; Parameters for the `persist-db` function, to show the notification messages
 (defn- graph-switch-on-persisted
   "graph: the target graph to switch to"
-  [graph {:keys [persist?]
-          :or {persist? true}}]
-  (let [current-repo (state/get-current-repo)]
-    (p/do!
-     (when persist?
-       (when (util/electron?)
-         (p/do!
-          (when (or
-                 (config/db-based-graph? current-repo)
-                 (config/local-file-based-graph? current-repo))
-            (persist-db/<export-db current-repo {})))))
-     (repo-handler/restore-and-setup-repo! graph)
-     (graph-switch graph)
-     state/set-state! :sync-graph/init? false)))
+  [graph _opts]
+  (p/do!
+   (repo-handler/restore-and-setup-repo! graph)
+   (graph-switch graph)
+   state/set-state! :sync-graph/init? false))
 
 (defmethod handle :graph/switch [[_ graph opts]]
   (if (or (not (false? (get @outliner-file/*writes-finished? graph)))

+ 0 - 12
src/main/frontend/persist_db.cljs

@@ -48,15 +48,3 @@
 (defn <release-access-handles
   [repo]
   (protocol/<release-access-handles (get-impl) repo))
-
-(comment
-  (defn run-export-periodically!
-    []
-    (js/setInterval
-     (fn []
-       (when-let [repo (state/get-current-repo)]
-         (when (and (util/electron?) (config/db-based-graph? repo))
-           (println :debug :save-db-to-disk repo)
-           (<export-db repo {}))))
-   ;; every 10 minutes
-     (* 10 60 1000))))

+ 12 - 1
src/main/frontend/persist_db/browser.cljs

@@ -87,7 +87,11 @@
 
   (<fetch-initial-data [_this repo _opts]
     (when-let [^js sqlite @*sqlite]
-      (-> (p/let [_ (.createOrOpenDB sqlite repo)]
+      (-> (p/let [db-exists? (.dbExists sqlite repo)
+                  disk-db-data (when-not db-exists? (ipc/ipc :db-get repo))
+                  _ (when disk-db-data
+                      (.importDb sqlite repo disk-db-data))
+                  _ (.createOrOpenDB sqlite repo)]
             (.getInitialData sqlite repo))
           (p/catch sqlite-error-handler))))
 
@@ -110,3 +114,10 @@
                      (prn :debug :import-db-error repo)
                      (js/console.error error)
                      (notification/show! [:div (str "SQLiteDB import error: " error)] :error) {}))))))
+
+(comment
+  (defn clean-all-dbs!
+    []
+    (when-let [sqlite @*sqlite]
+      (.dangeriousRemoveAllDbs sqlite)
+      (state/set-current-repo! nil))))

+ 1 - 3
src/main/logseq/api.cljs

@@ -34,7 +34,6 @@
             [frontend.modules.outliner.tree :as outliner-tree]
             [frontend.handler.command-palette :as palette-handler]
             [frontend.modules.shortcut.core :as st]
-            [electron.listener :as el]
             [frontend.state :as state]
             [frontend.util :as util]
             [frontend.util.cursor :as cursor]
@@ -1021,7 +1020,6 @@
 
 (defn ^:export force_save_graph
   []
-  (p/let [_ (el/persist-dbs!)]
-    true))
+  true)
 
 (def ^:export set_blocks_id #(editor-handler/set-blocks-id! (map uuid %)))