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_ANDROID_ANDROID_CACHE_DATABASE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_ANDROID_ANDROID_CACHE_DATABASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/android_history_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/init_status.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This database is used to support Android ContentProvider APIs.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It will be created only when it used, and deleted by HistoryBackend when
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// history system shutdown.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AndroidCacheDatabase {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidCacheDatabase();
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~AndroidCacheDatabase();
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the database, deletes existing one if any; also attach it to the
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // database returned by GetDB(). Returns sql::INIT_OK on success, otherwise
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // sql::INIT_FAILURE returned.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sql::InitStatus InitAndroidCacheDatabase(const base::FilePath& db_name);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The bookmark_cache table ------------------------------------------------
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a row to the bookmark_cache table. Returns true on success.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AddBookmarkCacheRow(const base::Time& created_time,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const base::Time& last_visit_time,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           URLID url_id);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears all rows in the bookmark_cache table; returns true on success.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ClearAllBookmarkCache();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Marks the given |url_ids| as bookmarked; Returns true on success.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool MarkURLsAsBookmarked(const std::vector<URLID>& url_id);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the given |url_id|'s favicon column to |favicon_id|. Returns true on
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success.
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool SetFaviconID(URLID url_id, chrome::FaviconID favicon_id);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The search_terms table -------------------------------------------------
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a row in the search_term table with the given |term| and
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |last_visit_time|. Return the new row's id on success, otherwise 0 is
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // returned.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermID AddSearchTerm(const string16& term,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const base::Time& last_visit_time);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the |id|'s row with the given |row|; returns true on success.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool UpdateSearchTerm(SearchTermID id, const SearchTermRow& row);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get SearchTermRow of the given |term|; return the row id on success.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise 0 is returned.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The found row is return in |row| if it is not NULL.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermID GetSearchTerm(const string16& term, SearchTermRow* row);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete the search terms which don't exist in keyword_search_terms table.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DeleteUnusedSearchTerms();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the database for the functions in this interface. The decendent of
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // this class implements these functions to return its objects.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual sql::Connection& GetDB() = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AndroidCacheDatabaseTest, InitAndroidCacheDatabase);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the database and make it ready for attaching; returns true on
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // success.
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool CreateDatabase(const base::FilePath& db_name);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the bookmark_cache table in attached DB; returns true on success.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The created_time, last_visit_time, favicon_id and bookmark are stored.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The created_time and last_visit_time are cached because Android use the
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // millisecond for the time unit, and we don't want to convert it in the
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // runtime for it requires to parsing the SQL.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The favicon_id is also cached because it is in thumbnail database. Its
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default value is set to null as the type of favicon column in Android APIs
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is blob. To use default value null, we can support client query by
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 'WHERE favicon IS NULL'.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmark column is used to indicate whether the url is bookmarked.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateBookmarkCacheTable();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the search_terms table in attached DB; returns true on success.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This table has _id, search, and date fields which match the Android's
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // definition.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When Android Client require update the search term, the search term can't
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be updated as it always associated a URL. We simulate the update by
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // deleting the old search term then inserting a new one, but the ID given
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to client can not be changed, so it appears to client as update. This
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // table is used to mapping the ID given to client to the search term.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The search term last visit time is stored in date as Android needs the time
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in milliseconds.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CreateSearchTermsTable();
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Attachs to history database; returns true on success.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Attach();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does the real attach. Returns true on success.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoAttach();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath db_name_;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AndroidCacheDatabase);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_HISTORY_ANDROID_ANDROID_CACHE_DATABASE_H_
121