1// Copyright 2014 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 COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
6#define COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
7
8#include <string>
9#include <vector>
10
11#include "base/compiler_specific.h"
12#include "base/gtest_prod_util.h"
13#include "base/strings/string16.h"
14#include "components/search_engines/template_url_id.h"
15#include "components/webdata/common/web_database_table.h"
16
17struct TemplateURLData;
18class WebDatabase;
19
20namespace sql {
21class Statement;
22}  // namespace sql
23
24// This class manages the |keywords| MetaTable within the SQLite database
25// passed to the constructor. It expects the following schema:
26//
27// Note: The database stores time in seconds, UTC.
28//
29// keywords                 Most of the columns mirror that of a field in
30//                          TemplateURLData.  See that struct for more details.
31//   id
32//   short_name
33//   keyword
34//   favicon_url
35//   url
36//   show_in_default_list
37//   safe_for_autoreplace
38//   originating_url
39//   date_created           This column was added after we allowed keywords.
40//                          Keywords created before we started tracking
41//                          creation date have a value of 0 for this.
42//   usage_count
43//   input_encodings        Semicolon separated list of supported input
44//                          encodings, may be empty.
45//   suggest_url
46//   prepopulate_id         See TemplateURLData::prepopulate_id.
47//   created_by_policy      See TemplateURLData::created_by_policy.  This was
48//                          added in version 26.
49//   instant_url            See TemplateURLData::instant_url.  This was added in
50//                          version 29.
51//   last_modified          See TemplateURLData::last_modified.  This was added
52//                          in version 38.
53//   sync_guid              See TemplateURLData::sync_guid. This was added in
54//                          version 39.
55//   alternate_urls         See TemplateURLData::alternate_urls. This was added
56//                          in version 47.
57//   search_terms_replacement_key
58//                          See TemplateURLData::search_terms_replacement_key.
59//                          This was added in version 49.
60//   image_url              See TemplateURLData::image_url. This was added in
61//                          version 52.
62//   search_url_post_params See TemplateURLData::search_url_post_params. This
63//                          was added in version 52.
64//   suggest_url_post_params See TemplateURLData::suggestions_url_post_params.
65//                          This was added in version 52.
66//   instant_url_post_params See TemplateURLData::instant_url_post_params. This
67//                          was added in version 52.
68//   image_url_post_params  See TemplateURLData::image_url_post_params. This
69//                          was added in version 52.
70//   new_tab_url            See TemplateURLData::new_tab_url. This was added in
71//                          version 53.
72//
73// This class also manages some fields in the |meta| table:
74//
75// Default Search Provider ID        The id of the default search provider.
76// Builtin Keyword Version           The version of builtin keywords data.
77//
78class KeywordTable : public WebDatabaseTable {
79 public:
80  enum OperationType {
81    ADD,
82    REMOVE,
83    UPDATE,
84  };
85
86  typedef std::pair<OperationType, TemplateURLData> Operation;
87  typedef std::vector<Operation> Operations;
88  typedef std::vector<TemplateURLData> Keywords;
89
90  // Constants exposed for the benefit of test code:
91
92  static const char kDefaultSearchProviderKey[];
93
94  KeywordTable();
95  virtual ~KeywordTable();
96
97  // Retrieves the KeywordTable* owned by |database|.
98  static KeywordTable* FromWebDatabase(WebDatabase* db);
99
100  virtual WebDatabaseTable::TypeKey GetTypeKey() const OVERRIDE;
101  virtual bool CreateTablesIfNecessary() OVERRIDE;
102  virtual bool IsSyncable() OVERRIDE;
103  virtual bool MigrateToVersion(int version,
104                                bool* update_compatible_version) OVERRIDE;
105
106  // Performs an arbitrary number of Add/Remove/Update operations as a single
107  // transaction.  This is provided for efficiency reasons: if the caller needs
108  // to perform a large number of operations, doing them in a single transaction
109  // instead of one-per-transaction can be dramatically more efficient.
110  bool PerformOperations(const Operations& operations);
111
112  // Loads the keywords into the specified vector. It's up to the caller to
113  // delete the returned objects.
114  // Returns true on success.
115  bool GetKeywords(Keywords* keywords);
116
117  // ID (TemplateURLData->id) of the default search provider.
118  bool SetDefaultSearchProviderID(int64 id);
119  int64 GetDefaultSearchProviderID();
120
121  // Version of the built-in keywords.
122  bool SetBuiltinKeywordVersion(int version);
123  int GetBuiltinKeywordVersion();
124
125  // Returns a comma-separated list of the keyword columns for the current
126  // version of the table.
127  static std::string GetKeywordColumns();
128
129  // Table migration functions.
130  bool MigrateToVersion21AutoGenerateKeywordColumn();
131  bool MigrateToVersion25AddLogoIDColumn();
132  bool MigrateToVersion26AddCreatedByPolicyColumn();
133  bool MigrateToVersion28SupportsInstantColumn();
134  bool MigrateToVersion29InstantURLToSupportsInstant();
135  bool MigrateToVersion38AddLastModifiedColumn();
136  bool MigrateToVersion39AddSyncGUIDColumn();
137  bool MigrateToVersion44AddDefaultSearchProviderBackup();
138  bool MigrateToVersion45RemoveLogoIDAndAutogenerateColumns();
139  bool MigrateToVersion47AddAlternateURLsColumn();
140  bool MigrateToVersion48RemoveKeywordsBackup();
141  bool MigrateToVersion49AddSearchTermsReplacementKeyColumn();
142  bool MigrateToVersion52AddImageSearchAndPOSTSupport();
143  bool MigrateToVersion53AddNewTabURLColumn();
144
145 private:
146  friend class KeywordTableTest;
147  FRIEND_TEST_ALL_PREFIXES(WebDatabaseMigrationTest, MigrateVersion44ToCurrent);
148
149  // NOTE: Since the table columns have changed in different versions, many
150  // functions below take a |table_version| argument which dictates which
151  // version number's column set to use.
152
153  // Fills |data| with the data in |s|.  Returns false if we couldn't fill
154  // |data| for some reason, e.g. |s| tried to set one of the fields to an
155  // illegal value.
156  static bool GetKeywordDataFromStatement(const sql::Statement& s,
157                                          TemplateURLData* data);
158
159  // Adds a new keyword, updating the id field on success.
160  // Returns true if successful.
161  bool AddKeyword(const TemplateURLData& data);
162
163  // Removes the specified keyword.
164  // Returns true if successful.
165  bool RemoveKeyword(TemplateURLID id);
166
167  // Updates the database values for the specified url.
168  // Returns true on success.
169  bool UpdateKeyword(const TemplateURLData& data);
170
171  // Gets a string representation for keyword with id specified.
172  // Used to store its result in |meta| table or to compare with another
173  // keyword. Returns true on success, false otherwise.
174  bool GetKeywordAsString(TemplateURLID id,
175                          const std::string& table_name,
176                          std::string* result);
177
178  // Migrates table |name| (which should be either "keywords" or
179  // "keywords_backup") from version 44 to version 45.
180  bool MigrateKeywordsTableForVersion45(const std::string& name);
181
182  DISALLOW_COPY_AND_ASSIGN(KeywordTable);
183};
184
185#endif  // COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
186