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:
parent
a5dea165af
commit
a06ec7ceae
2 changed files with 109 additions and 63 deletions
|
|
@ -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)))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue