| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef WEBKIT_BROWSER_APPCACHE_APPCACHE_DATABASE_H_ | |
| 6 #define WEBKIT_BROWSER_APPCACHE_APPCACHE_DATABASE_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <set> | |
| 10 #include <vector> | |
| 11 | |
| 12 #include "base/basictypes.h" | |
| 13 #include "base/files/file_path.h" | |
| 14 #include "base/gtest_prod_util.h" | |
| 15 #include "base/memory/scoped_ptr.h" | |
| 16 #include "base/time/time.h" | |
| 17 #include "url/gurl.h" | |
| 18 #include "webkit/browser/webkit_storage_browser_export.h" | |
| 19 #include "webkit/common/appcache/appcache_interfaces.h" | |
| 20 | |
| 21 namespace sql { | |
| 22 class Connection; | |
| 23 class MetaTable; | |
| 24 class Statement; | |
| 25 class StatementID; | |
| 26 } | |
| 27 | |
| 28 namespace content { | |
| 29 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, CacheRecords); | |
| 30 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, EntryRecords); | |
| 31 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, QuickIntegrityCheck); | |
| 32 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, NamespaceRecords); | |
| 33 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, GroupRecords); | |
| 34 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, LazyOpen); | |
| 35 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, ExperimentalFlags); | |
| 36 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, OnlineWhiteListRecords); | |
| 37 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, ReCreate); | |
| 38 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, DeletableResponseIds); | |
| 39 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, OriginUsage); | |
| 40 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, UpgradeSchema3to5); | |
| 41 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, UpgradeSchema4to5); | |
| 42 FORWARD_DECLARE_TEST(AppCacheDatabaseTest, WasCorrutionDetected); | |
| 43 class AppCacheDatabaseTest; | |
| 44 class AppCacheStorageImplTest; | |
| 45 } | |
| 46 | |
| 47 namespace appcache { | |
| 48 | |
| 49 class WEBKIT_STORAGE_BROWSER_EXPORT AppCacheDatabase { | |
| 50 public: | |
| 51 struct WEBKIT_STORAGE_BROWSER_EXPORT GroupRecord { | |
| 52 GroupRecord(); | |
| 53 ~GroupRecord(); | |
| 54 | |
| 55 int64 group_id; | |
| 56 GURL origin; | |
| 57 GURL manifest_url; | |
| 58 base::Time creation_time; | |
| 59 base::Time last_access_time; | |
| 60 }; | |
| 61 | |
| 62 struct WEBKIT_STORAGE_BROWSER_EXPORT CacheRecord { | |
| 63 CacheRecord() | |
| 64 : cache_id(0), group_id(0), online_wildcard(false), cache_size(0) {} | |
| 65 | |
| 66 int64 cache_id; | |
| 67 int64 group_id; | |
| 68 bool online_wildcard; | |
| 69 base::Time update_time; | |
| 70 int64 cache_size; // the sum of all response sizes in this cache | |
| 71 }; | |
| 72 | |
| 73 struct EntryRecord { | |
| 74 EntryRecord() : cache_id(0), flags(0), response_id(0), response_size(0) {} | |
| 75 | |
| 76 int64 cache_id; | |
| 77 GURL url; | |
| 78 int flags; | |
| 79 int64 response_id; | |
| 80 int64 response_size; | |
| 81 }; | |
| 82 | |
| 83 struct WEBKIT_STORAGE_BROWSER_EXPORT NamespaceRecord { | |
| 84 NamespaceRecord(); | |
| 85 ~NamespaceRecord(); | |
| 86 | |
| 87 int64 cache_id; | |
| 88 GURL origin; | |
| 89 Namespace namespace_; | |
| 90 }; | |
| 91 | |
| 92 typedef std::vector<NamespaceRecord> NamespaceRecordVector; | |
| 93 | |
| 94 struct OnlineWhiteListRecord { | |
| 95 OnlineWhiteListRecord() : cache_id(0), is_pattern(false) {} | |
| 96 | |
| 97 int64 cache_id; | |
| 98 GURL namespace_url; | |
| 99 bool is_pattern; | |
| 100 }; | |
| 101 | |
| 102 explicit AppCacheDatabase(const base::FilePath& path); | |
| 103 ~AppCacheDatabase(); | |
| 104 | |
| 105 void Disable(); | |
| 106 bool is_disabled() const { return is_disabled_; } | |
| 107 bool was_corruption_detected() const { return was_corruption_detected_; } | |
| 108 | |
| 109 int64 GetOriginUsage(const GURL& origin); | |
| 110 bool GetAllOriginUsage(std::map<GURL, int64>* usage_map); | |
| 111 | |
| 112 bool FindOriginsWithGroups(std::set<GURL>* origins); | |
| 113 bool FindLastStorageIds( | |
| 114 int64* last_group_id, int64* last_cache_id, int64* last_response_id, | |
| 115 int64* last_deletable_response_rowid); | |
| 116 | |
| 117 bool FindGroup(int64 group_id, GroupRecord* record); | |
| 118 bool FindGroupForManifestUrl(const GURL& manifest_url, GroupRecord* record); | |
| 119 bool FindGroupsForOrigin( | |
| 120 const GURL& origin, std::vector<GroupRecord>* records); | |
| 121 bool FindGroupForCache(int64 cache_id, GroupRecord* record); | |
| 122 bool UpdateGroupLastAccessTime( | |
| 123 int64 group_id, base::Time last_access_time); | |
| 124 bool InsertGroup(const GroupRecord* record); | |
| 125 bool DeleteGroup(int64 group_id); | |
| 126 | |
| 127 bool FindCache(int64 cache_id, CacheRecord* record); | |
| 128 bool FindCacheForGroup(int64 group_id, CacheRecord* record); | |
| 129 bool FindCachesForOrigin( | |
| 130 const GURL& origin, std::vector<CacheRecord>* records); | |
| 131 bool InsertCache(const CacheRecord* record); | |
| 132 bool DeleteCache(int64 cache_id); | |
| 133 | |
| 134 bool FindEntriesForCache( | |
| 135 int64 cache_id, std::vector<EntryRecord>* records); | |
| 136 bool FindEntriesForUrl( | |
| 137 const GURL& url, std::vector<EntryRecord>* records); | |
| 138 bool FindEntry(int64 cache_id, const GURL& url, EntryRecord* record); | |
| 139 bool InsertEntry(const EntryRecord* record); | |
| 140 bool InsertEntryRecords( | |
| 141 const std::vector<EntryRecord>& records); | |
| 142 bool DeleteEntriesForCache(int64 cache_id); | |
| 143 bool AddEntryFlags(const GURL& entry_url, int64 cache_id, | |
| 144 int additional_flags); | |
| 145 bool FindResponseIdsForCacheAsVector( | |
| 146 int64 cache_id, std::vector<int64>* response_ids) { | |
| 147 return FindResponseIdsForCacheHelper(cache_id, response_ids, NULL); | |
| 148 } | |
| 149 bool FindResponseIdsForCacheAsSet( | |
| 150 int64 cache_id, std::set<int64>* response_ids) { | |
| 151 return FindResponseIdsForCacheHelper(cache_id, NULL, response_ids); | |
| 152 } | |
| 153 | |
| 154 bool FindNamespacesForOrigin( | |
| 155 const GURL& origin, | |
| 156 NamespaceRecordVector* intercepts, | |
| 157 NamespaceRecordVector* fallbacks); | |
| 158 bool FindNamespacesForCache( | |
| 159 int64 cache_id, | |
| 160 NamespaceRecordVector* intercepts, | |
| 161 std::vector<NamespaceRecord>* fallbacks); | |
| 162 bool InsertNamespaceRecords( | |
| 163 const NamespaceRecordVector& records); | |
| 164 bool InsertNamespace(const NamespaceRecord* record); | |
| 165 bool DeleteNamespacesForCache(int64 cache_id); | |
| 166 | |
| 167 bool FindOnlineWhiteListForCache( | |
| 168 int64 cache_id, std::vector<OnlineWhiteListRecord>* records); | |
| 169 bool InsertOnlineWhiteList(const OnlineWhiteListRecord* record); | |
| 170 bool InsertOnlineWhiteListRecords( | |
| 171 const std::vector<OnlineWhiteListRecord>& records); | |
| 172 bool DeleteOnlineWhiteListForCache(int64 cache_id); | |
| 173 | |
| 174 bool GetDeletableResponseIds(std::vector<int64>* response_ids, | |
| 175 int64 max_rowid, int limit); | |
| 176 bool InsertDeletableResponseIds(const std::vector<int64>& response_ids); | |
| 177 bool DeleteDeletableResponseIds(const std::vector<int64>& response_ids); | |
| 178 | |
| 179 // So our callers can wrap operations in transactions. | |
| 180 sql::Connection* db_connection() { | |
| 181 LazyOpen(true); | |
| 182 return db_.get(); | |
| 183 } | |
| 184 | |
| 185 private: | |
| 186 bool RunCachedStatementWithIds( | |
| 187 const sql::StatementID& statement_id, const char* sql, | |
| 188 const std::vector<int64>& ids); | |
| 189 bool RunUniqueStatementWithInt64Result(const char* sql, int64* result); | |
| 190 | |
| 191 bool FindResponseIdsForCacheHelper( | |
| 192 int64 cache_id, std::vector<int64>* ids_vector, | |
| 193 std::set<int64>* ids_set); | |
| 194 | |
| 195 // Record retrieval helpers | |
| 196 void ReadGroupRecord(const sql::Statement& statement, GroupRecord* record); | |
| 197 void ReadCacheRecord(const sql::Statement& statement, CacheRecord* record); | |
| 198 void ReadEntryRecord(const sql::Statement& statement, EntryRecord* record); | |
| 199 void ReadNamespaceRecords( | |
| 200 sql::Statement* statement, | |
| 201 NamespaceRecordVector* intercepts, | |
| 202 NamespaceRecordVector* fallbacks); | |
| 203 void ReadNamespaceRecord( | |
| 204 const sql::Statement* statement, NamespaceRecord* record); | |
| 205 void ReadOnlineWhiteListRecord( | |
| 206 const sql::Statement& statement, OnlineWhiteListRecord* record); | |
| 207 | |
| 208 // Database creation | |
| 209 bool LazyOpen(bool create_if_needed); | |
| 210 bool EnsureDatabaseVersion(); | |
| 211 bool CreateSchema(); | |
| 212 bool UpgradeSchema(); | |
| 213 | |
| 214 void ResetConnectionAndTables(); | |
| 215 | |
| 216 // Deletes the existing database file and the entire directory containing | |
| 217 // the database file including the disk cache in which response headers | |
| 218 // and bodies are stored, and then creates a new database file. | |
| 219 bool DeleteExistingAndCreateNewDatabase(); | |
| 220 | |
| 221 void OnDatabaseError(int err, sql::Statement* stmt); | |
| 222 | |
| 223 base::FilePath db_file_path_; | |
| 224 scoped_ptr<sql::Connection> db_; | |
| 225 scoped_ptr<sql::MetaTable> meta_table_; | |
| 226 bool is_disabled_; | |
| 227 bool is_recreating_; | |
| 228 bool was_corruption_detected_; | |
| 229 | |
| 230 friend class content::AppCacheDatabaseTest; | |
| 231 friend class content::AppCacheStorageImplTest; | |
| 232 | |
| 233 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, CacheRecords); | |
| 234 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, EntryRecords); | |
| 235 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, QuickIntegrityCheck); | |
| 236 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, NamespaceRecords); | |
| 237 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, GroupRecords); | |
| 238 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, LazyOpen); | |
| 239 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, ExperimentalFlags); | |
| 240 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, | |
| 241 OnlineWhiteListRecords); | |
| 242 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, ReCreate); | |
| 243 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, DeletableResponseIds); | |
| 244 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, OriginUsage); | |
| 245 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, UpgradeSchema3to5); | |
| 246 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, UpgradeSchema4to5); | |
| 247 FRIEND_TEST_ALL_PREFIXES(content::AppCacheDatabaseTest, WasCorrutionDetected); | |
| 248 | |
| 249 DISALLOW_COPY_AND_ASSIGN(AppCacheDatabase); | |
| 250 }; | |
| 251 | |
| 252 } // namespace appcache | |
| 253 | |
| 254 #endif // WEBKIT_BROWSER_APPCACHE_APPCACHE_DATABASE_H_ | |
| OLD | NEW |