Initial support for URI connections.

I want to believe that the person who designed MongoDB Java driver API was not sober while at it.
This commit is contained in:
Michael S. Klishin 2012-04-10 23:54:23 +04:00
parent efbb439dca
commit 0da0a696f2
2 changed files with 32 additions and 4 deletions

View file

@ -14,7 +14,7 @@
monger.core monger.core
(:refer-clojure :exclude [count]) (:refer-clojure :exclude [count])
(:use [monger.conversion]) (:use [monger.conversion])
(:import [com.mongodb Mongo DB WriteConcern DBObject DBCursor CommandResult Bytes MongoOptions ServerAddress MapReduceOutput] (:import [com.mongodb Mongo MongoURI DB WriteConcern DBObject DBCursor CommandResult Bytes MongoOptions ServerAddress MapReduceOutput]
[com.mongodb.gridfs GridFS] [com.mongodb.gridfs GridFS]
[java.util Map])) [java.util Map]))
@ -31,6 +31,7 @@
(declare ^:dynamic ^GridFS *mongodb-gridfs*) (declare ^:dynamic ^GridFS *mongodb-gridfs*)
;; ;;
;; API ;; API
;; ;;
@ -51,11 +52,10 @@
(Mongo.)) (Mongo.))
([^ServerAddress server-address ^MongoOptions options] ([^ServerAddress server-address ^MongoOptions options]
(Mongo. server-address options)) (Mongo. server-address options))
([{ :keys [host port] :or { host *mongodb-host*, port *mongodb-port* }}] ([{ :keys [host port uri] :or { host *mongodb-host* port *mongodb-port* }}]
(Mongo. ^String host ^Long port))) (Mongo. ^String host ^Long port)))
(defn ^DB get-db-names (defn ^DB get-db-names
"Gets a list of all database names present on the server" "Gets a list of all database names present on the server"
([] ([]
@ -105,7 +105,7 @@
(defn server-address (defn server-address
([^String hostname] ([^String hostname]
(ServerAddress. hostname)) (ServerAddress. hostname))
([^String hostname ^long port] ([^String hostname ^Long port]
(ServerAddress. hostname port))) (ServerAddress. hostname port)))
@ -172,6 +172,30 @@
and WebScale fast second." and WebScale fast second."
(def ^:dynamic *mongodb-write-concern* wc)) (def ^:dynamic *mongodb-write-concern* wc))
(defn connect-via-uri!
"Connects to MongoDB using a URI, sets up default connection and database. Commonly used for PaaS-based applications,
for example, running on Heroku. If username and password are provided, performs authentication."
[{ :keys [uri] }]
(let [uri (MongoURI. uri)
;; yes, you are not hallucinating. A class named MongoURI has a method called connectDB.
;; I call it "college OOP". Or maybe "don't give a shit" OOP.
db (.connectDB uri)
conn (.getMongo db)
user (.getUsername uri)
pwd (.getPassword uri)]
;; I hope that whoever wrote the MongoDB Java driver connection/authentication parts
;; wasn't sober while at it. MK.
;;
;; First we set connection, then DB, then authentcate
(set-connection! conn)
(when db
(set-db! db))
(when (and user pwd)
(authenticate db user pwd))
conn))
(defn ^CommandResult command (defn ^CommandResult command
"Runs a database command (please check MongoDB documentation for the complete list of commands). Some common commands "Runs a database command (please check MongoDB documentation for the complete list of commands). Some common commands
are: are:

View file

@ -23,6 +23,10 @@
(let [connection (monger.core/connect { :host "127.0.0.1" })] (let [connection (monger.core/connect { :host "127.0.0.1" })]
(is (instance? com.mongodb.Mongo connection)))) (is (instance? com.mongodb.Mongo connection))))
(deftest connect-to-mongo-via-uri-without-credentials
(let [connection (monger.core/connect "mongodb://127.0.0.1")]
(is (instance? com.mongodb.Mongo connection))))
(deftest test-mongo-options-builder (deftest test-mongo-options-builder
(let [max-wait-time (* 1000 60 2) (let [max-wait-time (* 1000 60 2)