mirror of https://gitee.com/bigwinds/arangodb
removed some code
This commit is contained in:
parent
c0e185c859
commit
3b192782c5
|
@ -51,53 +51,15 @@ using triagens::basics::JsonHelper;
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo::CollectionInfo ()
|
||||
: _id(),
|
||||
_name(),
|
||||
_type(TRI_COL_TYPE_UNKNOWN),
|
||||
_status(TRI_VOC_COL_STATUS_CORRUPTED),
|
||||
_maximalSize(0),
|
||||
_deleted(false),
|
||||
_doCompact(false),
|
||||
_isSystem(false),
|
||||
_isVolatile(false),
|
||||
_waitForSync(false),
|
||||
_keyOptions(0),
|
||||
_shardKeys(),
|
||||
_shardIds() {
|
||||
: _json(0) {
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief creates a collection info object from json
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo::CollectionInfo (std::string const& data) {
|
||||
TRI_json_t* json = JsonHelper::fromString(data);
|
||||
|
||||
if (json != 0) {
|
||||
if (JsonHelper::isArray(json)) {
|
||||
if (! createFromJson(json)) {
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json);
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief creates a collection info object from json
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo::CollectionInfo (TRI_json_t* json) {
|
||||
if (json != 0) {
|
||||
if (JsonHelper::isArray(json)) {
|
||||
if (! createFromJson(json)) {
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, json);
|
||||
}
|
||||
CollectionInfo::CollectionInfo (TRI_json_t* json)
|
||||
: _json(json) {
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -105,22 +67,10 @@ CollectionInfo::CollectionInfo (TRI_json_t* json) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo::CollectionInfo (CollectionInfo const& other) :
|
||||
_id(other._id),
|
||||
_name(other._name),
|
||||
_type(other._type),
|
||||
_status(other._status),
|
||||
_maximalSize(other._maximalSize),
|
||||
_deleted(other._deleted),
|
||||
_doCompact(other._doCompact),
|
||||
_isSystem(other._isSystem),
|
||||
_isVolatile(other._isVolatile),
|
||||
_waitForSync(other._waitForSync),
|
||||
_keyOptions(0),
|
||||
_shardKeys(other._shardKeys),
|
||||
_shardIds(other._shardIds) {
|
||||
_json(other._json) {
|
||||
|
||||
if (other._keyOptions != 0) {
|
||||
_keyOptions = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, other._keyOptions);
|
||||
if (other._json != 0) {
|
||||
_json = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, other._json);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -129,22 +79,11 @@ CollectionInfo::CollectionInfo (CollectionInfo const& other) :
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo& CollectionInfo::operator= (CollectionInfo const& other) {
|
||||
_id = other._id;
|
||||
_name = other._name;
|
||||
_type = other._type;
|
||||
_status = other._status;
|
||||
_maximalSize = other._maximalSize;
|
||||
_deleted = other._deleted;
|
||||
_doCompact = other._doCompact;
|
||||
_isSystem = other._isSystem;
|
||||
_isVolatile = other._isVolatile;
|
||||
_waitForSync = other._waitForSync;
|
||||
_shardKeys = other._shardKeys;
|
||||
_shardIds = other._shardIds;
|
||||
_keyOptions = 0;
|
||||
|
||||
if (other._keyOptions != 0) {
|
||||
_keyOptions = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, other._keyOptions);
|
||||
if (other._json != 0 && this != &other) {
|
||||
_json = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, other._json);
|
||||
}
|
||||
else {
|
||||
_json = 0;
|
||||
}
|
||||
|
||||
return *this;
|
||||
|
@ -155,8 +94,8 @@ CollectionInfo& CollectionInfo::operator= (CollectionInfo const& other) {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
CollectionInfo::~CollectionInfo () {
|
||||
if (_keyOptions != 0) {
|
||||
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, _keyOptions);
|
||||
if (_json != 0) {
|
||||
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, _json);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -164,159 +103,6 @@ CollectionInfo::~CollectionInfo () {
|
|||
// --SECTION-- private methods
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief invalidates a collection info object
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void CollectionInfo::invalidate () {
|
||||
_id = 0;
|
||||
_name = "";
|
||||
_type = TRI_COL_TYPE_UNKNOWN;
|
||||
_status = TRI_VOC_COL_STATUS_CORRUPTED;
|
||||
_maximalSize = 0;
|
||||
_deleted = false;
|
||||
_doCompact = false;
|
||||
_isSystem = false;
|
||||
_isVolatile = false;
|
||||
_waitForSync = false;
|
||||
_shardKeys.clear();
|
||||
_shardIds.clear();
|
||||
|
||||
if (_keyOptions != 0) {
|
||||
TRI_FreeJson(TRI_UNKNOWN_MEM_ZONE, _keyOptions);
|
||||
}
|
||||
_keyOptions = 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief populate object properties from the JSON given
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool CollectionInfo::createFromJson (TRI_json_t const* json) {
|
||||
// id
|
||||
const std::string id = JsonHelper::getStringValue(json, "id", "");
|
||||
if (id.empty()) {
|
||||
return false;
|
||||
}
|
||||
_id = triagens::basics::StringUtils::uint64(id.c_str(), id.size());
|
||||
|
||||
|
||||
// name
|
||||
_name = JsonHelper::getStringValue(json, "name", "");
|
||||
if (_name.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// type
|
||||
_type = (TRI_col_type_e) JsonHelper::getNumericValue<int>(json,
|
||||
"type",
|
||||
(int) TRI_COL_TYPE_UNKNOWN);
|
||||
if (_type == TRI_COL_TYPE_UNKNOWN) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// status
|
||||
_status = (TRI_vocbase_col_status_e) JsonHelper::getNumericValue<int>(json,
|
||||
"status",
|
||||
(int) TRI_VOC_COL_STATUS_NEW_BORN);
|
||||
if (_status == TRI_VOC_COL_STATUS_CORRUPTED ||
|
||||
_status == TRI_VOC_COL_STATUS_NEW_BORN) {
|
||||
return false;
|
||||
}
|
||||
|
||||
_maximalSize = JsonHelper::getNumericValue<TRI_voc_size_t>(json, "maximalSize", 0);
|
||||
_doCompact = JsonHelper::getBooleanValue(json, "doCompact", false);
|
||||
_isSystem = JsonHelper::getBooleanValue(json, "isSystem", false);
|
||||
_isVolatile = JsonHelper::getBooleanValue(json, "isVolatile", false);
|
||||
_waitForSync = JsonHelper::getBooleanValue(json, "waitForSync", false);
|
||||
|
||||
TRI_json_t const* keyOptions = JsonHelper::getArrayElement(json, "keyOptions");
|
||||
if (JsonHelper::isArray(keyOptions)) {
|
||||
_keyOptions = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, keyOptions);
|
||||
}
|
||||
else {
|
||||
_keyOptions = 0;
|
||||
}
|
||||
|
||||
// TODO: indexes
|
||||
|
||||
// shardKeys
|
||||
TRI_json_t const* value = TRI_LookupArrayJson(json, "shardKeys");
|
||||
if (! JsonHelper::isList(value)) {
|
||||
return false;
|
||||
}
|
||||
_shardKeys = JsonHelper::stringList(value);
|
||||
|
||||
// shards
|
||||
value = TRI_LookupArrayJson(json, "shards");
|
||||
if (! JsonHelper::isArray(value)) {
|
||||
return false;
|
||||
}
|
||||
_shardIds = JsonHelper::stringObject(value);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create a JSON string from the object
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* CollectionInfo::toJson (TRI_memory_zone_t* zone) {
|
||||
TRI_json_t* json = TRI_CreateArrayJson(zone);
|
||||
|
||||
if (json == 0) {
|
||||
return json;
|
||||
}
|
||||
|
||||
char* data = TRI_StringUInt64(_id);
|
||||
|
||||
if (data == 0) {
|
||||
TRI_FreeJson(zone, json);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TRI_Insert3ArrayJson(zone, json, "id", TRI_CreateStringJson(zone, data));
|
||||
TRI_Insert3ArrayJson(zone, json, "name", TRI_CreateStringCopyJson(zone, _name.c_str()));
|
||||
TRI_Insert3ArrayJson(zone, json, "type", TRI_CreateNumberJson(zone, (int) _type));
|
||||
TRI_Insert3ArrayJson(zone, json, "status", TRI_CreateNumberJson(zone, (int) _status));
|
||||
|
||||
TRI_Insert3ArrayJson(zone, json, "maximalSize", TRI_CreateNumberJson(zone, (int) _maximalSize));
|
||||
TRI_Insert3ArrayJson(zone, json, "doCompact", TRI_CreateBooleanJson(zone, _doCompact));
|
||||
TRI_Insert3ArrayJson(zone, json, "isSystem", TRI_CreateBooleanJson(zone, _isSystem));
|
||||
TRI_Insert3ArrayJson(zone, json, "isVolatile", TRI_CreateBooleanJson(zone, _isVolatile));
|
||||
TRI_Insert3ArrayJson(zone, json, "waitForSync", TRI_CreateBooleanJson(zone, _waitForSync));
|
||||
|
||||
if (_keyOptions != 0) {
|
||||
TRI_Insert3ArrayJson(zone, json, "keyOptions", TRI_CopyJson(zone, _keyOptions));
|
||||
}
|
||||
|
||||
// TODO: indexes
|
||||
|
||||
TRI_json_t* values = JsonHelper::stringList(zone, _shardKeys);
|
||||
|
||||
if (values == 0) {
|
||||
TRI_FreeJson(zone, json);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TRI_Insert3ArrayJson(zone, json, "shardKeys", values);
|
||||
|
||||
values = JsonHelper::stringObject(zone, _shardIds);
|
||||
|
||||
if (values == 0) {
|
||||
TRI_FreeJson(zone, json);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TRI_Insert3ArrayJson(zone, json, "shards", values);
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- ClusterInfo class
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
ClusterInfo* ClusterInfo::_theinstance = 0;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -763,23 +549,19 @@ CollectionInfo ClusterInfo::getCollection (DatabaseID const& databaseID,
|
|||
TRI_col_info_t ClusterInfo::getCollectionProperties (CollectionInfo const& collection) {
|
||||
TRI_col_info_t info;
|
||||
|
||||
info._type = collection._type;
|
||||
info._cid = collection._id;
|
||||
info._type = collection.type();
|
||||
info._cid = collection.id();
|
||||
info._revision = 0; // TODO
|
||||
info._maximalSize = collection._maximalSize;
|
||||
memcpy(info._name, collection._name.c_str(), collection._name.size());
|
||||
info._deleted = collection._deleted;
|
||||
info._doCompact = collection._doCompact;
|
||||
info._isSystem = collection._isSystem;
|
||||
info._isVolatile = collection._isVolatile;
|
||||
info._waitForSync = collection._waitForSync;
|
||||
info._maximalSize = collection.maximalSize();
|
||||
|
||||
if (collection._keyOptions != 0) {
|
||||
info._keyOptions = TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, collection._keyOptions);
|
||||
}
|
||||
else {
|
||||
info._keyOptions = 0;
|
||||
}
|
||||
const std::string name = collection.name();
|
||||
memcpy(info._name, name.c_str(), name.size());
|
||||
info._deleted = collection.deleted();
|
||||
info._doCompact = collection.doCompact();
|
||||
info._isSystem = collection.isSystem();
|
||||
info._isVolatile = collection.isVolatile();
|
||||
info._waitForSync = collection.waitForSync();
|
||||
info._keyOptions = collection.keyOptions();
|
||||
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#define TRIAGENS_CLUSTER_CLUSTER_INFO_H 1
|
||||
|
||||
#include "Basics/Common.h"
|
||||
#include "Basics/JsonHelper.h"
|
||||
#include "Cluster/AgencyComm.h"
|
||||
#include "VocBase/collection.h"
|
||||
#include "VocBase/voc-types.h"
|
||||
|
@ -69,8 +70,6 @@ namespace triagens {
|
|||
|
||||
CollectionInfo ();
|
||||
|
||||
CollectionInfo (std::string const&);
|
||||
|
||||
CollectionInfo (struct TRI_json_s*);
|
||||
|
||||
CollectionInfo (CollectionInfo const&);
|
||||
|
@ -89,8 +88,8 @@ namespace triagens {
|
|||
/// @brief returns the collection id
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_voc_cid_t cid () const {
|
||||
return _id;
|
||||
TRI_voc_cid_t id () const {
|
||||
return triagens::basics::JsonHelper::stringUInt64(_json, "id");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -98,7 +97,7 @@ namespace triagens {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::string name () const {
|
||||
return _name;
|
||||
return triagens::basics::JsonHelper::getStringValue(_json, "name", "");
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -106,7 +105,7 @@ namespace triagens {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_col_type_e type () const {
|
||||
return _type;
|
||||
return triagens::basics::JsonHelper::getNumericValue<TRI_col_type_e>(_json, "type", TRI_COL_TYPE_UNKNOWN);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -114,39 +113,87 @@ namespace triagens {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_vocbase_col_status_e status () const {
|
||||
return _status;
|
||||
return triagens::basics::JsonHelper::getNumericValue<TRI_vocbase_col_status_e>(_json, "status", TRI_VOC_COL_STATUS_CORRUPTED);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the collection status
|
||||
/// @brief returns the collection status as a string
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::string statusString () const {
|
||||
return TRI_GetStatusStringCollectionVocBase(_status);
|
||||
return TRI_GetStatusStringCollectionVocBase(status());
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the properties
|
||||
/// @brief returns the deleted flag
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_col_info_t properties () const;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief TODO: returns the indexes
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
/*
|
||||
std::vector<std::string> indexes () const {
|
||||
return _indexes;
|
||||
bool deleted () const {
|
||||
return triagens::basics::JsonHelper::getBooleanValue(_json, "deleted", false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the docompact flag
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool doCompact () const {
|
||||
return triagens::basics::JsonHelper::getBooleanValue(_json, "doCompact", false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the issystem flag
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool isSystem () const {
|
||||
return triagens::basics::JsonHelper::getBooleanValue(_json, "isSystem", false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the isvolatile flag
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool isVolatile () const {
|
||||
return triagens::basics::JsonHelper::getBooleanValue(_json, "isVolatile", false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns a copy of the key options
|
||||
/// the caller is responsible for freeing it
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_json_t* keyOptions () const {
|
||||
TRI_json_t const* keyOptions = triagens::basics::JsonHelper::getArrayElement(_json, "keyOptions");
|
||||
|
||||
if (keyOptions != 0) {
|
||||
return TRI_CopyJson(TRI_UNKNOWN_MEM_ZONE, keyOptions);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the waitforsync flag
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool waitForSync () const {
|
||||
return triagens::basics::JsonHelper::getBooleanValue(_json, "waitForSync", false);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the maximal journal size
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
TRI_voc_size_t maximalSize () const {
|
||||
return triagens::basics::JsonHelper::getNumericValue<TRI_voc_size_t>(_json, "maximalSize", 0);
|
||||
}
|
||||
*/
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief returns the shard keys
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::vector<std::string> shardKeys () const {
|
||||
return _shardKeys;
|
||||
TRI_json_t* const node = triagens::basics::JsonHelper::getArrayElement(_json, "shardKeys");
|
||||
return triagens::basics::JsonHelper::stringList(node);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -154,54 +201,21 @@ namespace triagens {
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::map<std::string, std::string> shardIds () const {
|
||||
return _shardIds;
|
||||
TRI_json_t* const node = triagens::basics::JsonHelper::getArrayElement(_json, "shards");
|
||||
return triagens::basics::JsonHelper::stringObject(node);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private methods
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
private:
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief invalidates a collection info object
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void invalidate ();
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief populate object properties from the JSON given
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
bool createFromJson (struct TRI_json_s const*);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief create a JSON string from the object
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct TRI_json_s* toJson (struct TRI_memory_zone_s*);
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private variables
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
TRI_voc_cid_t _id;
|
||||
std::string _name;
|
||||
TRI_col_type_e _type;
|
||||
TRI_vocbase_col_status_e _status;
|
||||
|
||||
TRI_voc_size_t _maximalSize;
|
||||
bool _deleted;
|
||||
bool _doCompact;
|
||||
bool _isSystem;
|
||||
bool _isVolatile;
|
||||
bool _waitForSync;
|
||||
|
||||
TRI_json_t* _keyOptions;
|
||||
|
||||
// TODO: indexes
|
||||
std::vector<std::string> _shardKeys;
|
||||
std::map<std::string, std::string> _shardIds;
|
||||
|
||||
private:
|
||||
|
||||
TRI_json_t* _json;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -738,7 +738,7 @@ static v8::Handle<v8::Value> JS_GetCollectionInfoClusterInfo (v8::Arguments cons
|
|||
TRI_ObjectToString(argv[1]));
|
||||
|
||||
v8::Handle<v8::Object> result = v8::Object::New();
|
||||
const std::string cid = triagens::basics::StringUtils::itoa(ci.cid());
|
||||
const std::string cid = triagens::basics::StringUtils::itoa(ci.id());
|
||||
const std::string& name = ci.name();
|
||||
result->Set(v8::String::New("id"), v8::String::New(cid.c_str(), cid.size()));
|
||||
result->Set(v8::String::New("name"), v8::String::New(name.c_str(), name.size()));
|
||||
|
|
|
@ -251,7 +251,7 @@ static TRI_vocbase_col_t* CollectionInfoToVocBaseCol (TRI_vocbase_t* vocbase,
|
|||
c->_isLocal = false;
|
||||
c->_vocbase = vocbase;
|
||||
c->_type = ci.type();
|
||||
c->_cid = ci.cid();
|
||||
c->_cid = ci.id();
|
||||
c->_status = ci.status();
|
||||
c->_collection = 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue