diff options
Diffstat (limited to 'src/mongo/client/gridfs.h')
-rw-r--r-- | src/mongo/client/gridfs.h | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/mongo/client/gridfs.h b/src/mongo/client/gridfs.h new file mode 100644 index 00000000000..5a19aa142ca --- /dev/null +++ b/src/mongo/client/gridfs.h @@ -0,0 +1,205 @@ +/** @file gridfs.h */ + +/* Copyright 2009 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "dbclient.h" +#include "redef_macros.h" + +namespace mongo { + + typedef unsigned long long gridfs_offset; + + class GridFS; + class GridFile; + + class GridFSChunk { + public: + GridFSChunk( BSONObj data ); + GridFSChunk( BSONObj fileId , int chunkNumber , const char * data , int len ); + + int len() const { + int len; + _data["data"].binDataClean( len ); + return len; + } + + const char * data( int & len ) const { + return _data["data"].binDataClean( len ); + } + + private: + BSONObj _data; + friend class GridFS; + }; + + + /** + GridFS is for storing large file-style objects in MongoDB. + @see http://www.mongodb.org/display/DOCS/GridFS+Specification + */ + class GridFS { + public: + /** + * @param client - db connection + * @param dbName - root database name + * @param prefix - if you want your data somewhere besides <dbname>.fs + */ + GridFS( DBClientBase& client , const string& dbName , const string& prefix="fs" ); + ~GridFS(); + + /** + * @param + */ + void setChunkSize(unsigned int size); + + /** + * puts the file reference by fileName into the db + * @param fileName local filename relative to process + * @param remoteName optional filename to use for file stored in GridFS + * (default is to use fileName parameter) + * @param contentType optional MIME type for this object. + * (default is to omit) + * @return the file object + */ + BSONObj storeFile( const string& fileName , const string& remoteName="" , const string& contentType=""); + + /** + * puts the file represented by data into the db + * @param data pointer to buffer to store in GridFS + * @param length length of buffer + * @param remoteName optional filename to use for file stored in GridFS + * (default is to use fileName parameter) + * @param contentType optional MIME type for this object. + * (default is to omit) + * @return the file object + */ + BSONObj storeFile( const char* data , size_t length , const string& remoteName , const string& contentType=""); + + /** + * removes file referenced by fileName from the db + * @param fileName filename (in GridFS) of the file to remove + * @return the file object + */ + void removeFile( const string& fileName ); + + /** + * returns a file object matching the query + */ + GridFile findFile( BSONObj query ) const; + + /** + * equiv to findFile( { filename : filename } ) + */ + GridFile findFile( const string& fileName ) const; + + /** + * convenience method to get all the files + */ + auto_ptr<DBClientCursor> list() const; + + /** + * convenience method to get all the files with a filter + */ + auto_ptr<DBClientCursor> list( BSONObj query ) const; + + private: + DBClientBase& _client; + string _dbName; + string _prefix; + string _filesNS; + string _chunksNS; + unsigned int _chunkSize; + + // insert fileobject. All chunks must be in DB. + BSONObj insertFile(const string& name, const OID& id, gridfs_offset length, const string& contentType); + + friend class GridFile; + }; + + /** + wrapper for a file stored in the Mongo database + */ + class GridFile { + public: + /** + * @return whether or not this file exists + * findFile will always return a GriFile, so need to check this + */ + bool exists() const { + return ! _obj.isEmpty(); + } + + string getFilename() const { + return _obj["filename"].str(); + } + + int getChunkSize() const { + return (int)(_obj["chunkSize"].number()); + } + + gridfs_offset getContentLength() const { + return (gridfs_offset)(_obj["length"].number()); + } + + string getContentType() const { + return _obj["contentType"].valuestr(); + } + + Date_t getUploadDate() const { + return _obj["uploadDate"].date(); + } + + string getMD5() const { + return _obj["md5"].str(); + } + + BSONElement getFileField( const string& name ) const { + return _obj[name]; + } + + BSONObj getMetadata() const; + + int getNumChunks() const { + return (int) ceil( (double)getContentLength() / (double)getChunkSize() ); + } + + GridFSChunk getChunk( int n ) const; + + /** + write the file to the output stream + */ + gridfs_offset write( ostream & out ) const; + + /** + write the file to this filename + */ + gridfs_offset write( const string& where ) const; + + private: + GridFile(const GridFS * grid , BSONObj obj ); + + void _exists() const; + + const GridFS * _grid; + BSONObj _obj; + + friend class GridFS; + }; +} + +#include "undef_macros.h" |