mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-01-28 00:07:09 -05:00
added a local cache in rsdataservice to avoid calling sqlcipher on GrpMetaData
This commit is contained in:
parent
9f7ef8b46b
commit
86d8f01033
@ -27,6 +27,7 @@
|
|||||||
/*****
|
/*****
|
||||||
* #define RS_DATA_SERVICE_DEBUG 1
|
* #define RS_DATA_SERVICE_DEBUG 1
|
||||||
* #define RS_DATA_SERVICE_DEBUG_TIME 1
|
* #define RS_DATA_SERVICE_DEBUG_TIME 1
|
||||||
|
* #define RS_DATA_SERVICE_DEBUG_CACHE 1
|
||||||
****/
|
****/
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
@ -123,6 +124,7 @@ RsDataService::RsDataService(const std::string &serviceDir, const std::string &d
|
|||||||
: RsGeneralDataService(), mDbMutex("RsDataService"), mServiceDir(serviceDir), mDbName(dbName), mDbPath(mServiceDir + "/" + dbName), mServType(serviceType), mDb(NULL)
|
: RsGeneralDataService(), mDbMutex("RsDataService"), mServiceDir(serviceDir), mDbName(dbName), mDbPath(mServiceDir + "/" + dbName), mServType(serviceType), mDb(NULL)
|
||||||
{
|
{
|
||||||
bool isNewDatabase = !RsDirUtil::fileExists(mDbPath);
|
bool isNewDatabase = !RsDirUtil::fileExists(mDbPath);
|
||||||
|
mGrpMetaDataCache_ContainsAllDatabase = false ;
|
||||||
|
|
||||||
mDb = new RetroDb(mDbPath, RetroDb::OPEN_READWRITE_CREATE, key);
|
mDb = new RetroDb(mDbPath, RetroDb::OPEN_READWRITE_CREATE, key);
|
||||||
|
|
||||||
@ -1231,6 +1233,9 @@ int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaRes
|
|||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
locked_retrieveMsgMeta(c, metaSet);
|
locked_retrieveMsgMeta(c, metaSet);
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << "Retrieving (all) Msg metadata grpId=" << grpId << ", " << std::dec << metaSet.size() << " messages" << std::endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
@ -1245,6 +1250,9 @@ int RsDataService::retrieveGxsMsgMetaData(const GxsMsgReq& reqIds, GxsMsgMetaRes
|
|||||||
if (c)
|
if (c)
|
||||||
{
|
{
|
||||||
locked_retrieveMsgMeta(c, metaSet);
|
locked_retrieveMsgMeta(c, metaSet);
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << "Retrieving Msg metadata grpId=" << grpId << ", " << std::dec << metaSet.size() << " messages" << std::endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1296,34 +1304,51 @@ int RsDataService::retrieveGxsGrpMetaData(std::map<RsGxsGroupId, RsGxsGrpMetaDat
|
|||||||
int requestedGroups = grp.size();
|
int requestedGroups = grp.size();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(grp.empty()){
|
if(grp.empty())
|
||||||
|
{
|
||||||
#ifdef RS_DATA_SERVICE_DEBUG
|
if(mGrpMetaDataCache_ContainsAllDatabase) // grab all the stash from the cache, so as to avoid decryption costs.
|
||||||
std::cerr << "RsDataService::retrieveGxsGrpMetaData() retrieving all";
|
{
|
||||||
std::cerr << std::endl;
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << (void*)this << ": RsDataService::retrieveGxsGrpMetaData() retrieving all from cache!" << std::endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "", "");
|
for(std::map<RsGxsGroupId,RsGxsGrpMetaData>::const_iterator it(mGrpMetaDataCache.begin());it!=mGrpMetaDataCache.end();++it)
|
||||||
|
grp[it->first] = new RsGxsGrpMetaData(it->second);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG
|
||||||
|
std::cerr << "RsDataService::retrieveGxsGrpMetaData() retrieving all" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
if(c)
|
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "", "");
|
||||||
{
|
|
||||||
bool valid = c->moveToFirst();
|
|
||||||
|
|
||||||
while(valid)
|
if(c)
|
||||||
{
|
{
|
||||||
RsGxsGrpMetaData* g = locked_getGrpMeta(*c, 0);
|
bool valid = c->moveToFirst();
|
||||||
if(g)
|
|
||||||
{
|
while(valid)
|
||||||
grp[g->mGroupId] = g;
|
{
|
||||||
}
|
RsGxsGrpMetaData* g = locked_getGrpMeta(*c, 0);
|
||||||
valid = c->moveToNext();
|
if(g)
|
||||||
|
{
|
||||||
|
grp[g->mGroupId] = g;
|
||||||
|
mGrpMetaDataCache[g->mGroupId] = *g ;
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << (void *)this << ": Retrieving (all) Grp metadata grpId=" << g->mGroupId << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
valid = c->moveToNext();
|
||||||
|
|
||||||
#ifdef RS_DATA_SERVICE_DEBUG_TIME
|
#ifdef RS_DATA_SERVICE_DEBUG_TIME
|
||||||
++resultCount;
|
++resultCount;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
delete c;
|
delete c;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mGrpMetaDataCache_ContainsAllDatabase = true ;
|
||||||
|
}
|
||||||
|
|
||||||
}else
|
}else
|
||||||
{
|
{
|
||||||
@ -1331,30 +1356,56 @@ int RsDataService::retrieveGxsGrpMetaData(std::map<RsGxsGroupId, RsGxsGrpMetaDat
|
|||||||
|
|
||||||
for(; mit != grp.end(); ++mit)
|
for(; mit != grp.end(); ++mit)
|
||||||
{
|
{
|
||||||
const RsGxsGroupId& grpId = mit->first;
|
std::map<RsGxsGroupId, RsGxsGrpMetaData>::const_iterator itt = mGrpMetaDataCache.find(mit->first) ;
|
||||||
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "grpId='" + grpId.toStdString() + "'", "");
|
if(itt != mGrpMetaDataCache.end())
|
||||||
|
|
||||||
if(c)
|
|
||||||
{
|
{
|
||||||
bool valid = c->moveToFirst();
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << "Retrieving Grp metadata grpId=" << mit->first << " from cache!" << std::endl;
|
||||||
|
#endif
|
||||||
|
grp[mit->first] = new RsGxsGrpMetaData(itt->second) ;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << "Retrieving Grp metadata grpId=" << mit->first ;
|
||||||
|
#endif
|
||||||
|
|
||||||
while(valid)
|
const RsGxsGroupId& grpId = mit->first;
|
||||||
{
|
RetroCursor* c = mDb->sqlQuery(GRP_TABLE_NAME, mGrpMetaColumns, "grpId='" + grpId.toStdString() + "'", "");
|
||||||
RsGxsGrpMetaData* g = locked_getGrpMeta(*c, 0);
|
|
||||||
|
|
||||||
if(g)
|
if(c)
|
||||||
{
|
{
|
||||||
grp[g->mGroupId] = g;
|
bool valid = c->moveToFirst();
|
||||||
}
|
|
||||||
valid = c->moveToNext();
|
//#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
if(!valid)
|
||||||
|
std::cerr << " Empty query! GrpId " << grpId << " is not in database" << std::endl;
|
||||||
|
//#endif
|
||||||
|
while(valid)
|
||||||
|
{
|
||||||
|
RsGxsGrpMetaData* g = locked_getGrpMeta(*c, 0);
|
||||||
|
|
||||||
|
if(g)
|
||||||
|
{
|
||||||
|
grp[g->mGroupId] = g;
|
||||||
|
mGrpMetaDataCache[g->mGroupId] = *g ;
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
std::cerr << ". Got it. Updating cache." << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
valid = c->moveToNext();
|
||||||
|
|
||||||
#ifdef RS_DATA_SERVICE_DEBUG_TIME
|
#ifdef RS_DATA_SERVICE_DEBUG_TIME
|
||||||
++resultCount;
|
++resultCount;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
delete c;
|
delete c;
|
||||||
}
|
}
|
||||||
|
#ifdef RS_DATA_SERVICE_DEBUG_CACHE
|
||||||
|
else
|
||||||
|
std::cerr << ". not found!" << std::endl;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -1391,13 +1442,23 @@ int RsDataService::resetDataStore()
|
|||||||
|
|
||||||
int RsDataService::updateGroupMetaData(GrpLocMetaData &meta)
|
int RsDataService::updateGroupMetaData(GrpLocMetaData &meta)
|
||||||
{
|
{
|
||||||
RsStackMutex stack(mDbMutex);
|
std::cerr << (void*)this << ": Updating Grp Meta data: grpId = " << meta.grpId << std::endl;
|
||||||
|
|
||||||
|
RsStackMutex stack(mDbMutex);
|
||||||
RsGxsGroupId& grpId = meta.grpId;
|
RsGxsGroupId& grpId = meta.grpId;
|
||||||
|
|
||||||
|
std::cerr << (void*)this << ": erasing old entry from cache." << std::endl;
|
||||||
|
|
||||||
|
mGrpMetaDataCache_ContainsAllDatabase = false ;
|
||||||
|
mGrpMetaDataCache.erase(meta.grpId) ;
|
||||||
|
|
||||||
return mDb->sqlUpdate(GRP_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "'", meta.val) ? 1 : 0;
|
return mDb->sqlUpdate(GRP_TABLE_NAME, KEY_GRP_ID+ "='" + grpId.toStdString() + "'", meta.val) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RsDataService::updateMessageMetaData(MsgLocMetaData &metaData)
|
int RsDataService::updateMessageMetaData(MsgLocMetaData &metaData)
|
||||||
{
|
{
|
||||||
|
std::cerr << (void*)this << ": Updating Msg Meta data: grpId = " << metaData.msgId.first << " msgId = " << metaData.msgId.second << std::endl;
|
||||||
|
|
||||||
RsStackMutex stack(mDbMutex);
|
RsStackMutex stack(mDbMutex);
|
||||||
RsGxsGroupId& grpId = metaData.msgId.first;
|
RsGxsGroupId& grpId = metaData.msgId.first;
|
||||||
RsGxsMessageId& msgId = metaData.msgId.second;
|
RsGxsMessageId& msgId = metaData.msgId.second;
|
||||||
|
@ -340,6 +340,13 @@ private:
|
|||||||
uint16_t mServType;
|
uint16_t mServType;
|
||||||
|
|
||||||
RetroDb* mDb;
|
RetroDb* mDb;
|
||||||
|
|
||||||
|
// used to store metadata instead of reading it from the database.
|
||||||
|
// The boolean variable below is also used to force re-reading when
|
||||||
|
// the entre list of grp metadata is requested (which happens quite often)
|
||||||
|
|
||||||
|
std::map<RsGxsGroupId,RsGxsGrpMetaData> mGrpMetaDataCache ;
|
||||||
|
bool mGrpMetaDataCache_ContainsAllDatabase ;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // RSDATASERVICE_H
|
#endif // RSDATASERVICE_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user