| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/url_database.h" | 5 #include "chrome/browser/history/url_database.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <limits> | 8 #include <limits> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 470 int max_count, | 470 int max_count, |
| 471 std::vector<KeywordSearchTermVisit>* matches) { | 471 std::vector<KeywordSearchTermVisit>* matches) { |
| 472 // NOTE: the keyword_id can be zero if on first run the user does a query | 472 // NOTE: the keyword_id can be zero if on first run the user does a query |
| 473 // before the TemplateURLService has finished loading. As the chances of this | 473 // before the TemplateURLService has finished loading. As the chances of this |
| 474 // occurring are small, we ignore it. | 474 // occurring are small, we ignore it. |
| 475 if (!keyword_id) | 475 if (!keyword_id) |
| 476 return; | 476 return; |
| 477 | 477 |
| 478 DCHECK(!prefix.empty()); | 478 DCHECK(!prefix.empty()); |
| 479 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, | 479 sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, |
| 480 "SELECT DISTINCT kv.term, u.last_visit_time " | 480 "SELECT DISTINCT kv.term, u.visit_count, u.last_visit_time " |
| 481 "FROM keyword_search_terms kv " | 481 "FROM keyword_search_terms kv " |
| 482 "JOIN urls u ON kv.url_id = u.id " | 482 "JOIN urls u ON kv.url_id = u.id " |
| 483 "WHERE kv.keyword_id = ? AND kv.lower_term >= ? AND kv.lower_term < ? " | 483 "WHERE kv.keyword_id = ? AND kv.lower_term >= ? AND kv.lower_term < ? " |
| 484 "ORDER BY u.last_visit_time DESC LIMIT ?")); | 484 "ORDER BY u.last_visit_time DESC LIMIT ?")); |
| 485 if (!statement) | 485 if (!statement) |
| 486 return; | 486 return; |
| 487 | 487 |
| 488 // NOTE: Keep this ToLower() call in sync with search_provider.cc. | 488 // NOTE: Keep this ToLower() call in sync with search_provider.cc. |
| 489 string16 lower_prefix = base::i18n::ToLower(prefix); | 489 string16 lower_prefix = base::i18n::ToLower(prefix); |
| 490 // This magic gives us a prefix search. | 490 // This magic gives us a prefix search. |
| 491 string16 next_prefix = lower_prefix; | 491 string16 next_prefix = lower_prefix; |
| 492 next_prefix[next_prefix.size() - 1] = | 492 next_prefix[next_prefix.size() - 1] = |
| 493 next_prefix[next_prefix.size() - 1] + 1; | 493 next_prefix[next_prefix.size() - 1] + 1; |
| 494 statement.BindInt64(0, keyword_id); | 494 statement.BindInt64(0, keyword_id); |
| 495 statement.BindString16(1, lower_prefix); | 495 statement.BindString16(1, lower_prefix); |
| 496 statement.BindString16(2, next_prefix); | 496 statement.BindString16(2, next_prefix); |
| 497 statement.BindInt(3, max_count); | 497 statement.BindInt(3, max_count); |
| 498 | 498 |
| 499 KeywordSearchTermVisit visit; | 499 KeywordSearchTermVisit visit; |
| 500 while (statement.Step()) { | 500 while (statement.Step()) { |
| 501 visit.term = statement.ColumnString16(0); | 501 visit.term = statement.ColumnString16(0); |
| 502 visit.time = base::Time::FromInternalValue(statement.ColumnInt64(1)); | 502 visit.visits = statement.ColumnInt(1); |
| 503 visit.time = base::Time::FromInternalValue(statement.ColumnInt64(2)); |
| 503 matches->push_back(visit); | 504 matches->push_back(visit); |
| 504 } | 505 } |
| 505 } | 506 } |
| 506 | 507 |
| 507 bool URLDatabase::DropStarredIDFromURLs() { | 508 bool URLDatabase::DropStarredIDFromURLs() { |
| 508 if (!GetDB().DoesColumnExist("urls", "starred_id")) | 509 if (!GetDB().DoesColumnExist("urls", "starred_id")) |
| 509 return true; // urls is already updated, no need to continue. | 510 return true; // urls is already updated, no need to continue. |
| 510 | 511 |
| 511 // Create a temporary table to contain the new URLs table. | 512 // Create a temporary table to contain the new URLs table. |
| 512 if (!CreateTemporaryURLTable()) { | 513 if (!CreateTemporaryURLTable()) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 return GetDB().Execute(sql.c_str()); | 552 return GetDB().Execute(sql.c_str()); |
| 552 } | 553 } |
| 553 | 554 |
| 554 void URLDatabase::CreateMainURLIndex() { | 555 void URLDatabase::CreateMainURLIndex() { |
| 555 // Index over URLs so we can quickly look up based on URL. Ignore errors as | 556 // Index over URLs so we can quickly look up based on URL. Ignore errors as |
| 556 // this likely already exists (and the same below). | 557 // this likely already exists (and the same below). |
| 557 GetDB().Execute("CREATE INDEX urls_url_index ON urls (url)"); | 558 GetDB().Execute("CREATE INDEX urls_url_index ON urls (url)"); |
| 558 } | 559 } |
| 559 | 560 |
| 560 } // namespace history | 561 } // namespace history |
| OLD | NEW |