Follow-up: don't accept schema when creating DB.
This schema was already ignored.
This commit is contained in:
parent
52af06ce28
commit
73b155cfdc
2 changed files with 69 additions and 72 deletions
|
@ -446,63 +446,60 @@
|
|||
(declare <with-internal)
|
||||
|
||||
(defn <db-with-sqlite-connection
|
||||
([sqlite-connection]
|
||||
(<db-with-sqlite-connection sqlite-connection {}))
|
||||
[sqlite-connection]
|
||||
(go-pair
|
||||
(when-not (= sqlite-schema/current-version (<? (sqlite-schema/<ensure-current-version sqlite-connection)))
|
||||
(raise "Could not ensure current SQLite schema version."))
|
||||
|
||||
([sqlite-connection schema]
|
||||
(go-pair
|
||||
(when-not (= sqlite-schema/current-version (<? (sqlite-schema/<ensure-current-version sqlite-connection)))
|
||||
(raise "Could not ensure current SQLite schema version."))
|
||||
(let [current-tx (<? (<current-tx sqlite-connection))
|
||||
bootstrapped (>= current-tx 0)
|
||||
current-tx (max current-tx tx0)]
|
||||
(when-not bootstrapped
|
||||
;; We need to bootstrap the DB.
|
||||
(let [fail-alter-ident (fn [old new] (if-not (= old new)
|
||||
(raise "Altering idents is not yet supported, got " new " altering existing ident " old
|
||||
{:error :schema/alter-idents :old old :new new})
|
||||
new))
|
||||
fail-alter-attr (fn [old new] (if-not (= old new)
|
||||
(raise "Altering schema attributes is not yet supported, got " new " altering existing schema attribute " old
|
||||
{:error :schema/alter-schema :old old :new new})
|
||||
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.
|
||||
: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
|
||||
;; changes, since the applied datoms would conflict with the bootstrapping idents and
|
||||
;; schema. (The bootstrapping idents and schema are required to be able to write to
|
||||
;; 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)
|
||||
(<?))))
|
||||
|
||||
(let [current-tx (<? (<current-tx sqlite-connection))
|
||||
bootstrapped (>= current-tx 0)
|
||||
current-tx (max current-tx tx0)]
|
||||
(when-not bootstrapped
|
||||
;; We need to bootstrap the DB.
|
||||
(let [fail-alter-ident (fn [old new] (if-not (= old new)
|
||||
(raise "Altering idents is not yet supported, got " new " altering existing ident " old
|
||||
{:error :schema/alter-idents :old old :new new})
|
||||
new))
|
||||
fail-alter-attr (fn [old new] (if-not (= old new)
|
||||
(raise "Altering schema attributes is not yet supported, got " new " altering existing schema attribute " old
|
||||
{:error :schema/alter-schema :old old :new new})
|
||||
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.
|
||||
: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
|
||||
;; changes, since the applied datoms would conflict with the bootstrapping idents and
|
||||
;; schema. (The bootstrapping idents and schema are required to be able to write to
|
||||
;; 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)
|
||||
(<?))))
|
||||
|
||||
;; 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))
|
||||
(raise "After bootstrapping database, expected new materialized idents and old bootstrapped idents to be identical"
|
||||
{:error :bootstrap/bad-idents,
|
||||
:new idents :old bootstrap-idents
|
||||
}))
|
||||
(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
|
||||
})))
|
||||
(map->DB
|
||||
{:sqlite-connection sqlite-connection
|
||||
:idents idents
|
||||
:symbolic-schema symbolic-schema
|
||||
:schema (ds/schema (into {} (map (fn [[k v]] [(k idents) v]) symbolic-schema))) ;; TODO: fail if ident missing.
|
||||
:current-tx (inc current-tx)}))))))
|
||||
;; 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))
|
||||
(raise "After bootstrapping database, expected new materialized idents and old bootstrapped idents to be identical"
|
||||
{:error :bootstrap/bad-idents,
|
||||
:new idents :old bootstrap-idents
|
||||
}))
|
||||
(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
|
||||
})))
|
||||
(map->DB
|
||||
{:sqlite-connection sqlite-connection
|
||||
:idents idents
|
||||
:symbolic-schema symbolic-schema
|
||||
:schema (ds/schema (into {} (map (fn [[k v]] [(k idents) v]) symbolic-schema))) ;; TODO: fail if ident missing.
|
||||
:current-tx (inc current-tx)})))))
|
||||
|
||||
(defn connection-with-db [db]
|
||||
(map->Connection {:current-db (atom db)}))
|
||||
|
|
|
@ -123,7 +123,7 @@
|
|||
(deftest-async test-add-one
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
|
@ -139,7 +139,7 @@
|
|||
(deftest-async test-add-two
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [{tx0 :tx} (<? (dm/<transact! conn test-schema))
|
||||
|
@ -169,7 +169,7 @@
|
|||
(deftest-async test-retract
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [{tx0 :tx} (<? (dm/<transact! conn test-schema))
|
||||
|
@ -188,7 +188,7 @@
|
|||
(deftest-async test-id-literal-1
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [tx0 (:tx (<? (dm/<transact! conn test-schema)))
|
||||
|
@ -214,7 +214,7 @@
|
|||
(deftest-async test-unique
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [tx0 (:tx (<? (dm/<transact! conn test-schema)))]
|
||||
|
@ -236,7 +236,7 @@
|
|||
(deftest-async test-valueType-keyword
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [tx0 (:tx (<? (dm/<transact! conn [{:db/id (dm/id-literal :db.part/user -1)
|
||||
|
@ -271,7 +271,7 @@
|
|||
(deftest-async test-vector-upsert
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
tempids (fn [tx] (into {} (map (juxt (comp :idx first) second) (:tempids tx))))]
|
||||
(try
|
||||
|
@ -309,7 +309,7 @@
|
|||
(deftest-async test-map-upsert
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
tempids (fn [tx] (into {} (map (juxt (comp :idx first) second) (:tempids tx))))]
|
||||
(try
|
||||
|
@ -363,7 +363,7 @@
|
|||
(deftest-async test-map-upsert-conflicts
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
tempids (fn [tx] (into {} (map (juxt (comp :idx first) second) (:tempids tx))))]
|
||||
(try
|
||||
|
@ -401,7 +401,7 @@
|
|||
(deftest-async test-add-ident
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [report (<? (dm/<transact! conn [[:db/add (dm/id-literal :db.part/db -1) :db/ident :test/ident]]))
|
||||
|
@ -429,7 +429,7 @@
|
|||
(deftest-async test-add-schema
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)]
|
||||
(try
|
||||
(let [es [[:db/add :db.part/db :db.install/attribute (dm/id-literal :db.part/db -1)]
|
||||
|
@ -461,7 +461,7 @@
|
|||
(deftest-async test-fulltext
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
schema [{:db/id (dm/id-literal :db.part/db -1)
|
||||
:db/ident :test/fulltext
|
||||
|
@ -535,7 +535,7 @@
|
|||
(deftest-async test-txInstant
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
(try
|
||||
|
@ -571,7 +571,7 @@
|
|||
(deftest-async test-no-tx
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
(try
|
||||
|
@ -586,7 +586,7 @@
|
|||
(deftest-async test-explode-sequences
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
(try
|
||||
|
@ -615,7 +615,7 @@
|
|||
(deftest-async test-explode-maps
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
(try
|
||||
|
@ -650,7 +650,7 @@
|
|||
(deftest-async test-explode-reverse-refs
|
||||
(with-tempfile [t (tempfile)]
|
||||
(let [c (<? (s/<sqlite-connection t))
|
||||
db (<? (dm/<db-with-sqlite-connection c test-schema))
|
||||
db (<? (dm/<db-with-sqlite-connection c))
|
||||
conn (dm/connection-with-db db)
|
||||
{tx0 :tx} (<? (dm/<transact! conn test-schema))]
|
||||
(try
|
||||
|
|
Loading…
Reference in a new issue