#ifndef NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_QUERIES_H_
#define NET_DISK_CACHE_SQL_SQL_PERSISTENT_STORE_QUERIES_H_
#include "base/notreached.h"
#include "base/strings/cstring_view.h"
namespace disk_cache_sql_queries {
namespace internal {
inline constexpr const char kInitSchema_CreateTableResources[] =
"CREATE TABLE resources("
"res_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
"last_used INTEGER NOT NULL,"
"hints INTEGER NOT NULL,"
"body_end INTEGER NOT NULL,"
"bytes_usage INTEGER NOT NULL,"
"doomed INTEGER NOT NULL,"
"check_sum INTEGER NOT NULL,"
"cache_key_hash INTEGER NOT NULL,"
"cache_key TEXT NOT NULL,"
"head BLOB)";
inline constexpr const char kInitSchema_CreateTableBlobs[] =
"CREATE TABLE blobs("
"blob_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
"res_id INTEGER NOT NULL,"
"start INTEGER NOT NULL,"
"end INTEGER NOT NULL,"
"check_sum INTEGER NOT NULL,"
"blob BLOB NOT NULL)";
inline constexpr const char kIndex_ResourcesCacheKeyHashDoomed[] =
"CREATE INDEX index_resources_cache_key_hash_doomed ON "
"resources(cache_key_hash, doomed)";
inline constexpr const char kIndex_LiveResourcesLastUsed[] =
"CREATE INDEX index_live_resources_last_used_bytes_usage ON "
"resources(last_used, bytes_usage) WHERE doomed=0";
inline constexpr const char kIndex_LiveResourcesHints[] =
"CREATE INDEX index_live_resources_hints ON "
"resources(hints) WHERE hints!=0 AND doomed=0";
inline constexpr const char kIndex_BlobsResIdStart[] =
"CREATE UNIQUE INDEX index_blobs_res_id_start ON "
"blobs(res_id, start)";
inline constexpr const char kOpenEntry_SelectLiveResources[] =
"SELECT "
"res_id,"
"last_used,"
"body_end,"
"check_sum,"
"head "
"FROM resources "
"WHERE "
"cache_key_hash=? AND "
"cache_key=? AND "
"doomed=0 "
"ORDER BY res_id DESC";
inline constexpr const char kCreateEntry_InsertIntoResources[] =
"INSERT INTO resources("
"last_used,"
"hints,"
"body_end,"
"bytes_usage,"
"doomed,"
"check_sum,"
"cache_key_hash,"
"cache_key) "
"VALUES(?,0,?,?,0,?,?,?) "
"RETURNING res_id";
inline constexpr const char kDoomEntry_MarkDoomedResources[] =
"UPDATE resources "
"SET "
"doomed=1 "
"WHERE "
"res_id=? AND "
"doomed=0 "
"RETURNING "
"bytes_usage";
inline constexpr const char kDeleteDoomedEntry_DeleteFromResources[] =
"DELETE FROM resources "
"WHERE "
"res_id=? AND "
"doomed=1";
inline constexpr const char kDeleteLiveEntry_DeleteFromResources[] =
"DELETE FROM resources "
"WHERE "
"cache_key_hash=? AND "
"cache_key=? AND "
"doomed=0 "
"RETURNING "
"res_id,"
"bytes_usage";
inline constexpr const char kDeleteAllEntries_DeleteFromResources[] =
"DELETE FROM resources";
inline constexpr const char kDeleteAllEntries_DeleteFromBlobs[] =
"DELETE FROM blobs";
inline constexpr const char kDeleteLiveEntriesBetween_SelectLiveResources[] =
"SELECT "
"res_id,"
"bytes_usage "
"FROM resources "
"WHERE "
"last_used>=? AND "
"last_used<? AND "
"doomed=0";
inline constexpr const char kDeleteResourceByResIds_DeleteFromResources[] =
"DELETE FROM resources WHERE res_id=?";
inline constexpr const char kUpdateEntryLastUsedByKey_UpdateResourceLastUsed[] =
"UPDATE resources "
"SET "
"last_used=? "
"WHERE "
"cache_key_hash=? AND "
"cache_key=? AND "
"doomed=0";
inline constexpr const char
kUpdateEntryLastUsedByResId_UpdateResourceLastUsed[] =
"UPDATE resources "
"SET "
"last_used=? "
"WHERE "
"res_id=? AND "
"doomed=0";
inline constexpr const char kUpdateEntryHeaderAndLastUsed_UpdateResource[] =
"UPDATE resources "
"SET "
"last_used=?, "
"bytes_usage=bytes_usage+?, "
"check_sum=?, "
"head=? "
"WHERE "
"res_id=? AND "
"doomed=0 "
"RETURNING "
"bytes_usage";
inline constexpr const char
kUpdateEntryHeaderAndLastUsed_UpdateResourceAndHints[] =
"UPDATE resources "
"SET "
"last_used=?, "
"hints=?, "
"bytes_usage=bytes_usage+?, "
"check_sum=?, "
"head=? "
"WHERE "
"res_id=? AND "
"doomed=0 "
"RETURNING "
"bytes_usage";
inline constexpr const char kWriteEntryData_UpdateResource[] =
"UPDATE resources "
"SET "
"body_end=body_end+?, "
"bytes_usage=bytes_usage+? "
"WHERE "
"res_id=? "
"RETURNING "
"body_end,"
"doomed";
inline constexpr const char kTrimOverlappingBlobs_DeleteContained[] =
"DELETE FROM blobs "
"WHERE "
"res_id=? AND "
"start>=? AND "
"end<=? "
"RETURNING "
"start,"
"end";
inline constexpr const char kTrimOverlappingBlobs_SelectOverlapping[] =
"SELECT "
"blob_id,"
"start,"
"end,"
"check_sum,"
"blob "
"FROM blobs "
"WHERE "
"res_id=? AND "
"start<? AND "
"end>?";
inline constexpr const char kTruncateBlobsAfter_DeleteAfter[] =
"DELETE FROM blobs "
"WHERE "
"res_id=? AND "
"start>=? "
"RETURNING "
"start,"
"end";
inline constexpr const char kInsertNewBlob_InsertIntoBlobs[] =
"INSERT INTO blobs("
"res_id,"
"start,"
"end,"
"check_sum,"
"blob) "
"VALUES(?,?,?,?,?)";
inline constexpr const char kDeleteBlobById_DeleteFromBlobs[] =
"DELETE FROM blobs "
"WHERE "
"blob_id=? "
"RETURNING "
"start,"
"end";
inline constexpr const char kDeleteBlobsByResId_DeleteFromBlobs[] =
"DELETE FROM blobs "
"WHERE "
"res_id=?";
inline constexpr const char kReadEntryData_SelectOverlapping[] =
"SELECT "
"start,"
"end,"
"check_sum,"
"blob "
"FROM blobs "
"WHERE "
"res_id=? AND "
"start<? AND "
"end>? "
"ORDER BY start";
inline constexpr const char kGetEntryAvailableRange_SelectOverlapping[] =
"SELECT "
"start,"
"end "
"FROM blobs "
"WHERE "
"res_id=? AND "
"start<? AND "
"end>? "
"ORDER BY start";
inline constexpr const char
kCalculateSizeOfEntriesBetween_SelectLiveResources[] =
"SELECT "
"bytes_usage "
"FROM resources "
"WHERE "
"last_used>=? AND "
"last_used<? AND "
"doomed=0";
inline constexpr const char kOpenNextEntry_SelectLiveResources[] =
"SELECT "
"res_id,"
"last_used,"
"body_end,"
"check_sum,"
"cache_key,"
"head "
"FROM resources "
"WHERE "
"res_id<? AND "
"doomed=0 "
"ORDER BY res_id DESC";
inline constexpr const char kStartEviction_SelectLiveResources[] =
"SELECT "
"res_id,"
"bytes_usage, "
"last_used "
"FROM resources "
"WHERE "
"doomed=0 "
"ORDER BY last_used";
inline constexpr const char
kCalculateResourceEntryCount_SelectCountFromLiveResources[] =
"SELECT COUNT(*) FROM resources WHERE doomed=0";
inline constexpr const char
kCalculateTotalSize_SelectTotalSizeFromLiveResources[] =
"SELECT SUM(bytes_usage) FROM resources WHERE doomed=0";
inline constexpr const char
kLoadInMemoryIndex_SelectCacheKeyHashFromLiveResources[] =
"SELECT "
"res_id, "
"cache_key_hash, "
"doomed "
"FROM resources "
"ORDER BY cache_key_hash";
inline constexpr const char kLoadInMemoryIndex_SelectHintsFromLiveResources[] =
"SELECT "
"res_id, "
"hints "
"FROM resources "
"WHERE hints!=0 AND doomed=0";
}
enum class Query {
kInitSchema_CreateTableResources,
kInitSchema_CreateTableBlobs,
kIndex_ResourcesCacheKeyHashDoomed,
kIndex_LiveResourcesLastUsed,
kIndex_LiveResourcesHints,
kIndex_BlobsResIdStart,
kOpenEntry_SelectLiveResources,
kCreateEntry_InsertIntoResources,
kDoomEntry_MarkDoomedResources,
kDeleteDoomedEntry_DeleteFromResources,
kDeleteLiveEntry_DeleteFromResources,
kDeleteAllEntries_DeleteFromResources,
kDeleteAllEntries_DeleteFromBlobs,
kDeleteLiveEntriesBetween_SelectLiveResources,
kDeleteResourceByResIds_DeleteFromResources,
kUpdateEntryLastUsedByKey_UpdateResourceLastUsed,
kUpdateEntryLastUsedByResId_UpdateResourceLastUsed,
kUpdateEntryHeaderAndLastUsed_UpdateResource,
kUpdateEntryHeaderAndLastUsed_UpdateResourceAndHints,
kWriteEntryData_UpdateResource,
kTrimOverlappingBlobs_DeleteContained,
kTrimOverlappingBlobs_SelectOverlapping,
kTruncateBlobsAfter_DeleteAfter,
kInsertNewBlob_InsertIntoBlobs,
kDeleteBlobById_DeleteFromBlobs,
kDeleteBlobsByResId_DeleteFromBlobs,
kReadEntryData_SelectOverlapping,
kGetEntryAvailableRange_SelectOverlapping,
kCalculateSizeOfEntriesBetween_SelectLiveResources,
kOpenNextEntry_SelectLiveResources,
kStartEviction_SelectLiveResources,
kCalculateResourceEntryCount_SelectCountFromLiveResources,
kCalculateTotalSize_SelectTotalSizeFromLiveResources,
kLoadInMemoryIndex_SelectCacheKeyHashFromLiveResources,
kLoadInMemoryIndex_SelectHintsFromLiveResources,
kMaxValue = kLoadInMemoryIndex_SelectHintsFromLiveResources,
};
inline base::cstring_view GetQuery(Query query) {
switch (query) {
case Query::kInitSchema_CreateTableResources:
return internal::kInitSchema_CreateTableResources;
case Query::kInitSchema_CreateTableBlobs:
return internal::kInitSchema_CreateTableBlobs;
case Query::kIndex_ResourcesCacheKeyHashDoomed:
return internal::kIndex_ResourcesCacheKeyHashDoomed;
case Query::kIndex_LiveResourcesLastUsed:
return internal::kIndex_LiveResourcesLastUsed;
case Query::kIndex_LiveResourcesHints:
return internal::kIndex_LiveResourcesHints;
case Query::kIndex_BlobsResIdStart:
return internal::kIndex_BlobsResIdStart;
case Query::kOpenEntry_SelectLiveResources:
return internal::kOpenEntry_SelectLiveResources;
case Query::kCreateEntry_InsertIntoResources:
return internal::kCreateEntry_InsertIntoResources;
case Query::kDoomEntry_MarkDoomedResources:
return internal::kDoomEntry_MarkDoomedResources;
case Query::kDeleteDoomedEntry_DeleteFromResources:
return internal::kDeleteDoomedEntry_DeleteFromResources;
case Query::kDeleteLiveEntry_DeleteFromResources:
return internal::kDeleteLiveEntry_DeleteFromResources;
case Query::kDeleteAllEntries_DeleteFromResources:
return internal::kDeleteAllEntries_DeleteFromResources;
case Query::kDeleteAllEntries_DeleteFromBlobs:
return internal::kDeleteAllEntries_DeleteFromBlobs;
case Query::kDeleteLiveEntriesBetween_SelectLiveResources:
return internal::kDeleteLiveEntriesBetween_SelectLiveResources;
case Query::kDeleteResourceByResIds_DeleteFromResources:
return internal::kDeleteResourceByResIds_DeleteFromResources;
case Query::kUpdateEntryLastUsedByKey_UpdateResourceLastUsed:
return internal::kUpdateEntryLastUsedByKey_UpdateResourceLastUsed;
case Query::kUpdateEntryLastUsedByResId_UpdateResourceLastUsed:
return internal::kUpdateEntryLastUsedByResId_UpdateResourceLastUsed;
case Query::kUpdateEntryHeaderAndLastUsed_UpdateResource:
return internal::kUpdateEntryHeaderAndLastUsed_UpdateResource;
case Query::kUpdateEntryHeaderAndLastUsed_UpdateResourceAndHints:
return internal::kUpdateEntryHeaderAndLastUsed_UpdateResourceAndHints;
case Query::kWriteEntryData_UpdateResource:
return internal::kWriteEntryData_UpdateResource;
case Query::kTrimOverlappingBlobs_DeleteContained:
return internal::kTrimOverlappingBlobs_DeleteContained;
case Query::kTrimOverlappingBlobs_SelectOverlapping:
return internal::kTrimOverlappingBlobs_SelectOverlapping;
case Query::kTruncateBlobsAfter_DeleteAfter:
return internal::kTruncateBlobsAfter_DeleteAfter;
case Query::kInsertNewBlob_InsertIntoBlobs:
return internal::kInsertNewBlob_InsertIntoBlobs;
case Query::kDeleteBlobById_DeleteFromBlobs:
return internal::kDeleteBlobById_DeleteFromBlobs;
case Query::kDeleteBlobsByResId_DeleteFromBlobs:
return internal::kDeleteBlobsByResId_DeleteFromBlobs;
case Query::kReadEntryData_SelectOverlapping:
return internal::kReadEntryData_SelectOverlapping;
case Query::kGetEntryAvailableRange_SelectOverlapping:
return internal::kGetEntryAvailableRange_SelectOverlapping;
case Query::kCalculateSizeOfEntriesBetween_SelectLiveResources:
return internal::kCalculateSizeOfEntriesBetween_SelectLiveResources;
case Query::kOpenNextEntry_SelectLiveResources:
return internal::kOpenNextEntry_SelectLiveResources;
case Query::kStartEviction_SelectLiveResources:
return internal::kStartEviction_SelectLiveResources;
case Query::kCalculateResourceEntryCount_SelectCountFromLiveResources:
return internal::
kCalculateResourceEntryCount_SelectCountFromLiveResources;
case Query::kCalculateTotalSize_SelectTotalSizeFromLiveResources:
return internal::kCalculateTotalSize_SelectTotalSizeFromLiveResources;
case Query::kLoadInMemoryIndex_SelectCacheKeyHashFromLiveResources:
return internal::kLoadInMemoryIndex_SelectCacheKeyHashFromLiveResources;
case Query::kLoadInMemoryIndex_SelectHintsFromLiveResources:
return internal::kLoadInMemoryIndex_SelectHintsFromLiveResources;
}
NOTREACHED();
}
}
#endif