| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/history/visit_database.h" | 5 #include "chrome/browser/history/visit_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 249 statement.BindInt(3, transition); | 249 statement.BindInt(3, transition); |
| 250 statement.BindInt64(4, | 250 statement.BindInt64(4, |
| 251 max_results ? max_results : std::numeric_limits<int64>::max()); | 251 max_results ? max_results : std::numeric_limits<int64>::max()); |
| 252 | 252 |
| 253 AddEventToVisitLog(VisitLog::SELECT_VISIT); | 253 AddEventToVisitLog(VisitLog::SELECT_VISIT); |
| 254 FillVisitVector(statement, visits); | 254 FillVisitVector(statement, visits); |
| 255 } | 255 } |
| 256 | 256 |
| 257 void VisitDatabase::GetVisibleVisitsInRange(base::Time begin_time, | 257 void VisitDatabase::GetVisibleVisitsInRange(base::Time begin_time, |
| 258 base::Time end_time, | 258 base::Time end_time, |
| 259 bool most_recent_visit_only, | |
| 260 int max_count, | 259 int max_count, |
| 261 VisitVector* visits) { | 260 VisitVector* visits) { |
| 262 visits->clear(); | 261 visits->clear(); |
| 263 // The visit_time values can be duplicated in a redirect chain, so we sort | 262 // The visit_time values can be duplicated in a redirect chain, so we sort |
| 264 // by id too, to ensure a consistent ordering just in case. | 263 // by id too, to ensure a consistent ordering just in case. |
| 265 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, | 264 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, |
| 266 "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " | 265 "SELECT" HISTORY_VISIT_ROW_FIELDS "FROM visits " |
| 267 "WHERE visit_time >= ? AND visit_time < ? " | 266 "WHERE visit_time >= ? AND visit_time < ? " |
| 268 "AND (transition & ?) != 0 " // CHAIN_END | 267 "AND (transition & ?) != 0 " // CHAIN_END |
| 269 "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or | 268 "AND (transition & ?) NOT IN (?, ?, ?) " // NO SUBFRAME or |
| (...skipping 12 matching lines...) Expand all Loading... |
| 282 statement.BindInt(3, PageTransition::CORE_MASK); | 281 statement.BindInt(3, PageTransition::CORE_MASK); |
| 283 statement.BindInt(4, PageTransition::AUTO_SUBFRAME); | 282 statement.BindInt(4, PageTransition::AUTO_SUBFRAME); |
| 284 statement.BindInt(5, PageTransition::MANUAL_SUBFRAME); | 283 statement.BindInt(5, PageTransition::MANUAL_SUBFRAME); |
| 285 statement.BindInt(6, PageTransition::KEYWORD_GENERATED); | 284 statement.BindInt(6, PageTransition::KEYWORD_GENERATED); |
| 286 | 285 |
| 287 AddEventToVisitLog(VisitLog::SELECT_VISIT); | 286 AddEventToVisitLog(VisitLog::SELECT_VISIT); |
| 288 std::set<URLID> found_urls; | 287 std::set<URLID> found_urls; |
| 289 while (statement.Step()) { | 288 while (statement.Step()) { |
| 290 VisitRow visit; | 289 VisitRow visit; |
| 291 FillVisitRow(statement, &visit); | 290 FillVisitRow(statement, &visit); |
| 292 if (most_recent_visit_only) { | 291 // Make sure the URL this visit corresponds to is unique. |
| 293 // Make sure the URL this visit corresponds to is unique if required. | 292 if (found_urls.find(visit.url_id) != found_urls.end()) |
| 294 if (found_urls.find(visit.url_id) != found_urls.end()) | 293 continue; |
| 295 continue; | 294 found_urls.insert(visit.url_id); |
| 296 found_urls.insert(visit.url_id); | |
| 297 } | |
| 298 visits->push_back(visit); | 295 visits->push_back(visit); |
| 299 | 296 |
| 300 if (max_count > 0 && static_cast<int>(visits->size()) >= max_count) | 297 if (max_count > 0 && static_cast<int>(visits->size()) >= max_count) |
| 301 break; | 298 break; |
| 302 } | 299 } |
| 303 } | 300 } |
| 304 | 301 |
| 305 VisitID VisitDatabase::GetMostRecentVisitForURL(URLID url_id, | 302 VisitID VisitDatabase::GetMostRecentVisitForURL(URLID url_id, |
| 306 VisitRow* visit_row) { | 303 VisitRow* visit_row) { |
| 307 // The visit_time values can be duplicated in a redirect chain, so we sort | 304 // The visit_time values can be duplicated in a redirect chain, so we sort |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 449 AddEventToVisitLog(VisitLog::SELECT_VISIT); | 446 AddEventToVisitLog(VisitLog::SELECT_VISIT); |
| 450 if (!statement || !statement.Step() || statement.ColumnInt64(0) == 0) { | 447 if (!statement || !statement.Step() || statement.ColumnInt64(0) == 0) { |
| 451 *first_visit = base::Time::Now(); | 448 *first_visit = base::Time::Now(); |
| 452 return false; | 449 return false; |
| 453 } | 450 } |
| 454 *first_visit = base::Time::FromInternalValue(statement.ColumnInt64(0)); | 451 *first_visit = base::Time::FromInternalValue(statement.ColumnInt64(0)); |
| 455 return true; | 452 return true; |
| 456 } | 453 } |
| 457 | 454 |
| 458 } // namespace history | 455 } // namespace history |
| OLD | NEW |