Bladeren bron

enhance: set opfs pool for each graph

Tienson Qin 2 jaren geleden
bovenliggende
commit
efa1c93fff
3 gewijzigde bestanden met toevoegingen van 53 en 16 verwijderingen
  1. 1 1
      package.json
  2. 51 14
      src/main/frontend/db_worker.cljs
  3. 1 1
      yarn.lock

+ 1 - 1
package.json

@@ -101,7 +101,7 @@
         "@logseq/capacitor-file-sync": "5.0.1",
         "@logseq/diff-merge": "0.2.2",
         "@logseq/react-tweet-embed": "1.3.1-1",
-        "@logseq/sqlite-wasm": "=0.0.4",
+        "@logseq/sqlite-wasm": "^0.0.4",
         "@radix-ui/colors": "^0.1.8",
         "@sentry/react": "^6.18.2",
         "@sentry/tracing": "^6.18.2",

+ 51 - 14
src/main/frontend/db_worker.cljs

@@ -23,10 +23,11 @@
   (get @*sqlite-conns repo))
 
 (defn- <get-opfs-pool
-  []
+  [graph]
   (or @*opfs-pool
-      (p/let [^js pool (.installOpfsSAHPoolVfs @*sqlite #js {:name "logseq-db"
-                                                             :initialCapacity 100})]
+      (p/let [^js pool (.installOpfsSAHPoolVfs @*sqlite #js {:name (str "logseq-pool-" graph)
+                                                             :initialCapacity 10})]
+        ;; (.removeVfs ^js pool)
         (reset! *opfs-pool pool)
         (js/console.dir pool)
         pool)))
@@ -50,15 +51,15 @@
   (str "/" repo ".sqlite"))
 
 (defn- get-file-names
-  []
-  (p/let [^js pool (<get-opfs-pool)]
+  [graph]
+  (p/let [^js pool (<get-opfs-pool graph)]
     (when pool
       (.getFileNames pool))))
 
 (defn- export-db-file
   [repo]
   ;; TODO: get file name by repo
-  (p/let [^js pool (<get-opfs-pool)
+  (p/let [^js pool (<get-opfs-pool repo)
           path (get-repo-path repo)]
     (when pool
       (.exportFile ^js pool path))))
@@ -113,7 +114,7 @@
 (defn- create-or-open-db!
   [repo]
   (when-not (get-sqlite-conn repo)
-    (p/let [pool (<get-opfs-pool)
+    (p/let [pool (<get-opfs-pool repo)
             db (new (.-OpfsSAHPoolDb pool) (get-repo-path repo))
             storage (new-sqlite-storage repo {})]
       (swap! *sqlite-conns assoc repo db)
@@ -124,6 +125,33 @@
         (reset! *datascript-conn conn)
         nil))))
 
+(defn iter->vec [iter]
+  (when iter
+    (p/loop [acc []]
+      (p/let [elem (.next iter)]
+        (if (.-done elem)
+          acc
+          (p/recur (conj acc (.-value elem))))))))
+
+(defn- <list-all-files
+  []
+  (let [dir? #(= (.-kind %) "directory")]
+    (p/let [^js root (.getDirectory js/navigator.storage)]
+      (p/loop [result []
+               dirs [root]]
+        (if (empty? dirs)
+          result
+          (p/let [dir (first dirs)
+                  result (conj result dir)
+                  values-iter (when (dir? dir) (.values dir))
+                  values (when values-iter (iter->vec values-iter))
+                  current-dir-dirs (filter dir? values)
+                  result (concat result values)
+                  dirs (concat
+                        current-dir-dirs
+                        (rest dirs))]
+            (p/recur result dirs)))))))
+
 #_:clj-kondo/ignore
 (defclass SQLiteDB
   (extends js/Object)
@@ -139,6 +167,7 @@
    (when-let [sqlite @*sqlite]
      (.-version sqlite)))
 
+  ;; FIXME:
   (supportOPFS
    [_this]
    (some? (.-createSyncAccessHandle (.-prototype js/FileSystemFileHandle))))
@@ -153,12 +182,20 @@
 
   (listDB
    [_this]
-   (p/let [file-names (get-file-names)]
-     (->> file-names
-          (filter (fn [file] (string/ends-with? file ".sqlite")))
-          (map (fn [file]
-                 (subs file 1 (- (count file) 7))))
-          (bean/->js))))
+   (p/let [all-files (<list-all-files)
+           dbs (->>
+                (keep (fn [file]
+                        (when (and
+                               (= (.-kind file) "directory")
+                               (string/starts-with? (.-name file) ".logseq-pool-"))
+                          (string/replace-first (.-name file) ".logseq-pool-" "")))
+                      all-files)
+                distinct)]
+     (prn :debug :all-files-count (count (filter
+                                          #(= (.-kind %) "file")
+                                          all-files)))
+     (prn :dbs dbs)
+     (bean/->js dbs)))
 
   (createOrOpenDB
    [_this repo]
@@ -188,7 +225,7 @@
   (unsafeUnlinkDB
    [_this repo]
    (p/let [_ (close-db! repo)
-           pool (<get-opfs-pool)
+           pool (<get-opfs-pool repo)
            path (get-repo-path repo)]
      (when pool
        (.unlink pool path)))))

+ 1 - 1
yarn.lock

@@ -552,7 +552,7 @@
   resolved "https://registry.yarnpkg.com/@logseq/react-tweet-embed/-/react-tweet-embed-1.3.1-1.tgz#119d22be8234de006fc35c3fa2a36f85634c5be6"
   integrity sha512-9O0oHs5depCvh6ZQvwtl1xb7B80YG5rUfY10uSUat5itOlcE3IWaYYpe6p/tcHErqHWnWgkXHitAB9M29FMbQg==
 
-"@logseq/sqlite-wasm@=0.0.4":
+"@logseq/sqlite-wasm@^0.0.4":
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/@logseq/sqlite-wasm/-/sqlite-wasm-0.0.4.tgz#7d9d9fb6034149d503fa66237b1a5f5206107f15"
   integrity sha512-aV1nhgUPIrv36E9J7GRKLAFuqPKJbSFxuhrzbxNAhHS8Wn0XO/0++UcikwCOK9aKnbgqfoRgX+VSxiFhwfno2g==