Hi Pablo!!!!
I think the reason you've got so many responses is because most people
share the same problem. I do think this is a fruitful area of discussion.
There are multiple ways to go about it.
Based on your original post, I'll share my two cents:
In my experience, mixing an atom and dynamic vars is unnecessary and brings
complexity that is not worth it. It would be better to separate the two.
That is, use the atom, which would allow you to change the state (to
reconnect, etc). But also use the dynamic var so that the dynamic scope is
changed. That means that you may want to define a macro (but may also do
without);
(def current-connection (atom nil))
(def ^:dynamic db nil)
;; somewhere later
(binding [db @current-connection]
(do-some-db-operations))
Transactions could re-bind `db` in their dynamic scope.
Rebinding a dynamic var to a new atom is a little weird. It mixes mutation
with dynamic scope. I'm sure there are weird edge cases that are hard to
reason about. This way unifies the operations (even the first db operation
needs a binding) and separates it from mutation, which appears necessary in
your code.
The other thing is that you can make a nice Ring middleware like this:
(defn wrap-db [handler]
(fn [req]
(binding [db @current-connection]
(handler req))))
The connection it gets at the beginning will be with it throughout, so you
won't ever have a weird case where the connection atom is changed in the
middle.
Thanks
Eric
On Thursday, August 6, 2015 at 11:56:49 AM UTC-5, J. Pablo Fernández wrote:
>
>
> On 5 August 2015 at 19:33, James Reeves <[email protected]
> <javascript:>> wrote:
>
>> So when you're testing, presumably you use a dynamic binding to override
>> the global connection to the test database?
>>
>
> The wrap transaction always overrides the dynamic binding, whether it's in
> tests or not.
>
> --
> J. Pablo Fernández <[email protected] <javascript:>> (http://pupeno.com)
>
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.