Skip to content

Instantly share code, notes, and snippets.

@MokkeMeguru
Last active January 14, 2024 09:57
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MokkeMeguru/858813437a1f76e4552ed05ee124c523 to your computer and use it in GitHub Desktop.
Save MokkeMeguru/858813437a1f76e4552ed05ee124c523 to your computer and use it in GitHub Desktop.
IndexedDB with ClojureScript
(ns practical-customizable-alerm.idb
(:require [re-frame.core :as re-frame]
[reagent.core :as r]))
;; event
(re-frame/reg-event-db
::init-indexed-db
(fn [db [_ indexed-db]]
(println "db" indexed-db)
(assoc db :indexed-db indexed-db)))
;; subs
(re-frame/reg-sub
::indexed-db
(fn [db]
(:indexed-db db)))
;; functions
(defn check-idb []
(if (. js/window -indexedDB)
true
false))
(check-idb) ;; => true
(defn idb-request-error [e]
(.error js/console "it raised error when i request IndexedDB" e))
(defn idb-request-success [e]
(.log js/console "successed request")
(re-frame/dispatch [::init-indexed-db (.. e -target -result)]))
(def sound-table
{:name "sounds"
:index
[{:name "name" :unique true}]})
(defn create-object-store [db table-info]
(let [object-store (.createObjectStore db "sounds" #js {:keyPath "id" :autoIncrement true})]
(for [table-idx (:index table-info)]
(.createIndex
object-store
(:name table-idx) (:name table-idx) #js {:unique (:unique table-idx)}))
(set! (.. object-store -transaction -oncomplete)
(fn [e]
(let [sound-object-store (-> db
(.transaction "sounds" "readwrite")
(.objectStore "sounds"))]
(.add sound-object-store #js {:name "sample.ogg"})
(.add sound-object-store #js {:name "sample2.ogg"}))))))
(defn add-obect-store [db new-sounds]
(let [transaction (.transaction db #js ["sounds"] "readwrite")]
(set! (.-oncomplete transaction) (fn [e] (.log js/console "all done !" e)))
(set! (.-onerror transaction) idb-request-error)
(let [object-store (.objectStore transaction "sounds")]
(for [sound new-sounds]
(do
(.log js/console sound)
(->
object-store
(.put (clj->js sound))))))))
(defn get-all-object-store [db]
(let [values (r/atom [])
request
(->
(.transaction db #js ["sounds"] "readonly")
(.objectStore "sounds")
.openCursor)]
(set! (.-onerror request) idb-request-error)
(set! (.-onsuccess request)
(fn [e]
(if-let [cursor (.. e -target -result)]
(do
(.log js/console (.-value cursor))
(swap! values conj (.-value cursor))
(.continue cursor))
(do
(.log js/console "values" @values)
))))))
(defn delete-all-object-store [db]
(let [transaction (.transaction db #js ["sounds"] "readwrite")]
(set! (.-oncomplete transaction) (fn [e] (.log js/console "erase complete")))
(set! (.-onerror transaction) idb-request-error)
(let [request (-> (.objectStore transaction "sounds")
.clear)]
(set!
(.-onsuccess request)
(fn [e] (.log js/console "finished"))))))
(defn get-object-store [db idx]
(let [request (->
(.transaction db #js ["sounds"] "readonly")
(.objectStore "sounds")
(.get idx))]
(set! (.-oncomplete request) (fn [e] (.log js/console "complete")))
(set! (.-onerror request) idb-request-error)
(set! (.-onsuccess request) (fn [e] (.log js/console "find! " (.. e -target -result -name))))
))
(def dbname "testdb")
;; initialize
(let [request (.open
(. js/window -indexedDB)
dbname 4)]
(set! (.-onerror request) idb-request-error)
(set! (.-onupgradeneeded request)
(fn [e]
(let [db (.. e -target -result)]
(re-frame/dispatch-sync [::init-indexed-db db])
(create-object-store db sound-table)))))
;; add
(def new-sounds [{:name "sample3.wav"} {:name "sample4.wav"}])
(add-obect-store @(re-frame/subscribe [::indexed-db]) new-sounds)
(get-object-store @(re-frame/subscribe [::indexed-db]) 9)
;; get all
(get-all-object-store @(re-frame/subscribe [::indexed-db]))
;; delete all
(delete-all-object-store @(re-frame/subscribe [::indexed-db]))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment