Bläddra i källkod

feat: restore dbs for native file stores

Tienson Qin 5 år sedan
förälder
incheckning
14b6c64196

+ 1 - 0
src/main/frontend/config.cljs

@@ -272,6 +272,7 @@
   #{"now" "later" "todo" "doing" "done" "wait" "waiting"
     "canceled" "cancelled" "started" "in-progress"})
 
+(defonce idb-db-prefix "logseq-db/")
 (defonce local-db-prefix "logseq_local_")
 (defonce local-handle-prefix (str "handle/" local-db-prefix))
 

+ 1 - 1
src/main/frontend/db.cljs

@@ -37,7 +37,7 @@
 (defn datascript-db
   [repo]
   (when repo
-    (str "logseq-db/" (get-repo-path repo))))
+    (str config/idb-db-prefix (get-repo-path repo))))
 
 (defn datascript-files-db
   [repo]

+ 34 - 18
src/main/frontend/handler.cljs

@@ -19,7 +19,7 @@
             [frontend.ui :as ui]
             [goog.object :as gobj]
             [frontend.helper :as helper]
-            [lambdaisland.glogi :as log]))
+            [frontend.idb :as idb]))
 
 (defn- watch-for-date!
   []
@@ -62,9 +62,7 @@
 
 (defn restore-and-setup!
   [me repos logged?]
-  ;; wait until pfs is loaded
-  (let [pfs-loaded? (atom js/window.pfs)
-        interval (atom nil)
+  (let [interval (atom nil)
         inner-fn (fn []
                    (when (and @interval js/window.pfs)
                      (js/clearInterval @interval)
@@ -75,9 +73,14 @@
                                                (ui-handler/add-style-if-exists!))))
                          (p/then
                           (fn []
-                            (if (and (not logged?)
-                                     (not (seq (db/get-files config/local-repo))))
+                            (cond
+                              (and (not logged?)
+                                   (not (seq (db/get-files config/local-repo)))
+                                   ;; Not native local directory
+                                   (not (some config/local-db? (map :url repos))))
                               (repo-handler/setup-local-repo-if-not-exists!)
+
+                              :else
                               (state/set-db-restoring! false))
 
                             (if (schema-changed?)
@@ -87,16 +90,16 @@
                                  :warning
                                  false)
                                 (let [export-repos (for [repo repos]
-                                                    (when-let [url (:url repo)]
-                                                      (println "Export repo: " url)
-                                                      (export-handler/export-repo-as-zip! url)))]
-                                 (-> (p/all export-repos)
-                                     (p/then (fn []
-                                               (store-schema!)
-                                               (js/setTimeout clear-stores-and-refresh! 5000)))
-                                     (p/catch (fn [error]
-                                                (log/error :export/zip {:error error
-                                                                        :repos repos}))))))
+                                                     (when-let [url (:url repo)]
+                                                       (println "Export repo: " url)
+                                                       (export-handler/export-repo-as-zip! url)))]
+                                  (-> (p/all export-repos)
+                                      (p/then (fn []
+                                                (store-schema!)
+                                                (js/setTimeout clear-stores-and-refresh! 5000)))
+                                      (p/catch (fn [error]
+                                                 (log/error :export/zip {:error error
+                                                                         :repos repos}))))))
                               (store-schema!))
 
                             (page-handler/init-commands!)
@@ -178,8 +181,21 @@
        (notification/show! "Sorry, it seems that your browser doesn't support IndexedDB, we recommend to use latest Chrome(Chromium) or Firefox(Non-private mode)." :error false)
        (state/set-indexedb-support! false)))
 
-    (nfs/trigger-check!)
-    (restore-and-setup! me repos logged?)
+    ;; (nfs/trigger-check!)
+    (p/let [nfs-dbs (idb/get-nfs-dbs)
+            nfs-dbs (map (fn [db] {:url db}) nfs-dbs)]
+      (let [repos (cond
+                    logged?
+                    (concat
+                     (:repos me)
+                     nfs-dbs)
+
+                    (seq nfs-dbs)
+                    nfs-dbs
+
+                    :else
+                    [{:url config/local-repo}])]
+        (restore-and-setup! me repos logged?)))
 
     (periodically-persist-repo-to-indexeddb!)
 

+ 4 - 2
src/main/frontend/handler/web/nfs.cljs

@@ -36,8 +36,10 @@
             files (doall
                    (map (fn [file]
                           (let [handle (gobj/get file "handle")
-                                get-attr #(gobj/get file %)]
-                            {:file/path (get-attr "webkitRelativePath")
+                                get-attr #(gobj/get file %)
+                                path (-> (get-attr "webkitRelativePath")
+                                         (string/replace-first (str dir-name "/") ""))]
+                            {:file/path path
                              :file/last-modified-at (get-attr "lastModified")
                              :file/size (get-attr "size")
                              :file/type (get-attr "type")

+ 13 - 1
src/main/frontend/idb.cljs

@@ -2,7 +2,9 @@
   (:require ["localforage" :as localforage]
             [cljs-bean.core :as bean]
             [goog.object :as gobj]
-            [promesa.core :as p]))
+            [promesa.core :as p]
+            [clojure.string :as string]
+            [frontend.config :as config]))
 
 ;; offline db
 (def store-name "dbs")
@@ -32,3 +34,13 @@
 (defn get-item
   [key]
   (.getItem localforage-instance key))
+
+(defn get-keys
+  []
+  (.keys localforage-instance))
+
+(defn get-nfs-dbs
+  []
+  (p/let [ks (get-keys)]
+    (->> (filter (fn [k] (string/starts-with? k (str config/idb-db-prefix config/local-db-prefix))) ks)
+         (map #(string/replace-first % config/idb-db-prefix "")))))