Skip to content

Commit

Permalink
Added new namespace to avoid collisions with future mongo_cxx driver …
Browse files Browse the repository at this point in the history
…addition of the GridFileBuilder class
  • Loading branch information
pakozm committed May 4, 2014
1 parent e13ae5a commit be23fae
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 76 deletions.
4 changes: 3 additions & 1 deletion mongo_cxx_extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@
#include <algorithm>
#include "mongo_cxx_extension.h"

namespace mongo {
namespace mongo_cxx_extension {

using namespace mongo;

using std::ios;
using std::ofstream;
using std::ostream;
Expand Down
14 changes: 7 additions & 7 deletions mongo_cxx_extension.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
#include <client/dbclient.h>
#include <client/gridfs.h>

namespace mongo {
namespace mongo_cxx_extension {

const unsigned int DEFAULT_CHUNK_SIZE = 256*1024;

Expand All @@ -40,29 +40,29 @@ namespace mongo {
* @param chunkSize - size of chunks
* @param prefix - if you want your data somewhere besides <dbname>.fs
*/
GridFileBuilder(DBClientBase *client, const std::string &dbName,
GridFileBuilder(mongo::DBClientBase *client, const std::string &dbName,
unsigned int chunkSize = DEFAULT_CHUNK_SIZE,
const std::string& prefix = "fs");
~GridFileBuilder();
// chunks are splitted in as many as necessary chunkSize blocks; sizes not
// multiple of chunkSize will copy remaining data at pending_data pointer
void appendChunk(const char *data, size_t length);
// buildFile will destroy this builder, not allowing to insert more data
BSONObj buildFile(const std::string &name,
const std::string& contentType="");
mongo::BSONObj buildFile(const std::string &name,
const std::string& contentType="");

private:
DBClientBase *_client;
mongo::DBClientBase *_client;
std::string _dbName;
std::string _prefix;
std::string _chunkNS;
std::string _filesNS;
size_t _chunkSize;
unsigned int _current_chunk;
BSONObj _file_id;
mongo::BSONObj _file_id;
char *_pending_data; // NULL or pointer with _chunkSize space
size_t _pending_data_size;
gridfs_offset _file_length;
mongo::gridfs_offset _file_length;

const char *privateAppendChunk(const char *data, size_t length,
bool pending_insert = false);
Expand Down
147 changes: 79 additions & 68 deletions mongo_gridfilebuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,59 +15,67 @@ extern int gridfile_create(lua_State *L, GridFile gf);
extern DBClientBase* userdata_to_dbclient(lua_State *L, int stackpos);

namespace {
inline GridFileBuilder* userdata_to_gridfilebuilder(lua_State* L,
int index) {
void *ud = 0;
inline mongo_cxx_extension::GridFileBuilder* userdata_to_gridfilebuilder(lua_State* L,
int index) {
void *ud = 0;

ud = luaL_checkudata(L, index, LUAMONGO_GRIDFILEBUILDER);
GridFileBuilder *gridfilebuilder = *((GridFileBuilder **)ud);
ud = luaL_checkudata(L, index, LUAMONGO_GRIDFILEBUILDER);
mongo_cxx_extension::GridFileBuilder *gridfilebuilder;
gridfilebuilder = *((mongo_cxx_extension::GridFileBuilder **)ud);

return gridfilebuilder;
}
return gridfilebuilder;
}
} // anonymous namespace

/*
* builder, err = mongo.GridFileBuilder.New(connection, dbname[, chunksize[, prefix]])
*/
static int gridfilebuilder_new(lua_State *L) {
int n = lua_gettop(L);
int resultcount = 1;

try {
DBClientBase *connection = userdata_to_dbclient(L, 1);
const char *dbname = lua_tostring(L, 2);

GridFileBuilder **builder = (GridFileBuilder **)lua_newuserdata(L, sizeof(GridFileBuilder *));

if (n >= 4) {
unsigned int chunksize = static_cast<unsigned int>(luaL_checkint(L, 3));
const char *prefix = luaL_checkstring(L, 4);
int n = lua_gettop(L);
int resultcount = 1;

*builder = new GridFileBuilder(connection, dbname, chunksize, prefix);
} else if (n == 3) {
unsigned int chunksize = static_cast<unsigned int>(luaL_checkint(L, 3));
try {
DBClientBase *connection = userdata_to_dbclient(L, 1);
const char *dbname = lua_tostring(L, 2);

mongo_cxx_extension::GridFileBuilder **builder;
builder = (mongo_cxx_extension::GridFileBuilder **)
lua_newuserdata(L, sizeof(mongo_cxx_extension::GridFileBuilder *));

if (n >= 4) {
unsigned int chunksize = static_cast<unsigned int>(luaL_checkint(L, 3));
const char *prefix = luaL_checkstring(L, 4);

*builder = new mongo_cxx_extension::GridFileBuilder(connection,
dbname,
chunksize,
prefix);
} else if (n == 3) {
unsigned int chunksize = static_cast<unsigned int>(luaL_checkint(L, 3));

*builder = new GridFileBuilder(connection, dbname, chunksize);
} else {
*builder = new GridFileBuilder(connection, dbname);
}

luaL_getmetatable(L, LUAMONGO_GRIDFILEBUILDER);
lua_setmetatable(L, -2);
} catch (std::exception &e) {
lua_pushnil(L);
lua_pushfstring(L, LUAMONGO_ERR_CONNECTION_FAILED, e.what());
resultcount = 2;
*builder = new mongo_cxx_extension::GridFileBuilder(connection,
dbname, chunksize);
} else {
*builder = new mongo_cxx_extension::GridFileBuilder(connection, dbname);
}

return resultcount;
luaL_getmetatable(L, LUAMONGO_GRIDFILEBUILDER);
lua_setmetatable(L, -2);
} catch (std::exception &e) {
lua_pushnil(L);
lua_pushfstring(L, LUAMONGO_ERR_CONNECTION_FAILED, e.what());
resultcount = 2;
}

return resultcount;
}

/*
* ok, err = builder:append(data_string)
*/
static int gridfilebuilder_append(lua_State *L) {
GridFileBuilder *builder = userdata_to_gridfilebuilder(L, 1);
mongo_cxx_extension::GridFileBuilder *builder;
builder = userdata_to_gridfilebuilder(L, 1);
int resultcount = 1;
try {
size_t length = 0;
Expand All @@ -88,7 +96,8 @@ static int gridfilebuilder_append(lua_State *L) {
*/
static int gridfilebuilder_build(lua_State *L) {
int resultcount = 1;
GridFileBuilder *builder = userdata_to_gridfilebuilder(L, 1);
mongo_cxx_extension::GridFileBuilder *builder;
builder = userdata_to_gridfilebuilder(L, 1);
const char *remote = luaL_checkstring(L, 2);
const char *content_type = luaL_optstring(L, 3, "");
try {
Expand All @@ -107,51 +116,53 @@ static int gridfilebuilder_build(lua_State *L) {
* __gc
*/
static int gridfilebuilder_gc(lua_State *L) {
GridFileBuilder *builder = userdata_to_gridfilebuilder(L, 1);

delete builder;
mongo_cxx_extension::GridFileBuilder *builder;
builder = userdata_to_gridfilebuilder(L, 1);

delete builder;

return 0;
return 0;
}

/*
* __tostring
*/
static int gridfilebuilder_tostring(lua_State *L) {
GridFileBuilder *builder = userdata_to_gridfilebuilder(L, 1);
mongo_cxx_extension::GridFileBuilder *builder;
builder = userdata_to_gridfilebuilder(L, 1);

lua_pushfstring(L, "%s: %p", LUAMONGO_GRIDFILEBUILDER, builder);
lua_pushfstring(L, "%s: %p", LUAMONGO_GRIDFILEBUILDER, builder);

return 1;
return 1;
}

int mongo_gridfilebuilder_register(lua_State *L) {
static const luaL_Reg gridfilebuilder_methods[] = {
{"append", gridfilebuilder_append},
{"build", gridfilebuilder_build},
{NULL, NULL}
};

static const luaL_Reg gridfilebuilder_class_methods[] = {
{"New", gridfilebuilder_new},
{NULL, NULL}
};

luaL_newmetatable(L, LUAMONGO_GRIDFILEBUILDER);
//luaL_register(L, 0, gridfs_methods);
luaL_setfuncs(L, gridfilebuilder_methods, 0);
lua_pushvalue(L,-1);
lua_setfield(L, -2, "__index");

lua_pushcfunction(L, gridfilebuilder_gc);
lua_setfield(L, -2, "__gc");

lua_pushcfunction(L, gridfilebuilder_tostring);
lua_setfield(L, -2, "__tostring");
static const luaL_Reg gridfilebuilder_methods[] = {
{"append", gridfilebuilder_append},
{"build", gridfilebuilder_build},
{NULL, NULL}
};

static const luaL_Reg gridfilebuilder_class_methods[] = {
{"New", gridfilebuilder_new},
{NULL, NULL}
};

luaL_newmetatable(L, LUAMONGO_GRIDFILEBUILDER);
//luaL_register(L, 0, gridfs_methods);
luaL_setfuncs(L, gridfilebuilder_methods, 0);
lua_pushvalue(L,-1);
lua_setfield(L, -2, "__index");

lua_pushcfunction(L, gridfilebuilder_gc);
lua_setfield(L, -2, "__gc");

lua_pushcfunction(L, gridfilebuilder_tostring);
lua_setfield(L, -2, "__tostring");

lua_pop(L,1);
lua_pop(L,1);

luaL_newlib(L, gridfilebuilder_class_methods);
luaL_newlib(L, gridfilebuilder_class_methods);

return 1;
return 1;
}

0 comments on commit be23fae

Please sign in to comment.