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