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 17 struct TemplateURLData; 18 class WebDatabase; 19 20 namespace sql { 21 class 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 // 78 class 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