1
0
Fork 0

use std::vector

This commit is contained in:
Jan Steemann 2015-08-10 16:43:59 +02:00
parent b659d9fa07
commit 82940cda10
3 changed files with 40 additions and 58 deletions

View File

@ -3120,34 +3120,30 @@ static void JS_ListDatabases (const v8::FunctionCallbackInfo<v8::Value>& args) {
TRI_GET_GLOBALS(); TRI_GET_GLOBALS();
TRI_vector_string_t names; std::vector<std::string> names;
TRI_InitVectorString(&names, TRI_UNKNOWN_MEM_ZONE);
int res; int res;
if (argc == 0) { if (argc == 0) {
// return all databases // return all databases
res = TRI_GetDatabaseNamesServer(static_cast<TRI_server_t*>(v8g->_server), &names); res = TRI_GetDatabaseNamesServer(static_cast<TRI_server_t*>(v8g->_server), names);
} }
else { else {
// return all databases for a specific user // return all databases for a specific user
std::string&& username = TRI_ObjectToString(args[0]); std::string&& username = TRI_ObjectToString(args[0]);
res = TRI_GetUserDatabasesServer((TRI_server_t*) v8g->_server, username.c_str(), &names); res = TRI_GetUserDatabasesServer((TRI_server_t*) v8g->_server, username.c_str(), names);
} }
if (res != TRI_ERROR_NO_ERROR) { if (res != TRI_ERROR_NO_ERROR) {
TRI_DestroyVectorString(&names);
TRI_V8_THROW_EXCEPTION(res); TRI_V8_THROW_EXCEPTION(res);
} }
v8::Handle<v8::Array> result = v8::Array::New(isolate); v8::Handle<v8::Array> result = v8::Array::New(isolate);
for (size_t i = 0; i < names._length; ++i) { for (size_t i = 0; i < names.size(); ++i) {
result->Set((uint32_t) i, TRI_V8_STRING((char const*) TRI_AtVectorString(&names, i))); result->Set((uint32_t) i, TRI_V8_STD_STRING(names[i]));
} }
TRI_DestroyVectorString(&names);
TRI_V8_RETURN(result); TRI_V8_RETURN(result);
} }

View File

@ -299,25 +299,6 @@ static bool CanUseDatabase (TRI_vocbase_t* vocbase,
return TRI_ExistsAuthenticationAuthInfo(vocbase, username); return TRI_ExistsAuthenticationAuthInfo(vocbase, username);
} }
////////////////////////////////////////////////////////////////////////////////
/// @brief comparator for database names
////////////////////////////////////////////////////////////////////////////////
static int DatabaseNameComparator (const void* lhs, const void* rhs) {
const char* l = *((char**) lhs);
const char* r = *((char**) rhs);
return strcmp(l, r);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief sort a list of database names
////////////////////////////////////////////////////////////////////////////////
static void SortDatabaseNames (TRI_vector_string_t* names) {
qsort(names->_buffer, names->_length, sizeof(char*), &DatabaseNameComparator);
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief extract the numeric part from a filename /// @brief extract the numeric part from a filename
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -830,6 +811,7 @@ static int CloseDroppedDatabases (TRI_server_t* server) {
// Now it is safe to destroy the old dropped databases and the old lists struct: // Now it is safe to destroy the old dropped databases and the old lists struct:
for (TRI_vocbase_t* vocbase : oldList->_droppedDatabases) { for (TRI_vocbase_t* vocbase : oldList->_droppedDatabases) {
TRI_ASSERT(vocbase != nullptr); TRI_ASSERT(vocbase != nullptr);
if (vocbase->_type == TRI_VOCBASE_TYPE_NORMAL) { if (vocbase->_type == TRI_VOCBASE_TYPE_NORMAL) {
TRI_DestroyVocBase(vocbase); TRI_DestroyVocBase(vocbase);
delete vocbase; delete vocbase;
@ -2291,6 +2273,7 @@ std::vector<TRI_voc_tick_t> TRI_GetIdsCoordinatorDatabaseServer (TRI_server_t* s
for (auto& p : theLists->_coordinatorDatabases) { for (auto& p : theLists->_coordinatorDatabases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
TRI_ASSERT(vocbase != nullptr); TRI_ASSERT(vocbase != nullptr);
if (! TRI_EqualString(vocbase->_name, TRI_VOC_SYSTEM_DATABASE)) { if (! TRI_EqualString(vocbase->_name, TRI_VOC_SYSTEM_DATABASE)) {
v.push_back(vocbase->_id); v.push_back(vocbase->_id);
} }
@ -2314,6 +2297,7 @@ int TRI_DropByIdCoordinatorDatabaseServer (TRI_server_t* server,
TRI_vocbase_t* vocbase = nullptr; TRI_vocbase_t* vocbase = nullptr;
try { try {
newLists = new DatabasesLists(*oldLists); newLists = new DatabasesLists(*oldLists);
for (auto it = newLists->_coordinatorDatabases.begin(); for (auto it = newLists->_coordinatorDatabases.begin();
it != newLists->_coordinatorDatabases.end(); it++) { it != newLists->_coordinatorDatabases.end(); it++) {
vocbase = it->second; vocbase = it->second;
@ -2438,6 +2422,7 @@ int TRI_DropByIdDatabaseServer (TRI_server_t* server,
{ {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
@ -2460,6 +2445,7 @@ TRI_vocbase_t* TRI_UseByIdCoordinatorDatabaseServer (TRI_server_t* server,
TRI_voc_tick_t id) { TRI_voc_tick_t id) {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_coordinatorDatabases) { for (auto& p : theLists->_coordinatorDatabases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
@ -2485,10 +2471,12 @@ TRI_vocbase_t* TRI_UseCoordinatorDatabaseServer (TRI_server_t* server,
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
auto it = theLists->_coordinatorDatabases.find(std::string(name)); auto it = theLists->_coordinatorDatabases.find(std::string(name));
TRI_vocbase_t* vocbase = nullptr; TRI_vocbase_t* vocbase = nullptr;
if (it != theLists->_coordinatorDatabases.end()) { if (it != theLists->_coordinatorDatabases.end()) {
vocbase = it->second; vocbase = it->second;
TRI_UseVocBase(vocbase); TRI_UseVocBase(vocbase);
} }
return vocbase; return vocbase;
} }
@ -2503,10 +2491,12 @@ TRI_vocbase_t* TRI_UseDatabaseServer (TRI_server_t* server,
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
auto it = theLists->_databases.find(std::string(name)); auto it = theLists->_databases.find(std::string(name));
TRI_vocbase_t* vocbase = nullptr; TRI_vocbase_t* vocbase = nullptr;
if (it != theLists->_databases.end()) { if (it != theLists->_databases.end()) {
vocbase = it->second; vocbase = it->second;
TRI_UseVocBase(vocbase); TRI_UseVocBase(vocbase);
} }
return vocbase; return vocbase;
} }
@ -2518,8 +2508,10 @@ TRI_vocbase_t* TRI_LookupDatabaseByIdServer (TRI_server_t* server,
TRI_voc_tick_t id) { TRI_voc_tick_t id) {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
if (vocbase->_id == id) { if (vocbase->_id == id) {
return vocbase; return vocbase;
} }
@ -2536,8 +2528,10 @@ TRI_vocbase_t* TRI_LookupDatabaseByNameServer (TRI_server_t* server,
char const* name) { char const* name) {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
if (TRI_EqualString(vocbase->_name, name)) { if (TRI_EqualString(vocbase->_name, name)) {
return vocbase; return vocbase;
} }
@ -2555,8 +2549,10 @@ TRI_vocbase_t* TRI_UseDatabaseByIdServer (TRI_server_t* server,
TRI_voc_tick_t id) { TRI_voc_tick_t id) {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
if (vocbase->_id == id) { if (vocbase->_id == id) {
TRI_UseVocBase(vocbase); TRI_UseVocBase(vocbase);
return vocbase; return vocbase;
@ -2583,13 +2579,14 @@ void TRI_ReleaseDatabaseServer (TRI_server_t* server,
int TRI_GetUserDatabasesServer (TRI_server_t* server, int TRI_GetUserDatabasesServer (TRI_server_t* server,
char const* username, char const* username,
TRI_vector_string_t* names) { std::vector<std::string>& names) {
int res = TRI_ERROR_NO_ERROR; int res = TRI_ERROR_NO_ERROR;
{ {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
TRI_ASSERT(vocbase != nullptr); TRI_ASSERT(vocbase != nullptr);
@ -2600,23 +2597,18 @@ int TRI_GetUserDatabasesServer (TRI_server_t* server,
continue; continue;
} }
char* copy = TRI_DuplicateStringZ(names->_memoryZone, vocbase->_name); try {
names.emplace_back(vocbase->_name);
if (copy == nullptr) {
res = TRI_ERROR_OUT_OF_MEMORY;
break;
} }
catch (...) {
if (TRI_PushBackVectorString(names, copy) != TRI_ERROR_NO_ERROR) { return TRI_ERROR_OUT_OF_MEMORY;
// insertion failed.
TRI_Free(names->_memoryZone, copy);
res = TRI_ERROR_OUT_OF_MEMORY;
break;
} }
} }
} }
SortDatabaseNames(names); std::sort(names.begin(), names.end(), [](std::string const& l, std::string const& r) -> bool {
return l < r;
});
return res; return res;
} }
@ -2626,37 +2618,31 @@ int TRI_GetUserDatabasesServer (TRI_server_t* server,
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_GetDatabaseNamesServer (TRI_server_t* server, int TRI_GetDatabaseNamesServer (TRI_server_t* server,
TRI_vector_string_t* names) { std::vector<std::string>& names) {
int res = TRI_ERROR_NO_ERROR; int res = TRI_ERROR_NO_ERROR;
{ {
auto unuser(server->_databasesProtector.use()); auto unuser(server->_databasesProtector.use());
auto theLists = server->_databasesLists.load(); auto theLists = server->_databasesLists.load();
for (auto& p : theLists->_databases) { for (auto& p : theLists->_databases) {
TRI_vocbase_t* vocbase = p.second; TRI_vocbase_t* vocbase = p.second;
TRI_ASSERT(vocbase != nullptr); TRI_ASSERT(vocbase != nullptr);
char* copy;
TRI_ASSERT(vocbase->_name != nullptr); TRI_ASSERT(vocbase->_name != nullptr);
copy = TRI_DuplicateStringZ(names->_memoryZone, vocbase->_name); try {
names.emplace_back(vocbase->_name);
if (copy == nullptr) {
res = TRI_ERROR_OUT_OF_MEMORY;
break;
} }
catch (...) {
if (TRI_PushBackVectorString(names, copy) != TRI_ERROR_NO_ERROR) { return TRI_ERROR_OUT_OF_MEMORY;
// insertion failed.
TRI_Free(names->_memoryZone, copy);
res = TRI_ERROR_OUT_OF_MEMORY;
break;
} }
} }
} }
SortDatabaseNames(names); std::sort(names.begin(), names.end(), [](std::string const& l, std::string const& r) -> bool {
return l < r;
});
return res; return res;
} }

View File

@ -276,14 +276,14 @@ void TRI_ReleaseDatabaseServer (TRI_server_t*,
int TRI_GetUserDatabasesServer (TRI_server_t*, int TRI_GetUserDatabasesServer (TRI_server_t*,
char const*, char const*,
TRI_vector_string_t*); std::vector<std::string>&);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief return the list of all database names /// @brief return the list of all database names
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int TRI_GetDatabaseNamesServer (TRI_server_t*, int TRI_GetDatabaseNamesServer (TRI_server_t*,
TRI_vector_string_t*); std::vector<std::string>&);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief copies the defaults into the target /// @brief copies the defaults into the target