1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_HISTORY_URL_DATABASE_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_HISTORY_URL_DATABASE_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "app/sql/statement.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GURL; 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace sql { 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Connection; 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass VisitDatabase; // For friend statement. 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Encapsulates an SQL database that holds URL info. This is a subset of the 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// full history data. We split this class' functionality out from the larger 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryDatabase class to support maintaining separate databases of URLs with 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// different capabilities (for example, in-memory, or archived). 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is refcounted to support calling InvokeLater() with some of its methods 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (necessary to maintain ordering of DB operations). 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass URLDatabase { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Must call CreateURLTable() and CreateURLIndexes() before using to make 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sure the database is initialized. 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLDatabase(); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This object must be destroyed on the thread where all accesses are 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // happening to avoid thread-safety problems. 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual ~URLDatabase(); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Converts a GURL to a string used in the history database. We plan to 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // do more complex operations than just getting the spec out involving 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // punycode, so this function should be used instead of url.spec() when 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // interacting with the database. 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(brettw) this should be moved out of the public section and the 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // entire public HistoryDatabase interface should use GURL. This should 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // also probably return a string instead since that is what the DB uses 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // internally and we can avoid the extra conversion. 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static std::string GURLToDatabaseURL(const GURL& url); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URL table functions ------------------------------------------------------- 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Looks up a url given an id. Fills info with the data. Returns true on 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // success and false otherwise. 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetURLRow(URLID url_id, URLRow* info); 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Looks up all urls that were typed in manually. Fills info with the data. 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true on success and false otherwise. 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetAllTypedUrls(std::vector<history::URLRow>* urls); 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Looks up the given URL and if it exists, fills the given pointers with the 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // associated info and returns the ID of that URL. If the info pointer is 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NULL, no information about the URL will be filled in, only the ID will be 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // returned. Returns 0 if the URL was not found. 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLID GetRowForURL(const GURL& url, URLRow* info); 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Given an already-existing row in the URL table, updates that URL's stats. 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This can not change the URL. Returns true on success. 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This will NOT update the title used for full text indexing. If you are 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // setting the title, call SetPageIndexedData with the new title. 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool UpdateURLRow(URLID url_id, const URLRow& info); 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds a line to the URL database with the given information and returns the 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // row ID. A row with the given URL must not exist. Returns 0 on error. 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This does NOT add a row to the full text search database. Use 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // HistoryDatabase::SetPageIndexedData to do this. 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLID AddURL(const URLRow& info) { 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return AddURLInternal(info, false); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Delete the row of the corresponding URL. Only the row in the URL table 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // will be deleted, not any other data that may refer to it. Returns true if 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the row existed and was deleted. 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DeleteURLRow(URLID id); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // URL mass-deleting --------------------------------------------------------- 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Begins the mass-deleting operation by creating a temporary URL table. 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The caller than adds the URLs it wants to preseve to the temporary table, 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and then deletes everything else by calling CommitTemporaryURLTable(). 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns true on success. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool CreateTemporaryURLTable(); 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Adds a row to the temporary URL table. This must be called between 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // CreateTemporaryURLTable() and CommitTemporaryURLTable() (see those for more 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // info). The ID of the URL will change in the temporary table, so the new ID 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is returned. Returns 0 on failure. 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLID AddTemporaryURL(const URLRow& row) { 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return AddURLInternal(row, true); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ends the mass-deleting by replacing the original URL table with the 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // temporary one created in CreateTemporaryURLTable. Returns true on success. 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This function does not create the supplimentary indices. It is virtual so 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // that the main history database can provide this additional behavior. 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual bool CommitTemporaryURLTable(); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Enumeration --------------------------------------------------------------- 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // A basic enumerator to enumerate urls database. 115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen class URLEnumeratorBase { 116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen URLEnumeratorBase(); 118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~URLEnumeratorBase(); 119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen friend class URLDatabase; 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool initialized_; 124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sql::Statement statement_; 125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(URLEnumeratorBase); 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // A basic enumerator to enumerate urls 130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen class URLEnumerator : public URLEnumeratorBase { 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen URLEnumerator(); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Retreives the next url. Returns false if no more urls are available 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetNextURL(history::URLRow* r); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(URLEnumerator); 139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen }; 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // A basic enumerator to enumerate icon mapping, it is only used for icon 142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // mapping migration. 143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen class IconMappingEnumerator : public URLEnumeratorBase { 144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IconMappingEnumerator(); 146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Retreives the next url. Returns false if no more urls are available 148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool GetNextIconMapping(IconMapping* r); 149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(IconMappingEnumerator); 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Initializes the given enumerator to enumerator all URLs in the database. 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitURLEnumeratorForEverything(URLEnumerator* enumerator); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Initializes the given enumerator to enumerator all URLs in the database 158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // that are historically significant: ones having been visited within 3 days, 159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // having their URL manually typed more than once, or having been visited 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // more than 3 times. 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool InitURLEnumeratorForSignificant(URLEnumerator* enumerator); 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Favicons ------------------------------------------------------------------ 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Autocomplete -------------------------------------------------------------- 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fills the given array with URLs matching the given prefix. They will be 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // sorted by typed count, then by visit count, then by visit date (most recent 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // first) up to the given maximum number. If |typed_only| is true, only urls 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // that have been typed once are returned. Called by HistoryURLProvider. 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AutocompleteForPrefix(const string16& prefix, 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t max_results, 173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch bool typed_only, 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<URLRow>* results); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Tries to find the shortest URL beginning with |base| that strictly 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // prefixes |url|, and has minimum visit_ and typed_counts as specified. 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If found, fills in |info| and returns true; otherwise returns false, 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // leaving |info| unchanged. 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We allow matches of exactly |base| iff |allow_base| is true. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool FindShortestURLFromBase(const std::string& base, 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& url, 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int min_visits, 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int min_typed, 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool allow_base, 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch history::URLRow* info); 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Keyword Search Terms ------------------------------------------------------ 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Sets the search terms for the specified url/keyword pair. 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool SetKeywordSearchTermsForURL(URLID url_id, 1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURLID keyword_id, 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& term); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Looks up a keyword search term given a url id. Fills row with the data. 1963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Returns true on success and false otherwise. 1973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen bool GetKeywordSearchTermRow(URLID url_id, KeywordSearchTermRow* row); 1983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deletes all search terms for the specified keyword that have been added by 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // way of SetKeywordSearchTermsForURL. 2013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void DeleteAllSearchTermsForKeyword(TemplateURLID keyword_id); 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns up to max_count of the most recent search terms for the specified 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // keyword. 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void GetMostRecentKeywordSearchTerms( 2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick TemplateURLID keyword_id, 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const string16& prefix, 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int max_count, 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<KeywordSearchTermVisit>* matches); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Migration ----------------------------------------------------------------- 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Do to a bug we were setting the favicon of about:blank. This forces 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // about:blank to have no icon or title. Returns true on success, false if 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // the favicon couldn't be updated. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool MigrateFromVersion11ToVersion12(); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Initializes the given enumerator to enumerator all URL and icon mappings 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // in the database. Only used for icon mapping migration. 220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool InitIconMappingEnumeratorForEverything( 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen IconMappingEnumerator* enumerator); 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch friend class VisitDatabase; 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See HISTORY_URL_ROW_FIELDS below. 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const char kURLRowFields[]; 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The number of fiends in kURLRowFields. If callers need additional 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // fields, they can add their 0-based index to this value to get the index of 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // fields following kURLRowFields. 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const int kNumURLRowFields; 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Drops the starred_id column from urls, returning true on success. This does 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // nothing (and returns true) if the urls doesn't contain the starred_id 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // column. 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DropStarredIDFromURLs(); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initialization functions. The indexing functions are separate from the 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // table creation functions so the in-memory database and the temporary tables 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // used when clearing history can populate the table and then create the 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // index, which is faster than the reverse. 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // is_temporary is false when generating the "regular" URLs table. The expirer 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // sets this to true to generate the temporary table, which will have a 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // different name but the same schema. 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool CreateURLTable(bool is_temporary); 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We have two tiers of indices for the URL table. The main tier is used by 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // all URL databases, and is an index over the URL itself. 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CreateMainURLIndex(); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ensures the keyword search terms table exists. 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool InitKeywordSearchTermsTable(); 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 255513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Creates the indices used for keyword search terms. 256513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void CreateKeywordSearchTermsIndices(); 257513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Deletes the keyword search terms table. 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool DropKeywordSearchTermsTable(); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Inserts the given URL row into the URLs table, using the regular table 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // if is_temporary is false, or the temporary URL table if is temporary is 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // true. The temporary table may only be used in between 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // CreateTemporaryURLTable() and CommitTemporaryURLTable(). 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLID AddURLInternal(const URLRow& info, bool is_temporary); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Convenience to fill a history::URLRow. Must be in sync with the fields in 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // kHistoryURLRowFields. 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static void FillURLRow(sql::Statement& s, URLRow* i); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returns the database for the functions in this interface. The decendent of 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this class implements these functions to return its objects. 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual sql::Connection& GetDB() = 0; 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // True if InitKeywordSearchTermsTable() has been invoked. Not all subclasses 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // have keyword search terms. 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool has_keyword_search_terms_; 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(URLDatabase); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The fields and order expected by FillURLRow(). ID is guaranteed to be first 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// so that DISTINCT can be prepended to get distinct URLs. 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is available BOTH as a macro and a static string (kURLRowFields). Use 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the macro if you want to put this in the middle of an otherwise constant 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// string, it will save time doing string appends. If you have to build a SQL 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// string dynamically anyway, use the constant, it will save space. 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define HISTORY_URL_ROW_FIELDS \ 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch " urls.id, urls.url, urls.title, urls.visit_count, urls.typed_count, " \ 292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen "urls.last_visit_time, urls.hidden " 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // history 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // CHROME_BROWSER_HISTORY_URL_DATABASE_H_ 297