ccls/src/cache.cc

47 lines
1.4 KiB
C++
Raw Normal View History

2017-04-09 02:24:32 +00:00
#include "cache.h"
#include "indexer.h"
#include <algorithm>
namespace {
std::string GetCachedFileName(const std::string& cache_directory, std::string source_file) {
assert(!cache_directory.empty());
2017-04-09 02:24:32 +00:00
std::replace(source_file.begin(), source_file.end(), '\\', '_');
std::replace(source_file.begin(), source_file.end(), '/', '_');
std::replace(source_file.begin(), source_file.end(), ':', '_');
std::replace(source_file.begin(), source_file.end(), '.', '_');
return cache_directory + source_file + ".json";
2017-04-09 02:24:32 +00:00
}
} // namespace
std::unique_ptr<IndexedFile> LoadCachedFile(IndexerConfig* config, const std::string& filename) {
if (!config->enableCacheRead)
return nullptr;
optional<std::string> file_content = ReadContent(GetCachedFileName(config->cacheDirectory, filename));
if (!file_content)
2017-04-09 02:24:32 +00:00
return nullptr;
optional<IndexedFile> indexed = Deserialize(filename, *file_content);
if (indexed && indexed->version == IndexedFile::kCurrentVersion)
2017-04-09 02:24:32 +00:00
return MakeUnique<IndexedFile>(indexed.value());
return nullptr;
}
void WriteToCache(IndexerConfig* config, const std::string& filename, IndexedFile& file) {
if (!config->enableCacheWrite)
return;
2017-04-09 02:24:32 +00:00
std::string indexed_content = Serialize(file);
std::ofstream cache;
cache.open(GetCachedFileName(config->cacheDirectory, filename));
2017-04-09 02:24:32 +00:00
assert(cache.good());
cache << indexed_content;
cache.close();
2017-04-19 00:05:14 +00:00
}