| Index: chrome/browser/history/text_database_manager.h
|
| diff --git a/chrome/browser/history/text_database_manager.h b/chrome/browser/history/text_database_manager.h
|
| deleted file mode 100644
|
| index 986274c8f71e8262201707d8eef406b22ceb246c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/history/text_database_manager.h
|
| +++ /dev/null
|
| @@ -1,320 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#ifndef CHROME_BROWSER_HISTORY_TEXT_DATABASE_MANAGER_H_
|
| -#define CHROME_BROWSER_HISTORY_TEXT_DATABASE_MANAGER_H_
|
| -
|
| -#include <cstddef>
|
| -#include <set>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/containers/mru_cache.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/memory/weak_ptr.h"
|
| -#include "base/strings/string16.h"
|
| -#include "chrome/browser/history/history_types.h"
|
| -#include "chrome/browser/history/query_parser.h"
|
| -#include "chrome/browser/history/text_database.h"
|
| -#include "chrome/browser/history/url_database.h"
|
| -
|
| -namespace history {
|
| -
|
| -class HistoryPublisher;
|
| -class VisitDatabase;
|
| -
|
| -// Manages a set of text databases representing different time periods. This
|
| -// will page them in and out as necessary, and will manage queries for times
|
| -// spanning multiple databases.
|
| -//
|
| -// It will also keep a list of partial changes, such as page adds and title and
|
| -// body sets, all of which come in at different times for a given page. When
|
| -// all data is received or enough time has elapsed since adding, the indexed
|
| -// data will be committed.
|
| -//
|
| -// This allows us to minimize inserts and modifications, which are slow for the
|
| -// full text database, since each page's information is added exactly once.
|
| -//
|
| -// Note: be careful to delete the relevant entries from this uncommitted list
|
| -// when clearing history or this information may get added to the database soon
|
| -// after the clear.
|
| -class TextDatabaseManager {
|
| - public:
|
| - // Tracks a set of changes (only deletes need to be supported now) to the
|
| - // databases. This is opaque to the caller, but allows it to pass back a list
|
| - // of all database that it has caused a change to.
|
| - //
|
| - // This is necessary for the feature where we optimize full text databases
|
| - // which have changed as a result of the user deleting history via
|
| - // OptimizeChangedDatabases. We want to do each affected database only once at
|
| - // the end of the delete, but we don't want the caller to have to worry about
|
| - // our internals.
|
| - class ChangeSet {
|
| - public:
|
| - ChangeSet();
|
| - ~ChangeSet();
|
| -
|
| - private:
|
| - friend class TextDatabaseManager;
|
| -
|
| - typedef std::set<TextDatabase::DBIdent> DBSet;
|
| -
|
| - void Add(TextDatabase::DBIdent id) { changed_databases_.insert(id); }
|
| -
|
| - DBSet changed_databases_;
|
| - };
|
| -
|
| - // You must call Init() to complete initialization.
|
| - //
|
| - // |dir| is the directory that will hold the full text database files (there
|
| - // will be many files named by their date ranges).
|
| - //
|
| - // The visit database is a pointer owned by the caller for the main database
|
| - // (of recent visits). The visit database will be updated to refer to the
|
| - // added text database entries.
|
| - TextDatabaseManager(const base::FilePath& dir,
|
| - URLDatabase* url_database,
|
| - VisitDatabase* visit_database);
|
| - ~TextDatabaseManager();
|
| -
|
| - // Must call before using other functions. If it returns false, no other
|
| - // functions should be called.
|
| - bool Init(const HistoryPublisher* history_publisher);
|
| -
|
| - // Returns the directory that holds the full text database files.
|
| - const base::FilePath& GetDir() { return dir_; }
|
| -
|
| - // Allows scoping updates. This also allows things to go faster since every
|
| - // page add doesn't need to be committed to disk (slow). Note that files will
|
| - // still get created during a transaction.
|
| - void BeginTransaction();
|
| - void CommitTransaction();
|
| -
|
| - // Sets specific information for the given page to be added to the database.
|
| - // In normal operation, URLs will be added as the user visits them, the titles
|
| - // and bodies will come in some time after that. These changes will be
|
| - // automatically coalesced and added to the database some time in the future
|
| - // using AddPageData().
|
| - //
|
| - // AddPageURL must be called for a given URL (+ its corresponding ID) before
|
| - // either the title or body set. The visit ID specifies the visit that will
|
| - // get updated to refer to the full text indexed information. The visit time
|
| - // should be the time corresponding to that visit in the database.
|
| - void AddPageURL(const GURL& url, URLID url_id, VisitID visit_id,
|
| - base::Time visit_time);
|
| - void AddPageTitle(const GURL& url, const string16& title);
|
| - void AddPageContents(const GURL& url, const string16& body);
|
| -
|
| - // Adds the given data to the appropriate database file, returning true on
|
| - // success. The visit database row identified by |visit_id| will be updated
|
| - // to refer to the full text index entry. If the visit ID is 0, the visit
|
| - // database will not be updated.
|
| - bool AddPageData(const GURL& url,
|
| - URLID url_id,
|
| - VisitID visit_id,
|
| - base::Time visit_time,
|
| - const string16& title,
|
| - const string16& body);
|
| -
|
| - // Deletes the instance of indexed data identified by the given time and URL.
|
| - // Any changes will be tracked in the optional change set for use when calling
|
| - // OptimizeChangedDatabases later. change_set can be NULL.
|
| - void DeletePageData(base::Time time, const GURL& url,
|
| - ChangeSet* change_set);
|
| -
|
| - // The text database manager keeps a list of changes that are made to the
|
| - // file AddPageURL/Title/Body that may not be committed to the database yet.
|
| - // This function removes entries from this list happening between the given
|
| - // time range. It is called when the user clears their history for a time
|
| - // range, and we don't want any of our data to "leak." If restrict_urls is
|
| - // not empty, only changes on those URLs are deleted.
|
| - //
|
| - // Either or both times my be is_null to be unbounded in that direction. When
|
| - // non-null, the range is [begin, end).
|
| - void DeleteFromUncommitted(const std::set<GURL>& restrict_urls,
|
| - base::Time begin, base::Time end);
|
| -
|
| - // This function removes entries from the same list as
|
| - // DeleteFromUncommitted() with times belonging to the given list of
|
| - // times, which must be in reverse chronological order.
|
| - void DeleteFromUncommittedForTimes(const std::vector<base::Time>& times);
|
| -
|
| - // Deletes all full text search data by removing the files from the disk.
|
| - // This must be called OUTSIDE of a transaction since it actually deletes the
|
| - // files rather than messing with the database.
|
| - void DeleteAll();
|
| -
|
| - // Calls optimize on all the databases identified in a given change set (see
|
| - // the definition of ChangeSet above for more). Optimizing means that old data
|
| - // will be removed rather than marked unused.
|
| - void OptimizeChangedDatabases(const ChangeSet& change_set);
|
| -
|
| - // Executes the given query. See QueryOptions for more info on input.
|
| - //
|
| - // The results are filled into |results|, and the first time considered for
|
| - // the output is in |first_time_searched| (see QueryResults for more).
|
| - //
|
| - // This function will return more than one match per URL if there is more than
|
| - // one entry for that URL in the database.
|
| - void GetTextMatches(const string16& query,
|
| - const QueryOptions& options,
|
| - std::vector<TextDatabase::Match>* results,
|
| - base::Time* first_time_searched);
|
| -
|
| - size_t GetUncommittedEntryCountForTest() const;
|
| -
|
| - private:
|
| - // These tests call ExpireRecentChangesForTime to force expiration.
|
| - FRIEND_TEST_ALL_PREFIXES(TextDatabaseManagerTest, InsertPartial);
|
| - FRIEND_TEST_ALL_PREFIXES(TextDatabaseManagerTest, PartialComplete);
|
| - FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, DeleteURLAndFavicon);
|
| - FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, FlushRecentURLsUnstarred);
|
| - FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest, FlushURLsForTimes);
|
| - FRIEND_TEST_ALL_PREFIXES(ExpireHistoryTest,
|
| - FlushRecentURLsUnstarredRestricted);
|
| -
|
| - // Stores "recent stuff" that has happened with the page, since the page
|
| - // visit, title, and body all come in at different times.
|
| - class PageInfo {
|
| - public:
|
| - PageInfo(URLID url_id, VisitID visit_id, base::Time visit_time);
|
| - ~PageInfo();
|
| -
|
| - // Getters.
|
| - URLID url_id() const { return url_id_; }
|
| - VisitID visit_id() const { return visit_id_; }
|
| - base::Time visit_time() const { return visit_time_; }
|
| - const string16& title() const { return title_; }
|
| - const string16& body() const { return body_; }
|
| -
|
| - // Setters, we can only update the title and body.
|
| - void set_title(const string16& ttl);
|
| - void set_body(const string16& bdy);
|
| -
|
| - // Returns true if both the title or body of the entry has been set. Since
|
| - // both the title and body setters will "fix" empty strings to be a space,
|
| - // these indicate if the setter was ever called.
|
| - bool has_title() const { return !title_.empty(); }
|
| - bool has_body() { return !body_.empty(); }
|
| -
|
| - // Returns true if this entry was added too long ago and we should give up
|
| - // waiting for more data. The current time is passed in as an argument so we
|
| - // can check many without re-querying the timer.
|
| - bool Expired(base::TimeTicks now) const;
|
| -
|
| - private:
|
| - URLID url_id_;
|
| - VisitID visit_id_;
|
| -
|
| - // Time of the visit of the URL. This will be the value stored in the URL
|
| - // and visit tables for the entry.
|
| - base::Time visit_time_;
|
| -
|
| - // When this page entry was created. We have a cap on the maximum time that
|
| - // an entry will be in the queue before being flushed to the database.
|
| - base::TimeTicks added_time_;
|
| -
|
| - // Will be the string " " when they are set to distinguish set and unset.
|
| - string16 title_;
|
| - string16 body_;
|
| - };
|
| -
|
| - // Converts the given time to a database identifier or vice-versa.
|
| - static TextDatabase::DBIdent TimeToID(base::Time time);
|
| - static base::Time IDToTime(TextDatabase::DBIdent id);
|
| -
|
| - // Returns a text database for the given identifier or time. This file will
|
| - // be created if it doesn't exist and |for_writing| is set. On error,
|
| - // including the case where the file doesn't exist and |for_writing|
|
| - // is false, it will return NULL.
|
| - //
|
| - // When |for_writing| is set, a transaction on the database will be opened
|
| - // if there is a transaction open on this manager.
|
| - //
|
| - // The pointer will be tracked in the cache. The caller should not store it
|
| - // or delete it since it will get automatically deleted as necessary.
|
| - TextDatabase* GetDB(TextDatabase::DBIdent id, bool for_writing);
|
| - TextDatabase* GetDBForTime(base::Time time, bool for_writing);
|
| -
|
| - // Populates the present_databases_ list based on which files are on disk.
|
| - // When the list is already initialized, this will do nothing, so you can
|
| - // call it whenever you want to ensure the present_databases_ set is filled.
|
| - void InitDBList();
|
| -
|
| - // Schedules a call to ExpireRecentChanges in the future.
|
| - void ScheduleFlushOldChanges();
|
| -
|
| - // Checks the recent_changes_ list and commits partial data that has been
|
| - // around too long.
|
| - void FlushOldChanges();
|
| -
|
| - // Given "now," this will expire old things from the recent_changes_ list.
|
| - // This is used as the backend for FlushOldChanges and is called directly
|
| - // by the unit tests with fake times.
|
| - void FlushOldChangesForTime(base::TimeTicks now);
|
| -
|
| - // Directory holding our index files.
|
| - const base::FilePath dir_;
|
| -
|
| - // Non-owning pointers to the recent history databases for URLs and visits.
|
| - URLDatabase* url_database_;
|
| - VisitDatabase* visit_database_;
|
| -
|
| - // Lists recent additions that we have not yet filled out with the title and
|
| - // body. Sorted by time, we will flush them when they are complete or have
|
| - // been in the queue too long without modification.
|
| - //
|
| - // We kind of abuse the MRUCache because we never move things around in it
|
| - // using Get. Instead, we keep them in the order they were inserted, since
|
| - // this is the metric we use to measure age. The MRUCache gives us an ordered
|
| - // list with fast lookup by URL.
|
| - typedef base::MRUCache<GURL, PageInfo> RecentChangeList;
|
| - RecentChangeList recent_changes_;
|
| -
|
| - // Nesting levels of transactions. Since sqlite only allows one open
|
| - // transaction, we simulate nested transactions by mapping the outermost one
|
| - // to a real transaction. Since this object never needs to do ROLLBACK, losing
|
| - // the ability for all transactions to rollback is inconsequential.
|
| - int transaction_nesting_;
|
| -
|
| - // The cache owns the TextDatabase pointers, they will be automagically
|
| - // deleted when the cache entry is removed or expired.
|
| - typedef base::OwningMRUCache<TextDatabase::DBIdent, TextDatabase*> DBCache;
|
| - DBCache db_cache_;
|
| -
|
| - // Tells us about the existence of database files on disk. All existing
|
| - // databases will be in here, and non-existent ones will not, so we don't
|
| - // have to check the disk every time.
|
| - //
|
| - // This set is populated LAZILY by InitDBList(), you should call that function
|
| - // before accessing the list.
|
| - //
|
| - // Note that iterators will work on the keys in-order. Normally, reverse
|
| - // iterators will be used to iterate the keys in reverse-order.
|
| - typedef std::set<TextDatabase::DBIdent> DBIdentSet;
|
| - DBIdentSet present_databases_;
|
| - bool present_databases_loaded_; // Set by InitDBList when populated.
|
| -
|
| - // Lists all databases with open transactions. These will have to be closed
|
| - // when the transaction is committed.
|
| - DBIdentSet open_transactions_;
|
| -
|
| - QueryParser query_parser_;
|
| -
|
| - // Generates tasks for our periodic checking of expired "recent changes".
|
| - base::WeakPtrFactory<TextDatabaseManager> weak_factory_;
|
| -
|
| - // This object is created and managed by the history backend. We maintain an
|
| - // opaque pointer to the object for our use.
|
| - // This can be NULL if there are no indexers registered to receive indexing
|
| - // data from us.
|
| - const HistoryPublisher* history_publisher_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(TextDatabaseManager);
|
| -};
|
| -
|
| -} // namespace history
|
| -
|
| -#endif // CHROME_BROWSER_HISTORY_TEXT_DATABASE_MANAGER_H_
|
|
|