diff --git a/src/monger/gridfs.clj b/src/monger/gridfs.clj index e097d82..bf532de 100644 --- a/src/monger/gridfs.clj +++ b/src/monger/gridfs.clj @@ -63,8 +63,35 @@ (.createFile ^GridFS monger.core/*mongodb-gridfs* ^InputStream (io/make-input-stream input { :encoding "UTF-8" })))) - - (defmacro store [^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))) + + diff --git a/test/monger/test/gridfs.clj b/test/monger/test/gridfs.clj index 95cc4dc..de08d83 100644 --- a/test/monger/test/gridfs.clj +++ b/test/monger/test/gridfs.clj @@ -3,12 +3,12 @@ (:use [clojure.test] [monger.core :only [count]] [monger.test.fixtures] - [monger.operators] + [monger operators conversion] [monger.gridfs :only (store make-input-file)]) (:require [monger.gridfs :as gridfs] [monger.test.helper :as helper] [clojure.java.io :as io]) - (:import [java.io InputStream] + (:import [java.io InputStream File] [com.mongodb.gridfs GridFS GridFSInputFile])) @@ -48,3 +48,33 @@ (.setFilename "monger.test.gridfs.file3") (.setContentType "application/octet-stream")) (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 }))))