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.source :as source]
|
||||||
[datomish.query :as query]
|
[datomish.query :as query]
|
||||||
[honeysql.core :as sql]
|
[honeysql.core :as sql]
|
||||||
|
[datomish.transact.bootstrap :as bootstrap]
|
||||||
[datomish.datom :as dd :refer [datom datom? #?@(:cljs [Datom])]]
|
[datomish.datom :as dd :refer [datom datom? #?@(:cljs [Datom])]]
|
||||||
[datomish.util :as util #?(:cljs :refer-macros :clj :refer) [raise raise-str cond-let]]
|
[datomish.util :as util #?(:cljs :refer-macros :clj :refer) [raise raise-str cond-let]]
|
||||||
[datomish.schema :as ds]
|
[datomish.schema :as ds]
|
||||||
|
@ -328,80 +329,6 @@
|
||||||
;; TODO: implement support for DB parts?
|
;; TODO: implement support for DB parts?
|
||||||
(def tx0 0x2000000)
|
(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]
|
(defn <idents [sqlite-connection]
|
||||||
"Read the ident map materialized view from the given SQLite store.
|
"Read the ident map materialized view from the given SQLite store.
|
||||||
Returns a map (keyword ident) -> (integer entid), like {:db/ident 0}."
|
Returns a map (keyword ident) -> (integer entid), like {:db/ident 0}."
|
||||||
|
@ -466,9 +393,9 @@
|
||||||
new))]
|
new))]
|
||||||
(-> (map->DB
|
(-> (map->DB
|
||||||
{:sqlite-connection sqlite-connection
|
{:sqlite-connection sqlite-connection
|
||||||
:idents bootstrap-idents
|
:idents bootstrap/idents
|
||||||
:symbolic-schema bootstrap-symbolic-schema
|
: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.
|
:schema (ds/schema (into {} (map (fn [[k v]] [(k bootstrap/idents) v]) bootstrap/symbolic-schema))) ;; TODO: fail if ident missing.
|
||||||
:current-tx current-tx})
|
:current-tx current-tx})
|
||||||
;; We use <with rather than <transact! to apply the bootstrap transaction data but to
|
;; 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
|
;; 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
|
;; 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
|
;; store. It's feasible but awkward.) After bootstrapping, we read back the idents
|
||||||
;; and schema, just like when we re-open.
|
;; 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.
|
;; We just bootstrapped, or we are returning to an already bootstrapped DB.
|
||||||
(let [idents (<? (<idents sqlite-connection))
|
(let [idents (<? (<idents sqlite-connection))
|
||||||
symbolic-schema (<? (<symbolic-schema sqlite-connection))]
|
symbolic-schema (<? (<symbolic-schema sqlite-connection))]
|
||||||
(when-not bootstrapped
|
(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"
|
(raise "After bootstrapping database, expected new materialized idents and old bootstrapped idents to be identical"
|
||||||
{:error :bootstrap/bad-idents,
|
{: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"
|
(raise "After bootstrapping database, expected new materialized symbolic schema and old bootstrapped symbolic schema to be identical"
|
||||||
{:error :bootstrap/bad-symbolic-schema,
|
{:error :bootstrap/bad-symbolic-schema,
|
||||||
:new symbolic-schema :old bootstrap-symbolic-schema
|
:new symbolic-schema :old bootstrap/symbolic-schema
|
||||||
})))
|
})))
|
||||||
(map->DB
|
(map->DB
|
||||||
{:sqlite-connection sqlite-connection
|
{: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