Skip to content

Commit 17c5dc5

Browse files
committed
Added: d/reset-schema!, d/with-schema
1 parent 3360f74 commit 17c5dc5

File tree

4 files changed

+33
-6
lines changed

4 files changed

+33
-6
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# WIP
22

3+
- Added: `d/reset-schema!`, `d/with-schema`
34
- JVM: Return `nil` from `d/restore-conn` if there is no db
45
- Do not throw from d/touch when finding hanging refs
56

src/datascript/core.cljc

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,10 @@
285285
{:pre [(db/db? db)]}
286286
(:db-after (with db tx-data)))
287287

288+
(defn ^DB with-schema
289+
"Warning! No validation or conversion. Only change schema in a compatible way"
290+
[db schema]
291+
(db/with-schema db schema))
288292

289293
; Index lookups
290294

@@ -527,7 +531,7 @@
527531
(if (> (transduce (map count) + 0 tx-tail') (:branching-factor settings))
528532
;; overflow tail
529533
(do
530-
(storage/store-impl! db (storage/storage-adapter db))
534+
(storage/store-impl! db (storage/storage-adapter db) false)
531535
(reset! *tx-tail [])
532536
(reset! (:db-last-stored (meta conn)) db))
533537
;; just update tail
@@ -652,6 +656,17 @@
652656
(callback report))
653657
db)))
654658

659+
(defn reset-schema! [conn schema]
660+
"Warning! Does not perform any validation or data conversion. Only change schema in a compatible way"
661+
{:pre [(conn? conn)]}
662+
(let [db (swap! conn db/with-schema schema)]
663+
#?(:clj
664+
(when-some [storage (storage/storage @conn)]
665+
(storage/store-impl! db (storage/storage-adapter db) true)
666+
(reset! (:tx-tail (meta conn)) [])
667+
(reset! (:db-last-stored (meta conn)) db)))
668+
db))
669+
655670
(defn- atom? [a]
656671
#?(:cljs (instance? Atom a)
657672
:clj (instance? clojure.lang.IAtom a)))

src/datascript/db.cljc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,15 @@
10321032
:pull-attrs (lru/cache 100)
10331033
:hash (atom 0)}))
10341034

1035+
(defn with-schema [db schema]
1036+
{:pre [(db? db) (or (nil? schema) (map? schema))]}
1037+
(assoc db
1038+
:schema schema
1039+
:rschema (rschema (merge implicit-schema schema))
1040+
:pull-patterns (lru/cache 100)
1041+
:pull-attrs (lru/cache 100)
1042+
:hash (atom 0)))
1043+
10351044
(defn- equiv-db-index [x y]
10361045
(loop [xs (seq x)
10371046
ys (seq y)]

src/datascript/storage.clj

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
me.tonsky.persistent_sorted_set.IStorage
5353
(store [_ ^ANode node]
5454
(let [addr (gen-addr)
55+
_ (util/log "store" addr)
5556
keys (mapv serializable-datom (.keys node))
5657
data (cond-> {:level (.level node)
5758
:keys keys}
@@ -60,6 +61,7 @@
6061
(vswap! *store-buffer* conj! [addr data])
6162
addr))
6263
(restore [_ addr]
64+
(util/log "restore" addr)
6365
(let [{:keys [level keys addresses]} (-restore storage addr)
6466
^List keys' (map (fn [[e a v tx]] (db/datom e a v tx)) keys)]
6567
(if addresses
@@ -84,7 +86,7 @@
8486
(defn- remember-db [db]
8587
(.add stored-dbs (WeakReference. db)))
8688

87-
(defn store-impl! [db adapter]
89+
(defn store-impl! [db adapter force?]
8890
(locking (:storage adapter)
8991
(remember-db db)
9092
(binding [*store-buffer* (volatile! (transient []))]
@@ -100,7 +102,7 @@
100102
:avet avet-addr
101103
:max-addr @*max-addr}
102104
(set/settings (:eavt db)))]
103-
(when (pos? (count @*store-buffer*))
105+
(when (or force? (pos? (count @*store-buffer*)))
104106
(vswap! *store-buffer* conj! [root-addr meta])
105107
(vswap! *store-buffer* conj! [tail-addr []])
106108
(-store (:storage adapter) (persistent! @*store-buffer*)))
@@ -109,17 +111,17 @@
109111
(defn store
110112
([db]
111113
(if-some [adapter (storage-adapter db)]
112-
(store-impl! db adapter)
114+
(store-impl! db adapter false)
113115
(throw (ex-info "Database has no associated storage" {}))))
114116
([db storage]
115117
(if-some [adapter (storage-adapter db)]
116118
(let [current-storage (:storage adapter)]
117119
(if (identical? current-storage storage)
118-
(store-impl! db adapter)
120+
(store-impl! db adapter false)
119121
(throw (ex-info "Database is already stored with another IStorage" {:storage current-storage}))))
120122
(let [settings (.-_settings ^PersistentSortedSet (:eavt db))
121123
adapter (StorageAdapter. storage settings)]
122-
(store-impl! db adapter)))))
124+
(store-impl! db adapter false)))))
123125

124126
(defn store-tail [db tail]
125127
(-store (storage db) [[tail-addr (mapv #(mapv serializable-datom %) tail)]]))

0 commit comments

Comments
 (0)