1
0
Fork 0

dropping databases, unfinished

This commit is contained in:
Jan Steemann 2013-09-11 12:47:27 +02:00
parent 803bd32ebc
commit 5bc1e5ecea
15 changed files with 151 additions and 189 deletions

View File

@ -7529,7 +7529,7 @@ static v8::Handle<v8::Value> JS_UpdateVocbase (v8::Arguments const& argv) {
/// Returns the server version string. /// Returns the server version string.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_VersionVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_VersionServer (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
return scope.Close(v8::String::New(TRI_VERSION)); return scope.Close(v8::String::New(TRI_VERSION));
@ -7543,7 +7543,7 @@ static v8::Handle<v8::Value> JS_VersionVocbase (v8::Arguments const& argv) {
/// Returns the path. /// Returns the path.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_PathVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_PathDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
TRI_vocbase_t* vocbase = GetContextVocBase(); TRI_vocbase_t* vocbase = GetContextVocBase();
@ -7559,7 +7559,7 @@ static v8::Handle<v8::Value> JS_PathVocbase (v8::Arguments const& argv) {
/// Returns the name of the current database. /// Returns the name of the current database.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_NameVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_NameDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
TRI_vocbase_t* vocbase = GetContextVocBase(); TRI_vocbase_t* vocbase = GetContextVocBase();
@ -7576,7 +7576,7 @@ static v8::Handle<v8::Value> JS_NameVocbase (v8::Arguments const& argv) {
/// database. /// database.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_IsSystemVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_IsSystemDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
TRI_vocbase_t* vocbase = GetContextVocBase(); TRI_vocbase_t* vocbase = GetContextVocBase();
@ -7599,7 +7599,7 @@ static v8::Handle<v8::Value> JS_IsSystemVocbase (v8::Arguments const& argv) {
/// credentials. /// credentials.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_UseVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_UseDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
if (argv.Length() != 1) { if (argv.Length() != 1) {
@ -7628,7 +7628,7 @@ static v8::Handle<v8::Value> JS_UseVocbase (v8::Arguments const& argv) {
/// Returns the list of all databases. /// Returns the list of all databases.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_ListVocbases (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_ListDatabases (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
if (argv.Length() != 0) { if (argv.Length() != 0) {
@ -7667,7 +7667,7 @@ static v8::Handle<v8::Value> JS_ListVocbases (v8::Arguments const& argv) {
/// Returns the new database as an object. /// Returns the new database as an object.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_CreateUserVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_CreateDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
if (argv.Length() < 1) { if (argv.Length() < 1) {
@ -7772,7 +7772,7 @@ static v8::Handle<v8::Value> JS_CreateUserVocbase (v8::Arguments const& argv) {
/// default database. The default database itself cannot be dropped. /// default database. The default database itself cannot be dropped.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Value> JS_DropUserVocbase (v8::Arguments const& argv) { static v8::Handle<v8::Value> JS_DropDatabase (v8::Arguments const& argv) {
v8::HandleScope scope; v8::HandleScope scope;
if (argv.Length() != 1) { if (argv.Length() != 1) {
@ -7790,48 +7790,13 @@ static v8::Handle<v8::Value> JS_DropUserVocbase (v8::Arguments const& argv) {
} }
const string name = TRI_ObjectToString(argv[0]); const string name = TRI_ObjectToString(argv[0]);
TRI_v8_global_t* v8g = (TRI_v8_global_t*) v8::Isolate::GetCurrent()->GetData();
// exclusive lock start int res = TRI_DropDatabaseServer((TRI_server_t*) v8g->_server, name.c_str());
// ---------------------------------------------------------
// TODO FIXME
/*
VocbaseManager::manager.lockCreation();
int res = VocbaseManager::manager.deleteVocbase(name);
if (res == TRI_ERROR_NO_ERROR) {
TRI_vocbase_col_t* col = TRI_LookupCollectionByNameVocBase(vocbase, TRI_COL_NAME_DATABASES);
if (col == 0) {
VocbaseManager::manager.unlockCreation();
TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection");
}
CollectionNameResolver resolver(col->_vocbase);
SingleCollectionWriteTransaction<EmbeddableTransaction<V8TransactionContext>, 1> trx(col->_vocbase, resolver, col->_cid);
res = trx.begin();
if (res != TRI_ERROR_NO_ERROR) {
VocbaseManager::manager.unlockCreation();
TRI_V8_EXCEPTION(scope, res);
}
trx.deleteDocument(name.c_str(), TRI_DOC_UPDATE_LAST_WRITE, false, 0, 0);
res = trx.finish(res);
}
VocbaseManager::manager.unlockCreation();
// exclusive lock end
// ---------------------------------------------------------
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
TRI_V8_EXCEPTION(scope, res); TRI_V8_EXCEPTION(scope, res);
} }
*/
return scope.Close(v8::True()); return scope.Close(v8::True());
} }
@ -8567,14 +8532,26 @@ void TRI_InitV8VocBridge (v8::Handle<v8::Context> context,
TRI_AddMethodVocbase(rt, "_createEdgeCollection", JS_CreateEdgeCollectionVocbase); TRI_AddMethodVocbase(rt, "_createEdgeCollection", JS_CreateEdgeCollectionVocbase);
TRI_AddMethodVocbase(rt, "_document", JS_DocumentVocbase); TRI_AddMethodVocbase(rt, "_document", JS_DocumentVocbase);
TRI_AddMethodVocbase(rt, "_exists", JS_ExistsVocbase); TRI_AddMethodVocbase(rt, "_exists", JS_ExistsVocbase);
TRI_AddMethodVocbase(rt, "_isSystem", JS_IsSystemVocbase);
TRI_AddMethodVocbase(rt, "_name", JS_NameVocbase);
TRI_AddMethodVocbase(rt, "_path", JS_PathVocbase);
TRI_AddMethodVocbase(rt, "_remove", JS_RemoveVocbase); TRI_AddMethodVocbase(rt, "_remove", JS_RemoveVocbase);
TRI_AddMethodVocbase(rt, "_replace", JS_ReplaceVocbase); TRI_AddMethodVocbase(rt, "_replace", JS_ReplaceVocbase);
TRI_AddMethodVocbase(rt, "_update", JS_UpdateVocbase); TRI_AddMethodVocbase(rt, "_update", JS_UpdateVocbase);
TRI_AddMethodVocbase(rt, "_version", JS_VersionVocbase);
TRI_AddMethodVocbase(rt, "_version", JS_VersionServer);
TRI_AddMethodVocbase(rt, "_isSystem", JS_IsSystemDatabase);
TRI_AddMethodVocbase(rt, "_name", JS_NameDatabase);
TRI_AddMethodVocbase(rt, "_path", JS_PathDatabase);
TRI_AddMethodVocbase(rt, "_createDatabase", JS_CreateDatabase);
TRI_AddMethodVocbase(rt, "_dropDatabase", JS_DropDatabase);
TRI_AddMethodVocbase(rt, "_listDatabases", JS_ListDatabases);
TRI_AddMethodVocbase(rt, "_useDatabase", JS_UseDatabase);
/* TODO: FIXME
TRI_AddGlobalFunctionVocbase(context, "USE_DATABASE", JS_UseVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "LIST_DATABASES", JS_ListVocbases, true);
TRI_AddGlobalFunctionVocbase(context, "CREATE_DATABASE", JS_CreateUserVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "DROP_DATABASE", JS_DropUserVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "ADD_ENDPOINT", JS_AddEndpoint, true);
*/
v8g->VocbaseTempl = v8::Persistent<v8::ObjectTemplate>::New(isolate, rt); v8g->VocbaseTempl = v8::Persistent<v8::ObjectTemplate>::New(isolate, rt);
TRI_AddGlobalFunctionVocbase(context, "ArangoDatabase", ft->GetFunction()); TRI_AddGlobalFunctionVocbase(context, "ArangoDatabase", ft->GetFunction());
@ -8737,12 +8714,6 @@ void TRI_InitV8VocBridge (v8::Handle<v8::Context> context,
TRI_AddGlobalFunctionVocbase(context, "RELOAD_AUTH", JS_ReloadAuth, true); TRI_AddGlobalFunctionVocbase(context, "RELOAD_AUTH", JS_ReloadAuth, true);
TRI_AddGlobalFunctionVocbase(context, "TRANSACTION", JS_Transaction, true); TRI_AddGlobalFunctionVocbase(context, "TRANSACTION", JS_Transaction, true);
TRI_AddGlobalFunctionVocbase(context, "USE_DATABASE", JS_UseVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "LIST_DATABASES", JS_ListVocbases, true);
TRI_AddGlobalFunctionVocbase(context, "CREATE_DATABASE", JS_CreateUserVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "DROP_DATABASE", JS_DropUserVocbase, true);
TRI_AddGlobalFunctionVocbase(context, "ADD_ENDPOINT", JS_AddEndpoint, true);
// ............................................................................. // .............................................................................
// create global variables // create global variables
// ............................................................................. // .............................................................................

View File

@ -499,6 +499,8 @@ static int OpenDatabases (TRI_server_t* server) {
TRI_json_t* json; TRI_json_t* json;
TRI_json_t const* deletedJson; TRI_json_t const* deletedJson;
TRI_json_t const* nameJson; TRI_json_t const* nameJson;
TRI_json_t const* idJson;
TRI_voc_tick_t id;
TRI_vocbase_defaults_t defaults; TRI_vocbase_defaults_t defaults;
char const* name; char const* name;
char* databaseDirectory; char* databaseDirectory;
@ -598,6 +600,20 @@ static int OpenDatabases (TRI_server_t* server) {
continue; continue;
} }
} }
idJson = TRI_LookupArrayJson(json, "id");
if (! TRI_IsStringJson(idJson)) {
LOG_ERROR("database directory '%s' does not contain a valid parameters file",
databaseDirectory);
TRI_FreeString(TRI_CORE_MEM_ZONE, databaseDirectory);
TRI_FreeJson(TRI_CORE_MEM_ZONE, json);
// skip this database
continue;
}
id = (TRI_voc_tick_t) TRI_UInt64String(idJson->_value._string.data);
nameJson = TRI_LookupArrayJson(json, "name"); nameJson = TRI_LookupArrayJson(json, "name");
@ -635,7 +651,7 @@ static int OpenDatabases (TRI_server_t* server) {
// ............................................................................. // .............................................................................
// try to open this database // try to open this database
vocbase = TRI_OpenVocBase(databaseDirectory, databaseName, &defaults, server->_wasShutdownCleanly); vocbase = TRI_OpenVocBase(databaseDirectory, id, databaseName, &defaults, server->_wasShutdownCleanly);
TRI_FreeString(TRI_CORE_MEM_ZONE, databaseName); TRI_FreeString(TRI_CORE_MEM_ZONE, databaseName);
@ -934,20 +950,19 @@ static int SaveDatabaseParameters (TRI_voc_tick_t id,
/// @brief create a new database directory and return its name /// @brief create a new database directory and return its name
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static int CreateDatabaseDirectory (TRI_server_t* server, static int CreateDatabaseDirectory (TRI_server_t* server,
TRI_voc_tick_t tick,
char const* databaseName, char const* databaseName,
TRI_vocbase_defaults_t const* defaults, TRI_vocbase_defaults_t const* defaults,
char** name) { char** name) {
char* tickString; char* tickString;
char* dname; char* dname;
char* file; char* file;
TRI_voc_tick_t tick;
int res; int res;
assert(server != NULL); assert(server != NULL);
assert(databaseName != NULL); assert(databaseName != NULL);
tick = TRI_NewTickServer();
tickString = TRI_StringUInt64(tick); tickString = TRI_StringUInt64(tick);
if (tickString == NULL) { if (tickString == NULL) {
@ -1122,7 +1137,7 @@ static int InitDatabases (TRI_server_t* server) {
// no databases found, i.e. there is no system database! // no databases found, i.e. there is no system database!
// create a database for the system database // create a database for the system database
res = CreateDatabaseDirectory(server, TRI_VOC_SYSTEM_DATABASE, &server->_defaults, &name); res = CreateDatabaseDirectory(server, TRI_NewTickServer(), TRI_VOC_SYSTEM_DATABASE, &server->_defaults, &name);
if (res == TRI_ERROR_NO_ERROR) { if (res == TRI_ERROR_NO_ERROR) {
if (TRI_PushBackVectorString(&names, name) != TRI_ERROR_NO_ERROR) { if (TRI_PushBackVectorString(&names, name) != TRI_ERROR_NO_ERROR) {
@ -1505,6 +1520,7 @@ int TRI_CreateDatabaseServer (TRI_server_t* server,
TRI_vocbase_defaults_t const* defaults, TRI_vocbase_defaults_t const* defaults,
TRI_vocbase_t** database) { TRI_vocbase_t** database) {
TRI_vocbase_t* vocbase; TRI_vocbase_t* vocbase;
TRI_voc_tick_t tick;
char* file; char* file;
char* path; char* path;
int res; int res;
@ -1528,7 +1544,7 @@ int TRI_CreateDatabaseServer (TRI_server_t* server,
TRI_ReadUnlockReadWriteLock(&server->_lock); TRI_ReadUnlockReadWriteLock(&server->_lock);
TRI_UnlockMutex(&server->_createLock); TRI_UnlockMutex(&server->_createLock);
return TRI_ERROR_ARANGO_DATABASE_NAME_USED; return TRI_ERROR_ARANGO_DUPLICATE_NAME;
} }
} }
} }
@ -1536,9 +1552,9 @@ int TRI_CreateDatabaseServer (TRI_server_t* server,
// name not yet in use, release the read lock // name not yet in use, release the read lock
TRI_ReadUnlockReadWriteLock(&server->_lock); TRI_ReadUnlockReadWriteLock(&server->_lock);
// create the database directory // create the database directory
res = CreateDatabaseDirectory(server, name, defaults, &file); tick = TRI_NewTickServer();
res = CreateDatabaseDirectory(server, tick, name, defaults, &file);
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
TRI_UnlockMutex(&server->_createLock); TRI_UnlockMutex(&server->_createLock);
@ -1549,7 +1565,7 @@ int TRI_CreateDatabaseServer (TRI_server_t* server,
path = TRI_Concatenate2File(server->_databasePath, file); path = TRI_Concatenate2File(server->_databasePath, file);
TRI_FreeString(TRI_CORE_MEM_ZONE, file); TRI_FreeString(TRI_CORE_MEM_ZONE, file);
vocbase = TRI_OpenVocBase(path, name, defaults, false); vocbase = TRI_OpenVocBase(path, tick, name, defaults, false);
TRI_FreeString(TRI_CORE_MEM_ZONE, path); TRI_FreeString(TRI_CORE_MEM_ZONE, path);
if (vocbase == NULL) { if (vocbase == NULL) {
@ -1583,6 +1599,37 @@ int TRI_CreateDatabaseServer (TRI_server_t* server,
return TRI_ERROR_NO_ERROR; return TRI_ERROR_NO_ERROR;
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief drops an existing database
////////////////////////////////////////////////////////////////////////////////
int TRI_DropDatabaseServer (TRI_server_t* server,
char const* name) {
TRI_vocbase_t* vocbase;
int res;
if (TRI_EqualString(name, TRI_VOC_SYSTEM_DATABASE)) {
return TRI_ERROR_FORBIDDEN;
}
TRI_WriteLockReadWriteLock(&server->_lock);
vocbase = TRI_RemoveKeyAssociativePointer(&server->_databases, name);
if (vocbase == NULL) {
res = TRI_ERROR_ARANGO_DATABASE_NOT_FOUND;
}
else {
assert(! vocbase->_isSystem);
res = SaveDatabaseParameters(vocbase->_id, name, true, &server->_defaults, vocbase->_path);
// TODO FIXME: perform actual drop
}
TRI_WriteUnlockReadWriteLock(&server->_lock);
return res;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief get a database by its name /// @brief get a database by its name
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -167,6 +167,13 @@ int TRI_CreateDatabaseServer (TRI_server_t*,
TRI_vocbase_defaults_t const*, TRI_vocbase_defaults_t const*,
struct TRI_vocbase_s**); struct TRI_vocbase_s**);
////////////////////////////////////////////////////////////////////////////////
/// @brief drops an existing database
////////////////////////////////////////////////////////////////////////////////
int TRI_DropDatabaseServer (TRI_server_t*,
char const*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief get a database by its name /// @brief get a database by its name
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -1205,6 +1205,7 @@ void TRI_SetupReplicationVocBase (bool disableLogger,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_vocbase_t* TRI_OpenVocBase (char const* path, TRI_vocbase_t* TRI_OpenVocBase (char const* path,
TRI_voc_tick_t id,
char const* name, char const* name,
TRI_vocbase_defaults_t const* defaults, TRI_vocbase_defaults_t const* defaults,
bool iterateMarkers) { bool iterateMarkers) {
@ -1228,6 +1229,7 @@ TRI_vocbase_t* TRI_OpenVocBase (char const* path,
return NULL; return NULL;
} }
vocbase->_id = id;
vocbase->_path = TRI_DuplicateStringZ(TRI_CORE_MEM_ZONE, path); vocbase->_path = TRI_DuplicateStringZ(TRI_CORE_MEM_ZONE, path);
vocbase->_name = TRI_DuplicateStringZ(TRI_CORE_MEM_ZONE, name); vocbase->_name = TRI_DuplicateStringZ(TRI_CORE_MEM_ZONE, name);
vocbase->_isSystem = TRI_EqualString(name, TRI_VOC_SYSTEM_DATABASE); vocbase->_isSystem = TRI_EqualString(name, TRI_VOC_SYSTEM_DATABASE);

View File

@ -318,6 +318,7 @@ struct TRI_vocbase_defaults_s;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
typedef struct TRI_vocbase_s { typedef struct TRI_vocbase_s {
TRI_voc_tick_t _id;
char* _path; // path to the data directory char* _path; // path to the data directory
TRI_voc_size_t _defaultMaximalSize; TRI_voc_size_t _defaultMaximalSize;
@ -493,7 +494,8 @@ void TRI_SetupReplicationVocBase (bool,
/// @brief opens an existing database, loads all collections /// @brief opens an existing database, loads all collections
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
TRI_vocbase_t* TRI_OpenVocBase (char const*, TRI_vocbase_t* TRI_OpenVocBase (char const*,
TRI_voc_tick_t,
char const*, char const*,
struct TRI_vocbase_defaults_s const*, struct TRI_vocbase_defaults_s const*,
bool); bool);

View File

@ -88,11 +88,10 @@
"ERROR_ARANGO_DOCUMENT_KEY_MISSING" : { "code" : 1226, "message" : "missing document key" }, "ERROR_ARANGO_DOCUMENT_KEY_MISSING" : { "code" : 1226, "message" : "missing document key" },
"ERROR_ARANGO_DOCUMENT_TYPE_INVALID" : { "code" : 1227, "message" : "invalid document type" }, "ERROR_ARANGO_DOCUMENT_TYPE_INVALID" : { "code" : 1227, "message" : "invalid document type" },
"ERROR_ARANGO_DATABASE_NOT_FOUND" : { "code" : 1228, "message" : "database not found" }, "ERROR_ARANGO_DATABASE_NOT_FOUND" : { "code" : 1228, "message" : "database not found" },
"ERROR_ARANGO_DATABASE_NAME_USED" : { "code" : 1229, "message" : "database name already used" }, "ERROR_ARANGO_DATABASE_NAME_INVALID" : { "code" : 1229, "message" : "database name invalid" },
"ERROR_ARANGO_DATABASE_NAME_INVALID" : { "code" : 1230, "message" : "database name invalid" }, "ERROR_ARANGO_USE_SYSTEM_DATABASE" : { "code" : 1230, "message" : "operation only allowed in system database" },
"ERROR_ARANGO_USE_SYSTEM_DATABASE" : { "code" : 1231, "message" : "operation only allowed in system database" }, "ERROR_ARANGO_DATADIR_LOCKED" : { "code" : 1231, "message" : "database directory is locked" },
"ERROR_ARANGO_DATADIR_LOCKED" : { "code" : 1232, "message" : "database directory is locked" }, "ERROR_ARANGO_DATADIR_UNLOCKABLE" : { "code" : 1232, "message" : "cannot lock database directory" },
"ERROR_ARANGO_DATADIR_UNLOCKABLE" : { "code" : 1233, "message" : "cannot lock database directory" },
"ERROR_ARANGO_DATAFILE_FULL" : { "code" : 1300, "message" : "datafile full" }, "ERROR_ARANGO_DATAFILE_FULL" : { "code" : 1300, "message" : "datafile full" },
"ERROR_REPLICATION_NO_RESPONSE" : { "code" : 1400, "message" : "no response" }, "ERROR_REPLICATION_NO_RESPONSE" : { "code" : 1400, "message" : "no response" },
"ERROR_REPLICATION_INVALID_RESPONSE" : { "code" : 1401, "message" : "invalid response" }, "ERROR_REPLICATION_INVALID_RESPONSE" : { "code" : 1401, "message" : "invalid response" },

View File

@ -88,11 +88,10 @@
"ERROR_ARANGO_DOCUMENT_KEY_MISSING" : { "code" : 1226, "message" : "missing document key" }, "ERROR_ARANGO_DOCUMENT_KEY_MISSING" : { "code" : 1226, "message" : "missing document key" },
"ERROR_ARANGO_DOCUMENT_TYPE_INVALID" : { "code" : 1227, "message" : "invalid document type" }, "ERROR_ARANGO_DOCUMENT_TYPE_INVALID" : { "code" : 1227, "message" : "invalid document type" },
"ERROR_ARANGO_DATABASE_NOT_FOUND" : { "code" : 1228, "message" : "database not found" }, "ERROR_ARANGO_DATABASE_NOT_FOUND" : { "code" : 1228, "message" : "database not found" },
"ERROR_ARANGO_DATABASE_NAME_USED" : { "code" : 1229, "message" : "database name already used" }, "ERROR_ARANGO_DATABASE_NAME_INVALID" : { "code" : 1229, "message" : "database name invalid" },
"ERROR_ARANGO_DATABASE_NAME_INVALID" : { "code" : 1230, "message" : "database name invalid" }, "ERROR_ARANGO_USE_SYSTEM_DATABASE" : { "code" : 1230, "message" : "operation only allowed in system database" },
"ERROR_ARANGO_USE_SYSTEM_DATABASE" : { "code" : 1231, "message" : "operation only allowed in system database" }, "ERROR_ARANGO_DATADIR_LOCKED" : { "code" : 1231, "message" : "database directory is locked" },
"ERROR_ARANGO_DATADIR_LOCKED" : { "code" : 1232, "message" : "database directory is locked" }, "ERROR_ARANGO_DATADIR_UNLOCKABLE" : { "code" : 1232, "message" : "cannot lock database directory" },
"ERROR_ARANGO_DATADIR_UNLOCKABLE" : { "code" : 1233, "message" : "cannot lock database directory" },
"ERROR_ARANGO_DATAFILE_FULL" : { "code" : 1300, "message" : "datafile full" }, "ERROR_ARANGO_DATAFILE_FULL" : { "code" : 1300, "message" : "datafile full" },
"ERROR_REPLICATION_NO_RESPONSE" : { "code" : 1400, "message" : "no response" }, "ERROR_REPLICATION_NO_RESPONSE" : { "code" : 1400, "message" : "no response" },
"ERROR_REPLICATION_INVALID_RESPONSE" : { "code" : 1401, "message" : "invalid response" }, "ERROR_REPLICATION_INVALID_RESPONSE" : { "code" : 1401, "message" : "invalid response" },

View File

@ -1,6 +1,5 @@
/*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, vars: true, white: true, plusplus: true */ /*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, vars: true, white: true, plusplus: true */
/*global require, exports, TRANSACTION, CREATE_DATABASE, DROP_DATABASE, USE_DATABASE, /*global require, exports, TRANSACTION */
LIST_DATABASES */
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief ArangoDatabase /// @brief ArangoDatabase
@ -127,51 +126,6 @@ ArangoDatabase.prototype._query = function (query, bindVars, cursorOptions, opti
/// @} /// @}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// -----------------------------------------------------------------------------
// --SECTION-- database functions
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup ArangoShell
/// @{
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief create a new database
////////////////////////////////////////////////////////////////////////////////
ArangoDatabase.prototype._createDatabase = function (name, options) {
return CREATE_DATABASE(name, options);
};
////////////////////////////////////////////////////////////////////////////////
/// @brief delete an existing database
////////////////////////////////////////////////////////////////////////////////
ArangoDatabase.prototype._dropDatabase = function (name) {
return DROP_DATABASE(name);
};
////////////////////////////////////////////////////////////////////////////////
/// @brief lists all existing databases
////////////////////////////////////////////////////////////////////////////////
ArangoDatabase.prototype._listDatabases = function () {
return LIST_DATABASES();
};
////////////////////////////////////////////////////////////////////////////////
/// @brief use a different database
////////////////////////////////////////////////////////////////////////////////
ArangoDatabase.prototype._useDatabase = function (name) {
return USE_DATABASE(name);
};
////////////////////////////////////////////////////////////////////////////////
/// @}
////////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
// --SECTION-- transactions // --SECTION-- transactions
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------

View File

@ -106,11 +106,10 @@ ERROR_ARANGO_OUT_OF_KEYS,1225,"out of keys","Will be raised when a key generator
ERROR_ARANGO_DOCUMENT_KEY_MISSING,1226,"missing document key","Will be raised when a document key is missing." ERROR_ARANGO_DOCUMENT_KEY_MISSING,1226,"missing document key","Will be raised when a document key is missing."
ERROR_ARANGO_DOCUMENT_TYPE_INVALID,1227,"invalid document type","Will be raised when there is an attempt to create a document with an invalid type." ERROR_ARANGO_DOCUMENT_TYPE_INVALID,1227,"invalid document type","Will be raised when there is an attempt to create a document with an invalid type."
ERROR_ARANGO_DATABASE_NOT_FOUND,1228,"database not found","Will be raised when a non-existing database is accessed." ERROR_ARANGO_DATABASE_NOT_FOUND,1228,"database not found","Will be raised when a non-existing database is accessed."
ERROR_ARANGO_DATABASE_NAME_USED,1229,"database name already used","Will be raised when a duplicate database name is used." ERROR_ARANGO_DATABASE_NAME_INVALID,1229,"database name invalid","Will be raised when an invalid database name is used."
ERROR_ARANGO_DATABASE_NAME_INVALID,1230,"database name invalid","Will be raised when an invalid database name is used." ERROR_ARANGO_USE_SYSTEM_DATABASE,1230,"operation only allowed in system database","Will be raised when an operation is requested in a database other than the system database."
ERROR_ARANGO_USE_SYSTEM_DATABASE,1231,"operation only allowed in system database","Will be raised when an operation is requested in a database other than the system database." ERROR_ARANGO_DATADIR_LOCKED,1231,"database directory is locked","Will be raised when the server's database directory is locked (mainly because another ArangoDB instance is already running)."
ERROR_ARANGO_DATADIR_LOCKED,1232,"database directory is locked","Will be raised when the server's database directory is locked (mainly because another ArangoDB instance is already running)." ERROR_ARANGO_DATADIR_UNLOCKABLE,1232,"cannot lock database directory","Will be raised when the server cannot lock the database directory on startup."
ERROR_ARANGO_DATADIR_UNLOCKABLE,1233,"cannot lock database directory","Will be raised when the server cannot lock the database directory on startup."
################################################################################ ################################################################################
## ArangoDB storage errors ## ArangoDB storage errors

View File

@ -84,7 +84,6 @@ void TRI_InitialiseErrorMessages (void) {
REG_ERROR(ERROR_ARANGO_DOCUMENT_KEY_MISSING, "missing document key"); REG_ERROR(ERROR_ARANGO_DOCUMENT_KEY_MISSING, "missing document key");
REG_ERROR(ERROR_ARANGO_DOCUMENT_TYPE_INVALID, "invalid document type"); REG_ERROR(ERROR_ARANGO_DOCUMENT_TYPE_INVALID, "invalid document type");
REG_ERROR(ERROR_ARANGO_DATABASE_NOT_FOUND, "database not found"); REG_ERROR(ERROR_ARANGO_DATABASE_NOT_FOUND, "database not found");
REG_ERROR(ERROR_ARANGO_DATABASE_NAME_USED, "database name already used");
REG_ERROR(ERROR_ARANGO_DATABASE_NAME_INVALID, "database name invalid"); REG_ERROR(ERROR_ARANGO_DATABASE_NAME_INVALID, "database name invalid");
REG_ERROR(ERROR_ARANGO_USE_SYSTEM_DATABASE, "operation only allowed in system database"); REG_ERROR(ERROR_ARANGO_USE_SYSTEM_DATABASE, "operation only allowed in system database");
REG_ERROR(ERROR_ARANGO_DATADIR_LOCKED, "database directory is locked"); REG_ERROR(ERROR_ARANGO_DATADIR_LOCKED, "database directory is locked");

View File

@ -173,17 +173,15 @@ extern "C" {
/// invalid type. /// invalid type.
/// - 1228: @LIT{database not found} /// - 1228: @LIT{database not found}
/// Will be raised when a non-existing database is accessed. /// Will be raised when a non-existing database is accessed.
/// - 1229: @LIT{database name already used} /// - 1229: @LIT{database name invalid}
/// Will be raised when a duplicate database name is used.
/// - 1230: @LIT{database name invalid}
/// Will be raised when an invalid database name is used. /// Will be raised when an invalid database name is used.
/// - 1231: @LIT{operation only allowed in system database} /// - 1230: @LIT{operation only allowed in system database}
/// Will be raised when an operation is requested in a database other than /// Will be raised when an operation is requested in a database other than
/// the system database. /// the system database.
/// - 1232: @LIT{database directory is locked} /// - 1231: @LIT{database directory is locked}
/// Will be raised when the server's database directory is locked (mainly /// Will be raised when the server's database directory is locked (mainly
/// because another ArangoDB instance is already running). /// because another ArangoDB instance is already running).
/// - 1233: @LIT{cannot lock database directory} /// - 1232: @LIT{cannot lock database directory}
/// Will be raised when the server cannot lock the database directory on /// Will be raised when the server cannot lock the database directory on
/// startup. /// startup.
/// - 1300: @LIT{datafile full} /// - 1300: @LIT{datafile full}
@ -1230,27 +1228,17 @@ void TRI_InitialiseErrorMessages (void);
#define TRI_ERROR_ARANGO_DATABASE_NOT_FOUND (1228) #define TRI_ERROR_ARANGO_DATABASE_NOT_FOUND (1228)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief 1229: ERROR_ARANGO_DATABASE_NAME_USED /// @brief 1229: ERROR_ARANGO_DATABASE_NAME_INVALID
///
/// database name already used
///
/// Will be raised when a duplicate database name is used.
////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_ARANGO_DATABASE_NAME_USED (1229)
////////////////////////////////////////////////////////////////////////////////
/// @brief 1230: ERROR_ARANGO_DATABASE_NAME_INVALID
/// ///
/// database name invalid /// database name invalid
/// ///
/// Will be raised when an invalid database name is used. /// Will be raised when an invalid database name is used.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_ARANGO_DATABASE_NAME_INVALID (1230) #define TRI_ERROR_ARANGO_DATABASE_NAME_INVALID (1229)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief 1231: ERROR_ARANGO_USE_SYSTEM_DATABASE /// @brief 1230: ERROR_ARANGO_USE_SYSTEM_DATABASE
/// ///
/// operation only allowed in system database /// operation only allowed in system database
/// ///
@ -1258,10 +1246,10 @@ void TRI_InitialiseErrorMessages (void);
/// system database. /// system database.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_ARANGO_USE_SYSTEM_DATABASE (1231) #define TRI_ERROR_ARANGO_USE_SYSTEM_DATABASE (1230)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief 1232: ERROR_ARANGO_DATADIR_LOCKED /// @brief 1231: ERROR_ARANGO_DATADIR_LOCKED
/// ///
/// database directory is locked /// database directory is locked
/// ///
@ -1269,10 +1257,10 @@ void TRI_InitialiseErrorMessages (void);
/// because another ArangoDB instance is already running). /// because another ArangoDB instance is already running).
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_ARANGO_DATADIR_LOCKED (1232) #define TRI_ERROR_ARANGO_DATADIR_LOCKED (1231)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief 1233: ERROR_ARANGO_DATADIR_UNLOCKABLE /// @brief 1232: ERROR_ARANGO_DATADIR_UNLOCKABLE
/// ///
/// cannot lock database directory /// cannot lock database directory
/// ///
@ -1280,7 +1268,7 @@ void TRI_InitialiseErrorMessages (void);
/// startup. /// startup.
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#define TRI_ERROR_ARANGO_DATADIR_UNLOCKABLE (1233) #define TRI_ERROR_ARANGO_DATADIR_UNLOCKABLE (1232)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief 1300: ERROR_ARANGO_DATAFILE_FULL /// @brief 1300: ERROR_ARANGO_DATAFILE_FULL

View File

@ -81,15 +81,15 @@ ApplicationEndpointServer::ApplicationEndpointServer (ApplicationServer* applica
ApplicationScheduler* applicationScheduler, ApplicationScheduler* applicationScheduler,
ApplicationDispatcher* applicationDispatcher, ApplicationDispatcher* applicationDispatcher,
std::string const& authenticationRealm, std::string const& authenticationRealm,
HttpHandlerFactory::flush_fptr flushAuthentication, HttpHandlerFactory::context_fptr setContext,
HttpHandlerFactory::context_fptr setContext) void* setContextData)
: ApplicationFeature("EndpointServer"), : ApplicationFeature("EndpointServer"),
_applicationServer(applicationServer), _applicationServer(applicationServer),
_applicationScheduler(applicationScheduler), _applicationScheduler(applicationScheduler),
_applicationDispatcher(applicationDispatcher), _applicationDispatcher(applicationDispatcher),
_authenticationRealm(authenticationRealm), _authenticationRealm(authenticationRealm),
_setContext(setContext), _setContext(setContext),
_flushAuthentication(flushAuthentication), _setContextData(setContextData),
_handlerFactory(0), _handlerFactory(0),
_servers(), _servers(),
_endpointList(), _endpointList(),
@ -317,8 +317,8 @@ bool ApplicationEndpointServer::prepare () {
_endpointList.dump(); _endpointList.dump();
_handlerFactory = new HttpHandlerFactory(_authenticationRealm, _handlerFactory = new HttpHandlerFactory(_authenticationRealm,
_flushAuthentication, _setContext,
_setContext); _setContextData);
return true; return true;
} }

View File

@ -86,8 +86,8 @@ namespace triagens {
ApplicationScheduler*, ApplicationScheduler*,
ApplicationDispatcher*, ApplicationDispatcher*,
std::string const&, std::string const&,
HttpHandlerFactory::flush_fptr, HttpHandlerFactory::context_fptr,
HttpHandlerFactory::context_fptr); void*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief destructor /// @brief destructor
@ -252,10 +252,10 @@ namespace triagens {
HttpHandlerFactory::context_fptr _setContext; HttpHandlerFactory::context_fptr _setContext;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief authentication cache flush callback function /// @brief database passed to callback functions
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
HttpHandlerFactory::flush_fptr _flushAuthentication; void* _setContextData;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief the handler factory /// @brief the handler factory

View File

@ -56,11 +56,11 @@ using namespace std;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
HttpHandlerFactory::HttpHandlerFactory (std::string const& authenticationRealm, HttpHandlerFactory::HttpHandlerFactory (std::string const& authenticationRealm,
flush_fptr flushAuthentication, context_fptr setContext,
context_fptr setContext) void* setContextData)
: _authenticationRealm(authenticationRealm), : _authenticationRealm(authenticationRealm),
_setContext(setContext), _setContext(setContext),
_flushAuthentication(flushAuthentication), _setContextData(setContextData),
_notFound(0) { _notFound(0) {
} }
@ -71,7 +71,7 @@ HttpHandlerFactory::HttpHandlerFactory (std::string const& authenticationRealm,
HttpHandlerFactory::HttpHandlerFactory (HttpHandlerFactory const& that) HttpHandlerFactory::HttpHandlerFactory (HttpHandlerFactory const& that)
: _authenticationRealm(that._authenticationRealm), : _authenticationRealm(that._authenticationRealm),
_setContext(that._setContext), _setContext(that._setContext),
_flushAuthentication(that._flushAuthentication), _setContextData(that._setContextData),
_constructors(that._constructors), _constructors(that._constructors),
_datas(that._datas), _datas(that._datas),
_prefixes(that._prefixes), _prefixes(that._prefixes),
@ -86,7 +86,7 @@ HttpHandlerFactory& HttpHandlerFactory::operator= (HttpHandlerFactory const& tha
if (this != &that) { if (this != &that) {
_authenticationRealm = that._authenticationRealm, _authenticationRealm = that._authenticationRealm,
_setContext = that._setContext, _setContext = that._setContext,
_flushAuthentication = that._flushAuthentication, _setContextData = that._setContextData,
_constructors = that._constructors; _constructors = that._constructors;
_datas = that._datas; _datas = that._datas;
_prefixes = that._prefixes; _prefixes = that._prefixes;
@ -146,15 +146,15 @@ pair<size_t, size_t> HttpHandlerFactory::sizeRestrictions () const {
HttpResponse::HttpResponseCode HttpHandlerFactory::authenticateRequest (HttpRequest* request) { HttpResponse::HttpResponseCode HttpHandlerFactory::authenticateRequest (HttpRequest* request) {
RequestContext* rc = request->getRequestContext(); RequestContext* rc = request->getRequestContext();
if (! rc) { if (rc == 0) {
if (! setRequestContext(request)) { if (! setRequestContext(request)) {
return HttpResponse::NOT_FOUND; return HttpResponse::NOT_FOUND;
} }
rc = request->getRequestContext();
} }
if (! rc) { assert(rc != 0);
return HttpResponse::NOT_FOUND;
}
return rc->authenticate(); return rc->authenticate();
} }
@ -163,8 +163,8 @@ HttpResponse::HttpResponseCode HttpHandlerFactory::authenticateRequest (HttpRequ
/// @brief set request context, wrapper method /// @brief set request context, wrapper method
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool HttpHandlerFactory::setRequestContext (HttpRequest * request) { bool HttpHandlerFactory::setRequestContext (HttpRequest* request) {
return _setContext(request); return _setContext(request, _setContextData);
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@ -102,15 +102,9 @@ namespace triagens {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief context handler /// @brief context handler
////////////////////////////////////////////////////////////////////////////////
typedef bool (*context_fptr) (HttpRequest*);
////////////////////////////////////////////////////////////////////////////////
/// @brief authentication cache invalidation handler
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
typedef bool (*flush_fptr) (); typedef bool (*context_fptr) (HttpRequest*, void*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @} /// @}
@ -132,8 +126,8 @@ namespace triagens {
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
HttpHandlerFactory (std::string const&, HttpHandlerFactory (std::string const&,
flush_fptr, context_fptr,
context_fptr); void*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief clones a handler factory /// @brief clones a handler factory
@ -184,26 +178,27 @@ namespace triagens {
/// @brief authenticates a new request, wrapper method /// @brief authenticates a new request, wrapper method
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
virtual HttpResponse::HttpResponseCode authenticateRequest (HttpRequest * request); virtual HttpResponse::HttpResponseCode authenticateRequest (HttpRequest*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief set request context, wrapper method /// @brief set request context, wrapper method
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
virtual bool setRequestContext (HttpRequest * request); virtual bool setRequestContext (HttpRequest*);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief returns the authentication realm /// @brief returns the authentication realm
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
virtual std::string const& authenticationRealm (HttpRequest * request) const; virtual std::string const& authenticationRealm (HttpRequest*) const;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new request /// @brief creates a new request
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
virtual HttpRequest* createRequest (ConnectionInfo const& info, virtual HttpRequest* createRequest (ConnectionInfo const&,
char const* ptr, size_t length); char const*,
size_t);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief creates a new handler /// @brief creates a new handler
@ -265,10 +260,10 @@ namespace triagens {
context_fptr _setContext; context_fptr _setContext;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief authentication cache flush callback /// @brief set context data
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
flush_fptr _flushAuthentication; void* _setContextData;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief authentication lock for cache /// @brief authentication lock for cache