Skip to content

Commit 3fba7f2

Browse files
committed
Add schema validate
1 parent a9501cc commit 3fba7f2

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

src/datascript/db.cljc

+13-1
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,7 @@
13181318
(assoc-in db [:schema e-ident a-ident] v-ident)))))
13191319

13201320
(defn update-rschema [db]
1321-
(assoc db :rschema (rschema (get-schema db))))
1321+
(assoc db :rschema (rschema (merge implicit-schema (get-schema db)))))
13221322

13231323
;; In context of `with-datom` we can use faster comparators which
13241324
;; do not check for nil (~10-15% performance gain in `transact`)
@@ -1615,6 +1615,17 @@
16151615
{:error :transact/syntax, :tempids unused})))
16161616
(dissoc report ::value-tempids ::tx-redundant)))
16171617

1618+
(defn check-schema-update [db entity]
1619+
(when (ds/schema-entity? entity)
1620+
(when (and (contains? entity :db/ident)
1621+
(ds/is-system-keyword? (:db/ident entity)))
1622+
(raise "Using namespace 'db' for attribute identifiers is not allowed"
1623+
{:error :transact/schema :entity entity}))
1624+
(when (or (:db/cardinality entity) (:db/valueType entity))
1625+
(when-not (ds/schema? entity)
1626+
(raise "Incomplete schema transaction attributes, expected :db/ident, :db/cardinality"
1627+
{:error :transact/schema :entity entity})))))
1628+
16181629
(defn+ transact-tx-data [initial-report initial-es]
16191630
(when-not (or (nil? initial-es)
16201631
(sequential? initial-es))
@@ -1653,6 +1664,7 @@
16531664

16541665
(map? entity)
16551666
(let [old-eid (:db/id entity)]
1667+
(check-schema-update db entity)
16561668
(cond+
16571669
;; trivial entity
16581670
; (if (contains? entity :db/id)

src/datascript/schema.cljc

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,21 @@
1-
(ns datascript.schema)
1+
(ns datascript.schema
2+
(:require [clojure.string]))
3+
4+
(def schema-keys #{:db/ident :db/isComponent :db/noHistory :db/valueType :db/cardinality :db/unique :db/index :db.install/_attribute :db/doc :db/tupleType :db/tupleTypes :db/tupleAttrs})
25

36
(defonce schema-attr?
47
#{:db/id :db/ident :db/isComponent :db/valueType :db/cardinality :db/unique :db/index :db/doc :db/tupleAttrs :db/tupleType :db/tupleTypes})
8+
9+
(defn schema?
10+
[m]
11+
(and (:db/ident m)
12+
(:db/cardinality m)))
13+
14+
(defn is-system-keyword? [value]
15+
(and (or (keyword? value) (string? value))
16+
(if-let [ns (namespace (keyword value))]
17+
(= "db" (first (clojure.string/split ns #"\.")))
18+
false)))
19+
20+
(defn schema-entity? [entity]
21+
(some #(contains? entity %) schema-keys))

0 commit comments

Comments
 (0)