15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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)#include "chrome/browser/history/top_sites_backend.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/top_sites_database.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/cancelable_task_tracker.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TopSitesBackend::TopSitesBackend()
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : db_(new TopSitesDatabase()) {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::Init(const base::FilePath& path) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_path_ = path;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::InitDBOnDBThread, this, path));
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::Shutdown() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::ShutdownDBOnDBThread, this));
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::GetMostVisitedThumbnails(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const GetMostVisitedThumbnailsCallback& callback,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CancelableTaskTracker* tracker) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<MostVisitedThumbnails> thumbnails = new MostVisitedThumbnails();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool* need_history_migration = new bool(false);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker->PostTaskAndReply(
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::GetMostVisitedThumbnailsOnDBThread,
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 this,
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 thumbnails,
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                 need_history_migration),
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(callback, thumbnails, base::Owned(need_history_migration)));
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::UpdateTopSites(const TopSitesDelta& delta) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::UpdateTopSitesOnDBThread, this, delta));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::SetPageThumbnail(const MostVisitedURL& url,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int url_rank,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       const Images& thumbnail) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::SetPageThumbnailOnDBThread, this, url,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 url_rank, thumbnail));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::ResetDatabase() {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserThread::PostTask(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::DB, FROM_HERE,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&TopSitesBackend::ResetDatabaseOnDBThread, this, db_path_));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::DoEmptyRequest(const base::Closure& reply,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     CancelableTaskTracker* tracker) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tracker->PostTaskAndReply(
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      BrowserThread::GetMessageLoopProxyForThread(BrowserThread::DB).get(),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&base::DoNothing),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reply);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TopSitesBackend::~TopSitesBackend() {
83b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  DCHECK(!db_);  // Shutdown should have happened first (which results in
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 // nulling out db).
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::InitDBOnDBThread(const base::FilePath& path) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!db_->Init(path)) {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Failed to initialize database.";
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_.reset();
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::ShutdownDBOnDBThread() {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::GetMostVisitedThumbnailsOnDBThread(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<MostVisitedThumbnails> thumbnails,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool* need_history_migration) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *need_history_migration = false;
106b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (db_) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->GetPageThumbnails(&(thumbnails->most_visited),
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           &(thumbnails->url_to_images_map));
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *need_history_migration = db_->may_need_history_migration();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::UpdateTopSitesOnDBThread(const TopSitesDelta& delta) {
114b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!db_)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.deleted.size(); ++i)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->RemoveURL(delta.deleted[i]);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.added.size(); ++i)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->SetPageThumbnail(delta.added[i].url, delta.added[i].rank, Images());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < delta.moved.size(); ++i)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    db_->UpdatePageRank(delta.moved[i].url, delta.moved[i].rank);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TopSitesBackend::SetPageThumbnailOnDBThread(const MostVisitedURL& url,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 int url_rank,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 const Images& thumbnail) {
130b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!db_)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_->SetPageThumbnail(url, url_rank, thumbnail);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TopSitesBackend::ResetDatabaseOnDBThread(const base::FilePath& file_path) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset(NULL);
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  sql::Connection::Delete(db_path_);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  db_.reset(new TopSitesDatabase());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitDBOnDBThread(db_path_);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace history
145