1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
#define CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
#pragma once
#include <vector>
#include "base/gtest_prod_util.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "chrome/browser/history/history_types.h"
#include "sql/connection.h"
#include "sql/init_status.h"
#include "sql/meta_table.h"
class FilePath;
class RefCountedMemory;
struct ThumbnailScore;
class SkBitmap;
namespace base {
class Time;
}
namespace gfx {
class Image;
}
namespace history {
class ExpireHistoryBackend;
class HistoryPublisher;
// This database interface is owned by the history backend and runs on the
// history thread. It is a totally separate component from history partially
// because we may want to move it to its own thread in the future. The
// operations we will do on this database will be slow, but we can tolerate
// higher latency (it's OK for thumbnails to come in slower than the rest
// of the data). Moving this to a separate thread would not block potentially
// higher priority history operations.
class ThumbnailDatabase {
public:
ThumbnailDatabase();
~ThumbnailDatabase();
// Must be called after creation but before any other methods are called.
// When not INIT_OK, no other functions should be called.
sql::InitStatus Init(const FilePath& db_name,
const HistoryPublisher* history_publisher,
URLDatabase* url_database);
// Open database on a given filename. If the file does not exist,
// it is created.
// |db| is the database to open.
// |db_name| is a path to the database file.
static sql::InitStatus OpenDatabase(sql::Connection* db,
const FilePath& db_name);
// Transactions on the database.
void BeginTransaction();
void CommitTransaction();
int transaction_nesting() const {
return db_.transaction_nesting();
}
// Vacuums the database. This will cause sqlite to defragment and collect
// unused space in the file. It can be VERY SLOW.
void Vacuum();
// Thumbnails ----------------------------------------------------------------
// Sets the given data to be the thumbnail for the given URL,
// overwriting any previous data. If the SkBitmap contains no pixel
// data, the thumbnail will be deleted.
void SetPageThumbnail(const GURL& url,
URLID id,
const gfx::Image* thumbnail,
const ThumbnailScore& score,
base::Time time);
// Retrieves thumbnail data for the given URL, returning true on success,
// false if there is no such thumbnail or there was some other error.
bool GetPageThumbnail(URLID id, std::vector<unsigned char>* data);
// Delete the thumbnail with the provided id. Returns false on failure
bool DeleteThumbnail(URLID id);
// If there is a thumbnail score for the id provided, retrieves the
// current thumbnail score and places it in |score| and returns
// true. Returns false otherwise.
bool ThumbnailScoreForId(URLID id, ThumbnailScore* score);
// Called by the to delete all old thumbnails and make a clean table.
// Returns true on success.
bool RecreateThumbnailTable();
// Favicons ------------------------------------------------------------------
// Sets the bits for a favicon. This should be png encoded data.
// The time indicates the access time, and is used to detect when the favicon
// should be refreshed.
bool SetFavicon(FaviconID icon_id,
scoped_refptr<RefCountedMemory> icon_data,
base::Time time);
// Sets the time the favicon was last updated.
bool SetFaviconLastUpdateTime(FaviconID icon_id, base::Time time);
// Returns the id of the entry in the favicon database with the specified url
// and icon type. If |required_icon_type| contains multiple icon types and
// there are more than one matched icon in database, only one icon will be
// returned in the priority of TOUCH_PRECOMPOSED_ICON, TOUCH_ICON, and
// FAVICON, and the icon type is returned in icon_type parameter if it is not
// NULL.
// Returns 0 if no entry exists for the specified url.
FaviconID GetFaviconIDForFaviconURL(const GURL& icon_url,
int required_icon_type,
IconType* icon_type);
// Gets the png encoded favicon and last updated time for the specified
// favicon id.
bool GetFavicon(FaviconID icon_id,
base::Time* last_updated,
std::vector<unsigned char>* png_icon_data,
GURL* icon_url);
// Adds the favicon URL and icon type to the favicon db, returning its id.
FaviconID AddFavicon(const GURL& icon_url, IconType icon_type);
// Delete the favicon with the provided id. Returns false on failure
bool DeleteFavicon(FaviconID id);
// Icon Mapping --------------------------------------------------------------
//
// Returns true if there is a matched icon mapping for the given page and
// icon type.
// The matched icon mapping is returned in the icon_mapping parameter if it is
// not NULL.
bool GetIconMappingForPageURL(const GURL& page_url,
IconType required_icon_type,
IconMapping* icon_mapping);
// Returns true if there is any matched icon mapping for the given page.
// All matched icon mappings are returned in descent order of IconType if
// mapping_data is not NULL.
bool GetIconMappingsForPageURL(const GURL& page_url,
std::vector<IconMapping>* mapping_data);
// Adds a mapping between the given page_url and icon_id.
// Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
IconMappingID AddIconMapping(const GURL& page_url, FaviconID icon_id);
// Updates the page and icon mapping for the given mapping_id with the given
// icon_id.
// Returns true if the update succeeded.
bool UpdateIconMapping(IconMappingID mapping_id, FaviconID icon_id);
// Deletes the icon mapping entries for the given page url.
// Returns true if the deletion succeeded.
bool DeleteIconMappings(const GURL& page_url);
// Checks whether a favicon is used by any URLs in the database.
bool HasMappingFor(FaviconID id);
// Clones the existing mappings from |old_page_url| if |new_page_url| has no
// mappings. Otherwise, will leave mappings alone.
bool CloneIconMapping(const GURL& old_page_url, const GURL& new_page_url);
// Temporary IconMapping -----------------------------------------------------
//
// Creates a temporary table to store icon mapping. Icon mapping will be
// copied to this table by AddToTemporaryIconMappingTable() and then the
// original table will be dropped, leaving only those copied mapping
// remaining. This is used to quickly delete most of the icon mapping when
// clearing history.
bool InitTemporaryIconMappingTable() {
return InitIconMappingTable(&db_, true);
}
// Copies the given icon mapping from the "main" icon_mapping table to the
// temporary one. This is only valid in between calls to
// InitTemporaryIconMappingTable()
// and CommitTemporaryIconMappingTable().
//
// The ID of the favicon will change when this copy takes place. The new ID
// is returned, or 0 on failure.
IconMappingID AddToTemporaryIconMappingTable(const GURL& page_url,
const FaviconID icon_id);
// Replaces the main icon mapping table with the temporary table created by
// InitTemporaryIconMappingTable(). This will mean all icon mapping not copied
// over will be deleted. Returns true on success.
bool CommitTemporaryIconMappingTable();
// Temporary Favicons --------------------------------------------------------
// Create a temporary table to store favicons. Favicons will be copied to
// this table by CopyToTemporaryFaviconTable() and then the original table
// will be dropped, leaving only those copied favicons remaining. This is
// used to quickly delete most of the favicons when clearing history.
bool InitTemporaryFaviconsTable() {
return InitFaviconsTable(&db_, true);
}
// Copies the given favicon from the "main" favicon table to the temporary
// one. This is only valid in between calls to InitTemporaryFaviconsTable()
// and CommitTemporaryFaviconTable().
//
// The ID of the favicon will change when this copy takes place. The new ID
// is returned, or 0 on failure.
FaviconID CopyToTemporaryFaviconTable(FaviconID source);
// Replaces the main URL table with the temporary table created by
// InitTemporaryFaviconsTable(). This will mean all favicons not copied over
// will be deleted. Returns true on success.
bool CommitTemporaryFaviconTable();
// Returns true iff the thumbnails table exists.
// Migrating to TopSites is dropping the thumbnails table.
bool NeedsMigrationToTopSites();
// Renames the database file and drops the Thumbnails table.
bool RenameAndDropThumbnails(const FilePath& old_db_file,
const FilePath& new_db_file);
private:
friend class ExpireHistoryBackend;
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest,
GetFaviconAfterMigrationToTopSites);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion4);
FRIEND_TEST_ALL_PREFIXES(ThumbnailDatabaseTest, UpgradeToVersion5);
FRIEND_TEST_ALL_PREFIXES(HistoryBackendTest, MigrationIconMapping);
// Creates the thumbnail table, returning true if the table already exists
// or was successfully created.
bool InitThumbnailTable();
// Creates the favicon table, returning true if the table already exists,
// or was successfully created. |is_temporary| will be false when generating
// the "regular" favicons table. The expirer sets this to true to generate the
// temporary table, which will have a different name but the same schema.
// |db| is the connection to use for initializing the table.
// A different connection is used in RenameAndDropThumbnails, when we
// need to copy the favicons between two database files.
bool InitFaviconsTable(sql::Connection* db, bool is_temporary);
// Helper function to handle cleanup on upgrade failures.
sql::InitStatus CantUpgradeToVersion(int cur_version);
// Adds support for the new metadata on web page thumbnails.
bool UpgradeToVersion3();
// Adds support for the icon_type in favicon table.
bool UpgradeToVersion4();
// Adds support for sizes in favicon table.
bool UpgradeToVersion5();
// Migrates the icon mapping data from URL database to Thumbnail database.
// Return whether the migration succeeds.
bool MigrateIconMappingData(URLDatabase* url_db);
// Creates the index over the favicon table. This will be called during
// initialization after the table is created. This is a separate function
// because it is used by SwapFaviconTables to create an index over the
// newly-renamed favicons table (formerly the temporary table with no index).
void InitFaviconsIndex();
// Creates the icon_map table, return true if the table already exists or was
// successfully created.
bool InitIconMappingTable(sql::Connection* db, bool is_temporary);
// Creates the index over the icon_mapping table, This will be called during
// initialization after the table is created. This is a separate function
// because it is used by CommitTemporaryIconMappingTable to create an index
// over the newly-renamed icon_mapping table (formerly the temporary table
// with no index).
void InitIconMappingIndex();
// Adds a mapping between the given page_url and icon_id; The mapping will be
// added to temp_icon_mapping table if is_temporary is true.
// Returns the new mapping id if the adding succeeds, otherwise 0 is returned.
IconMappingID AddIconMapping(const GURL& page_url,
FaviconID icon_id,
bool is_temporary);
// Returns True if the current database is latest.
bool IsLatestVersion();
sql::Connection db_;
sql::MetaTable meta_table_;
// This object is created and managed by the history backend. We maintain an
// opaque pointer to the object for our use.
// This can be NULL if there are no indexers registered to receive indexing
// data from us.
const HistoryPublisher* history_publisher_;
// True if migration to TopSites has been done and the thumbnails
// table should not be used.
bool use_top_sites_;
};
} // namespace history
#endif // CHROME_BROWSER_HISTORY_THUMBNAIL_DATABASE_H_
|