mirror of https://gitee.com/bigwinds/arangodb
use std::vector
This commit is contained in:
parent
b659d9fa07
commit
82940cda10
|
@ -3120,34 +3120,30 @@ static void JS_ListDatabases (const v8::FunctionCallbackInfo<v8::Value>& args) {
|
|||
|
||||
TRI_GET_GLOBALS();
|
||||
|
||||
TRI_vector_string_t names;
|
||||
TRI_InitVectorString(&names, TRI_UNKNOWN_MEM_ZONE);
|
||||
std::vector<std::string> names;
|
||||
|
||||
int res;
|
||||
|
||||
if (argc == 0) {
|
||||
// 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 {
|
||||
// return all databases for a specific user
|
||||
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) {
|
||||
TRI_DestroyVectorString(&names);
|
||||
TRI_V8_THROW_EXCEPTION(res);
|
||||
}
|
||||
|
||||
v8::Handle<v8::Array> result = v8::Array::New(isolate);
|
||||
for (size_t i = 0; i < names._length; ++i) {
|
||||
result->Set((uint32_t) i, TRI_V8_STRING((char const*) TRI_AtVectorString(&names, i)));
|
||||
for (size_t i = 0; i < names.size(); ++i) {
|
||||
result->Set((uint32_t) i, TRI_V8_STD_STRING(names[i]));
|
||||
}
|
||||
|
||||
TRI_DestroyVectorString(&names);
|
||||
|
||||
TRI_V8_RETURN(result);
|
||||
}
|
||||
|
||||
|
|
|
@ -299,25 +299,6 @@ static bool CanUseDatabase (TRI_vocbase_t* vocbase,
|
|||
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
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -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:
|
||||
for (TRI_vocbase_t* vocbase : oldList->_droppedDatabases) {
|
||||
TRI_ASSERT(vocbase != nullptr);
|
||||
|
||||
if (vocbase->_type == TRI_VOCBASE_TYPE_NORMAL) {
|
||||
TRI_DestroyVocBase(vocbase);
|
||||
delete vocbase;
|
||||
|
@ -2291,6 +2273,7 @@ std::vector<TRI_voc_tick_t> TRI_GetIdsCoordinatorDatabaseServer (TRI_server_t* s
|
|||
for (auto& p : theLists->_coordinatorDatabases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
TRI_ASSERT(vocbase != nullptr);
|
||||
|
||||
if (! TRI_EqualString(vocbase->_name, TRI_VOC_SYSTEM_DATABASE)) {
|
||||
v.push_back(vocbase->_id);
|
||||
}
|
||||
|
@ -2314,6 +2297,7 @@ int TRI_DropByIdCoordinatorDatabaseServer (TRI_server_t* server,
|
|||
TRI_vocbase_t* vocbase = nullptr;
|
||||
try {
|
||||
newLists = new DatabasesLists(*oldLists);
|
||||
|
||||
for (auto it = newLists->_coordinatorDatabases.begin();
|
||||
it != newLists->_coordinatorDatabases.end(); it++) {
|
||||
vocbase = it->second;
|
||||
|
@ -2438,6 +2422,7 @@ int TRI_DropByIdDatabaseServer (TRI_server_t* server,
|
|||
{
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
|
||||
|
@ -2460,6 +2445,7 @@ TRI_vocbase_t* TRI_UseByIdCoordinatorDatabaseServer (TRI_server_t* server,
|
|||
TRI_voc_tick_t id) {
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_coordinatorDatabases) {
|
||||
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 it = theLists->_coordinatorDatabases.find(std::string(name));
|
||||
TRI_vocbase_t* vocbase = nullptr;
|
||||
|
||||
if (it != theLists->_coordinatorDatabases.end()) {
|
||||
vocbase = it->second;
|
||||
TRI_UseVocBase(vocbase);
|
||||
}
|
||||
|
||||
return vocbase;
|
||||
}
|
||||
|
||||
|
@ -2503,10 +2491,12 @@ TRI_vocbase_t* TRI_UseDatabaseServer (TRI_server_t* server,
|
|||
auto theLists = server->_databasesLists.load();
|
||||
auto it = theLists->_databases.find(std::string(name));
|
||||
TRI_vocbase_t* vocbase = nullptr;
|
||||
|
||||
if (it != theLists->_databases.end()) {
|
||||
vocbase = it->second;
|
||||
TRI_UseVocBase(vocbase);
|
||||
}
|
||||
|
||||
return vocbase;
|
||||
}
|
||||
|
||||
|
@ -2518,8 +2508,10 @@ TRI_vocbase_t* TRI_LookupDatabaseByIdServer (TRI_server_t* server,
|
|||
TRI_voc_tick_t id) {
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
|
||||
if (vocbase->_id == id) {
|
||||
return vocbase;
|
||||
}
|
||||
|
@ -2536,8 +2528,10 @@ TRI_vocbase_t* TRI_LookupDatabaseByNameServer (TRI_server_t* server,
|
|||
char const* name) {
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
|
||||
if (TRI_EqualString(vocbase->_name, name)) {
|
||||
return vocbase;
|
||||
}
|
||||
|
@ -2555,8 +2549,10 @@ TRI_vocbase_t* TRI_UseDatabaseByIdServer (TRI_server_t* server,
|
|||
TRI_voc_tick_t id) {
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
|
||||
if (vocbase->_id == id) {
|
||||
TRI_UseVocBase(vocbase);
|
||||
return vocbase;
|
||||
|
@ -2583,13 +2579,14 @@ void TRI_ReleaseDatabaseServer (TRI_server_t* server,
|
|||
|
||||
int TRI_GetUserDatabasesServer (TRI_server_t* server,
|
||||
char const* username,
|
||||
TRI_vector_string_t* names) {
|
||||
std::vector<std::string>& names) {
|
||||
|
||||
int res = TRI_ERROR_NO_ERROR;
|
||||
|
||||
{
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
TRI_ASSERT(vocbase != nullptr);
|
||||
|
@ -2600,23 +2597,18 @@ int TRI_GetUserDatabasesServer (TRI_server_t* server,
|
|||
continue;
|
||||
}
|
||||
|
||||
char* copy = TRI_DuplicateStringZ(names->_memoryZone, vocbase->_name);
|
||||
|
||||
if (copy == nullptr) {
|
||||
res = TRI_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
try {
|
||||
names.emplace_back(vocbase->_name);
|
||||
}
|
||||
|
||||
if (TRI_PushBackVectorString(names, copy) != TRI_ERROR_NO_ERROR) {
|
||||
// insertion failed.
|
||||
TRI_Free(names->_memoryZone, copy);
|
||||
res = TRI_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
catch (...) {
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SortDatabaseNames(names);
|
||||
std::sort(names.begin(), names.end(), [](std::string const& l, std::string const& r) -> bool {
|
||||
return l < r;
|
||||
});
|
||||
|
||||
return res;
|
||||
}
|
||||
|
@ -2626,37 +2618,31 @@ int TRI_GetUserDatabasesServer (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;
|
||||
|
||||
{
|
||||
auto unuser(server->_databasesProtector.use());
|
||||
auto theLists = server->_databasesLists.load();
|
||||
|
||||
for (auto& p : theLists->_databases) {
|
||||
TRI_vocbase_t* vocbase = p.second;
|
||||
TRI_ASSERT(vocbase != nullptr);
|
||||
char* copy;
|
||||
|
||||
TRI_ASSERT(vocbase->_name != nullptr);
|
||||
|
||||
copy = TRI_DuplicateStringZ(names->_memoryZone, vocbase->_name);
|
||||
|
||||
if (copy == nullptr) {
|
||||
res = TRI_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
try {
|
||||
names.emplace_back(vocbase->_name);
|
||||
}
|
||||
|
||||
if (TRI_PushBackVectorString(names, copy) != TRI_ERROR_NO_ERROR) {
|
||||
// insertion failed.
|
||||
TRI_Free(names->_memoryZone, copy);
|
||||
res = TRI_ERROR_OUT_OF_MEMORY;
|
||||
break;
|
||||
catch (...) {
|
||||
return TRI_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SortDatabaseNames(names);
|
||||
std::sort(names.begin(), names.end(), [](std::string const& l, std::string const& r) -> bool {
|
||||
return l < r;
|
||||
});
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -276,14 +276,14 @@ void TRI_ReleaseDatabaseServer (TRI_server_t*,
|
|||
|
||||
int TRI_GetUserDatabasesServer (TRI_server_t*,
|
||||
char const*,
|
||||
TRI_vector_string_t*);
|
||||
std::vector<std::string>&);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief return the list of all database names
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
int TRI_GetDatabaseNamesServer (TRI_server_t*,
|
||||
TRI_vector_string_t*);
|
||||
std::vector<std::string>&);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief copies the defaults into the target
|
||||
|
|
Loading…
Reference in New Issue