Implemented updating of revision files as new data is writing to the FileCache

This commit is contained in:
Robert Osfield
2009-06-04 14:07:12 +00:00
parent cf976e956d
commit 40155d59b4
7 changed files with 1690 additions and 53 deletions

View File

@@ -87,7 +87,12 @@ ReaderWriter::WriteResult FileCache::writeObject(const osg::Object& object, cons
}
osg::notify(osg::INFO)<<"FileCache::writeObjectToCache("<<originalFileName<<") as "<<cacheFileName<<std::endl;
return osgDB::Registry::instance()->writeObject(object, cacheFileName, options);
ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeObject(object, cacheFileName, options);
if (result.success())
{
removeFileFromBlackListed(originalFileName);
}
return result;
}
return ReaderWriter::WriteResult::FILE_NOT_HANDLED;
}
@@ -120,7 +125,12 @@ ReaderWriter::WriteResult FileCache::writeImage(const osg::Image& image, const s
}
osg::notify(osg::INFO)<<"FileCache::writeImageToCache("<<originalFileName<<") as "<<cacheFileName<<std::endl;
return osgDB::Registry::instance()->writeImage(image, cacheFileName, options);
ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeImage(image, cacheFileName, options);
if (result.success())
{
removeFileFromBlackListed(originalFileName);
}
return result;
}
return ReaderWriter::WriteResult::FILE_NOT_HANDLED;
}
@@ -153,7 +163,12 @@ ReaderWriter::WriteResult FileCache::writeHeightField(const osg::HeightField& hf
}
osg::notify(osg::INFO)<<"FileCache::writeHeightFieldToCache("<<originalFileName<<") as "<<cacheFileName<<std::endl;
return osgDB::Registry::instance()->writeHeightField(hf, cacheFileName, options);
ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeHeightField(hf, cacheFileName, options);
if (result.success())
{
removeFileFromBlackListed(originalFileName);
}
return result;
}
return ReaderWriter::WriteResult::FILE_NOT_HANDLED;
}
@@ -186,7 +201,12 @@ ReaderWriter::WriteResult FileCache::writeNode(const osg::Node& node, const std:
}
osg::notify(osg::INFO)<<"FileCache::writeNodeToCache("<<originalFileName<<") as "<<cacheFileName<<std::endl;
return osgDB::Registry::instance()->writeNode(node, cacheFileName, options);
ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeNode(node, cacheFileName, options);
if (result.success())
{
removeFileFromBlackListed(originalFileName);
}
return result;
}
return ReaderWriter::WriteResult::FILE_NOT_HANDLED;
}
@@ -220,7 +240,12 @@ ReaderWriter::WriteResult FileCache::writeShader(const osg::Shader& shader, cons
}
osg::notify(osg::INFO)<<"FileCache::writeShaderToCache("<<originalFileName<<") as "<<cacheFileName<<std::endl;
return osgDB::Registry::instance()->writeShader(shader, cacheFileName, options);
ReaderWriter::WriteResult result = osgDB::Registry::instance()->writeShader(shader, cacheFileName, options);
if (result.success())
{
removeFileFromBlackListed(originalFileName);
}
return result;
}
return ReaderWriter::WriteResult::FILE_NOT_HANDLED;
}
@@ -228,7 +253,6 @@ ReaderWriter::WriteResult FileCache::writeShader(const osg::Shader& shader, cons
bool FileCache::isCachedFileBlackListed(const std::string& originalFileName) const
{
osg::notify(osg::NOTICE)<<"FileCache::isCachedFileBlackListed("<<originalFileName<<")"<<std::endl;
for(DatabaseRevisionsList::const_iterator itr = _databaseRevisionsList.begin();
itr != _databaseRevisionsList.end();
++itr)
@@ -238,22 +262,189 @@ bool FileCache::isCachedFileBlackListed(const std::string& originalFileName) con
return false;
}
bool FileCache::removeFileFromBlackListed(const std::string& originalFileName) const
{
for(DatabaseRevisionsList::const_iterator dr_itr = _databaseRevisionsList.begin();
dr_itr != _databaseRevisionsList.end();
++dr_itr)
{
DatabaseRevisions* dr = dr_itr->get();
if (dr->getDatabasePath().length()>=originalFileName.length()) continue;
if (originalFileName.compare(0,dr->getDatabasePath().length(), dr->getDatabasePath())!=0) continue;
std::string localPath(originalFileName,
dr->getDatabasePath().empty() ? 0 : dr->getDatabasePath().length()+1,
std::string::npos);
for(DatabaseRevisions::DatabaseRevisionList::const_iterator itr = dr->getDatabaseRevisionList().begin();
itr != dr->getDatabaseRevisionList().end();
++itr)
{
DatabaseRevision* revision = const_cast<DatabaseRevision*>(itr->get());
if (revision->getFilesAdded() && revision->getFilesAdded()->removeFile(localPath))
{
std::string cacheFileName = revision->getFilesAdded()->getName();
if (containsServerAddress(cacheFileName)) cacheFileName = createCacheFileName(cacheFileName);
if (!cacheFileName.empty()) writeObjectFile(*(revision->getFilesAdded()), cacheFileName);
}
if (revision->getFilesRemoved() && revision->getFilesRemoved()->removeFile(localPath))
{
std::string cacheFileName = revision->getFilesRemoved()->getName();
if (containsServerAddress(cacheFileName)) cacheFileName = createCacheFileName(cacheFileName);
if (!cacheFileName.empty()) writeObjectFile(*(revision->getFilesRemoved()), cacheFileName);
}
if (revision->getFilesModified() && revision->getFilesModified()->removeFile(localPath))
{
std::string cacheFileName = revision->getFilesModified()->getName();
if (containsServerAddress(cacheFileName)) cacheFileName = createCacheFileName(cacheFileName);
if (!cacheFileName.empty()) writeObjectFile(*(revision->getFilesModified()), cacheFileName);
}
}
}
return false;
}
bool FileCache::loadDatabaseRevisionsForFile(const std::string& originalFileName)
{
osg::notify(osg::NOTICE)<<"FileCache::loadDatabaseRevisionsForFile("<<originalFileName<<")"<<std::endl;
osg::notify(osg::INFO)<<"FileCache::loadDatabaseRevisionsForFile("<<originalFileName<<")"<<std::endl;
std::string revisionsFileName = originalFileName;
if (getLowerCaseFileExtension(revisionsFileName)!="revisions") revisionsFileName += ".revisions";
osg::notify(osg::NOTICE)<<" revisionsFileName("<<revisionsFileName<<")"<<std::endl;
osg::notify(osg::INFO)<<" revisionsFileName("<<revisionsFileName<<")"<<std::endl;
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(revisionsFileName);
DatabaseRevisions* dr = dynamic_cast<DatabaseRevisions*>(object.get());
osg::ref_ptr<DatabaseRevisions> dr_local;
if (dr)
std::string cacheFileName = createCacheFileName(revisionsFileName);
// check to see if revion file is already loaded.
DatabaseRevisionsList::iterator ritr = _databaseRevisionsList.begin();
for(;
ritr != _databaseRevisionsList.end() && !dr_local;
++ritr)
{
osg::notify(osg::NOTICE)<<" loaded revisions File("<<revisionsFileName<<")"<<std::endl;
_databaseRevisionsList.push_back(dr);
osg::notify(osg::INFO)<<" comparing "<<(*ritr)->getName()<<" to "<<revisionsFileName<<std::endl;
if ((*ritr)->getName()==revisionsFileName)
{
osg::notify(osg::INFO)<<"Already loaded"<<std::endl;
dr_local = *ritr;
}
}
if (!dr_local)
{
if (!cacheFileName.empty() && osgDB::fileExists(cacheFileName))
{
osg::notify(osg::INFO)<<" found revisions file in local cache, now loading it"<<std::endl;
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(cacheFileName);
dr_local = dynamic_cast<DatabaseRevisions*>(object.get());
if (dr_local)
{
osg::notify(osg::INFO)<<" loaded local revisions File("<<cacheFileName<<")"<<std::endl;
}
}
else
{
osg::notify(osg::INFO)<<" could not load found revisions file from local cache."<<std::endl;
}
}
// now load revision file from remote server
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(revisionsFileName+".curl");
osg::ref_ptr<DatabaseRevisions> dr_remote = dynamic_cast<DatabaseRevisions*>(object.get());
if (dr_remote.valid())
{
bool needToWriteRevisionsFileToDisk = true;
if (dr_local.valid())
{
if (dr_local->getDatabaseRevisionList().size()==dr_remote->getDatabaseRevisionList().size())
{
unsigned int i;
for(i=0; i<dr_local->getDatabaseRevisionList().size(); ++i)
{
DatabaseRevision* revision_local = dr_local->getDatabaseRevision(i);
DatabaseRevision* revision_remote = dr_remote->getDatabaseRevision(i);
osg::notify(osg::INFO)<<" Comparing local "<<revision_local->getName()<<" to remote "<<revision_remote->getName()<<std::endl;
if (revision_local->getName()!=revision_remote->getName()) break;
}
needToWriteRevisionsFileToDisk = (i!=dr_local->getDatabaseRevisionList().size());
osg::notify(osg::INFO)<<"Local and remote revisions are different "<<needToWriteRevisionsFileToDisk<<std::endl;
}
}
if (needToWriteRevisionsFileToDisk)
{
osg::notify(osg::INFO)<<"Need to write DatabaseRevions "<<revisionsFileName<<" to local FileCache"<<std::endl;
if (!cacheFileName.empty()) writeObjectFile(*dr_remote, cacheFileName);
}
else
{
osg::notify(osg::INFO)<<"No need to write DatabaseRevions "<<revisionsFileName<<" to local FileCache"<<std::endl;
}
}
osg::ref_ptr<DatabaseRevisions> dr = dr_remote.valid() ? dr_remote : dr_local;
if (dr.valid())
{
osg::notify(osg::INFO)<<" loaded remote revisions File("<<revisionsFileName<<")"<<std::endl;
if (ritr != _databaseRevisionsList.end())
{
// replace already loaded DatabaseRevisions object
osg::notify(osg::INFO)<<"Replacing already loaded DatabaseRevisions object"<<std::endl;
*ritr = dr;
}
else
{
osg::notify(osg::INFO)<<"Added newly loaded DatabaseRevisions object "<<dr->getName()<<std::endl;
_databaseRevisionsList.push_back(dr);
}
// now need to load the individual FileLists
for(DatabaseRevisions::DatabaseRevisionList::iterator itr = dr->getDatabaseRevisionList().begin();
itr != dr->getDatabaseRevisionList().end();
++itr)
{
DatabaseRevision* revision = itr->get();
osg::notify(osg::INFO)<<" now loaded DatabaseRevisions "<<revision->getName()<<" FileList contents"<<std::endl;
if (revision->getFilesAdded())
{
FileList* fileList = readFileList(osgDB::concatPaths(revision->getDatabasePath(), revision->getFilesAdded()->getName()));
if (fileList)
{
revision->setFilesAdded(fileList);
}
}
if (revision->getFilesRemoved())
{
FileList* fileList = readFileList(osgDB::concatPaths(revision->getDatabasePath(), revision->getFilesRemoved()->getName()));
if (fileList)
{
revision->setFilesRemoved(fileList);
}
}
if (revision->getFilesModified())
{
FileList* fileList = readFileList(osgDB::concatPaths(revision->getDatabasePath(), revision->getFilesModified()->getName()));
if (fileList)
{
revision->setFilesModified(fileList);
}
}
}
return true;
}
else
@@ -262,3 +453,30 @@ bool FileCache::loadDatabaseRevisionsForFile(const std::string& originalFileName
return false;
}
}
FileList* FileCache::readFileList(const std::string& originalFileName) const
{
osg::ref_ptr<FileList> fileList;
std::string cacheFileListName = createCacheFileName(originalFileName);
if (!cacheFileListName.empty() && osgDB::fileExists(cacheFileListName))
{
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(cacheFileListName);
fileList = dynamic_cast<osgDB::FileList*>(object.get());
if (fileList) osg::notify(osg::INFO)<<" loadeded FileList from local cache "<<fileList->getName()<<std::endl;
}
if (!fileList)
{
osg::notify(osg::INFO)<<" complete_path="<<originalFileName<<std::endl;
osg::ref_ptr<osg::Object> object = osgDB::readObjectFile(originalFileName+".curl");
fileList = dynamic_cast<osgDB::FileList*>(object.get());
if (fileList)
{
osg::notify(osg::INFO)<<" loadeded FileList from remote system "<<fileList->getName()<<std::endl;
osg::notify(osg::INFO)<<" Need to write to local file cache "<<fileList->getName()<<std::endl;
if (!cacheFileListName.empty()) writeObjectFile(*fileList, cacheFileListName);
}
}
return fileList.release();
}