Skip to content

Instantly share code, notes, and snippets.

@leblowl
Created February 13, 2015 02:00
Show Gist options
  • Save leblowl/6b84bc1a9e55d11a03cd to your computer and use it in GitHub Desktop.
Save leblowl/6b84bc1a9e55d11a03cd to your computer and use it in GitHub Desktop.
simple clojurescript interface to IndexedDB for github.com/leblowl/lokate
(def db (atom nil))
(defn error [e]
(.error js/console "An IndexedDB error has occured!" e))
(defn new [cb]
(let [version 1
request (.open js/indexedDB "lokate" version)]
(set! (.-onupgradeneeded request) (fn [e]
(reset! db (.. e -target -result))
(set! (.. e -target -transaction -onerror) error)
(.createObjectStore @db "collection" #js {:keyPath "id"})
(.createObjectStore @db "resource" #js {:keyPath "id"})
(.createObjectStore @db "setting" #js {:keyPath "id"})
(.createObjectStore @db "history")))
(set! (.-onsuccess request) (fn [e]
(reset! db (.. e -target -result))
(cb)))
(set! (.-onerror request) error)))
(defn add
([db-name data]
(add db-name data nil))
([db-name data key]
(let [transaction (.transaction @db #js [db-name] "readwrite")
store (.objectStore transaction db-name)
request (if key
(.put store (clj->js data) key)
(.put store (clj->js data)))]
(set! (.-onerror request) error))))
(defn delete [db-name key]
(let [transaction (.transaction @db #js [db-name] "readwrite")
store (.objectStore transaction db-name)
request (.delete store (if (keyword? key) (name key) key))]
(set! (.-onerror request) error)))
(defn get-all [db-name for-each cb]
(let [transaction (.transaction @db #js [db-name] "readonly")
store (.objectStore transaction db-name)
keyRange (.lowerBound js/IDBKeyRange 0)
cursorRequest (.openCursor store keyRange)]
(set! (.-onsuccess cursorRequest)
(fn [e]
(if-let [result (.. e -target -result)]
(do
(for-each result)
(.continue result))
(cb))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment