Last active
March 3, 2017 13:29
-
-
Save claj/29d43841afa21514efdee24d6b52eb62 to your computer and use it in GitHub Desktop.
datomic db/fn transactional behaviour (datomic 0.9.554)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; transact a db-fn using io.pedestal.log, but forget to add require! | |
user> (d/transact conn [{:db/id (d/tempid :db.part/user) | |
:db/ident :some-dbfn | |
:db/fn (d/function | |
'{:lang "clojure" | |
:params [db params] | |
:code (io.pedestal.log/error :some-dbfn "hello")})}]) | |
#<promise$settable_future$reify__3565@738ad462: | |
{:db-before datomic.db.Db@e6de0f53, | |
:db-after datomic.db.Db@87233408, | |
:tx-data | |
[#datom[13194139536014 50 #inst "2017-03-03T13:15:49.754-00:00" 13194139536014 true] | |
#datom[17592186047119 10 :some-dbfn 13194139536014 true] | |
#datom[17592186047119 52 #db/fn{:lang :clojure, | |
:imports [], | |
:requires [], ;; <---- | |
:params [db params], | |
:code "(io.pedestal.log/error :some-dbfn \"hello\")"} 13194139536014 true]], | |
:tempids {-9223350046623231499 17592186047119}}> | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; whoops, forgot to add :requires | |
user> (d/pull (db conn) '[*] :some-dbfn) | |
#:db{:id 17592186047119, | |
:ident :some-dbfn, | |
:fn | |
#db/fn{:lang :clojure, | |
:imports [], | |
:requires [], | |
:params [db params], | |
:code "(io.pedestal.log/error :some-dbfn \"hello\")"}} | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; try to fix it: | |
;; adding :requires with identical :code | |
user> (d/transact conn [{:db/id (d/tempid :db.part/user) | |
:db/ident :some-dbfn | |
:db/fn (d/function | |
'{:lang "clojure" | |
:params [db params] | |
:requires ([io.pedestal.log]) ;;<--- whoops | |
:code (io.pedestal.log/error :some-dbfn "hello")})}]) | |
#<promise$settable_future$reify__3565@439dd566: | |
{:db-before datomic.db.Db@87233408, | |
:db-after datomic.db.Db@631eafce, | |
:tx-data | |
[#datom[13194139536016 50 #inst "2017-03-03T13:16:22.221-00:00" 13194139536016 true]], | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; No db fn transacted! | |
;; | |
;; EXPECTED: a db/fn with :requires key updated. | |
:tempids {-9223350046623231500 17592186047119}}> | |
;;; We see that requires are not added to the function either: | |
user> (d/pull (db conn) '[*] :some-dbfn) | |
#:db{:id 17592186047119, | |
:ident :some-dbfn, | |
:fn | |
#db/fn{:lang :clojure, | |
:imports [], | |
:requires [], ;; <---- no requires | |
:params [db params], :code "(io.pedestal.log/error :some-dbfn \"hello\")"}} | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; WORKAROUND | |
;; manipulate the :code when transacting | |
user> (d/transact conn [{:db/id (d/tempid :db.part/user) | |
:db/ident :some-dbfn | |
:db/fn (d/function | |
'{:lang "clojure" | |
:params [db params] | |
:requires ([io.pedestal.log]) ;;<--- requires | |
:code (do (io.pedestal.log/error :some-dbfn "hello")) ;; <--- wrapped in (do) | |
})}]) | |
#<promise$settable_future$reify__3565@76354e0b: | |
{:db-before datomic.db.Db@631eafce, | |
:db-after datomic.db.Db@277f1947, | |
:tx-data | |
[#datom[13194139536017 50 #inst "2017-03-03T13:16:37.951-00:00" 13194139536017 true] | |
;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; db fn transacted (which is good) | |
;; | |
#datom[17592186047119 52 #db/fn{:lang :clojure, | |
:imports [], | |
:requires [[io.pedestal.log]], ;; <--- requires updated! | |
:params [db params], | |
:code "(do (io.pedestal.log/error :some-dbfn \"hello\"))"} 13194139536017 true] #datom[17592186047119 52 #db/fn{:lang :clojure, :imports [], :requires [], :params [db params], :code "(io.pedestal.log/error :some-dbfn \"hello\")"} 13194139536017 false]], | |
:tempids {-9223350046623231501 17592186047119}}> | |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
;; cannot "remove" :requires by leaving them out either. | |
traktor-dev.user> (d/transact conn [{:db/id (d/tempid :db.part/user) | |
:db/ident :some-dbfn | |
:db/fn (d/function | |
'{:lang "clojure" | |
:params [db params] | |
;;:requires ([io.pedestal.log]) ;; <--- commented out | |
:code (do (io.pedestal.log/error :some-dbfn "hello"))})}]) | |
#<promise$settable_future$reify__3565@72679f30: | |
{:db-before datomic.db.Db@277f1947, | |
:db-after datomic.db.Db@d11fda73, | |
:tx-data | |
[#datom[13194139536018 50 #inst "2017-03-03T13:16:58.799-00:00" 13194139536018 true]], | |
;; no db/fn transacted | |
:tempids {-9223350046623231502 17592186047119}}> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment