Skip to content

Commit

Permalink
initial IStorage protocol impl
Browse files Browse the repository at this point in the history
  • Loading branch information
tonsky committed Jul 18, 2023
1 parent e484f4e commit 3d51505
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 1 deletion.
1 change: 1 addition & 0 deletions script/repl.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
set -o errexit -o nounset -o pipefail
cd "`dirname $0`/.."

echo "Starting Socket REPL server on port 5555"
clj -A:test:bench -J--add-opens=java.base/java.io=ALL-UNNAMED -X clojure.core.server/start-server :name repl :port 5555 :accept clojure.core.server/repl :server-daemon false
2 changes: 2 additions & 0 deletions src/datascript/core.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -761,3 +761,5 @@
:cljs (-> (subs (str uuid) 0 8)
(js/parseInt 16)
(* 1000))))

#?(:clj (load "storage"))
2 changes: 1 addition & 1 deletion src/datascript/db.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -1111,7 +1111,7 @@
from (components->pattern db index c0 c1 c2 c3 e0 tx0)
to (components->pattern db index c0 c1 c2 c3 emax txmax)
datom (first (set/seek (seq set) from))]
(when (and datom (<= 0 (cmp to datom)))
(when (and (some? datom) (<= 0 (cmp to datom)))
datom)))

;; ----------------------------------------------------------------------------
Expand Down
63 changes: 63 additions & 0 deletions src/datascript/storage.clj
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

(in-ns 'datascript.core)

(require
'[datascript.db :as db]
'[me.tonsky.persistent-sorted-set :as set])

(import
'[java.util List]
'[me.tonsky.persistent_sorted_set ANode Branch Leaf])

(def ^:private root-addr
#uuid "d5695966-036d-6740-8541-d80034219c28")

(defn- gen-addr []
(random-uuid))

(defprotocol IStorage
(-store [_ addr data])
(-restore [_ addr]))

(defn- pss-storage [istorage]
(reify me.tonsky.persistent_sorted_set.IStorage
(store [_ ^ANode node]
(let [addr (gen-addr)
data (cond-> {:level (.level node)
:keys (.keys node)}
(instance? Branch node)
(assoc :addresses (.addresses ^Branch node)))]
(-store istorage addr data)
addr))
(restore [_ addr]
(let [{:keys [level keys addresses]} (-restore istorage addr)]
(if addresses
(Branch. (int level) ^List keys ^List addresses)
(Leaf. keys))))))

(defn store
([istorage db]
(store istorage db {}))
([istorage db opts]
(let [pss-storage (pss-storage istorage)
meta {:schema (:schema db)
:max-eid (:max-eid db)
:max-tx (:max-tx db)
:eavt (set/store (:eavt db) pss-storage)
:aevt (set/store (:aevt db) pss-storage)
:avet (set/store (:avet db) pss-storage)}]
(-store istorage root-addr meta))))

(defn restore
([istorage]
(restore istorage {}))
([istorage opts]
(let [{:keys [schema eavt aevt avet max-eid max-tx]} (-restore istorage root-addr)
pss-storage (pss-storage istorage)]
(db/restore-db
{:schema schema
:eavt (set/restore-by db/cmp-datoms-eavt eavt pss-storage)
:aevt (set/restore-by db/cmp-datoms-aevt aevt pss-storage)
:avet (set/restore-by db/cmp-datoms-avet avet pss-storage)
:max-eid max-eid
:max-tx max-tx}))))

0 comments on commit 3d51505

Please sign in to comment.