PySubStream *CachedObjectMgr::LoadCachedFile(PyRep *key, const char *oname) { std::string fname; GetCacheFileName(key, fname); std::string abs_fname = "../data/cache/"; abs_fname += fname; return(LoadCachedFile(abs_fname.c_str(), oname)); }
// Publish //------------------------------------------------------------------------------ /*virtual*/ bool Cache::Publish( const AString & cacheId, const void * data, size_t dataSize ) { AStackString<> cacheFileName; GetCacheFileName( cacheId, cacheFileName ); // make sure the cache output path exists char * lastSlash = cacheFileName.FindLast( NATIVE_SLASH ); *lastSlash = 0; if ( !FileIO::EnsurePathExists( cacheFileName ) ) { return false; } *lastSlash = NATIVE_SLASH; // open output cache (tmp) file AStackString<> cacheFileTmpName( cacheFileName ); cacheFileTmpName += ".tmp"; FileStream cacheTmpFile; if( !cacheTmpFile.Open( cacheFileTmpName.Get(), FileStream::WRITE_ONLY ) ) { return false; } // write data bool cacheTmpWriteOk = ( cacheTmpFile.Write( data, dataSize ) == dataSize ); cacheTmpFile.Close(); if ( !cacheTmpWriteOk ) { // failed to write to cache tmp file FileIO::FileDelete( cacheFileTmpName.Get() ); // try to cleanup failure return false; } // rename tmp file to real file if ( FileIO::FileMove( cacheFileTmpName, cacheFileName ) == false ) { // try to delete (possibly) existing file FileIO::FileDelete( cacheFileName.Get() ); // try rename again if ( FileIO::FileMove( cacheFileTmpName, cacheFileName ) == false ) { // problem renaming file FileIO::FileDelete( cacheFileTmpName.Get() ); // try to cleanup tmp file return false; } } return true; }
// Retrieve //------------------------------------------------------------------------------ /*virtual*/ bool Cache::Retrieve( const AString & cacheId, void * & data, size_t & dataSize ) { data = nullptr; dataSize = 0; AStackString<> cacheFileName; GetCacheFileName( cacheId, cacheFileName ); FileStream cacheFile; if ( cacheFile.Open( cacheFileName.Get(), FileStream::READ_ONLY ) ) { const size_t cacheFileSize = (size_t)cacheFile.GetFileSize(); AutoPtr< char > mem( (char *)ALLOC( cacheFileSize ) ); if ( cacheFile.Read( mem.Get(), cacheFileSize ) == cacheFileSize ) { dataSize = cacheFileSize; data = mem.Release(); return true; } } return false; }