Fix "fetch more" button

This sent a lot of unnecessary requests, because the `min_id` / `max_id`
parameters that were fetched from the database were way off. No idea why
exactly that happened, but aggregating the result manually seems to work
fine.
This commit is contained in:
arne 2025-11-20 19:36:32 +01:00
commit a06ec7ceae
2 changed files with 109 additions and 63 deletions

View file

@ -30,14 +30,17 @@
; we don't add a listener for "blocked" events because we handle "versionchange" above
(.addEventListener "error" (fn [ev] (reject (.-result request) ev))))))))
(def transaction? (partial instance? js/IDBTransaction))
(def store? (partial instance? js/IDBObjectStore))
(defn open-store
([db-or-txn store-id]
(open-store db-or-txn store-id "readonly"))
([db-or-txn store-id permissions]
([store-id permissions]
(open-store @+db+ store-id permissions))
([db store-id permissions]
(let [store-id (str store-id) ; simplifies using keywords as store identifiers
txn (if (instance? js/IDBTransaction db-or-txn)
db-or-txn
(.transaction db-or-txn store-id permissions))]
txn (if (transaction? db)
db
(.transaction db store-id permissions))]
(.objectStore txn store-id))))
(defn create-object-store! [db store-id key-opts]
@ -55,39 +58,69 @@
(.addEventListener "success" (fn [] (resolve (.-result request))))
(.addEventListener "error" (fn [] (reject (.-error request))))))))
(defn add! [store-id object]
(let [store (open-store @+db+ store-id "readwrite")
request (.add store (clj->js object))]
(promisify request)))
(defn add!
([store-id object] (add! @+db+ store-id object))
([db store-id object]
(let [store (open-store db store-id "readwrite")
request (.add store (clj->js object))]
(promisify request))))
(defn put! [store-id object]
(let [store (open-store @+db+ store-id "readwrite")
request (.put store (clj->js object))]
(promisify request)))
(defn put!
([store-id object] (put! @+db+ store-id object))
([db store-id object]
(let [store (open-store db store-id "readwrite")
request (.put store (clj->js object))]
(promisify request))))
(defn get! [store-id k]
(let [store (open-store @+db+ store-id)
request (.get store k)]
(promisify request)))
(defn get!
([store-id k] (get! @+db+ store-id k))
([db store-id k]
(let [store (open-store db store-id "readonly")
request (.get store k)]
(promisify request))))
(defn get-all! [store-id key-range]
(let [store (open-store @+db+ store-id)
request (.getAll store key-range)]
(promisify request)))
(defn get-all!
([store-id key-range] (get-all! @+db+ store-id key-range))
([db store-id key-range]
(let [store (open-store db store-id "readonly")
request (.getAll store key-range)]
(promisify request))))
(defn clear!
([store-id] (clear! @+db+ store-id))
([db store-id]
(let [store (open-store db store-id "readwrite")
request (.clear store)]
(promisify request))))
(defn delete!
([store-id k] (get! @+db+ store-id k))
([db store-id k]
(let [store (open-store db store-id "readwrite")
request (.delete store k)]
(promisify request))))
(defn count!
([store-id] (count! @+db+ store-id))
([db store-id]
(let [store (open-store db store-id "readonly")
request (.count store)]
(promisify request))))
(defn clear! [store-id]
(let [store (open-store @+db+ store-id "readwrite")
request (.clear store)]
(promisify request)))
(defn open-cursor!
([store-id key-range] (open-cursor! store-id key-range "next"))
([store-id key-range direction]
(let [store (open-store @+db+ store-id)]
(.openCursor store key-range direction)))
([store-id idx-name key-range direction]
(let [store (open-store @+db+ store-id)]
(.openCursor (.index store (str idx-name)) key-range direction))))
([store-id key-range] (open-cursor! @+db+ store-id key-range {:direction :asc}))
([store-id key-range opts] (open-cursor! @+db+ store-id key-range opts))
([db store-id key-range {:keys [direction index]}]
(let [store (open-store db store-id "readonly")
key-range (if (= key-range ::all)
(js/IDBKeyRange.lowerBound "")
key-range)
direction ({:asc "next" :desc "prev"} direction direction)]
(if index
(.openCursor (.index store (str index)) key-range direction)
(.openCursor store key-range direction)))))
#_(defn logging [f]
(let [n (volatile! 0)]
@ -130,13 +163,11 @@
(defn first-result [xform cursor-req]
(transduce-cursor (comp xform (take 1)) (fn [_ x] x) cursor-req))
(def all (js/IDBKeyRange.lowerBound ""))
(comment
(let [re (js/RegExp. "user" "i")]
(do (print "starting…" (js/Date.))
(-> (open-cursor! ::posts all)
(-> (open-cursor! ::posts ::all)
(transduce-cursor (comp (filter #(re-find re (.-content %)))
(take 50)
(map #(js->clj % :keywordize-keys true))))
@ -145,13 +176,3 @@
(js/console.log (first result)))))))
)
(defn delete! [store-id k]
(let [store (open-store @+db+ store-id)
request (.delete store k)]
(promisify request)))
(defn count! [store-id]
(let [store (open-store @+db+ store-id)
request (.count store)]
(promisify request)))