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