|
52 | 52 | me.tonsky.persistent_sorted_set.IStorage |
53 | 53 | (store [_ ^ANode node] |
54 | 54 | (let [addr (gen-addr) |
| 55 | + _ (util/log "store" addr) |
55 | 56 | keys (mapv serializable-datom (.keys node)) |
56 | 57 | data (cond-> {:level (.level node) |
57 | 58 | :keys keys} |
|
60 | 61 | (vswap! *store-buffer* conj! [addr data]) |
61 | 62 | addr)) |
62 | 63 | (restore [_ addr] |
| 64 | + (util/log "restore" addr) |
63 | 65 | (let [{:keys [level keys addresses]} (-restore storage addr) |
64 | 66 | ^List keys' (map (fn [[e a v tx]] (db/datom e a v tx)) keys)] |
65 | 67 | (if addresses |
|
84 | 86 | (defn- remember-db [db] |
85 | 87 | (.add stored-dbs (WeakReference. db))) |
86 | 88 |
|
87 | | -(defn store-impl! [db adapter] |
| 89 | +(defn store-impl! [db adapter force?] |
88 | 90 | (locking (:storage adapter) |
89 | 91 | (remember-db db) |
90 | 92 | (binding [*store-buffer* (volatile! (transient []))] |
|
100 | 102 | :avet avet-addr |
101 | 103 | :max-addr @*max-addr} |
102 | 104 | (set/settings (:eavt db)))] |
103 | | - (when (pos? (count @*store-buffer*)) |
| 105 | + (when (or force? (pos? (count @*store-buffer*))) |
104 | 106 | (vswap! *store-buffer* conj! [root-addr meta]) |
105 | 107 | (vswap! *store-buffer* conj! [tail-addr []]) |
106 | 108 | (-store (:storage adapter) (persistent! @*store-buffer*))) |
|
109 | 111 | (defn store |
110 | 112 | ([db] |
111 | 113 | (if-some [adapter (storage-adapter db)] |
112 | | - (store-impl! db adapter) |
| 114 | + (store-impl! db adapter false) |
113 | 115 | (throw (ex-info "Database has no associated storage" {})))) |
114 | 116 | ([db storage] |
115 | 117 | (if-some [adapter (storage-adapter db)] |
116 | 118 | (let [current-storage (:storage adapter)] |
117 | 119 | (if (identical? current-storage storage) |
118 | | - (store-impl! db adapter) |
| 120 | + (store-impl! db adapter false) |
119 | 121 | (throw (ex-info "Database is already stored with another IStorage" {:storage current-storage})))) |
120 | 122 | (let [settings (.-_settings ^PersistentSortedSet (:eavt db)) |
121 | 123 | adapter (StorageAdapter. storage settings)] |
122 | | - (store-impl! db adapter))))) |
| 124 | + (store-impl! db adapter false))))) |
123 | 125 |
|
124 | 126 | (defn store-tail [db tail] |
125 | 127 | (-store (storage db) [[tail-addr (mapv #(mapv serializable-datom %) tail)]])) |
|
0 commit comments