mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-07-25 23:45:49 -04:00
added option to RsTokReqOptions for group subscription filter
added code for rank calculation best,top, and newest (not enabled, not working yet...) added variables for circles to grp meta type and modified storage and serialisation accordingly git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5930 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
083c4411b8
commit
bcf9f443b4
14 changed files with 660 additions and 49 deletions
|
@ -51,6 +51,10 @@
|
|||
#define KEY_KEY_SET std::string("keySet")
|
||||
#define KEY_GRP_NAME std::string("grpName")
|
||||
#define KEY_GRP_SIGN_FLAGS std::string("signFlags")
|
||||
#define KEY_GRP_CIRCLE_ID std::string("circleId")
|
||||
#define KEY_GRP_CIRCLE_TYPE std::string("circleType")
|
||||
#define KEY_GRP_INTERNAL_CIRCLE std::string("internalCircle")
|
||||
#define KEY_GRP_ORIGINATOR std::string("originator")
|
||||
|
||||
// grp local
|
||||
#define KEY_GRP_SUBCR_FLAG std::string("subscribeFlag")
|
||||
|
@ -98,6 +102,11 @@
|
|||
#define COL_ORIG_GRP_ID 12
|
||||
#define COL_GRP_SERV_STRING 13
|
||||
#define COL_GRP_SIGN_FLAGS 14
|
||||
#define COL_GRP_CIRCLE_ID 15
|
||||
#define COL_GRP_CIRCL_TYPE 16
|
||||
#define COL_GRP_INTERN_CIRCLE 17
|
||||
#define COL_GRP_ORIGINATOR 18
|
||||
|
||||
|
||||
// msg col numbers
|
||||
#define COL_MSG_ID 5
|
||||
|
@ -150,7 +159,8 @@ RsDataService::RsDataService(const std::string &serviceDir, const std::string &d
|
|||
grpMetaColumns.push_back(KEY_KEY_SET); grpMetaColumns.push_back(KEY_GRP_SUBCR_FLAG); grpMetaColumns.push_back(KEY_GRP_POP);
|
||||
grpMetaColumns.push_back(KEY_MSG_COUNT); grpMetaColumns.push_back(KEY_GRP_STATUS); grpMetaColumns.push_back(KEY_GRP_NAME);
|
||||
grpMetaColumns.push_back(KEY_GRP_LAST_POST); grpMetaColumns.push_back(KEY_ORIG_GRP_ID); grpMetaColumns.push_back(KEY_NXS_SERV_STRING);
|
||||
grpMetaColumns.push_back(KEY_GRP_SIGN_FLAGS);
|
||||
grpMetaColumns.push_back(KEY_GRP_SIGN_FLAGS); grpMetaColumns.push_back(KEY_GRP_CIRCLE_ID); grpMetaColumns.push_back(KEY_GRP_CIRCLE_TYPE);
|
||||
grpMetaColumns.push_back(KEY_GRP_INTERNAL_CIRCLE); grpMetaColumns.push_back(KEY_GRP_ORIGINATOR);
|
||||
|
||||
// for retrieving actual grp data
|
||||
grpColumns.push_back(KEY_GRP_ID); grpColumns.push_back(KEY_NXS_FILE); grpColumns.push_back(KEY_NXS_FILE_OFFSET);
|
||||
|
@ -209,6 +219,10 @@ void RsDataService::initialise(){
|
|||
KEY_NXS_SERV_STRING + " TEXT," +
|
||||
KEY_NXS_FLAGS + " INT," +
|
||||
KEY_GRP_SIGN_FLAGS + " INT," +
|
||||
KEY_GRP_CIRCLE_ID + " TEXT," +
|
||||
KEY_GRP_CIRCLE_TYPE + " INT," +
|
||||
KEY_GRP_INTERNAL_CIRCLE + " TEXT," +
|
||||
KEY_GRP_ORIGINATOR + " TEXT," +
|
||||
KEY_SIGN_SET + " BLOB);");
|
||||
|
||||
}
|
||||
|
@ -235,7 +249,7 @@ RsGxsGrpMetaData* RsDataService::getGrpMeta(RetroCursor &c)
|
|||
c.getString(COL_GRP_NAME, grpMeta->mGroupName);
|
||||
c.getString(COL_ORIG_GRP_ID, grpMeta->mOrigGrpId);
|
||||
c.getString(COL_GRP_SERV_STRING, grpMeta->mServiceString);
|
||||
grpMeta->mSignFlags = c.getInt32(COL_GRP_SIGN_FLAGS);
|
||||
grpMeta->mSignFlags = c.getInt32(COL_GRP_SIGN_FLAGS);
|
||||
|
||||
grpMeta->mPublishTs = c.getInt32(COL_TIME_STAMP);
|
||||
grpMeta->mGroupFlags = c.getInt32(COL_NXS_FLAGS);
|
||||
|
@ -256,6 +270,11 @@ RsGxsGrpMetaData* RsDataService::getGrpMeta(RetroCursor &c)
|
|||
grpMeta->mLastPost = c.getInt32(COL_GRP_LAST_POST);
|
||||
grpMeta->mGroupStatus = c.getInt32(COL_GRP_STATUS);
|
||||
|
||||
c.getString(COL_GRP_CIRCLE_ID, grpMeta->mCircleId);
|
||||
grpMeta->mCircleType = c.getInt32(COL_GRP_CIRCL_TYPE);
|
||||
c.getString(COL_GRP_INTERN_CIRCLE, grpMeta->mInternalCircle);
|
||||
c.getString(COL_GRP_ORIGINATOR, grpMeta->mOriginator);
|
||||
|
||||
|
||||
if(ok)
|
||||
return grpMeta;
|
||||
|
@ -539,6 +558,10 @@ int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
|
|||
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);
|
||||
cv.put(KEY_GRP_CIRCLE_TYPE, (int32_t)grpMetaPtr->mCircleType);
|
||||
cv.put(KEY_GRP_INTERNAL_CIRCLE, grpMetaPtr->mInternalCircle);
|
||||
cv.put(KEY_GRP_ORIGINATOR, grpMetaPtr->mOriginator);
|
||||
|
||||
if(! (grpMetaPtr->mAuthorId.empty()) ){
|
||||
cv.put(KEY_NXS_IDENTITY, grpMetaPtr->mAuthorId);
|
||||
|
|
|
@ -1570,6 +1570,7 @@ void RsGenExchange::processRecvdMessages()
|
|||
RsGxsMsgMetaData* meta = new RsGxsMsgMetaData();
|
||||
bool ok = meta->deserialise(msg->meta.bin_data, &(msg->meta.bin_len));
|
||||
|
||||
|
||||
if(ok)
|
||||
{
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*>::iterator mit = grpMetas.find(msg->grpId);
|
||||
|
@ -1578,7 +1579,9 @@ void RsGenExchange::processRecvdMessages()
|
|||
if(mit != grpMetas.end()){
|
||||
RsGxsGrpMetaData* grpMeta = mit->second;
|
||||
ok = true;
|
||||
//&= validateMsg(msg, grpMeta->mGroupFlags, grpMeta->keys);
|
||||
// msg->metaData = meta;
|
||||
// ok &= validateMsg(msg, grpMeta->mGroupFlags, grpMeta->keys);
|
||||
// msg->metaData = NULL;
|
||||
}
|
||||
else
|
||||
ok = false;
|
||||
|
|
|
@ -306,7 +306,7 @@ protected:
|
|||
|
||||
/*!
|
||||
* Retrieve keys for a given group, \n
|
||||
* call is blocking retrieval for underlying db
|
||||
* call is blocking retrieval from underlying db
|
||||
* @warning under normal circumstance a service should not need this
|
||||
* @param grpId the id of the group to retrieve keys for
|
||||
* @param keys this is set to the retrieved keys
|
||||
|
|
|
@ -46,7 +46,8 @@ uint32_t RsGxsGrpMetaData::serial_size()
|
|||
s += GetTlvStringSize(mServiceString);
|
||||
s += signSet.TlvSize();
|
||||
s += keys.TlvSize();
|
||||
|
||||
s += 4; // for mCircleType
|
||||
s += GetTlvStringSize(mCircleId);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
@ -67,6 +68,10 @@ void RsGxsGrpMetaData::clear(){
|
|||
mSubscribeFlags = 0;
|
||||
signSet.TlvClear();
|
||||
keys.TlvClear();
|
||||
mCircleId.clear();
|
||||
mInternalCircle.clear();
|
||||
mOriginator.clear();
|
||||
mCircleType = 0;
|
||||
|
||||
}
|
||||
|
||||
|
@ -99,8 +104,10 @@ bool RsGxsGrpMetaData::serialise(void *data, uint32_t &pktsize)
|
|||
ok &= SetTlvString(data, tlvsize, &offset, 0, mGroupName);
|
||||
ok &= setRawUInt32(data, tlvsize, &offset, mGroupFlags);
|
||||
ok &= setRawUInt32(data, tlvsize, &offset, mPublishTs);
|
||||
ok &= setRawUInt32(data, tlvsize, &offset, mCircleType);
|
||||
ok &= SetTlvString(data, tlvsize, &offset, 0, mAuthorId);
|
||||
ok &= SetTlvString(data, tlvsize, &offset, 0, mServiceString);
|
||||
ok &= SetTlvString(data, tlvsize, &offset, 0, mCircleId);
|
||||
ok &= signSet.SetTlv(data, tlvsize, &offset);
|
||||
ok &= keys.SetTlv(data, tlvsize, &offset);
|
||||
|
||||
|
@ -125,8 +132,10 @@ bool RsGxsGrpMetaData::deserialise(void *data, uint32_t &pktsize)
|
|||
ok &= GetTlvString(data, pktsize, &offset, 0, mGroupName);
|
||||
ok &= getRawUInt32(data, pktsize, &offset, &mGroupFlags);
|
||||
ok &= getRawUInt32(data, pktsize, &offset, &mPublishTs);
|
||||
ok &= getRawUInt32(data, pktsize, &offset, &mCircleType);
|
||||
ok &= GetTlvString(data, pktsize, &offset, 0, mAuthorId);
|
||||
ok &= GetTlvString(data, pktsize, &offset, 0, mServiceString);
|
||||
ok &= GetTlvString(data, pktsize, &offset, 0, mCircleId);
|
||||
ok &= signSet.GetTlv(data, pktsize, &offset);
|
||||
ok &= keys.GetTlv(data, pktsize, &offset);
|
||||
|
||||
|
@ -257,6 +266,10 @@ void RsGxsGrpMetaData::operator =(const RsGroupMetaData& rMeta)
|
|||
this->mGroupName = rMeta.mGroupName;
|
||||
this->mServiceString = rMeta.mServiceString;
|
||||
this->mSignFlags = rMeta.mSignFlags;
|
||||
this->mCircleId = rMeta.mCircleId;
|
||||
this->mCircleType = rMeta.mCircleType;
|
||||
this->mInternalCircle = rMeta.mInternalCircle;
|
||||
this->mOriginator = rMeta.mOriginator;
|
||||
}
|
||||
|
||||
void RsGxsMsgMetaData::operator =(const RsMsgMetaData& rMeta)
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
*/
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "serialiser/rsserial.h"
|
||||
#include "serialiser/rstlvtypes.h"
|
||||
#include "serialiser/rstlvkeys.h"
|
||||
|
@ -59,6 +58,9 @@ public:
|
|||
uint32_t mSignFlags;
|
||||
std::string mAuthorId;
|
||||
|
||||
std::string mCircleId;
|
||||
uint32_t mCircleType;
|
||||
|
||||
|
||||
RsTlvKeySignatureSet signSet;
|
||||
RsTlvSecurityKeySet keys;
|
||||
|
@ -74,7 +76,8 @@ public:
|
|||
time_t mLastPost; // ???
|
||||
|
||||
uint32_t mGroupStatus;
|
||||
|
||||
std::string mOriginator;
|
||||
std::string mInternalCircle;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -771,9 +771,15 @@ void RsGxsDataAccess::processRequests()
|
|||
bool RsGxsDataAccess::getGroupData(GroupDataReq* req)
|
||||
{
|
||||
std::map<RsGxsGroupId, RsNxsGrp*> grpData;
|
||||
std::list<RsGxsGroupId> grpIdsOut;
|
||||
|
||||
std::list<RsGxsGroupId>::iterator lit = req->mGroupIds.begin(),
|
||||
lit_end = req->mGroupIds.end();
|
||||
getGroupList(req->mGroupIds, req->Options, grpIdsOut);
|
||||
|
||||
if(grpIdsOut.empty())
|
||||
return true;
|
||||
|
||||
std::list<RsGxsGroupId>::iterator lit = grpIdsOut.begin(),
|
||||
lit_end = grpIdsOut.end();
|
||||
|
||||
for(; lit != lit_end; lit++)
|
||||
{
|
||||
|
@ -794,9 +800,16 @@ bool RsGxsDataAccess::getGroupSummary(GroupMetaReq* req)
|
|||
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMeta;
|
||||
|
||||
std::list<RsGxsGroupId>::const_iterator lit = req->mGroupIds.begin();
|
||||
std::list<RsGxsGroupId> grpIdsOut;
|
||||
|
||||
for(; lit != req->mGroupIds.end(); lit++)
|
||||
getGroupList(req->mGroupIds, req->Options, grpIdsOut);
|
||||
|
||||
if(grpIdsOut.empty())
|
||||
return true;
|
||||
|
||||
std::list<RsGxsGroupId>::const_iterator lit = grpIdsOut.begin();
|
||||
|
||||
for(; lit != grpIdsOut.end(); lit++)
|
||||
grpMeta[*lit] = NULL;
|
||||
|
||||
mDataStore->retrieveGxsGrpMetaData(grpMeta);
|
||||
|
@ -811,24 +824,37 @@ bool RsGxsDataAccess::getGroupSummary(GroupMetaReq* req)
|
|||
|
||||
bool RsGxsDataAccess::getGroupList(GroupIdReq* req)
|
||||
{
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMeta;
|
||||
getGroupList(req->mGroupIds, req->Options, req->mGroupIdResult);
|
||||
|
||||
std::list<RsGxsGroupId>::const_iterator lit = req->mGroupIds.begin();
|
||||
return true;
|
||||
}
|
||||
|
||||
for(; lit != req->mGroupIds.end(); lit++)
|
||||
grpMeta[*lit] = NULL;
|
||||
bool RsGxsDataAccess::getGroupList(const std::list<RsGxsGroupId>& grpIdsIn, const RsTokReqOptions& opts, std::list<RsGxsGroupId>& grpIdsOut)
|
||||
{
|
||||
std::map<RsGxsGroupId, RsGxsGrpMetaData*> grpMeta;
|
||||
|
||||
mDataStore->retrieveGxsGrpMetaData(grpMeta);
|
||||
std::list<RsGxsGroupId>::const_iterator lit = grpIdsIn.begin();
|
||||
|
||||
std::map<std::string, RsGxsGrpMetaData*>::iterator mit = grpMeta.begin();
|
||||
for(; lit != grpIdsIn.end(); lit++)
|
||||
grpMeta[*lit] = NULL;
|
||||
|
||||
for(; mit != grpMeta.end(); mit++)
|
||||
{
|
||||
req->mGroupIdResult.push_back(mit->first);
|
||||
delete mit->second; // so wasteful!!
|
||||
}
|
||||
mDataStore->retrieveGxsGrpMetaData(grpMeta);
|
||||
|
||||
return true;
|
||||
std::map<std::string, RsGxsGrpMetaData*>::iterator mit = grpMeta.begin();
|
||||
|
||||
for(; mit != grpMeta.end(); mit++)
|
||||
{
|
||||
grpIdsOut.push_back(mit->first);
|
||||
}
|
||||
|
||||
filterGrpList(grpIdsOut, opts, grpMeta);
|
||||
|
||||
for(mit = grpMeta.begin(); mit != grpMeta.end(); mit++)
|
||||
{
|
||||
delete mit->second; // so wasteful!!
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RsGxsDataAccess::getMsgData(MsgDataReq* req)
|
||||
|
@ -1394,6 +1420,32 @@ void RsGxsDataAccess::filterMsgList(GxsMsgIdResult& msgIds, const RsTokReqOption
|
|||
}
|
||||
}
|
||||
|
||||
void RsGxsDataAccess::filterGrpList(std::list<RsGxsGroupId> &grpIds, const RsTokReqOptions &opts, const GrpMetaFilter &meta) const
|
||||
{
|
||||
std::list<RsGxsGroupId>::iterator lit = grpIds.begin();
|
||||
|
||||
for(; lit != grpIds.end(); )
|
||||
{
|
||||
GrpMetaFilter::const_iterator cit = meta.find(*lit);
|
||||
|
||||
bool keep = false;
|
||||
|
||||
if(cit != meta.end())
|
||||
{
|
||||
keep = checkGrpFilter(opts, cit->second);
|
||||
}
|
||||
|
||||
if(keep)
|
||||
{
|
||||
lit++;
|
||||
}else
|
||||
{
|
||||
lit = grpIds.erase(lit);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool RsGxsDataAccess::checkRequestStatus(const uint32_t& token,
|
||||
uint32_t& status, uint32_t& reqtype, uint32_t& anstype, time_t& ts)
|
||||
|
@ -1516,6 +1568,26 @@ bool RsGxsDataAccess::disposeOfPublicToken(const uint32_t& token)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool RsGxsDataAccess::checkGrpFilter(const RsTokReqOptions &opts, const RsGxsGrpMetaData *meta) const
|
||||
{
|
||||
|
||||
bool subscribeMatch = false;
|
||||
|
||||
if(opts.mSubscribeMask)
|
||||
{
|
||||
// Exact Flags match required.
|
||||
if ((opts.mSubscribeMask & opts.mSubscribeFilter) == (opts.mSubscribeMask & meta->mSubscribeFlags))
|
||||
{
|
||||
subscribeMatch = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
subscribeMatch = true;
|
||||
}
|
||||
|
||||
return subscribeMatch;
|
||||
}
|
||||
bool RsGxsDataAccess::checkMsgFilter(const RsTokReqOptions& opts, const RsGxsMsgMetaData* meta) const
|
||||
{
|
||||
bool statusMatch = false;
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
|
||||
typedef std::map< RsGxsGroupId, std::map<RsGxsMessageId, RsGxsMsgMetaData*> > MsgMetaFilter;
|
||||
typedef std::map< RsGxsGroupId, RsGxsGrpMetaData* > GrpMetaFilter;
|
||||
|
||||
class RsGxsDataAccess : public RsTokenService
|
||||
{
|
||||
|
@ -304,6 +305,14 @@ private:
|
|||
*/
|
||||
bool getGroupList(GroupIdReq* req);
|
||||
|
||||
/*!
|
||||
* convenience function for filtering grpIds
|
||||
* @param grpIdsIn The ids to filter with opts
|
||||
* @param opts the filter options
|
||||
* @param grpIdsOut grpIdsIn filtered with opts
|
||||
*/
|
||||
bool getGroupList(const std::list<RsGxsGroupId>& grpIdsIn, const RsTokReqOptions& opts, std::list<RsGxsGroupId>& grpIdsOut);
|
||||
|
||||
/*!
|
||||
* Attempts to retrieve msg id list from data store
|
||||
* Computationally/CPU-Bandwidth expensive
|
||||
|
@ -358,6 +367,14 @@ private:
|
|||
*/
|
||||
void filterMsgList(GxsMsgIdResult& msgIds, const RsTokReqOptions& opts, const MsgMetaFilter& meta) const;
|
||||
|
||||
/*!
|
||||
* This filter msgs based of options supplied (at the moment just status masks)
|
||||
* @param grpIds The group ids to filter
|
||||
* @param opts the request options containing mask set by user
|
||||
* @param meta The accompanying meta information for group ids
|
||||
*/
|
||||
void filterGrpList(std::list<RsGxsGroupId>& msgIds, const RsTokReqOptions& opts, const GrpMetaFilter& meta) const;
|
||||
|
||||
|
||||
/*!
|
||||
* This applies the options to the meta to find out if the given message satisfies
|
||||
|
@ -368,6 +385,16 @@ private:
|
|||
*/
|
||||
bool checkMsgFilter(const RsTokReqOptions& opts, const RsGxsMsgMetaData* meta) const;
|
||||
|
||||
/*!
|
||||
* This applies the options to the meta to find out if the given group satisfies
|
||||
* them
|
||||
* @param opts options containing filters to check
|
||||
* @param meta meta containing currently defined options for group
|
||||
* @return true if group meta passes all options
|
||||
*/
|
||||
bool checkGrpFilter(const RsTokReqOptions& opts, const RsGxsGrpMetaData* meta) const;
|
||||
|
||||
|
||||
/*!
|
||||
* This is a filter method which applies the request options to the list of ids
|
||||
* requested
|
||||
|
|
|
@ -79,6 +79,7 @@ RsTokReqOptions()
|
|||
{
|
||||
mOptions = 0;
|
||||
mStatusFilter = 0; mStatusMask = 0; mSubscribeFilter = 0;
|
||||
mSubscribeMask = 0;
|
||||
mMsgFlagMask = 0; mMsgFlagFilter = 0;
|
||||
mBefore = 0; mAfter = 0; mReqType = 0;
|
||||
}
|
||||
|
@ -95,7 +96,7 @@ uint32_t mMsgFlagMask, mMsgFlagFilter;
|
|||
|
||||
uint32_t mReqType;
|
||||
|
||||
uint32_t mSubscribeFilter; // Only for Groups.
|
||||
uint32_t mSubscribeFilter, mSubscribeMask; // Only for Groups.
|
||||
|
||||
// Time range... again applied after Options.
|
||||
time_t mBefore;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue