mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-31 03:45:10 -04:00
removed aliasing in storeMessages/storeGroups, removed several memory leaks in unittests, improved auto-delete structures in rsgxsutil, added deletion for members of RsGenExchange, removed shared pointers from unittests (they cause a memory leak and are only used in unittests)
This commit is contained in:
parent
ef24459c5e
commit
461ccf3b84
21 changed files with 281 additions and 275 deletions
|
@ -702,20 +702,20 @@ RsNxsMsg* RsDataService::locked_getMessage(RetroCursor &c)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg)
|
||||
int RsDataService::storeMessage(const std::list<RsNxsMsg*>& msg)
|
||||
{
|
||||
|
||||
RsStackMutex stack(mDbMutex);
|
||||
|
||||
std::map<RsNxsMsg*, RsGxsMsgMetaData* >::iterator mit = msg.begin();
|
||||
|
||||
// start a transaction
|
||||
mDb->beginTransaction();
|
||||
|
||||
for(; mit != msg.end(); ++mit)
|
||||
for(std::list<RsNxsMsg*>::const_iterator mit = msg.begin(); mit != msg.end(); ++mit)
|
||||
{
|
||||
RsNxsMsg* msgPtr = mit->first;
|
||||
RsGxsMsgMetaData* msgMetaPtr = mit->second;
|
||||
RsNxsMsg* msgPtr = *mit;
|
||||
RsGxsMsgMetaData* msgMetaPtr = msgPtr->metaData;
|
||||
|
||||
assert(msgMetaPtr != NULL);
|
||||
|
||||
#ifdef RS_DATA_SERVICE_DEBUG
|
||||
std::cerr << "RsDataService::storeMessage() ";
|
||||
|
@ -790,16 +790,6 @@ int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg)
|
|||
// finish transaction
|
||||
bool ret = mDb->commitTransaction();
|
||||
|
||||
for(mit = msg.begin(); mit != msg.end(); ++mit)
|
||||
{
|
||||
//TODO: API encourages aliasing, remove this abomination
|
||||
if(mit->second != mit->first->metaData)
|
||||
delete mit->second;
|
||||
|
||||
delete mit->first;
|
||||
;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -811,104 +801,94 @@ bool RsDataService::validSize(RsNxsMsg* msg) const
|
|||
}
|
||||
|
||||
|
||||
int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
||||
int RsDataService::storeGroup(const std::list<RsNxsGrp*>& grp)
|
||||
{
|
||||
|
||||
RsStackMutex stack(mDbMutex);
|
||||
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData* >::iterator sit = grp.begin();
|
||||
|
||||
// begin transaction
|
||||
mDb->beginTransaction();
|
||||
|
||||
for(; sit != grp.end(); ++sit)
|
||||
{
|
||||
for(std::list<RsNxsGrp*>::const_iterator sit = grp.begin();sit != grp.end(); ++sit)
|
||||
{
|
||||
RsNxsGrp* grpPtr = *sit;
|
||||
RsGxsGrpMetaData* grpMetaPtr = grpPtr->metaData;
|
||||
|
||||
RsNxsGrp* grpPtr = sit->first;
|
||||
RsGxsGrpMetaData* grpMetaPtr = sit->second;
|
||||
assert(grpMetaPtr != NULL);
|
||||
|
||||
// if data is larger than max item size do not add
|
||||
if(!validSize(grpPtr)) continue;
|
||||
// if data is larger than max item size do not add
|
||||
if(!validSize(grpPtr)) continue;
|
||||
|
||||
#ifdef RS_DATA_SERVICE_DEBUG
|
||||
std::cerr << "RsDataService::storeGroup() GrpId: " << grpPtr->grpId.toStdString();
|
||||
std::cerr << " CircleType: " << (uint32_t) grpMetaPtr->mCircleType;
|
||||
std::cerr << " CircleId: " << grpMetaPtr->mCircleId.toStdString();
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "RsDataService::storeGroup() GrpId: " << grpPtr->grpId.toStdString();
|
||||
std::cerr << " CircleType: " << (uint32_t) grpMetaPtr->mCircleType;
|
||||
std::cerr << " CircleId: " << grpMetaPtr->mCircleId.toStdString();
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
/*!
|
||||
* STORE data, data len,
|
||||
* grpId, flags, publish time stamp, identity,
|
||||
* id signature, admin signatue, key set, last posting ts
|
||||
* and meta data
|
||||
**/
|
||||
ContentValue cv;
|
||||
/*!
|
||||
* STORE data, data len,
|
||||
* grpId, flags, publish time stamp, identity,
|
||||
* id signature, admin signatue, key set, last posting ts
|
||||
* and meta data
|
||||
**/
|
||||
ContentValue cv;
|
||||
|
||||
uint32_t dataLen = grpPtr->grp.TlvSize();
|
||||
char grpData[dataLen];
|
||||
uint32_t offset = 0;
|
||||
grpPtr->grp.SetTlv(grpData, dataLen, &offset);
|
||||
cv.put(KEY_NXS_DATA, dataLen, grpData);
|
||||
uint32_t dataLen = grpPtr->grp.TlvSize();
|
||||
char grpData[dataLen];
|
||||
uint32_t offset = 0;
|
||||
grpPtr->grp.SetTlv(grpData, dataLen, &offset);
|
||||
cv.put(KEY_NXS_DATA, dataLen, grpData);
|
||||
|
||||
cv.put(KEY_NXS_DATA_LEN, (int32_t) dataLen);
|
||||
cv.put(KEY_GRP_ID, grpPtr->grpId.toStdString());
|
||||
cv.put(KEY_GRP_NAME, grpMetaPtr->mGroupName);
|
||||
cv.put(KEY_ORIG_GRP_ID, grpMetaPtr->mOrigGrpId.toStdString());
|
||||
cv.put(KEY_NXS_SERV_STRING, grpMetaPtr->mServiceString);
|
||||
cv.put(KEY_NXS_FLAGS, (int32_t)grpMetaPtr->mGroupFlags);
|
||||
cv.put(KEY_TIME_STAMP, (int32_t)grpMetaPtr->mPublishTs);
|
||||
cv.put(KEY_GRP_SIGN_FLAGS, (int32_t)grpMetaPtr->mSignFlags);
|
||||
cv.put(KEY_GRP_CIRCLE_ID, grpMetaPtr->mCircleId.toStdString());
|
||||
cv.put(KEY_GRP_CIRCLE_TYPE, (int32_t)grpMetaPtr->mCircleType);
|
||||
cv.put(KEY_GRP_INTERNAL_CIRCLE, grpMetaPtr->mInternalCircle.toStdString());
|
||||
cv.put(KEY_GRP_ORIGINATOR, grpMetaPtr->mOriginator.toStdString());
|
||||
cv.put(KEY_GRP_AUTHEN_FLAGS, (int32_t)grpMetaPtr->mAuthenFlags);
|
||||
cv.put(KEY_PARENT_GRP_ID, grpMetaPtr->mParentGrpId.toStdString());
|
||||
cv.put(KEY_NXS_HASH, grpMetaPtr->mHash.toStdString());
|
||||
cv.put(KEY_RECV_TS, (int32_t)grpMetaPtr->mRecvTS);
|
||||
cv.put(KEY_GRP_REP_CUTOFF, (int32_t)grpMetaPtr->mReputationCutOff);
|
||||
cv.put(KEY_NXS_IDENTITY, grpMetaPtr->mAuthorId.toStdString());
|
||||
cv.put(KEY_NXS_DATA_LEN, (int32_t) dataLen);
|
||||
cv.put(KEY_GRP_ID, grpPtr->grpId.toStdString());
|
||||
cv.put(KEY_GRP_NAME, grpMetaPtr->mGroupName);
|
||||
cv.put(KEY_ORIG_GRP_ID, grpMetaPtr->mOrigGrpId.toStdString());
|
||||
cv.put(KEY_NXS_SERV_STRING, grpMetaPtr->mServiceString);
|
||||
cv.put(KEY_NXS_FLAGS, (int32_t)grpMetaPtr->mGroupFlags);
|
||||
cv.put(KEY_TIME_STAMP, (int32_t)grpMetaPtr->mPublishTs);
|
||||
cv.put(KEY_GRP_SIGN_FLAGS, (int32_t)grpMetaPtr->mSignFlags);
|
||||
cv.put(KEY_GRP_CIRCLE_ID, grpMetaPtr->mCircleId.toStdString());
|
||||
cv.put(KEY_GRP_CIRCLE_TYPE, (int32_t)grpMetaPtr->mCircleType);
|
||||
cv.put(KEY_GRP_INTERNAL_CIRCLE, grpMetaPtr->mInternalCircle.toStdString());
|
||||
cv.put(KEY_GRP_ORIGINATOR, grpMetaPtr->mOriginator.toStdString());
|
||||
cv.put(KEY_GRP_AUTHEN_FLAGS, (int32_t)grpMetaPtr->mAuthenFlags);
|
||||
cv.put(KEY_PARENT_GRP_ID, grpMetaPtr->mParentGrpId.toStdString());
|
||||
cv.put(KEY_NXS_HASH, grpMetaPtr->mHash.toStdString());
|
||||
cv.put(KEY_RECV_TS, (int32_t)grpMetaPtr->mRecvTS);
|
||||
cv.put(KEY_GRP_REP_CUTOFF, (int32_t)grpMetaPtr->mReputationCutOff);
|
||||
cv.put(KEY_NXS_IDENTITY, grpMetaPtr->mAuthorId.toStdString());
|
||||
|
||||
offset = 0;
|
||||
char keySetData[grpMetaPtr->keys.TlvSize()];
|
||||
grpMetaPtr->keys.SetTlv(keySetData, grpMetaPtr->keys.TlvSize(), &offset);
|
||||
cv.put(KEY_KEY_SET, grpMetaPtr->keys.TlvSize(), keySetData);
|
||||
offset = 0;
|
||||
char keySetData[grpMetaPtr->keys.TlvSize()];
|
||||
grpMetaPtr->keys.SetTlv(keySetData, grpMetaPtr->keys.TlvSize(), &offset);
|
||||
cv.put(KEY_KEY_SET, grpMetaPtr->keys.TlvSize(), keySetData);
|
||||
|
||||
offset = 0;
|
||||
char metaData[grpPtr->meta.TlvSize()];
|
||||
grpPtr->meta.SetTlv(metaData, grpPtr->meta.TlvSize(), &offset);
|
||||
cv.put(KEY_NXS_META, grpPtr->meta.TlvSize(), metaData);
|
||||
offset = 0;
|
||||
char metaData[grpPtr->meta.TlvSize()];
|
||||
grpPtr->meta.SetTlv(metaData, grpPtr->meta.TlvSize(), &offset);
|
||||
cv.put(KEY_NXS_META, grpPtr->meta.TlvSize(), metaData);
|
||||
|
||||
// local meta data
|
||||
cv.put(KEY_GRP_SUBCR_FLAG, (int32_t)grpMetaPtr->mSubscribeFlags);
|
||||
cv.put(KEY_GRP_POP, (int32_t)grpMetaPtr->mPop);
|
||||
cv.put(KEY_MSG_COUNT, (int32_t)grpMetaPtr->mVisibleMsgCount);
|
||||
cv.put(KEY_GRP_STATUS, (int32_t)grpMetaPtr->mGroupStatus);
|
||||
cv.put(KEY_GRP_LAST_POST, (int32_t)grpMetaPtr->mLastPost);
|
||||
// local meta data
|
||||
cv.put(KEY_GRP_SUBCR_FLAG, (int32_t)grpMetaPtr->mSubscribeFlags);
|
||||
cv.put(KEY_GRP_POP, (int32_t)grpMetaPtr->mPop);
|
||||
cv.put(KEY_MSG_COUNT, (int32_t)grpMetaPtr->mVisibleMsgCount);
|
||||
cv.put(KEY_GRP_STATUS, (int32_t)grpMetaPtr->mGroupStatus);
|
||||
cv.put(KEY_GRP_LAST_POST, (int32_t)grpMetaPtr->mLastPost);
|
||||
|
||||
locked_clearGrpMetaCache(grpMetaPtr->mGroupId);
|
||||
locked_clearGrpMetaCache(grpMetaPtr->mGroupId);
|
||||
|
||||
if (!mDb->sqlInsert(GRP_TABLE_NAME, "", cv))
|
||||
{
|
||||
std::cerr << "RsDataService::storeGroup() sqlInsert Failed";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "\t For GroupId: " << grpMetaPtr->mGroupId.toStdString();
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
}
|
||||
if (!mDb->sqlInsert(GRP_TABLE_NAME, "", cv))
|
||||
{
|
||||
std::cerr << "RsDataService::storeGroup() sqlInsert Failed";
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "\t For GroupId: " << grpMetaPtr->mGroupId.toStdString();
|
||||
std::cerr << std::endl;
|
||||
}
|
||||
}
|
||||
// finish transaction
|
||||
bool ret = mDb->commitTransaction();
|
||||
|
||||
for(sit = grp.begin(); sit != grp.end(); ++sit)
|
||||
{
|
||||
//TODO: API encourages aliasing, remove this abomination
|
||||
if(sit->second != sit->first->metaData)
|
||||
delete sit->second;
|
||||
delete sit->first;
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -918,21 +898,21 @@ void RsDataService::locked_clearGrpMetaCache(const RsGxsGroupId& gid)
|
|||
mGrpMetaDataCache_ContainsAllDatabase = false;
|
||||
}
|
||||
|
||||
int RsDataService::updateGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
||||
int RsDataService::updateGroup(const std::list<RsNxsGrp *> &grp)
|
||||
{
|
||||
|
||||
RsStackMutex stack(mDbMutex);
|
||||
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData* >::iterator sit = grp.begin();
|
||||
|
||||
// begin transaction
|
||||
mDb->beginTransaction();
|
||||
|
||||
for(; sit != grp.end(); ++sit)
|
||||
for( std::list<RsNxsGrp*>::const_iterator sit = grp.begin(); sit != grp.end(); ++sit)
|
||||
{
|
||||
|
||||
RsNxsGrp* grpPtr = sit->first;
|
||||
RsGxsGrpMetaData* grpMetaPtr = sit->second;
|
||||
RsNxsGrp* grpPtr = *sit;
|
||||
RsGxsGrpMetaData* grpMetaPtr = grpPtr->metaData;
|
||||
|
||||
assert(grpMetaPtr != NULL);
|
||||
|
||||
// if data is larger than max item size do not add
|
||||
if(!validSize(grpPtr)) continue;
|
||||
|
@ -991,15 +971,6 @@ int RsDataService::updateGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
|||
// finish transaction
|
||||
bool ret = mDb->commitTransaction();
|
||||
|
||||
for(sit = grp.begin(); sit != grp.end(); ++sit)
|
||||
{
|
||||
//TODO: API encourages aliasing, remove this abomination
|
||||
if(sit->second != sit->first->metaData)
|
||||
delete sit->second;
|
||||
delete sit->first;
|
||||
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -127,21 +127,21 @@ public:
|
|||
* @param msg map of message and decoded meta data information
|
||||
* @return error code
|
||||
*/
|
||||
int storeMessage(std::map<RsNxsMsg*, RsGxsMsgMetaData*>& msg);
|
||||
int storeMessage(const std::list<RsNxsMsg*>& msg);
|
||||
|
||||
/*!
|
||||
* Stores a list of groups in data store
|
||||
* @param grp map of group and decoded meta data
|
||||
* @return error code
|
||||
*/
|
||||
int storeGroup(std::map<RsNxsGrp*, RsGxsGrpMetaData*>& grp);
|
||||
int storeGroup(const std::list<RsNxsGrp*>& grp);
|
||||
|
||||
/*!
|
||||
* Updates group entries in Db
|
||||
* @param grp map of group and decoded meta data
|
||||
* @return error code
|
||||
*/
|
||||
int updateGroup(std::map<RsNxsGrp*, RsGxsGrpMetaData*>& grsp);
|
||||
int updateGroup(const std::list<RsNxsGrp*>& grsp);
|
||||
|
||||
/*!
|
||||
* @param metaData The meta data item to update
|
||||
|
|
|
@ -223,14 +223,14 @@ public:
|
|||
* @param msg map of message and decoded meta data information
|
||||
* @return error code
|
||||
*/
|
||||
virtual int storeMessage(std::map<RsNxsMsg*, RsGxsMsgMetaData*>& msgs) = 0;
|
||||
virtual int storeMessage(const std::list<RsNxsMsg*>& msgs) = 0;
|
||||
|
||||
/*!
|
||||
* Stores a list of groups in data store
|
||||
* @param grp map of group and decoded meta data
|
||||
* @return error code
|
||||
*/
|
||||
virtual int storeGroup(std::map<RsNxsGrp*, RsGxsGrpMetaData*>& grsp) = 0;
|
||||
virtual int storeGroup(const std::list<RsNxsGrp*>& grsp) = 0;
|
||||
|
||||
|
||||
/*!
|
||||
|
@ -238,7 +238,7 @@ public:
|
|||
* @param grp map of group and decoded meta data
|
||||
* @return error code
|
||||
*/
|
||||
virtual int updateGroup(std::map<RsNxsGrp*, RsGxsGrpMetaData*>& grsp) = 0;
|
||||
virtual int updateGroup(const std::list<RsNxsGrp*>& grsp) = 0;
|
||||
|
||||
/*!
|
||||
* @param metaData
|
||||
|
|
|
@ -117,6 +117,14 @@ RsGenExchange::~RsGenExchange()
|
|||
delete mDataStore;
|
||||
mDataStore = NULL;
|
||||
|
||||
for(uint32_t i=0;i<mNotifications.size();++i)
|
||||
delete mNotifications[i] ;
|
||||
|
||||
for(uint32_t i=0;i<mGrpsToPublish.size();++i)
|
||||
delete mGrpsToPublish[i].mItem ;
|
||||
|
||||
mNotifications.clear();
|
||||
mGrpsToPublish.clear();
|
||||
}
|
||||
|
||||
bool RsGenExchange::getGroupServerUpdateTS(const RsGxsGroupId& gid, time_t& grp_server_update_TS, time_t& msg_server_update_TS)
|
||||
|
@ -2264,6 +2272,8 @@ void RsGenExchange::publishMsgs()
|
|||
|
||||
computeHash(msg->msg, msg->metaData->mHash);
|
||||
mDataAccess->addMsgData(msg);
|
||||
delete msg ;
|
||||
|
||||
msgChangeMap[grpId].push_back(msgId);
|
||||
|
||||
delete[] metaDataBuff;
|
||||
|
@ -2664,9 +2674,9 @@ void RsGenExchange::publishGrps()
|
|||
mDataAccess->updateGroupData(grp);
|
||||
else
|
||||
mDataAccess->addGroupData(grp);
|
||||
#warning csoler: this is bad: addGroupData/updateGroupData actially deletes grp. But it may be used below? grp should be a class object and not deleted manually!
|
||||
|
||||
groups_to_subscribe.push_back(grpId) ;
|
||||
delete grp ;
|
||||
groups_to_subscribe.push_back(grpId) ;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -2885,9 +2895,8 @@ void RsGenExchange::processRecvdMessages()
|
|||
|
||||
std::vector<RsNxsMsg*>::iterator vit = mReceivedMsgs.begin();
|
||||
GxsMsgReq msgIds;
|
||||
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgs;
|
||||
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMetas;
|
||||
RsNxsMsgDataTemporaryList msgs;
|
||||
RsGxsGrpMetaTemporaryMap grpMetas;
|
||||
|
||||
// coalesce group meta retrieval for performance
|
||||
for(; vit != mReceivedMsgs.end(); ++vit)
|
||||
|
@ -2961,7 +2970,7 @@ void RsGenExchange::processRecvdMessages()
|
|||
if(validateReturn == VALIDATE_SUCCESS)
|
||||
{
|
||||
meta->mMsgStatus = GXS_SERV::GXS_MSG_STATUS_UNPROCESSED | GXS_SERV::GXS_MSG_STATUS_GUI_NEW | GXS_SERV::GXS_MSG_STATUS_GUI_UNREAD;
|
||||
msgs.insert(std::make_pair(msg, meta));
|
||||
msgs.push_back(msg);
|
||||
|
||||
std::vector<RsGxsMessageId> &msgv = msgIds[msg->grpId];
|
||||
if (std::find(msgv.begin(), msgv.end(), msg->msgId) == msgv.end())
|
||||
|
@ -3038,15 +3047,9 @@ void RsGenExchange::processRecvdMessages()
|
|||
|
||||
if(vit == mMsgPendingValidate.end())
|
||||
mMsgPendingValidate.push_back(GxsPendingItem<RsNxsMsg*, RsGxsGrpMsgIdPair>(msg, id,time(NULL)));
|
||||
// else
|
||||
// delete msg ;
|
||||
}
|
||||
}
|
||||
|
||||
// clean up resources from group meta retrieval
|
||||
freeAndClearContainerResource<std::map<RsGxsGroupId, RsGxsGrpMetaData*>,
|
||||
RsGxsGrpMetaData*>(grpMetas);
|
||||
|
||||
if(!msgIds.empty())
|
||||
{
|
||||
#ifdef GEN_EXCH_DEBUG
|
||||
|
@ -3091,7 +3094,7 @@ void RsGenExchange::processRecvdGroups()
|
|||
std::vector<RsGxsGroupId> existingGrpIds;
|
||||
std::list<RsGxsGroupId> grpIds;
|
||||
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grps;
|
||||
RsNxsGrpDataTemporaryList grps;
|
||||
|
||||
mDataStore->retrieveGroupIds(existingGrpIds);
|
||||
|
||||
|
@ -3145,7 +3148,7 @@ void RsGenExchange::processRecvdGroups()
|
|||
|
||||
meta->mSubscribeFlags = GXS_SERV::GROUP_SUBSCRIBE_NOT_SUBSCRIBED;
|
||||
|
||||
grps.insert(std::make_pair(grp, meta));
|
||||
grps.push_back(grp);
|
||||
grpIds.push_back(grp->grpId);
|
||||
}
|
||||
else
|
||||
|
@ -3250,7 +3253,9 @@ void RsGenExchange::performUpdateValidation()
|
|||
#endif
|
||||
|
||||
vit = mGroupUpdates.begin();
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grps;
|
||||
|
||||
RsNxsGrpDataTemporaryList grps ;
|
||||
|
||||
for(; vit != mGroupUpdates.end(); ++vit)
|
||||
{
|
||||
GroupUpdate& gu = *vit;
|
||||
|
@ -3265,7 +3270,7 @@ void RsGenExchange::performUpdateValidation()
|
|||
|
||||
gu.newGrp->metaData->mSubscribeFlags = gu.oldGrpMeta->mSubscribeFlags ;
|
||||
|
||||
grps.insert(std::make_pair(gu.newGrp, gu.newGrp->metaData));
|
||||
grps.push_back(gu.newGrp);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -3353,14 +3358,14 @@ void RsGenExchange::setGroupReputationCutOff(uint32_t& token, const RsGxsGroupId
|
|||
mGrpLocMetaMap.insert(std::make_pair(token, g));
|
||||
}
|
||||
|
||||
void RsGenExchange::removeDeleteExistingMessages( RsGeneralDataService::MsgStoreMap& msgs, GxsMsgReq& msgIdsNotify)
|
||||
void RsGenExchange::removeDeleteExistingMessages( std::list<RsNxsMsg*>& msgs, GxsMsgReq& msgIdsNotify)
|
||||
{
|
||||
// first get grp ids of messages to be stored
|
||||
|
||||
RsGxsGroupId::std_set mGrpIdsUnique;
|
||||
|
||||
for(RsGeneralDataService::MsgStoreMap::const_iterator cit = msgs.begin(); cit != msgs.end(); ++cit)
|
||||
mGrpIdsUnique.insert(cit->second->mGroupId);
|
||||
for(std::list<RsNxsMsg*>::const_iterator cit = msgs.begin(); cit != msgs.end(); ++cit)
|
||||
mGrpIdsUnique.insert((*cit)->metaData->mGroupId);
|
||||
|
||||
//RsGxsGroupId::std_list grpIds(mGrpIdsUnique.begin(), mGrpIdsUnique.end());
|
||||
//RsGxsGroupId::std_list::const_iterator it = grpIds.begin();
|
||||
|
@ -3381,13 +3386,10 @@ void RsGenExchange::removeDeleteExistingMessages( RsGeneralDataService::MsgStore
|
|||
#endif
|
||||
}
|
||||
|
||||
//RsGeneralDataService::MsgStoreMap::iterator cit2 = msgs.begin();
|
||||
RsGeneralDataService::MsgStoreMap filtered;
|
||||
|
||||
// now for each msg to be stored that exist in the retrieved msg/grp "index" delete and erase from map
|
||||
for(RsGeneralDataService::MsgStoreMap::iterator cit2 = msgs.begin(); cit2 != msgs.end(); ++cit2)
|
||||
for(std::list<RsNxsMsg*>::iterator cit2 = msgs.begin(); cit2 != msgs.end(); ++cit2)
|
||||
{
|
||||
const RsGxsMessageId::std_vector& msgIds = msgIdReq[cit2->second->mGroupId];
|
||||
const RsGxsMessageId::std_vector& msgIds = msgIdReq[(*cit2)->metaData->mGroupId];
|
||||
|
||||
#ifdef GEN_EXCH_DEBUG
|
||||
std::cerr << " grpid=" << cit2->second->mGroupId << ", msgid=" << cit2->second->mMsgId ;
|
||||
|
@ -3395,38 +3397,27 @@ void RsGenExchange::removeDeleteExistingMessages( RsGeneralDataService::MsgStore
|
|||
|
||||
// Avoid storing messages that are already in the database, as well as messages that are too old (or generally do not pass the database storage test)
|
||||
//
|
||||
if(std::find(msgIds.begin(), msgIds.end(), cit2->second->mMsgId) == msgIds.end() && messagePublicationTest(*cit2->second))
|
||||
{
|
||||
// passes tests, so add to filtered list
|
||||
//
|
||||
filtered.insert(*cit2);
|
||||
#ifdef GEN_EXCH_DEBUG
|
||||
std::cerr << " keeping " << cit2->second->mMsgId << std::endl;
|
||||
#endif
|
||||
}
|
||||
else // remove message from list
|
||||
if(std::find(msgIds.begin(), msgIds.end(), (*cit2)->metaData->mMsgId) != msgIds.end() || !messagePublicationTest( *(*cit2)->metaData))
|
||||
{
|
||||
// msg exist in retrieved index
|
||||
RsGxsMessageId::std_vector& notifyIds = msgIdsNotify[cit2->second->mGroupId];
|
||||
RsGxsMessageId::std_vector::iterator it2 = std::find(notifyIds.begin(),
|
||||
notifyIds.end(), cit2->second->mMsgId);
|
||||
RsGxsMessageId::std_vector& notifyIds = msgIdsNotify[ (*cit2)->metaData->mGroupId];
|
||||
RsGxsMessageId::std_vector::iterator it2 = std::find(notifyIds.begin(), notifyIds.end(), (*cit2)->metaData->mMsgId);
|
||||
if(it2 != notifyIds.end())
|
||||
{
|
||||
notifyIds.erase(it2);
|
||||
if (notifyIds.empty())
|
||||
{
|
||||
msgIdsNotify.erase(cit2->second->mGroupId);
|
||||
msgIdsNotify.erase( (*cit2)->metaData->mGroupId);
|
||||
}
|
||||
}
|
||||
#ifdef GEN_EXCH_DEBUG
|
||||
std::cerr << " discarding " << cit2->second->mMsgId << std::endl;
|
||||
#endif
|
||||
|
||||
delete cit2->first;
|
||||
delete *cit2;
|
||||
msgs.erase(cit2);
|
||||
// cit2->second will be deleted too in the destructor of cit2->first (RsNxsMsg)
|
||||
}
|
||||
}
|
||||
|
||||
msgs = filtered;
|
||||
}
|
||||
|
||||
|
|
|
@ -850,7 +850,7 @@ private:
|
|||
* @param msgs messages to be filtered
|
||||
* @param msgIdsNotify message notification map to be filtered
|
||||
*/
|
||||
void removeDeleteExistingMessages(RsGeneralDataService::MsgStoreMap& msgs, GxsMsgReq& msgIdsNotify);
|
||||
void removeDeleteExistingMessages(std::list<RsNxsMsg*>& msgs, GxsMsgReq& msgIdsNotify);
|
||||
|
||||
RsMutex mGenMtx;
|
||||
RsGxsDataAccess* mDataAccess;
|
||||
|
|
|
@ -45,6 +45,11 @@ RsGxsDataAccess::RsGxsDataAccess(RsGeneralDataService* ds) :
|
|||
mDataStore(ds), mDataMutex("RsGxsDataAccess"), mNextToken(0) {}
|
||||
|
||||
|
||||
RsGxsDataAccess::~RsGxsDataAccess()
|
||||
{
|
||||
for(std::map<uint32_t, GxsRequest*>::const_iterator it(mRequests.begin());it!=mRequests.end();++it)
|
||||
delete it->second ;
|
||||
}
|
||||
bool RsGxsDataAccess::requestGroupInfo(uint32_t &token, uint32_t ansType, const RsTokReqOptions &opts,
|
||||
const std::list<RsGxsGroupId> &groupIds)
|
||||
{
|
||||
|
@ -1803,8 +1808,8 @@ bool RsGxsDataAccess::addGroupData(RsNxsGrp* grp) {
|
|||
|
||||
RsStackMutex stack(mDataMutex);
|
||||
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grpM;
|
||||
grpM.insert(std::make_pair(grp, grp->metaData));
|
||||
std::list<RsNxsGrp*> grpM;
|
||||
grpM.push_back(grp);
|
||||
return mDataStore->storeGroup(grpM);
|
||||
}
|
||||
|
||||
|
@ -1812,8 +1817,8 @@ bool RsGxsDataAccess::updateGroupData(RsNxsGrp* grp) {
|
|||
|
||||
RsStackMutex stack(mDataMutex);
|
||||
|
||||
std::map<RsNxsGrp*, RsGxsGrpMetaData*> grpM;
|
||||
grpM.insert(std::make_pair(grp, grp->metaData));
|
||||
std::list<RsNxsGrp*> grpM;
|
||||
grpM.push_back(grp);
|
||||
return mDataStore->updateGroup(grpM);
|
||||
}
|
||||
|
||||
|
@ -1821,8 +1826,8 @@ bool RsGxsDataAccess::addMsgData(RsNxsMsg* msg) {
|
|||
|
||||
RsStackMutex stack(mDataMutex);
|
||||
|
||||
std::map<RsNxsMsg*, RsGxsMsgMetaData*> msgM;
|
||||
msgM.insert(std::make_pair(msg, msg->metaData));
|
||||
std::list<RsNxsMsg*> msgM;
|
||||
msgM.push_back(msg);
|
||||
return mDataStore->storeMessage(msgM);
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ class RsGxsDataAccess : public RsTokenService
|
|||
{
|
||||
public:
|
||||
RsGxsDataAccess(RsGeneralDataService* ds);
|
||||
virtual ~RsGxsDataAccess() { return ;}
|
||||
virtual ~RsGxsDataAccess() ;
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -71,13 +71,10 @@ class RsGroupNetworkStatsRecord
|
|||
* Incoming transaction are in 3 different states
|
||||
* 1. START 2. RECEIVING 3. END
|
||||
*/
|
||||
class RsGxsNetService : public RsNetworkExchangeService, public p3ThreadedService,
|
||||
public p3Config
|
||||
class RsGxsNetService : public RsNetworkExchangeService, public p3ThreadedService, public p3Config
|
||||
{
|
||||
public:
|
||||
|
||||
typedef RsSharedPtr<RsGxsNetService> pointer;
|
||||
|
||||
static const uint32_t FRAGMENT_SIZE;
|
||||
/*!
|
||||
* only one observer is allowed
|
||||
|
|
|
@ -33,26 +33,19 @@
|
|||
class RsGixs ;
|
||||
class RsGenExchange ;
|
||||
|
||||
/*!
|
||||
* Handy function for cleaning out meta result containers
|
||||
* @param container
|
||||
*/
|
||||
template <class Container, class Item>
|
||||
void freeAndClearContainerResource(Container container)
|
||||
{
|
||||
typename Container::iterator meta_it = container.begin();
|
||||
|
||||
for(; meta_it != container.end(); ++meta_it)
|
||||
if(meta_it->second != NULL)
|
||||
delete meta_it->second;
|
||||
|
||||
container.clear();
|
||||
}
|
||||
|
||||
// temporary holds a map of pointers to class T, and destroys all pointers on delete.
|
||||
|
||||
class non_copiable
|
||||
{
|
||||
public:
|
||||
non_copiable() {}
|
||||
private:
|
||||
non_copiable& operator=(const non_copiable&) { return *this ;}
|
||||
non_copiable(const non_copiable&) {}
|
||||
};
|
||||
|
||||
template<class IdClass,class IdData>
|
||||
class t_RsGxsGenericDataTemporaryMap: public std::map<IdClass,IdData *>
|
||||
class t_RsGxsGenericDataTemporaryMap: public std::map<IdClass,IdData *>, public non_copiable
|
||||
{
|
||||
public:
|
||||
virtual ~t_RsGxsGenericDataTemporaryMap()
|
||||
|
@ -71,7 +64,7 @@ public:
|
|||
};
|
||||
|
||||
template<class T>
|
||||
class t_RsGxsGenericDataTemporaryMapVector: public std::map<RsGxsGroupId,std::vector<T*> >
|
||||
class t_RsGxsGenericDataTemporaryMapVector: public std::map<RsGxsGroupId,std::vector<T*> >, public non_copiable
|
||||
{
|
||||
public:
|
||||
virtual ~t_RsGxsGenericDataTemporaryMapVector()
|
||||
|
@ -93,12 +86,33 @@ public:
|
|||
}
|
||||
};
|
||||
|
||||
template<class T>
|
||||
class t_RsGxsGenericDataTemporaryList: public std::list<T*>, public non_copiable
|
||||
{
|
||||
public:
|
||||
virtual ~t_RsGxsGenericDataTemporaryList()
|
||||
{
|
||||
clear() ;
|
||||
}
|
||||
|
||||
virtual void clear()
|
||||
{
|
||||
for(typename t_RsGxsGenericDataTemporaryList<T>::iterator it = this->begin();it!=this->end();++it)
|
||||
delete *it;
|
||||
|
||||
std::list<T*>::clear() ;
|
||||
}
|
||||
};
|
||||
|
||||
typedef t_RsGxsGenericDataTemporaryMap<RsGxsGroupId,RsGxsGrpMetaData> RsGxsGrpMetaTemporaryMap;
|
||||
typedef t_RsGxsGenericDataTemporaryMap<RsGxsGroupId,RsNxsGrp> RsNxsGrpDataTemporaryMap;
|
||||
|
||||
typedef t_RsGxsGenericDataTemporaryMapVector<RsGxsMsgMetaData> RsGxsMsgMetaTemporaryMap ;
|
||||
typedef t_RsGxsGenericDataTemporaryMapVector<RsNxsMsg> RsNxsMsgDataTemporaryMap ;
|
||||
|
||||
typedef t_RsGxsGenericDataTemporaryList<RsNxsGrp> RsNxsGrpDataTemporaryList ;
|
||||
typedef t_RsGxsGenericDataTemporaryList<RsNxsMsg> RsNxsMsgDataTemporaryList ;
|
||||
|
||||
#ifdef UNUSED
|
||||
template<class T>
|
||||
class RsGxsMetaDataTemporaryMapVector: public std::vector<T*>
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
/*!
|
||||
* Not thread safe!!
|
||||
* And also has a memory leak. Do not use (csoler, 24 Jul 2017).
|
||||
*/
|
||||
template<class T>
|
||||
class RsSharedPtr
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue