I'm working with Monger[1], and have been thinking about connection encapsulation. I've currently got a `myproject.mongo` ns with private `db` and `coll` vars. I've got a public `insert` method along the lines of
(defn insert [m] (mc/insert db coll m)) where `mc/insert` is, perhaps unsurprisingly, monger.collection/insert. To properly encapsulate my db-related vars, my options seem to be: 1) Replicate that `insert` func for every potentially-relevant mongo action (too much boilerplate/not DRY, I'd have to go back and add new funcs if I wanted more functionality) 2) Write a function along the lines of (defn with-connection [f & args] (apply f (concat [db coll] args)) which is fine I GUESS but is only func-level 3) Write a macro that inserts `db` and `coll` in the proper places, so that one could do something like (defn fake-upsert [m] (with-conn (if-let [existing (mc/find-one-as-map {:_id (:_id m)})] (mc/update existing m) (mc/insert m)))) and then `with-conn` would search through the code, identify the `monger.collection`-namespaced vars, and rewrite the code to put in `db` and `coll` arguments so it'd end up looking like ... (if-let [existing (mc/find-one-as-map db coll {:_id (:_id m})]... (mc/update db coll existing m).. and so on. This seems like my cleanest option, especially because it could be extended with an options map, à la (defn mongo-to-another-db [m] (with-conn {"monger.collection" [monger-db monger-coll] "another-db.adapter" [another-db-uri another-db-username another-db-password]} (adapter/insert (mc/find-one-as-map {:foo "bar"})))) I haven't been able to figure out how quite to do this, yet. I need, basically, a way to iterate through tokens in source code, examine each token, and then add a token and its relevant args if it's in the options map, or the token alone if it's not. Is this reasonable? Does this or something like it already exist? Is there something obvious my general macro mediocrity is preventing me from seeing? Thanks! -sam -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com 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 clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.