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