0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-30 17:10:48 +01:00
mongodb/client/gridfs.h

204 lines
5.6 KiB
C
Raw Normal View History

/** @file gridfs.h */
2009-02-02 23:19:55 +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 );
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
* @param prefix - if you want your data somewhere besides <dbname>.fs
2009-02-02 23:19:55 +01: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
* @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
2009-02-02 23:19:55 +01:00
*/
BSONObj storeFile( const string& fileName , const string& remoteName="" , const string& contentType="");
2009-08-06 20:12:32 +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
*/
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 );
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 } )
*/
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;
string _dbName;
2009-02-18 19:11:22 +01:00
string _prefix;
2009-02-02 23:19:55 +01:00
string _filesNS;
string _chunksNS;
// 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
/**
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());
}
string getContentType(){
return _obj["contentType"].valuestr();
}
Date_t getUploadDate(){
return _obj["uploadDate"].date();
}
string getMD5(){
return _obj["md5"].str();
}
BSONElement getFileField( const string& name ){
return _obj[name];
}
BSONObj getMetadata();
2009-02-02 23:19:55 +01:00
int getNumChunks(){
return (int) ceil( (double)getContentLength() / (double)getChunkSize() );
2009-02-02 23:19:55 +01:00
}
Chunk getChunk( int n );
/**
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
*/
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