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)#include "chrome/browser/history/android/bookmark_model_sql_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_utils.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/history/core/browser/url_database.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The interesting columns of this handler.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const HistoryAndBookmarkRow::ColumnID kInterestingColumns[] = {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HistoryAndBookmarkRow::BOOKMARK, HistoryAndBookmarkRow::TITLE };
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::Task::Task() {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& title) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model = GetBookmarkModel();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bookmark_model)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const BookmarkNode* mobile_node = bookmark_model->mobile_node();
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (mobile_node)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_model->AddURL(mobile_node, 0, title, url);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::AddBookmark(const GURL& url,
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                const base::string16& title,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int64 parent_id) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model = GetBookmarkModel();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bookmark_model)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const BookmarkNode* parent =
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      bookmarks::GetBookmarkNodeByID(bookmark_model, parent_id);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (parent)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_model->AddURL(parent, 0, title, url);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BookmarkModelSQLHandler::Task::RemoveBookmark(const GURL& url) {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model = GetBookmarkModel();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bookmark_model)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const BookmarkNode*> nodes;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_model->GetNodesByURL(url, &nodes);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<const BookmarkNode*>::iterator i = nodes.begin();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != nodes.end(); ++i) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BookmarkNode* parent_node = (*i)->parent();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_model->Remove(parent_node, parent_node->GetIndexOf(*i));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BookmarkModelSQLHandler::Task::UpdateBookmarkTitle(
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const GURL& url,
70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& title) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BookmarkModel* bookmark_model = GetBookmarkModel();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!bookmark_model)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<const BookmarkNode*> nodes;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bookmark_model->GetNodesByURL(url, &nodes);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (std::vector<const BookmarkNode*>::iterator i = nodes.begin();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != nodes.end(); ++i) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bookmark_model->SetTitle(*i, title);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::Task::~Task() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModel* BookmarkModelSQLHandler::Task::GetBookmarkModel() {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = ProfileManager::GetLastUsedProfile();
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!profile)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BookmarkModelFactory::GetForProfile(profile);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::BookmarkModelSQLHandler(
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    URLDatabase* url_database)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : SQLHandler(kInterestingColumns, arraysize(kInterestingColumns)),
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url_database_(url_database) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BookmarkModelSQLHandler::~BookmarkModelSQLHandler() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Update(const HistoryAndBookmarkRow& row,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const TableIDRows& ids_set) {
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (TableIDRows::const_iterator i = ids_set.begin();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      i != ids_set.end(); ++i) {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (row.is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK)) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (row.is_bookmark()) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        URLRow url_row;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (!url_database_->GetURLRow(i->url_id, &url_row))
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (row.is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &BookmarkModelSQLHandler::Task::AddBookmark,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              scoped_refptr<BookmarkModelSQLHandler::Task>(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  new BookmarkModelSQLHandler::Task()),
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              i->url, url_row.title(), row.parent_id()));
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        } else {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              scoped_refptr<BookmarkModelSQLHandler::Task>(
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  new BookmarkModelSQLHandler::Task()),
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              i->url, url_row.title()));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            &BookmarkModelSQLHandler::Task::RemoveBookmark,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            scoped_refptr<BookmarkModelSQLHandler::Task>(
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                new BookmarkModelSQLHandler::Task()),
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            i->url));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (row.is_value_set_explicitly(HistoryAndBookmarkRow::TITLE)) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          &BookmarkModelSQLHandler::Task::UpdateBookmarkTitle,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          scoped_refptr<BookmarkModelSQLHandler::Task>(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              new BookmarkModelSQLHandler::Task()),
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          i->url, row.title()));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Delete(const TableIDRows& ids_set) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (TableIDRows::const_iterator i = ids_set.begin();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       i != ids_set.end(); ++i) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &BookmarkModelSQLHandler::Task::RemoveBookmark,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_refptr<BookmarkModelSQLHandler::Task>(
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new BookmarkModelSQLHandler::Task()),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        i->url));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BookmarkModelSQLHandler::Insert(HistoryAndBookmarkRow* row) {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(row->is_value_set_explicitly(HistoryAndBookmarkRow::URL));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!row->is_value_set_explicitly(HistoryAndBookmarkRow::BOOKMARK) ||
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !row->is_bookmark())
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (row->is_value_set_explicitly(HistoryAndBookmarkRow::PARENT_ID)) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &BookmarkModelSQLHandler::Task::AddBookmark,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_refptr<BookmarkModelSQLHandler::Task>(
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new BookmarkModelSQLHandler::Task()),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        row->url(), row->title(), row->parent_id()));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        &BookmarkModelSQLHandler::Task::AddBookmarkToMobileFolder,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        scoped_refptr<BookmarkModelSQLHandler::Task>(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            new BookmarkModelSQLHandler::Task()),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        row->url(), row->title()));
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace history
176