Implement monger.gridfs/find-one and /find-one-as-map

This commit is contained in:
Michael S. Klishin 2011-12-31 16:23:49 +04:00
parent 7eec647a97
commit a292f082e8
2 changed files with 62 additions and 5 deletions

View file

@ -63,8 +63,35 @@
(.createFile ^GridFS monger.core/*mongodb-gridfs* ^InputStream (io/make-input-stream input { :encoding "UTF-8" })))) (.createFile ^GridFS monger.core/*mongodb-gridfs* ^InputStream (io/make-input-stream input { :encoding "UTF-8" }))))
(defmacro store (defmacro store
[^GridFSInputFile input & body] [^GridFSInputFile input & body]
`(.save ^GridFSInputFile (doto ~input ~@body) *chunk-size*)) `(let [^GridFSInputFile f# (doto ~input ~@body)]
(.save f# *chunk-size*)
(from-db-object f# true)))
(defprotocol Finders
(find-one [input] "Finds one file using given input (an ObjectId, filename or query)")
(find-one-as-map [input] "Finds one file using given input (an ObjectId, filename or query), converting result to Clojure map before returning"))
(extend-protocol Finders
String
(find-one [^String input]
(.findOne ^GridFS monger.core/*mongodb-gridfs* input))
(find-one-as-map [^String input]
(from-db-object (find-one input) true))
org.bson.types.ObjectId
(find-one [^org.bson.types.ObjectId input]
(.findOne ^GridFS monger.core/*mongodb-gridfs* input))
(find-one-as-map [^org.bson.types.ObjectId input]
(from-db-object (find-one input) true))
DBObject
(find-one [^DBObject input]
(.findOne ^GridFS monger.core/*mongodb-gridfs* input))
(find-one-as-map [^DBObject input]
(from-db-object (find-one input) true)))

View file

@ -3,12 +3,12 @@
(:use [clojure.test] (:use [clojure.test]
[monger.core :only [count]] [monger.core :only [count]]
[monger.test.fixtures] [monger.test.fixtures]
[monger.operators] [monger operators conversion]
[monger.gridfs :only (store make-input-file)]) [monger.gridfs :only (store make-input-file)])
(:require [monger.gridfs :as gridfs] (:require [monger.gridfs :as gridfs]
[monger.test.helper :as helper] [monger.test.helper :as helper]
[clojure.java.io :as io]) [clojure.java.io :as io])
(:import [java.io InputStream] (:import [java.io InputStream File]
[com.mongodb.gridfs GridFS GridFSInputFile])) [com.mongodb.gridfs GridFS GridFSInputFile]))
@ -48,3 +48,33 @@
(.setFilename "monger.test.gridfs.file3") (.setFilename "monger.test.gridfs.file3")
(.setContentType "application/octet-stream")) (.setContentType "application/octet-stream"))
(is (= 1 (count (gridfs/all-files)))))) (is (= 1 (count (gridfs/all-files))))))
(deftest test-storing-files-to-gridfs-using-absolute-fs-paths
(let [tmp-file (File/createTempFile "monger.test.gridfs" "test-storing-files-to-gridfs-using-absolute-fs-paths")
_ (spit tmp-file "Some content")
input (.getAbsolutePath tmp-file)]
(is (= 0 (count (gridfs/all-files))))
(store (make-input-file input)
(.setFilename "monger.test.gridfs.file4")
(.setContentType "application/octet-stream"))
(is (= 1 (count (gridfs/all-files))))))
(deftest test-finding-individual-files-on-gridfs
(let [input "./test/resources/mongo/js/mapfun1.js"
ct "binary/octet-stream"
filename "monger.test.gridfs.file5"
md5 "14a09deabb50925a3381315149017bbd"
stored (store (make-input-file input)
(.setFilename filename)
(.setContentType ct))]
(is (= 1 (count (gridfs/all-files))))
(is (:_id stored))
(is (:uploadDate stored))
(is (= 62 (:length stored)))
(is (= md5 (:md5 stored)))
(is (= filename (:filename stored)))
(is (= ct (:contentType stored)))
(are [a b] (is (= a (:md5 (gridfs/find-one-as-map b))))
md5 (:_id stored)
md5 filename
md5 (to-db-object { :md5 md5 }))))