2009-02-10 20:04:03 +01:00
|
|
|
/** @file gridfs.h */
|
2009-02-02 23:19:55 +01:00
|
|
|
|
2009-10-27 20:58:27 +01:00
|
|
|
/* 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.
|
|
|
|
*/
|
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "dbclient.h"
|
|
|
|
|
|
|
|
namespace mongo {
|
|
|
|
|
2009-02-09 21:38:26 +01:00
|
|
|
typedef unsigned long long gridfs_offset;
|
2009-02-02 23:19:55 +01:00
|
|
|
|
|
|
|
class GridFS;
|
|
|
|
class GridFile;
|
|
|
|
|
|
|
|
class Chunk {
|
|
|
|
public:
|
|
|
|
Chunk( BSONObj data );
|
2009-02-18 17:26:30 +01:00
|
|
|
Chunk( BSONObj fileId , int chunkNumber , const char * data , int len );
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
int len(){
|
|
|
|
int len;
|
|
|
|
const char * data = _data["data"].binData( len );
|
|
|
|
int * foo = (int*)data;
|
|
|
|
assert( len - 4 == foo[0] );
|
|
|
|
return len - 4;
|
|
|
|
}
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
const char * data( int & len ){
|
|
|
|
const char * data = _data["data"].binData( len );
|
|
|
|
int * foo = (int*)data;
|
|
|
|
assert( len - 4 == foo[0] );
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
len = len - 4;
|
|
|
|
return data + 4;
|
|
|
|
}
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
private:
|
|
|
|
BSONObj _data;
|
|
|
|
friend class GridFS;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
this is the main entry point into the mongo grid fs
|
|
|
|
*/
|
|
|
|
class GridFS{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* @param client - db connection
|
|
|
|
* @param dbName - root database name
|
2009-06-14 22:22:00 +02:00
|
|
|
* @param prefix - if you want your data somewhere besides <dbname>.fs
|
2009-02-02 23:19:55 +01:00
|
|
|
*/
|
2009-06-14 22:22:00 +02:00
|
|
|
GridFS( DBClientBase& client , const string& dbName , const string& prefix="fs" );
|
2009-02-02 23:19:55 +01:00
|
|
|
~GridFS();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* puts the file reference by fileName into the db
|
2009-09-24 22:29:38 +02:00
|
|
|
* @param fileName local filename relative to process
|
|
|
|
* @param remoteName optional filename to use for file stored in GridFS
|
|
|
|
* (default is to use fileName parameter)
|
2009-10-13 23:57:59 +02:00
|
|
|
* @param contentType optional MIME type for this object.
|
|
|
|
* (default is to omit)
|
2009-02-18 17:26:30 +01:00
|
|
|
* @return the file object
|
2009-02-02 23:19:55 +01:00
|
|
|
*/
|
2009-10-13 23:57:59 +02:00
|
|
|
BSONObj storeFile( const string& fileName , const string& remoteName="" , const string& contentType="");
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-10-16 17:23:09 +02:00
|
|
|
/**
|
|
|
|
* 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
|
|
|
|
*/
|
2009-10-16 19:02:07 +02:00
|
|
|
BSONObj storeFile( const char* data , size_t length , const string& remoteName , const string& contentType="");
|
2009-06-14 22:22:00 +02:00
|
|
|
/**
|
|
|
|
* removes file referenced by fileName from the db
|
2009-09-24 22:29:38 +02:00
|
|
|
* @param fileName filename (in GridFS) of the file to remove
|
2009-06-14 22:22:00 +02:00
|
|
|
* @return the file object
|
|
|
|
*/
|
|
|
|
void removeFile( const string& fileName );
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
/**
|
|
|
|
* returns a file object matching the query
|
|
|
|
*/
|
|
|
|
GridFile findFile( BSONObj query );
|
|
|
|
|
|
|
|
/**
|
|
|
|
* equiv to findFile( { filename : filename } )
|
|
|
|
*/
|
2009-06-14 22:22:00 +02:00
|
|
|
GridFile findFile( const string& fileName );
|
2009-02-02 23:19:55 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* convenience method to get all the files
|
|
|
|
*/
|
|
|
|
auto_ptr<DBClientCursor> list();
|
|
|
|
|
2009-02-03 04:16:39 +01:00
|
|
|
/**
|
|
|
|
* convenience method to get all the files with a filter
|
|
|
|
*/
|
|
|
|
auto_ptr<DBClientCursor> list( BSONObj query );
|
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
private:
|
|
|
|
DBClientBase& _client;
|
2009-02-18 17:26:30 +01:00
|
|
|
string _dbName;
|
2009-02-18 19:11:22 +01:00
|
|
|
string _prefix;
|
2009-02-02 23:19:55 +01:00
|
|
|
string _filesNS;
|
|
|
|
string _chunksNS;
|
|
|
|
|
2009-10-16 17:23:09 +02:00
|
|
|
// insert fileobject. All chunks must be in DB.
|
|
|
|
BSONObj insertFile(const string& name, const OID& id, unsigned length, const string& contentType);
|
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
friend class GridFile;
|
|
|
|
};
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
/**
|
2009-02-06 19:29:57 +01:00
|
|
|
wrapper for a file stored in the Mongo database
|
2009-02-02 23:19:55 +01:00
|
|
|
*/
|
|
|
|
class GridFile {
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* @return whether or not this file exists
|
|
|
|
* findFile will always return a GriFile, so need to check this
|
|
|
|
*/
|
|
|
|
bool exists(){
|
|
|
|
return ! _obj.isEmpty();
|
|
|
|
}
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
string getFilename(){
|
|
|
|
return _obj["filename"].str();
|
|
|
|
}
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
int getChunkSize(){
|
|
|
|
return (int)(_obj["chunkSize"].number());
|
|
|
|
}
|
|
|
|
|
|
|
|
gridfs_offset getContentLength(){
|
|
|
|
return (gridfs_offset)(_obj["length"].number());
|
|
|
|
}
|
|
|
|
|
2009-10-31 16:23:29 +01:00
|
|
|
string getContentType(){
|
|
|
|
return _obj["contentType"].valuestr();
|
|
|
|
}
|
|
|
|
|
2009-12-03 23:25:22 +01:00
|
|
|
Date_t getUploadDate(){
|
2009-08-20 00:32:46 +02:00
|
|
|
return _obj["uploadDate"].date();
|
|
|
|
}
|
|
|
|
|
|
|
|
string getMD5(){
|
|
|
|
return _obj["md5"].str();
|
|
|
|
}
|
|
|
|
|
2009-10-31 16:23:29 +01:00
|
|
|
BSONElement getFileField( const string& name ){
|
|
|
|
return _obj[name];
|
|
|
|
}
|
|
|
|
|
2009-08-20 04:34:13 +02:00
|
|
|
BSONObj getMetadata();
|
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
int getNumChunks(){
|
2009-02-04 19:22:02 +01:00
|
|
|
return (int) ceil( (double)getContentLength() / (double)getChunkSize() );
|
2009-02-02 23:19:55 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Chunk getChunk( int n );
|
|
|
|
|
|
|
|
/**
|
2009-06-14 22:22:00 +02:00
|
|
|
write the file to the output stream
|
2009-02-02 23:19:55 +01:00
|
|
|
*/
|
|
|
|
gridfs_offset write( ostream & out );
|
|
|
|
|
|
|
|
/**
|
|
|
|
write the file to this filename
|
|
|
|
*/
|
2009-06-14 22:22:00 +02:00
|
|
|
gridfs_offset write( const string& where );
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
private:
|
|
|
|
GridFile( GridFS * grid , BSONObj obj );
|
|
|
|
|
|
|
|
void _exists();
|
2009-08-06 20:12:32 +02:00
|
|
|
|
2009-02-02 23:19:55 +01:00
|
|
|
GridFS * _grid;
|
|
|
|
BSONObj _obj;
|
|
|
|
|
|
|
|
friend class GridFS;
|
|
|
|
};
|
|
|
|
}
|
2009-08-06 20:12:32 +02:00
|
|
|
|
|
|
|
|