1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/search_engines/template_url_id.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_table.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TemplateURLData;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebDatabase;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sql {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Statement;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace sql
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages the |keywords| MetaTable within the SQLite database
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// passed to the constructor. It expects the following schema:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: The database stores time in seconds, UTC.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// keywords                 Most of the columns mirror that of a field in
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          TemplateURLData.  See that struct for more details.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   id
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   short_name
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   keyword
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   favicon_url
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   url
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   show_in_default_list
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   safe_for_autoreplace
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   originating_url
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   date_created           This column was added after we allowed keywords.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          Keywords created before we started tracking
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          creation date have a value of 0 for this.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   usage_count
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   input_encodings        Semicolon separated list of supported input
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          encodings, may be empty.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   suggest_url
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   prepopulate_id         See TemplateURLData::prepopulate_id.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   created_by_policy      See TemplateURLData::created_by_policy.  This was
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          added in version 26.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   instant_url            See TemplateURLData::instant_url.  This was added in
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          version 29.
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   last_modified          See TemplateURLData::last_modified.  This was added
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          in version 38.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   sync_guid              See TemplateURLData::sync_guid. This was added in
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          version 39.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   alternate_urls         See TemplateURLData::alternate_urls. This was added
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                          in version 47.
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//   search_terms_replacement_key
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                          See TemplateURLData::search_terms_replacement_key.
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                          This was added in version 49.
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//   image_url              See TemplateURLData::image_url. This was added in
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                          version 52.
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//   search_url_post_params See TemplateURLData::search_url_post_params. This
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                          was added in version 52.
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//   suggest_url_post_params See TemplateURLData::suggestions_url_post_params.
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                          This was added in version 52.
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//   instant_url_post_params See TemplateURLData::instant_url_post_params. This
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                          was added in version 52.
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//   image_url_post_params  See TemplateURLData::image_url_post_params. This
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)//                          was added in version 52.
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//   new_tab_url            See TemplateURLData::new_tab_url. This was added in
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//                          version 53.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class also manages some fields in the |meta| table:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default Search Provider ID        The id of the default search provider.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Builtin Keyword Version           The version of builtin keywords data.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KeywordTable : public WebDatabaseTable {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  enum OperationType {
81e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    ADD,
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    REMOVE,
83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    UPDATE,
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  };
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::pair<OperationType, TemplateURLData> Operation;
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  typedef std::vector<Operation> Operations;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<TemplateURLData> Keywords;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constants exposed for the benefit of test code:
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kDefaultSearchProviderKey[];
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  KeywordTable();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~KeywordTable();
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieves the KeywordTable* owned by |database|.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static KeywordTable* FromWebDatabase(WebDatabase* db);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual WebDatabaseTable::TypeKey GetTypeKey() const OVERRIDE;
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool CreateTablesIfNecessary() OVERRIDE;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsSyncable() OVERRIDE;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool MigrateToVersion(int version,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                bool* update_compatible_version) OVERRIDE;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Performs an arbitrary number of Add/Remove/Update operations as a single
107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // transaction.  This is provided for efficiency reasons: if the caller needs
108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // to perform a large number of operations, doing them in a single transaction
109e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // instead of one-per-transaction can be dramatically more efficient.
110e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool PerformOperations(const Operations& operations);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the keywords into the specified vector. It's up to the caller to
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete the returned objects.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true on success.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetKeywords(Keywords* keywords);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ID (TemplateURLData->id) of the default search provider.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetDefaultSearchProviderID(int64 id);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 GetDefaultSearchProviderID();
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Version of the built-in keywords.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetBuiltinKeywordVersion(int version);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetBuiltinKeywordVersion();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a comma-separated list of the keyword columns for the current
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // version of the table.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetKeywordColumns();
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Table migration functions.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion21AutoGenerateKeywordColumn();
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion25AddLogoIDColumn();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion26AddCreatedByPolicyColumn();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion28SupportsInstantColumn();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion29InstantURLToSupportsInstant();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion38AddLastModifiedColumn();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion39AddSyncGUIDColumn();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion44AddDefaultSearchProviderBackup();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion45RemoveLogoIDAndAutogenerateColumns();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateToVersion47AddAlternateURLsColumn();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MigrateToVersion48RemoveKeywordsBackup();
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool MigrateToVersion49AddSearchTermsReplacementKeyColumn();
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool MigrateToVersion52AddImageSearchAndPOSTSupport();
1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool MigrateToVersion53AddNewTabURLColumn();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
146e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  friend class KeywordTableTest;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(WebDatabaseMigrationTest, MigrateVersion44ToCurrent);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: Since the table columns have changed in different versions, many
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // functions below take a |table_version| argument which dictates which
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // version number's column set to use.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fills |data| with the data in |s|.  Returns false if we couldn't fill
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |data| for some reason, e.g. |s| tried to set one of the fields to an
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // illegal value.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool GetKeywordDataFromStatement(const sql::Statement& s,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          TemplateURLData* data);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
159e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Adds a new keyword, updating the id field on success.
160e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Returns true if successful.
161e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool AddKeyword(const TemplateURLData& data);
162e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
163e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Removes the specified keyword.
164e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Returns true if successful.
165e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool RemoveKeyword(TemplateURLID id);
166e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
167e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Updates the database values for the specified url.
168e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Returns true on success.
169e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  bool UpdateKeyword(const TemplateURLData& data);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets a string representation for keyword with id specified.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to store its result in |meta| table or to compare with another
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // keyword. Returns true on success, false otherwise.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetKeywordAsString(TemplateURLID id,
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const std::string& table_name,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          std::string* result);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates table |name| (which should be either "keywords" or
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "keywords_backup") from version 44 to version 45.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MigrateKeywordsTableForVersion45(const std::string& name);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KeywordTable);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // COMPONENTS_SEARCH_ENGINES_KEYWORD_TABLE_H_
186