Merge pull request #1375 from csoler/v0.6-GxsFix2

created a connexion between token and meta data of created posts and …
This commit is contained in:
csoler 2018-10-20 14:42:58 +02:00 committed by GitHub
commit 9e632ce995
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 55 additions and 77 deletions

View File

@ -1189,6 +1189,26 @@ bool RsGenExchange::getMsgRelatedList(const uint32_t &token, MsgRelatedIdResult
{
return mDataAccess->getMsgRelatedList(token, msgIds);
}
bool RsGenExchange::getPublishedMsgMeta(const uint32_t& token,RsMsgMetaData& meta)
{
auto it = mPublishedMsgs.find(token);
if(it == mPublishedMsgs.end())
return false ;
meta = it->second;
return true;
}
bool RsGenExchange::getPublishedGroupMeta(const uint32_t& token,RsGroupMetaData& meta)
{
auto it = mPublishedGrps.find(token);
if(it == mPublishedGrps.end())
return false ;
meta = it->second;
return true;
}
bool RsGenExchange::getGroupMeta(const uint32_t &token, std::list<RsGroupMetaData> &groupInfo)
{
@ -2164,7 +2184,7 @@ void RsGenExchange::publishMsgs()
#endif
RsGxsMsgItem* msgItem = mit->second;
const uint32_t& token = mit->first;
uint32_t token = mit->first;
uint32_t size = mSerialiser->size(msgItem);
char* mData = new char[size];
@ -2279,6 +2299,9 @@ void RsGenExchange::publishMsgs()
computeHash(msg->msg, msg->metaData->mHash);
mDataAccess->addMsgData(msg);
mPublishedMsgs[token] = *msg->metaData;
delete msg ;
msgChangeMap[grpId].insert(msgId);
@ -2669,6 +2692,7 @@ void RsGenExchange::publishGrps()
#warning csoler: TODO: grp->meta should be renamed grp->public_meta !
grp->meta.setBinData(metaData, mdSize);
}
mPublishedGrps[ggps.mToken] = *grp->metaData ; // save the connexion between the token and the created metadata, without private keys
// Place back private keys for publisher and database storage
grp->metaData->keys.private_keys = fullKeySet.private_keys;

View File

@ -242,6 +242,21 @@ public:
*/
bool getMsgRelatedMeta(const uint32_t &token, GxsMsgRelatedMetaMap& msgMeta);
/*!
* Retrieves the meta data of a newly created group. The meta is kept in cache for the current session.
* \param token token that was used to create the group
* \param meta meta data for this group
* \return false if the group is not yet created.
*/
bool getPublishedGroupMeta(const uint32_t& token,RsGroupMetaData& meta);
/*!
* Retrieves the meta data of a newly created post. The meta is kept in cache for the current session.
* \param token token that was used to create the post
* \param meta meta data for this post
* \return false if the group is not yet created.
*/
bool getPublishedMsgMeta(const uint32_t& token,RsMsgMetaData& meta);
/*!
* Gxs services should call this for automatic handling of
@ -883,6 +898,9 @@ private:
std::vector<GxsGrpPendingSign> mGrpsToPublish;
typedef std::vector<GxsGrpPendingSign> NxsGrpSignPendVect;
std::map<uint32_t,RsGxsGrpMetaData> mPublishedGrps ; // keeps track of which group was created using which token
std::map<uint32_t,RsGxsMsgMetaData> mPublishedMsgs ; // keeps track of which message was created using which token
std::map<uint32_t, RsGxsMsgItem*> mMsgsToPublish;
std::map<uint32_t, RsGxsGrpMsgIdPair > mMsgNotify;

View File

@ -1045,102 +1045,38 @@ bool p3GxsChannels::getChannelsContent(
bool p3GxsChannels::createChannel(RsGxsChannelGroup& channel)
{
uint32_t token;
time_t beginCreation = time(nullptr);
if( !createGroup(token, channel)
|| waitToken(token) != RsTokenService::COMPLETE )
return false;
time_t endCreation = time(nullptr);
std::list<RsGroupMetaData> channels;
if(!getChannelsSummaries(channels)) return false;
/* This is ugly but after digging and doing many tries of doing it the right
* way ending always into too big refactor chain reaction, I think this is
* not that bad, moreover seems the last created group tend to end up near
* the beginning of the list so it is fast founding it.
* The shortcoming of this is that if groups with same data are created in
* a burst (more then once in a second) is that the id of another similar
* group can be returned, but this is a pointy case.
* Order of conditions in the `if` matter for performances */
bool found = false;
for(const RsGroupMetaData& chan : channels)
if(RsGenExchange::getPublishedGroupMeta(token, channel.mMeta))
{
if( IS_GROUP_ADMIN(chan.mSubscribeFlags)
&& IS_GROUP_SUBSCRIBED(chan.mSubscribeFlags)
&& chan.mPublishTs >= beginCreation
&& chan.mPublishTs <= endCreation
&& chan.mGroupFlags == channel.mMeta.mGroupFlags
&& chan.mSignFlags == channel.mMeta.mSignFlags
&& chan.mCircleType == channel.mMeta.mCircleType
&& chan.mAuthorId == channel.mMeta.mAuthorId
&& chan.mCircleId == channel.mMeta.mCircleId
&& chan.mServiceString == channel.mMeta.mServiceString
&& chan.mGroupName == channel.mMeta.mGroupName )
{
channel.mMeta = chan;
found = true;
break;
}
}
#ifdef RS_DEEP_SEARCH
if(found) DeepSearch::indexChannelGroup(channel);
DeepSearch::indexChannelGroup(channel);
#endif // RS_DEEP_SEARCH
return found;
return true;
}
return false;
}
bool p3GxsChannels::createPost(RsGxsChannelPost& post)
{
uint32_t token;
time_t beginCreation = time(nullptr);
if( !createPost(token, post)
|| waitToken(token) != RsTokenService::COMPLETE ) return false;
time_t endCreation = time(nullptr);
std::list<RsGxsGroupId> chanIds; chanIds.push_back(post.mMeta.mGroupId);
std::vector<RsGxsChannelPost> posts;
std::vector<RsGxsComment> comments;
if(!getChannelsContent(chanIds, posts, comments)) return false;
/* This is ugly but after digging and doing many tries of doing it the right
* way ending always into too big refactor chain reaction, I think this is
* not that bad.
* The shortcoming of this is that if posts with same data are created in
* a burst (more then once in a second) is that the id of another similar
* post could be returned, but this is a pointy case.
* Order of conditions in the `if` matter for performances */
bool found = false;
for(const RsGxsChannelPost& itPost : posts)
if(RsGenExchange::getPublishedMsgMeta(token,post.mMeta))
{
std::cout << __PRETTY_FUNCTION__ << " " << beginCreation << " "
<< itPost.mMeta.mPublishTs << " " << endCreation << " "
<< itPost.mMeta.mMsgId << std::endl;
if( itPost.mMeta.mPublishTs >= beginCreation
&& itPost.mMeta.mPublishTs <= endCreation
&& itPost.mMeta.mMsgFlags == post.mMeta.mMsgFlags
&& itPost.mMeta.mGroupId == post.mMeta.mGroupId
&& itPost.mMeta.mThreadId == post.mMeta.mThreadId
&& itPost.mMeta.mParentId == post.mMeta.mParentId
&& itPost.mMeta.mAuthorId == post.mMeta.mAuthorId
&& itPost.mMeta.mMsgName == post.mMeta.mMsgName
&& itPost.mFiles.size() == post.mFiles.size()
&& itPost.mMeta.mServiceString == post.mMeta.mServiceString
&& itPost.mOlderVersions == post.mOlderVersions
&& itPost.mMsg == post.mMsg )
{
post = itPost;
found = true;
break;
}
}
#ifdef RS_DEEP_SEARCH
if(found) DeepSearch::indexChannelPost(post);
DeepSearch::indexChannelPost(post);
#endif // RS_DEEP_SEARCH
return found;
return true;
}
return false;
}