15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_HISTORY_SHORTCUTS_DATABASE_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_SHORTCUTS_DATABASE_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h" 174ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch#include "sql/meta_table.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages the shortcut provider table within the SQLite database 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// passed to the constructor. It expects the following schema: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note: The database stores time in seconds, UTC. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// omni_box_shortcuts 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// id Unique id of the entry (needed for the sync). 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// search_text Text that shortcuts was searched with. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// url The url of the shortcut. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contents Contents of the original omni-box entry. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contents_matches Comma separated matches of the |search_text| in 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |contents|, for example "0,0,5,3,9,0". 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// description Description of the original omni-box entry. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// description_matches Comma separated matches of the |search_text| in 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |description|. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// last_access_time Time the entry was accessed last, stored in seconds, 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UTC. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// number_of_hits Number of times that the entry has been selected. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShortcutsDatabase : public base::RefCountedThreadSafe<ShortcutsDatabase> { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The following struct encapsulates one previously selected omnibox shortcut. 4323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct Shortcut { 4423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // The fields of an AutocompleteMatch that we preserve in a shortcut. 4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) struct MatchCore { 4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MatchCore(const base::string16& fill_into_edit, 4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const GURL& destination_url, 4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::string16& contents, 4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& contents_class, 5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::string16& description, 5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const std::string& description_class, 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int transition, 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int type, 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::string16& keyword); 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ~MatchCore(); 5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 fill_into_edit; 5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) GURL destination_url; 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 contents; 6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // For both contents_class and description_class, we strip MATCH 6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // classifications; the ShortcutsProvider will re-mark MATCH regions based 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // on the user's current typing. 6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string contents_class; 6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 description; 6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string description_class; 6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int transition; 6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int type; 6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 keyword; 6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }; 7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Shortcut(const std::string& id, 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::string16& text, 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const MatchCore& match_core, 7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const base::Time& last_access_time, 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int number_of_hits); 7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Required for STL, we don't use this directly. 7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) Shortcut(); 7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ~Shortcut(); 7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) std::string id; // Unique guid for the shortcut. 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::string16 text; // The user's original input string. 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) MatchCore match_core; 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) base::Time last_access_time; // Last time shortcut was selected. 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int number_of_hits; // How many times shortcut was selected. 8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) }; 8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) typedef std::vector<std::string> ShortcutIDs; 8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) typedef std::map<std::string, Shortcut> GuidToShortcutMap; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) explicit ShortcutsDatabase(const base::FilePath& database_path); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Init(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the ShortcutsProvider::Shortcut to the database. 9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool AddShortcut(const Shortcut& shortcut); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates timing and selection count for the ShortcutsProvider::Shortcut. 9823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool UpdateShortcut(const Shortcut& shortcut); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Deletes the ShortcutsProvider::Shortcuts with these IDs. 10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool DeleteShortcutsWithIDs(const ShortcutIDs& shortcut_ids); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes the ShortcutsProvider::Shortcuts with the url. 10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) bool DeleteShortcutsWithURL(const std::string& shortcut_url_spec); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Deletes all of the ShortcutsProvider::Shortcuts. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool DeleteAllShortcuts(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads all of the shortcuts. 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void LoadShortcuts(GuidToShortcutMap* shortcuts); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<ShortcutsDatabase>; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ShortcutsDatabaseTest; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ShortcutsDatabaseTest, AddShortcut); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ShortcutsDatabaseTest, UpdateShortcut); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ShortcutsDatabaseTest, DeleteShortcutsWithIds); 11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ShortcutsDatabaseTest, DeleteShortcutsWithURL); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(ShortcutsDatabaseTest, LoadShortcuts); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual ~ShortcutsDatabase(); 1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Ensures that the table is present. 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool EnsureTable(); 1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The sql database. Not valid until Init is called. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sql::Connection db_; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath database_path_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1304ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch sql::MetaTable meta_table_; 1314ad1aa43a48567659193a298fad74f55e00b3dd9Ben Murdoch 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const base::FilePath::CharType kShortcutsDatabaseName[]; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ShortcutsDatabase); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_HISTORY_SHORTCUTS_DATABASE_H_ 140