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