Follow-up: extract datomish.transact.bootstrap.
This commit is contained in:
parent
73b155cfdc
commit
1853d57cba
2 changed files with 88 additions and 82 deletions
|
@ -13,6 +13,7 @@
|
|||
[datomish.query.source :as source]
|
||||
[datomish.query :as query]
|
||||
[honeysql.core :as sql]
|
||||
[datomish.transact.bootstrap :as bootstrap]
|
||||
[datomish.datom :as dd :refer [datom datom? #?@(:cljs [Datom])]]
|
||||
[datomish.util :as util #?(:cljs :refer-macros :clj :refer) [raise raise-str cond-let]]
|
||||
[datomish.schema :as ds]
|
||||
|
@ -328,80 +329,6 @@
|
|||
;; TODO: implement support for DB parts?
|
||||
(def tx0 0x2000000)
|
||||
|
||||
(def ^{:private true} bootstrap-symbolic-schema
|
||||
{:db/ident {:db/valueType :db.type/keyword
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/unique :db.unique/identity}
|
||||
:db.install/partition {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
:db.install/valueType {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
:db.install/attribute {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
;; TODO: support user-specified functions in the future.
|
||||
;; :db.install/function {:db/valueType :db.type/ref
|
||||
;; :db/cardinality :db.cardinality/many}
|
||||
:db/txInstant {:db/valueType :db.type/integer
|
||||
:db/cardinality :db.cardinality/one
|
||||
} ;; :db/index true} TODO: Handle this using SQLite protocol.
|
||||
:db/valueType {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/cardinality {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/unique {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/isComponent {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/index {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/fulltext {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/noHistory {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
})
|
||||
|
||||
(def ^{:private true} bootstrap-idents
|
||||
{:db/ident 1
|
||||
:db.part/db 2
|
||||
:db/txInstant 3
|
||||
:db.install/partition 4
|
||||
:db.install/valueType 5
|
||||
:db.install/attribute 6
|
||||
:db/valueType 7
|
||||
:db/cardinality 8
|
||||
:db/unique 9
|
||||
:db/isComponent 10
|
||||
:db/index 11
|
||||
:db/fulltext 12
|
||||
:db/noHistory 13
|
||||
:db/add 14
|
||||
:db/retract 15
|
||||
:db.part/tx 16
|
||||
:db.part/user 17
|
||||
:db/excise 18
|
||||
:db.excise/attrs 19
|
||||
:db.excise/beforeT 20
|
||||
:db.excise/before 21
|
||||
:db.alter/attribute 22
|
||||
:db.type/ref 23
|
||||
:db.type/keyword 24
|
||||
:db.type/integer 25 ;; TODO: :db.type/long, to match Datomic?
|
||||
:db.type/string 26
|
||||
:db.type/boolean 27
|
||||
:db.type/instant 28
|
||||
:db.type/bytes 29
|
||||
:db.cardinality/one 30
|
||||
:db.cardinality/many 31
|
||||
:db.unique/value 32
|
||||
:db.unique/identity 33})
|
||||
|
||||
(defn- bootstrap-tx-data []
|
||||
(concat
|
||||
(map (fn [[ident entid]] [:db/add entid :db/ident ident]) bootstrap-idents)
|
||||
(map (fn [[ident attrs]] (assoc attrs :db/id ident)) bootstrap-symbolic-schema)
|
||||
(map (fn [[ident attrs]] [:db/add :db.part/db :db.install/attribute (get bootstrap-idents ident)]) bootstrap-symbolic-schema) ;; TODO: fail if nil.
|
||||
))
|
||||
|
||||
(defn <idents [sqlite-connection]
|
||||
"Read the ident map materialized view from the given SQLite store.
|
||||
Returns a map (keyword ident) -> (integer entid), like {:db/ident 0}."
|
||||
|
@ -466,9 +393,9 @@
|
|||
new))]
|
||||
(-> (map->DB
|
||||
{:sqlite-connection sqlite-connection
|
||||
:idents bootstrap-idents
|
||||
:symbolic-schema bootstrap-symbolic-schema
|
||||
:schema (ds/schema (into {} (map (fn [[k v]] [(k bootstrap-idents) v]) bootstrap-symbolic-schema))) ;; TODO: fail if ident missing.
|
||||
:idents bootstrap/idents
|
||||
:symbolic-schema bootstrap/symbolic-schema
|
||||
:schema (ds/schema (into {} (map (fn [[k v]] [(k bootstrap/idents) v]) bootstrap/symbolic-schema))) ;; TODO: fail if ident missing.
|
||||
:current-tx current-tx})
|
||||
;; We use <with rather than <transact! to apply the bootstrap transaction data but to
|
||||
;; not follow the regular schema application process. We can't apply the schema
|
||||
|
@ -477,22 +404,22 @@
|
|||
;; the database conveniently; without them, we'd have to manually write datoms to the
|
||||
;; store. It's feasible but awkward.) After bootstrapping, we read back the idents
|
||||
;; and schema, just like when we re-open.
|
||||
(<with-internal (bootstrap-tx-data) fail-alter-ident fail-alter-attr)
|
||||
(<with-internal (bootstrap/tx-data) fail-alter-ident fail-alter-attr)
|
||||
(<?))))
|
||||
|
||||
;; We just bootstrapped, or we are returning to an already bootstrapped DB.
|
||||
(let [idents (<? (<idents sqlite-connection))
|
||||
symbolic-schema (<? (<symbolic-schema sqlite-connection))]
|
||||
(when-not bootstrapped
|
||||
(when (not (= idents bootstrap-idents))
|
||||
(when (not (= idents bootstrap/idents))
|
||||
(raise "After bootstrapping database, expected new materialized idents and old bootstrapped idents to be identical"
|
||||
{:error :bootstrap/bad-idents,
|
||||
:new idents :old bootstrap-idents
|
||||
:new idents :old bootstrap/idents
|
||||
}))
|
||||
(when (not (= symbolic-schema bootstrap-symbolic-schema))
|
||||
(when (not (= symbolic-schema bootstrap/symbolic-schema))
|
||||
(raise "After bootstrapping database, expected new materialized symbolic schema and old bootstrapped symbolic schema to be identical"
|
||||
{:error :bootstrap/bad-symbolic-schema,
|
||||
:new symbolic-schema :old bootstrap-symbolic-schema
|
||||
:new symbolic-schema :old bootstrap/symbolic-schema
|
||||
})))
|
||||
(map->DB
|
||||
{:sqlite-connection sqlite-connection
|
||||
|
|
79
src/datomish/transact/bootstrap.cljc
Normal file
79
src/datomish/transact/bootstrap.cljc
Normal file
|
@ -0,0 +1,79 @@
|
|||
;; 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.transact.bootstrap)
|
||||
|
||||
(def symbolic-schema
|
||||
{:db/ident {:db/valueType :db.type/keyword
|
||||
:db/cardinality :db.cardinality/one
|
||||
:db/unique :db.unique/identity}
|
||||
:db.install/partition {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
:db.install/valueType {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
:db.install/attribute {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/many}
|
||||
;; TODO: support user-specified functions in the future.
|
||||
;; :db.install/function {:db/valueType :db.type/ref
|
||||
;; :db/cardinality :db.cardinality/many}
|
||||
:db/txInstant {:db/valueType :db.type/integer
|
||||
:db/cardinality :db.cardinality/one
|
||||
} ;; :db/index true} TODO: Handle this using SQLite protocol.
|
||||
:db/valueType {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/cardinality {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/unique {:db/valueType :db.type/ref
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/isComponent {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/index {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/fulltext {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
:db/noHistory {:db/valueType :db.type/boolean
|
||||
:db/cardinality :db.cardinality/one}
|
||||
})
|
||||
|
||||
(def idents
|
||||
{:db/ident 1
|
||||
:db.part/db 2
|
||||
:db/txInstant 3
|
||||
:db.install/partition 4
|
||||
:db.install/valueType 5
|
||||
:db.install/attribute 6
|
||||
:db/valueType 7
|
||||
:db/cardinality 8
|
||||
:db/unique 9
|
||||
:db/isComponent 10
|
||||
:db/index 11
|
||||
:db/fulltext 12
|
||||
:db/noHistory 13
|
||||
:db/add 14
|
||||
:db/retract 15
|
||||
:db.part/tx 16
|
||||
:db.part/user 17
|
||||
:db/excise 18
|
||||
:db.excise/attrs 19
|
||||
:db.excise/beforeT 20
|
||||
:db.excise/before 21
|
||||
:db.alter/attribute 22
|
||||
:db.type/ref 23
|
||||
:db.type/keyword 24
|
||||
:db.type/integer 25 ;; TODO: :db.type/long, to match Datomic?
|
||||
:db.type/string 26
|
||||
:db.type/boolean 27
|
||||
:db.type/instant 28
|
||||
:db.type/bytes 29
|
||||
:db.cardinality/one 30
|
||||
:db.cardinality/many 31
|
||||
:db.unique/value 32
|
||||
:db.unique/identity 33})
|
||||
|
||||
(defn tx-data []
|
||||
(concat
|
||||
(map (fn [[ident entid]] [:db/add entid :db/ident ident]) idents)
|
||||
(map (fn [[ident attrs]] (assoc attrs :db/id ident)) symbolic-schema)
|
||||
(map (fn [[ident attrs]] [:db/add :db.part/db :db.install/attribute (get idents ident)]) symbolic-schema) ;; TODO: fail if nil.
|
||||
))
|
Loading…
Reference in a new issue