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_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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue