Added helper function to GXS services to access token management and data store

git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5680 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
chrisparker126 2012-10-15 18:52:47 +00:00
parent 1ec5c7fe69
commit 57407fb8ae
8 changed files with 164 additions and 68 deletions

View File

@ -128,7 +128,8 @@ const std::string RsGeneralDataService::MSG_META_STATUS = KEY_MSG_STATUS;
RsDataService::RsDataService(const std::string &serviceDir, const std::string &dbName, uint16_t serviceType, RsDataService::RsDataService(const std::string &serviceDir, const std::string &dbName, uint16_t serviceType,
RsGxsSearchModule *mod) RsGxsSearchModule *mod)
: RsGeneralDataService(), mServiceDir(serviceDir), mDbName(mServiceDir + "/" + dbName), mServType(serviceType){ : RsGeneralDataService(), mServiceDir(serviceDir), mDbName(mServiceDir + "/" + dbName), mServType(serviceType),
mDbMutex("RsDataService"){
initialise(); initialise();
@ -163,6 +164,8 @@ RsDataService::~RsDataService(){
void RsDataService::initialise(){ void RsDataService::initialise(){
RsStackMutex stack(mDbMutex);
// initialise database // initialise database
mDb = new RetroDb(mDbName, RetroDb::OPEN_READWRITE_CREATE); mDb = new RetroDb(mDbName, RetroDb::OPEN_READWRITE_CREATE);
@ -417,6 +420,9 @@ RsNxsMsg* RsDataService::getMessage(RetroCursor &c)
int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg) int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg)
{ {
RsStackMutex stack(mDbMutex);
std::map<RsNxsMsg*, RsGxsMsgMetaData* >::iterator mit = msg.begin(); std::map<RsNxsMsg*, RsGxsMsgMetaData* >::iterator mit = msg.begin();
// start a transaction // start a transaction
@ -496,6 +502,9 @@ int RsDataService::storeMessage(std::map<RsNxsMsg *, RsGxsMsgMetaData *> &msg)
int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp) int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
{ {
RsStackMutex stack(mDbMutex);
std::map<RsNxsGrp*, RsGxsGrpMetaData* >::iterator sit = grp.begin(); std::map<RsNxsGrp*, RsGxsGrpMetaData* >::iterator sit = grp.begin();
// begin transaction // begin transaction
@ -576,70 +585,72 @@ int RsDataService::storeGroup(std::map<RsNxsGrp *, RsGxsGrpMetaData *> &grp)
int RsDataService::retrieveNxsGrps(std::map<std::string, RsNxsGrp *> &grp, bool withMeta, bool cache){ int RsDataService::retrieveNxsGrps(std::map<std::string, RsNxsGrp *> &grp, bool withMeta, bool cache){
if(grp.empty()){ if(grp.empty()){
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, grpColumns, "", ""); RsStackMutex stack(mDbMutex);
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, grpColumns, "", "");
if(c) if(c)
{
std::vector<RsNxsGrp*> grps;
retrieveGroups(c, grps);
std::vector<RsNxsGrp*>::iterator vit = grps.begin();
for(; vit != grps.end(); vit++)
{
grp[(*vit)->grpId] = *vit;
}
delete c;
}
}else{
std::map<std::string, RsNxsGrp *>::iterator mit = grp.begin();
for(; mit != grp.end(); mit++)
{
const std::string& grpId = mit->first;
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, grpColumns, "grpId='" + grpId + "'", "");
if(c)
{
std::vector<RsNxsGrp*> grps;
retrieveGroups(c, grps);
if(!grps.empty())
{
RsNxsGrp* ng = grps.front();
grp[ng->grpId] = ng;
}else{
grp.erase(grpId);
}
delete c;
}
}
}
if(withMeta)
{ {
std::map<RsGxsGroupId, RsGxsGrpMetaData*> metaMap; std::vector<RsNxsGrp*> grps;
std::map<std::string, RsNxsGrp *>::iterator mit = grp.begin();
for(; mit != grp.end(); mit++)
metaMap.insert(std::make_pair(mit->first, (RsGxsGrpMetaData*)(NULL)));
retrieveGxsGrpMetaData(metaMap); retrieveGroups(c, grps);
std::vector<RsNxsGrp*>::iterator vit = grps.begin();
mit = grp.begin(); for(; vit != grps.end(); vit++)
for(; mit != grp.end(); mit++) {
{ grp[(*vit)->grpId] = *vit;
RsNxsGrp* grpPtr = grp[mit->first]; }
grpPtr->metaData = metaMap[mit->first];
} delete c;
} }
return 1; }else{
RsStackMutex stack(mDbMutex);
std::map<std::string, RsNxsGrp *>::iterator mit = grp.begin();
for(; mit != grp.end(); mit++)
{
const std::string& grpId = mit->first;
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, grpColumns, "grpId='" + grpId + "'", "");
if(c)
{
std::vector<RsNxsGrp*> grps;
retrieveGroups(c, grps);
if(!grps.empty())
{
RsNxsGrp* ng = grps.front();
grp[ng->grpId] = ng;
}else{
grp.erase(grpId);
}
delete c;
}
}
}
if(withMeta)
{
std::map<RsGxsGroupId, RsGxsGrpMetaData*> metaMap;
std::map<std::string, RsNxsGrp *>::iterator mit = grp.begin();
for(; mit != grp.end(); mit++)
metaMap.insert(std::make_pair(mit->first, (RsGxsGrpMetaData*)(NULL)));
retrieveGxsGrpMetaData(metaMap);
mit = grp.begin();
for(; mit != grp.end(); mit++)
{
RsNxsGrp* grpPtr = grp[mit->first];
grpPtr->metaData = metaMap[mit->first];
}
}
return 1;
} }
void RsDataService::retrieveGroups(RetroCursor* c, std::vector<RsNxsGrp*>& grps){ void RsDataService::retrieveGroups(RetroCursor* c, std::vector<RsNxsGrp*>& grps){
@ -677,6 +688,9 @@ int RsDataService::retrieveNxsMsgs(const GxsMsgReq &reqIds, GxsMsgResult &msg, b
std::vector<RsNxsMsg*> msgSet; std::vector<RsNxsMsg*> msgSet;
if(msgIdV.empty()){ if(msgIdV.empty()){
RsStackMutex stack(mDbMutex);
RetroCursor* c = mDb->sqlQuery(MSG_TABLE_NAME, msgColumns, KEY_GRP_ID+ "='" + grpId + "'", ""); RetroCursor* c = mDb->sqlQuery(MSG_TABLE_NAME, msgColumns, KEY_GRP_ID+ "='" + grpId + "'", "");
if(c) if(c)
@ -690,6 +704,9 @@ int RsDataService::retrieveNxsMsgs(const GxsMsgReq &reqIds, GxsMsgResult &msg, b
for(; sit!=msgIdV.end();sit++){ for(; sit!=msgIdV.end();sit++){
const std::string& msgId = *sit; const std::string& msgId = *sit;
RsStackMutex stack(mDbMutex);
RetroCursor* c = mDb->sqlQuery(MSG_TABLE_NAME, msgColumns, KEY_GRP_ID+ "='" + grpId RetroCursor* c = mDb->sqlQuery(MSG_TABLE_NAME, msgColumns, KEY_GRP_ID+ "='" + grpId
+ "' AND " + KEY_MSG_ID + "='" + msgId + "'", ""); + "' AND " + KEY_MSG_ID + "='" + msgId + "'", "");
@ -721,7 +738,6 @@ int RsDataService::retrieveNxsMsgs(const GxsMsgReq &reqIds, GxsMsgResult &msg, b
if(withMeta) if(withMeta)
{ {
GxsMsgMetaResult metaResult; GxsMsgMetaResult metaResult;
// request with meta ids so there is no chance of // request with meta ids so there is no chance of
@ -791,6 +807,9 @@ void RsDataService::retrieveMessages(RetroCursor *c, std::vector<RsNxsMsg *> &ms
int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaResult &msgMeta) int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaResult &msgMeta)
{ {
RsStackMutex stack(mDbMutex);
GxsMsgReq::const_iterator mit = reqIds.begin(); GxsMsgReq::const_iterator mit = reqIds.begin();
for(; mit != reqIds.end(); mit++) for(; mit != reqIds.end(); mit++)
@ -848,6 +867,7 @@ void RsDataService::retrieveMsgMeta(RetroCursor *c, std::vector<RsGxsMsgMetaData
int RsDataService::retrieveGxsGrpMetaData(std::map<RsGxsGroupId, RsGxsGrpMetaData *>& grp) int RsDataService::retrieveGxsGrpMetaData(std::map<RsGxsGroupId, RsGxsGrpMetaData *>& grp)
{ {
RsStackMutex stack(mDbMutex);
if(grp.empty()){ if(grp.empty()){
@ -918,6 +938,7 @@ int RsDataService::resetDataStore()
std::map<std::string, RsNxsGrp*>::iterator mit std::map<std::string, RsNxsGrp*>::iterator mit
= grps.begin(); = grps.begin();
// remove all grp msgs files from service dir // remove all grp msgs files from service dir
for(; mit != grps.end(); mit++){ for(; mit != grps.end(); mit++){
std::string file = mServiceDir + "/" + mit->first; std::string file = mServiceDir + "/" + mit->first;
@ -925,8 +946,11 @@ int RsDataService::resetDataStore()
remove(file.c_str()); // remove group file remove(file.c_str()); // remove group file
remove(msgFile.c_str()); // and remove messages file remove(msgFile.c_str()); // and remove messages file
} }
{
RsStackMutex stack(mDbMutex);
mDb->closeDb();
}
mDb->closeDb();
remove(mDbName.c_str()); // remove db file remove(mDbName.c_str()); // remove db file
// recreate database // recreate database

View File

@ -190,6 +190,8 @@ private:
RetroDb* mDb; RetroDb* mDb;
RsMutex mDbMutex;
std::list<std::string> msgColumns; std::list<std::string> msgColumns;
std::list<std::string> msgMetaColumns; std::list<std::string> msgMetaColumns;

View File

@ -688,6 +688,28 @@ void RsGenExchange::publishGrps()
mGrpsToPublish.clear(); mGrpsToPublish.clear();
} }
uint32_t RsGenExchange::generatePublicToken()
{
return mDataAccess->generatePublicToken();
}
bool RsGenExchange::updatePublicRequestStatus(const uint32_t &token, const uint32_t &status)
{
return mDataAccess->updatePublicRequestStatus(token, status);
}
bool RsGenExchange::disposeOfPublicToken(const uint32_t &token)
{
return mDataAccess->disposeOfPublicToken(token);
}
RsGeneralDataService* RsGenExchange::getDataStore()
{
return mDataStore;
}
void RsGenExchange::createDummyGroup(RsGxsGrpItem *grpItem) void RsGenExchange::createDummyGroup(RsGxsGrpItem *grpItem)
{ {

View File

@ -36,6 +36,7 @@
#include "rsnxsobserver.h" #include "rsnxsobserver.h"
#include "retroshare/rsgxsservice.h" #include "retroshare/rsgxsservice.h"
#include "serialiser/rsnxsitems.h" #include "serialiser/rsnxsitems.h"
//#include "rsgixs.h"
typedef std::map<RsGxsGroupId, std::vector<RsGxsMsgItem*> > GxsMsgDataMap; typedef std::map<RsGxsGroupId, std::vector<RsGxsMsgItem*> > GxsMsgDataMap;
typedef std::map<RsGxsGroupId, RsGxsGrpItem*> GxsGroupDataMap; typedef std::map<RsGxsGroupId, RsGxsGrpItem*> GxsGroupDataMap;
@ -98,6 +99,12 @@ public:
*/ */
void tick(); void tick();
/*!
* Any backgroup processing needed by
*/
virtual void service_tick() = 0;
/*! /*!
* *
* @return handle to token service handle for making * @return handle to token service handle for making
@ -160,6 +167,41 @@ protected:
*/ */
void createDummyGroup(RsGxsGrpItem* grpItem); void createDummyGroup(RsGxsGrpItem* grpItem);
protected:
/*!
* Assigns a token value to passed integer
* The status of the token can still be queried from request status feature
* @warning the token space is shared with RsGenExchange backend, so do not
* modify tokens except does you have created by calling generatePublicToken()
* @return token
*/
uint32_t generatePublicToken();
/*!
* Updates the status of associate token
* @warning the token space is shared with RsGenExchange backend, so do not
* modify tokens except does you have created by calling generatePublicToken()
* @param token
* @param status
* @return false if token could not be found, true if token disposed of
*/
bool updatePublicRequestStatus(const uint32_t &token, const uint32_t &status);
/*!
* This gets rid of a publicly issued token
* @param token
* @return false if token could not found, true if token is disposed of
*/
bool disposeOfPublicToken(const uint32_t &token);
/*!
* This gives access to the data store which hold msgs and groups
* for the service
* @return Data store for retrieving msgs and groups
*/
RsGeneralDataService* getDataStore();
public: public:
/*! /*!

View File

@ -254,7 +254,7 @@ public:
uint32_t generatePublicToken(); uint32_t generatePublicToken();
/*! /*!
* Update * Updates the status of associate token
* @param token * @param token
* @param status * @param status
* @return false if token could not be found, true if token disposed of * @return false if token could not be found, true if token disposed of

View File

@ -2311,11 +2311,7 @@ int RsServer::StartupRetroShare()
// Testing New Cache Services. // Testing New Cache Services.
p3WireVEG *mWire = new p3WireVEG(RS_SERVICE_GXSV1_TYPE_WIRE); p3WireVEG *mWire = new p3WireVEG(RS_SERVICE_GXSV1_TYPE_WIRE);
pqih -> addService(mWire); pqih -> addService(mWire);
// Testing New Cache Services.
p3IdServiceVEG *mIdentity = new p3IdServiceVEG(RS_SERVICE_GXSV1_TYPE_IDENTITY);
pqih -> addService(mIdentity);
// Testing New Cache Services. // Testing New Cache Services.
p3ForumsVEG *mForumsV2 = new p3ForumsVEG(RS_SERVICE_GXSV1_TYPE_FORUMS); p3ForumsVEG *mForumsV2 = new p3ForumsVEG(RS_SERVICE_GXSV1_TYPE_FORUMS);
pqih -> addService(mForumsV2); pqih -> addService(mForumsV2);
@ -2584,8 +2580,8 @@ int RsServer::StartupRetroShare()
rsPhotoV2 = mPhotoV2; rsPhotoV2 = mPhotoV2;
#ifdef ENABLE_GXS_SERVICES #ifdef ENABLE_GXS_SERVICES
// Testing of new cache system interfaces. // Testing of new cache system interfaces.
rsIdentityVEG = mIdentity;
rsWikiVEG = mWikis; rsWikiVEG = mWikis;
rsWireVEG = mWire; rsWireVEG = mWire;
rsForumsVEG = mForumsV2; rsForumsVEG = mForumsV2;

View File

@ -105,6 +105,11 @@ bool p3PhotoServiceV2::updated()
return changed; return changed;
} }
void p3PhotoServiceV2::service_tick()
{
}
void p3PhotoServiceV2::groupsChanged(std::list<RsGxsGroupId>& grpIds) void p3PhotoServiceV2::groupsChanged(std::list<RsGxsGroupId>& grpIds)

View File

@ -43,6 +43,11 @@ public:
*/ */
bool updated(); bool updated();
/*!
*
*/
void service_tick();
protected: protected:
void notifyChanges(std::vector<RsGxsNotify*>& changes); void notifyChanges(std::vector<RsGxsNotify*>& changes);