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_HISTORY_TYPES_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_HISTORY_ANDROID_ANDROID_HISTORY_TYPES_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url_id.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/statement.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sql {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Statement;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 AndroidURLID;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef int64 SearchTermID;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wraps all columns needed to support android.provider.Browser.BookmarkColumns.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is used in insert() and update() to specify the columns need to insert or
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// update.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The column is not valid until it set. Using is_valid() to find out whether
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the specific column could be used.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The defult copy constructor is used.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class HistoryAndBookmarkRow {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ColumnID {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ID,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URL,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TITLE,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATED,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAST_VISIT_TIME,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VISIT_COUNT,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAVICON,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOKMARK,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RAW_URL,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PARENT_ID,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URL_ID,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COLUMN_END // This must be the last.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryAndBookmarkRow();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~HistoryAndBookmarkRow();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the column name defined in Android.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetAndroidName(ColumnID id);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ColumnID GetColumnID(const std::string& name);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLs for the page.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url(const GURL& url) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(URL);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = url;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& url() const {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Raw input URL
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_raw_url(const std::string& raw_url) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(RAW_URL);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    raw_url_ = raw_url;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string& raw_url() const {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return raw_url_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The title of page.
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_title(const string16& title) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(TITLE);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    title_ = title;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& title() const {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return title_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The page's first visit time.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_created(const base::Time created) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(CREATED);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    created_ = created;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time& created() const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return created_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The page's last visit time.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_last_visit_time(const base::Time last_visit_time) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(LAST_VISIT_TIME);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_visit_time_ = last_visit_time;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time& last_visit_time() const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return last_visit_time_;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The visit times
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_visit_count(int visit_count) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(VISIT_COUNT);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    visit_count_ = visit_count;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count() const {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return visit_count_;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the page is bookmarked.
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_is_bookmark(bool is_bookmark) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(BOOKMARK);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    is_bookmark_ = is_bookmark;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_bookmark() const {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return is_bookmark_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The favicon related to page if any.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_favicon(const scoped_refptr<base::RefCountedMemory>& data) {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(FAVICON);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    favicon_ = data;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const scoped_refptr<base::RefCountedMemory>& favicon() const {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return favicon_;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool favicon_valid() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return favicon_.get() && favicon_->size();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of android url.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(AndroidURLID id) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(ID);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id_ = id;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidURLID id() const {
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The id of the parent folder containing the bookmark, if any.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_parent_id(int64 parent_id) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(PARENT_ID);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parent_id_ = parent_id;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int64 parent_id() const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return parent_id_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The internal URLID
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url_id(URLID url_id) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(URL_ID);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_id_ = url_id;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id() const {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url_id_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the given |id| has been set explicitly.
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_value_set_explicitly(ColumnID id) const {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return values_set_.find(id) != values_set_.end();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_value_explicitly(ColumnID id) {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_set_.insert(id);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidURLID id_;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string raw_url_;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time created_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_visit_time_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::RefCountedMemory> favicon_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int visit_count_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_bookmark_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 parent_id_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to find whether a column has been set a value explicitly.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<ColumnID> values_set_;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We support the implicit copy constuctor and operator=.
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wraps all columns needed to support android.provider.Browser.SearchColumns.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It is used in insert() and update() to specify the columns need to insert or
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// update.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The column is not valid until it set. Using is_valid() to find out whether
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the specific column could be used.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The defult copy constructor is used.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchRow {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum ColumnID {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ID,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SEARCH_TERM,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SEARCH_TIME,
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URL,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TEMPLATE_URL,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    COLUMN_END
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchRow();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SearchRow();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the column name defined in Android.
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static std::string GetAndroidName(ColumnID id);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ColumnID GetColumnID(const std::string& name);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermID id() const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return id_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_id(SearchTermID id) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(SearchRow::ID);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id_ = id;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16& search_term() const {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return search_term_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_search_term(const string16& search_term) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(SearchRow::SEARCH_TERM);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_term_ = search_term;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::Time search_time() const {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return search_time_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_search_time(const base::Time& time) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(SearchRow::SEARCH_TIME);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    search_time_ = time;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL& url() const {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_url(const GURL& url) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(SearchRow::URL);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    url_ = url;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID template_url_id() const {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return template_url_id_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_template_url_id(TemplateURLID template_url_id) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_value_explicitly(SearchRow::TEMPLATE_URL);
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    template_url_id_ = template_url_id;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the given |id| has been set explicitly.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_value_set_explicitly(ColumnID id) const {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return values_set_.find(id) != values_set_.end();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_value_explicitly(ColumnID id) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    values_set_.insert(id);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermID id_;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 search_term_;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time search_time_;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TemplateURLID template_url_id_;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to find whether a column has been set a value.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<ColumnID> values_set_;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We support the implicit copy constuctor and operator=.
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines the row stored in android_urls table.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AndroidURLRow {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidURLRow();
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AndroidURLRow();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the row
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidURLID id;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The corresponding URLID in the url table.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLID url_id;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The orignal URL string passed in by client.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string raw_url;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines the row of keyword_cache table.
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SearchTermRow {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermRow();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SearchTermRow();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The unique id of the row.
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SearchTermID id;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The keyword.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 term;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last visit time.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time last_visit_time;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class wraps the sql statement and favicon column index in statement if
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// any. It is returned by AndroidProviderBackend::Query().
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Using favicon_index() to get the index of favicon; The value of that column
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is the Favicon ID, Client should call HistoryService::GetFavicon() to get the
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// actual value.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AndroidStatement {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AndroidStatement(sql::Statement* statement, int favicon_index);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~AndroidStatement();
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Statement* statement() {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return statement_.get();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The favicon index in statement; -1 is returned if favicon is not in
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the statement.
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int favicon_index() const {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return favicon_index_;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<sql::Statement> statement_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int favicon_index_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AndroidStatement);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_HISTORY_ANDROID_ANDROID_HISTORY_TYPES_H_
333