| Index: components/history/core/browser/visit_database.cc
|
| diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc
|
| index 6d5819c36621ae11058b478811aaca64af2736e8..0761e1138b40012d1ad9f44230a3c27a6855bd50 100644
|
| --- a/components/history/core/browser/visit_database.cc
|
| +++ b/components/history/core/browser/visit_database.cc
|
| @@ -36,7 +36,8 @@ bool VisitDatabase::InitVisitTable() {
|
| "segment_id INTEGER,"
|
| // Some old DBs may have an "is_indexed" field here, but this is no
|
| // longer used and should NOT be read or written from any longer.
|
| - "visit_duration INTEGER DEFAULT 0 NOT NULL)"))
|
| + "visit_duration INTEGER DEFAULT 0 NOT NULL,"
|
| + "context INTEGER DEFAULT 0 NOT NULL)"))
|
| return false;
|
| }
|
|
|
| @@ -91,6 +92,7 @@ void VisitDatabase::FillVisitRow(sql::Statement& statement, VisitRow* visit) {
|
| visit->segment_id = statement.ColumnInt64(5);
|
| visit->visit_duration =
|
| base::TimeDelta::FromInternalValue(statement.ColumnInt64(6));
|
| + visit->context = static_cast<HistoryContext>(statement.ColumnInt(7));
|
| }
|
|
|
| // static
|
| @@ -145,20 +147,20 @@ VisitID VisitDatabase::AddVisit(VisitRow* visit, VisitSource source) {
|
| sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| "INSERT INTO visits "
|
| "(url, visit_time, from_visit, transition, segment_id, "
|
| - "visit_duration) VALUES (?,?,?,?,?,?)"));
|
| + "visit_duration, context) VALUES (?,?,?,?,?,?,?)"));
|
| statement.BindInt64(0, visit->url_id);
|
| statement.BindInt64(1, visit->visit_time.ToInternalValue());
|
| statement.BindInt64(2, visit->referring_visit);
|
| statement.BindInt64(3, visit->transition);
|
| statement.BindInt64(4, visit->segment_id);
|
| statement.BindInt64(5, visit->visit_duration.ToInternalValue());
|
| + statement.BindInt(6, static_cast<int>(visit->context));
|
|
|
| if (!statement.Run()) {
|
| DVLOG(0) << "Failed to execute visit insert statement: "
|
| << "url_id = " << visit->url_id;
|
| return 0;
|
| }
|
| -
|
| visit->visit_id = GetDB().GetLastInsertRowId();
|
|
|
| if (source != SOURCE_BROWSED) {
|
| @@ -231,14 +233,15 @@ bool VisitDatabase::UpdateVisitRow(const VisitRow& visit) {
|
| sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| "UPDATE visits SET "
|
| "url=?,visit_time=?,from_visit=?,transition=?,segment_id=?,"
|
| - "visit_duration=? WHERE id=?"));
|
| + "visit_duration=?, context=? WHERE id=?"));
|
| statement.BindInt64(0, visit.url_id);
|
| statement.BindInt64(1, visit.visit_time.ToInternalValue());
|
| statement.BindInt64(2, visit.referring_visit);
|
| statement.BindInt64(3, visit.transition);
|
| statement.BindInt64(4, visit.segment_id);
|
| statement.BindInt64(5, visit.visit_duration.ToInternalValue());
|
| - statement.BindInt64(6, visit.visit_id);
|
| + statement.BindInt(6, visit.context);
|
| + statement.BindInt64(7, visit.visit_id);
|
|
|
| return statement.Run();
|
| }
|
| @@ -351,6 +354,7 @@ bool VisitDatabase::GetVisibleVisitsInRange(const QueryOptions& options,
|
| visits->clear();
|
| // The visit_time values can be duplicated in a redirect chain, so we sort
|
| // by id too, to ensure a consistent ordering just in case.
|
| + if (static_cast<int>(options.context) < 1 || static_cast<int>(options.context) > 5) {
|
| sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits "
|
| "WHERE visit_time >= ? AND visit_time < ? "
|
| @@ -358,7 +362,6 @@ bool VisitDatabase::GetVisibleVisitsInRange(const QueryOptions& options,
|
| "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or
|
| // KEYWORD_GENERATED
|
| "ORDER BY visit_time DESC, id DESC"));
|
| -
|
| statement.BindInt64(0, options.EffectiveBeginTime());
|
| statement.BindInt64(1, options.EffectiveEndTime());
|
| statement.BindInt(2, ui::PAGE_TRANSITION_CHAIN_END);
|
| @@ -366,8 +369,25 @@ bool VisitDatabase::GetVisibleVisitsInRange(const QueryOptions& options,
|
| statement.BindInt(4, ui::PAGE_TRANSITION_AUTO_SUBFRAME);
|
| statement.BindInt(5, ui::PAGE_TRANSITION_MANUAL_SUBFRAME);
|
| statement.BindInt(6, ui::PAGE_TRANSITION_KEYWORD_GENERATED);
|
| -
|
| return FillVisitVectorWithOptions(statement, options, visits);
|
| +} else {
|
| + sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE,
|
| + "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits "
|
| + "WHERE visit_time >= ? AND visit_time < ? AND context == ? "
|
| + "AND (transition & ?) != 0 " // CHAIN_END
|
| + "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or
|
| + // KEYWORD_GENERATED
|
| + "ORDER BY visit_time DESC, id DESC"));
|
| + statement.BindInt64(0, options.EffectiveBeginTime());
|
| + statement.BindInt64(1, options.EffectiveEndTime());
|
| + statement.BindInt(2, static_cast<int>(options.context));
|
| + statement.BindInt(3, ui::PAGE_TRANSITION_CHAIN_END);
|
| + statement.BindInt(4, ui::PAGE_TRANSITION_CORE_MASK);
|
| + statement.BindInt(5, ui::PAGE_TRANSITION_AUTO_SUBFRAME);
|
| + statement.BindInt(6, ui::PAGE_TRANSITION_MANUAL_SUBFRAME);
|
| + statement.BindInt(7, ui::PAGE_TRANSITION_KEYWORD_GENERATED);
|
| + return FillVisitVectorWithOptions(statement, options, visits);
|
| +}
|
| }
|
|
|
| void VisitDatabase::GetDirectVisitsDuringTimes(const VisitFilter& time_filter,
|
|
|