Skip to content

Instantly share code, notes, and snippets.

@claj
Last active March 3, 2017 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save claj/29d43841afa21514efdee24d6b52eb62 to your computer and use it in GitHub Desktop.
Save claj/29d43841afa21514efdee24d6b52eb62 to your computer and use it in GitHub Desktop.
datomic db/fn transactional behaviour (datomic 0.9.554)
;; 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