Implement js-sqlite for browser code.
This commit is contained in:
parent
1cfbf8498c
commit
b11b6c92d9
2 changed files with 77 additions and 0 deletions
20
src-browser/datomish/js_sqlite.cljs
Normal file
20
src-browser/datomish/js_sqlite.cljs
Normal file
|
@ -0,0 +1,20 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
(ns datomish.js-sqlite
|
||||
(:require
|
||||
[datomish.sqlite :as s]
|
||||
[datomish.js-util :refer [is-node?]]
|
||||
[datomish.sqlitejsm-sqlite :as sqlitejsm-sqlite]))
|
||||
|
||||
(def open sqlitejsm-sqlite/open)
|
||||
|
||||
(extend-protocol s/ISQLiteConnectionFactory
|
||||
string
|
||||
(<sqlite-connection [path]
|
||||
(open path))
|
||||
|
||||
object
|
||||
(<sqlite-connection [tempfile]
|
||||
(open (.-name tempfile))))
|
57
src-browser/datomish/sqlitejsm_sqlite.cljs
Normal file
57
src-browser/datomish/sqlitejsm_sqlite.cljs
Normal file
|
@ -0,0 +1,57 @@
|
|||
;; This Source Code Form is subject to the terms of the Mozilla Public
|
||||
;; License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
;; file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
(ns datomish.sqlitejsm-sqlite
|
||||
(:require
|
||||
[cljs-promises.async]
|
||||
[datomish.sqlite :as s]))
|
||||
|
||||
(def sqlite (.import (aget (js/require "chrome") "Cu") "resource://gre/modules/Sqlite.jsm"))
|
||||
|
||||
(println "sqlite is" (pr-str sqlite))
|
||||
|
||||
;; mozIStorageRow instances expose two methods: getResultByIndex and getResultByName.
|
||||
;; Our code expects to treat rows as associative containers, from keyword to value.
|
||||
;; So we implement ILookup (which has a different signature for ClojureScript than
|
||||
;; Clojure!), hope that we handle nil/NULL correctly, and switch between integers
|
||||
;; and keywords.
|
||||
(deftype
|
||||
StorageRow
|
||||
[row]
|
||||
|
||||
ILookup
|
||||
(-lookup [o k]
|
||||
(-lookup o k nil))
|
||||
|
||||
(-lookup [o k not-found]
|
||||
(or (if (integer? k)
|
||||
(.getResultByIndex row k)
|
||||
(.getResultByName row (clj->js (name k))))
|
||||
not-found)))
|
||||
|
||||
(defrecord SQLite3Connection [db]
|
||||
s/ISQLiteConnection
|
||||
(-execute!
|
||||
[db sql bindings]
|
||||
(cljs-promises.async/pair-port
|
||||
(.execute (.-db db) sql (or (clj->js bindings) #js []))))
|
||||
|
||||
(-each
|
||||
[db sql bindings row-cb]
|
||||
(let [cb (fn [row]
|
||||
(row-cb (StorageRow. row)))]
|
||||
(cljs-promises.async/pair-port
|
||||
(.execute (.-db db) sql (or (clj->js bindings) #js []) (when row-cb cb)))))
|
||||
|
||||
(close
|
||||
[db]
|
||||
(cljs-promises.async/pair-port
|
||||
(.close (.-db db)))))
|
||||
|
||||
(defn open
|
||||
[path & {:keys [mode] :or {mode 6}}]
|
||||
(cljs-promises.async/pair-port
|
||||
(->
|
||||
(.openConnection (aget sqlite "Sqlite") (clj->js {:path path :sharedMemoryCache false}))
|
||||
(.then ->SQLite3Connection))))
|
Loading…
Reference in a new issue