diff --git a/src/electron/electron/backup_file.cljs b/src/electron/electron/backup_file.cljs index 24bea90e08..da1b04aa47 100644 --- a/src/electron/electron/backup_file.cljs +++ b/src/electron/electron/backup_file.cljs @@ -37,14 +37,16 @@ "backup CONTENT under DIR :backup-dir or :version-file-dir :backup-dir = `backup-dir` :version-file-dir = `version-file-dir`" - [repo dir relative-path ext content] + [repo dir relative-path ext content & {:keys [add-desktop?] + :or {add-desktop? true}}] {:pre [(contains? #{:backup-dir :version-file-dir} dir)]} (let [dir* (case dir :backup-dir (get-backup-dir repo relative-path) :version-file-dir (get-version-file-dir repo relative-path)) new-path (node-path/join dir* (str (string/replace (.toISOString (js/Date.)) ":" "_") - ".Desktop" ext))] + (when add-desktop? ".Desktop") + ext))] (fs-extra/ensureDirSync dir*) (fs/writeFileSync new-path content) (fs/statSync new-path) diff --git a/src/electron/electron/db.cljs b/src/electron/electron/db.cljs index 1d2523d3cd..4daa9879f5 100644 --- a/src/electron/electron/db.cljs +++ b/src/electron/electron/db.cljs @@ -3,8 +3,9 @@ (:require ["path" :as node-path] ["fs-extra" :as fs] ["electron" :refer [app]] - [electron.logger :as logger] - [logseq.db.sqlite.db :as sqlite-db])) + ;; [electron.logger :as logger] + [logseq.db.sqlite.db :as sqlite-db] + [electron.backup-file :as backup-file])) (def close! sqlite-db/close!) @@ -17,21 +18,23 @@ [] (fs/ensureDirSync (get-graphs-dir))) -(defn open-db! - [db-name] - (let [graphs-dir (get-graphs-dir)] - (try (sqlite-db/open-db! graphs-dir db-name) - (catch :default e - (js/console.error e) - (logger/error (str e ": " db-name)) - ;; (fs/unlinkSync db-full-path) - )))) - -(defn new-db! +(defn ensure-graph-dir! [db-name] + (ensure-graphs-dir!) (let [graph-dir (node-path/join (get-graphs-dir) (sqlite-db/sanitize-db-name db-name))] (fs/ensureDirSync graph-dir) - (open-db! db-name))) + graph-dir)) + +(defn save-db! + [db-name data] + (let [graph-dir (ensure-graph-dir! db-name) + [_db-name db-path] (sqlite-db/get-db-full-path (get-graphs-dir) db-name)] + (fs/writeFileSync db-path data) + (backup-file/backup-file graph-dir :backup-dir + "" + ".sqlite" + data + {:add-desktop? false}))) (def unlinked-graphs-dir "Unlinked graphs") @@ -48,3 +51,19 @@ (when (fs/existsSync path) (fs/ensureDirSync unlinked) (fs/moveSync path new-path')))) + +(comment + (defn open-db! + [db-name] + (let [graphs-dir (get-graphs-dir)] + (try (sqlite-db/open-db! graphs-dir db-name) + (catch :default e + (js/console.error e) + (logger/error (str e ": " db-name)) + ;; (fs/unlinkSync db-full-path) + )))) + + (defn new-db! + [db-name] + (ensure-graph-dir! db-name) + (open-db! db-name))) diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index 07774ca2e2..6e333569f9 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -364,22 +364,9 @@ ;; DB related IPCs start -;; Needs to be called first for a new graph -(defmethod handle :db-new [_window [_ repo]] - (db/new-db! repo)) - -(defmethod handle :db-transact-data [_window [_ repo data-str]] - (let [{:keys [tx-data tx-meta]} (reader/read-string data-str)] - (sqlite-db/transact! repo tx-data tx-meta) - nil)) - -;; Needs to be called first for an existing graph -(defmethod handle :get-initial-data [_window [_ repo _opts]] - (db/open-db! repo) - (dt/write-transit-str (sqlite-db/get-initial-data repo))) - -(defmethod handle :get-other-data [_window [_ _repo _journal-block-uuids _opts]] - nil) +(defmethod handle :db-export [_window [_ repo data]] + (db/ensure-graph-dir! repo) + (db/save-db! repo data)) ;; DB related IPCs End @@ -737,6 +724,21 @@ (defmethod handle :system/info [^js _win _] {:home-dir (.homedir os)}) +(comment + ;; Needs to be called first for a new graph + (defmethod handle :db-new [_window [_ repo]] + (db/new-db! repo)) + + ;; Needs to be called first for an existing graph + (defmethod handle :get-initial-data [_window [_ repo _opts]] + (db/open-db! repo) + (dt/write-transit-str (sqlite-db/get-initial-data repo))) + + (defmethod handle :db-transact-data [_window [_ repo data-str]] + (let [{:keys [tx-data tx-meta]} (reader/read-string data-str)] + (sqlite-db/transact! repo tx-data tx-meta) + nil))) + (defn set-ipc-handler! [window] (let [main-channel "main"] (.handle ipcMain main-channel diff --git a/src/main/frontend/db_worker.cljs b/src/main/frontend/db_worker.cljs index 49e79141a0..8ac448076c 100644 --- a/src/main/frontend/db_worker.cljs +++ b/src/main/frontend/db_worker.cljs @@ -48,14 +48,18 @@ [repo] (str "/" repo ".sqlite")) -(comment - (defn- export-db-file - [repo] - ;; TODO: get file name by repo - (p/let [^js pool (InBrowser)) @@ -17,12 +18,6 @@ (defn (p/let [_ (.createOrOpenDB sqlite repo)] (.getInitialData sqlite repo)) (p/catch (fn [error] - (prn :debug :fetch-initial-data-error) + (prn :debug :fetch-initial-data-error repo) (js/console.error error) - (notification/show! [:div (str "SQLiteDB fetch error: " error)] :error) {})))))) + (notification/show! [:div (str "SQLiteDB fetch error: " error)] :error) {}))))) + + ( (p/let [data (.exportDB sqlite repo)] + ( (.importDB sqlite repo data) + (p/catch (fn [error] + (prn :debug :import-db-error repo) + (js/console.error error) + (notification/show! [:div (str "SQLiteDB import error: " error)] :error) {})))))) diff --git a/src/main/frontend/persist_db/protocol.cljs b/src/main/frontend/persist_db/protocol.cljs index e5c405ccda..a62afc4fda 100644 --- a/src/main/frontend/persist_db/protocol.cljs +++ b/src/main/frontend/persist_db/protocol.cljs @@ -1,11 +1,11 @@ (ns frontend.persist-db.protocol - "Provides protocol for persisting db" - (:require)) + "Provides protocol for persisting db") -;; TODO: exporting, importing support (defprotocol PersistentDB - (