1// Copyright (c) 2012 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 CHROME_BROWSER_WEBDATA_KEYWORD_TABLE_H_ 6#define CHROME_BROWSER_WEBDATA_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 // CHROME_BROWSER_WEBDATA_KEYWORD_TABLE_H_ 186