1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/keyword_web_data_service.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/keyword_table.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_data.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/webdata/common/web_data_results.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/webdata/common/web_database_service.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing base::Bind;
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWDKeywordsResult::WDKeywordsResult()
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  : default_search_provider_id(0),
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    builtin_keyword_version(0) {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
20116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWDKeywordsResult::~WDKeywordsResult() {}
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeywordWebDataService::BatchModeScoper::BatchModeScoper(
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    KeywordWebDataService* service)
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : service_(service) {
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (service_)
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_->AdjustBatchModeLevel(true);
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeywordWebDataService::BatchModeScoper::~BatchModeScoper() {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (service_)
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_->AdjustBatchModeLevel(false);
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeywordWebDataService::KeywordWebDataService(
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<WebDatabaseService> wdbs,
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    scoped_refptr<base::MessageLoopProxy> ui_thread,
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ProfileErrorCallback& callback)
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : WebDataServiceBase(wdbs, callback, ui_thread),
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      batch_mode_level_(0) {
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::AddKeyword(const TemplateURLData& data) {
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (batch_mode_level_) {
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    queued_keyword_operations_.push_back(
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        KeywordTable::Operation(KeywordTable::ADD, data));
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(true);
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AddKeyword(data);
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(false);
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::RemoveKeyword(TemplateURLID id) {
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (batch_mode_level_) {
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURLData data;
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    data.id = id;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    queued_keyword_operations_.push_back(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        KeywordTable::Operation(KeywordTable::REMOVE, data));
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(true);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RemoveKeyword(id);
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(false);
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::UpdateKeyword(const TemplateURLData& data) {
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (batch_mode_level_) {
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    queued_keyword_operations_.push_back(
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        KeywordTable::Operation(KeywordTable::UPDATE, data));
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(true);
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UpdateKeyword(data);
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AdjustBatchModeLevel(false);
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDataServiceBase::Handle KeywordWebDataService::GetKeywords(
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebDataServiceConsumer* consumer) {
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return wdbs_->ScheduleDBTaskWithResult(
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE, Bind(&KeywordWebDataService::GetKeywordsImpl, this), consumer);
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::SetDefaultSearchProviderID(TemplateURLID id) {
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  wdbs_->ScheduleDBTask(
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Bind(&KeywordWebDataService::SetDefaultSearchProviderIDImpl, this, id));
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::SetBuiltinKeywordVersion(int version) {
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  wdbs_->ScheduleDBTask(
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      FROM_HERE,
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      Bind(&KeywordWebDataService::SetBuiltinKeywordVersionImpl,
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           this, version));
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
96116680a4aac90f2aa7413d9095a592090648e557Ben MurdochKeywordWebDataService::~KeywordWebDataService() {
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(!batch_mode_level_);
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid KeywordWebDataService::AdjustBatchModeLevel(bool entering_batch_mode) {
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (entering_batch_mode) {
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ++batch_mode_level_;
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK(batch_mode_level_);
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    --batch_mode_level_;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!batch_mode_level_ && !queued_keyword_operations_.empty()) {
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      wdbs_->ScheduleDBTask(
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          FROM_HERE,
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch          Bind(&KeywordWebDataService::PerformKeywordOperationsImpl, this,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               queued_keyword_operations_));
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      queued_keyword_operations_.clear();
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
116116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDatabase::State KeywordWebDataService::PerformKeywordOperationsImpl(
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const KeywordTable::Operations& operations,
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebDatabase* db) {
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return KeywordTable::FromWebDatabase(db)->PerformOperations(operations) ?
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<WDTypedResult> KeywordWebDataService::GetKeywordsImpl(
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebDatabase* db) {
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<WDTypedResult> result_ptr;
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WDKeywordsResult result;
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (KeywordTable::FromWebDatabase(db)->GetKeywords(&result.keywords)) {
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result.default_search_provider_id =
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        KeywordTable::FromWebDatabase(db)->GetDefaultSearchProviderID();
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result.builtin_keyword_version =
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        KeywordTable::FromWebDatabase(db)->GetBuiltinKeywordVersion();
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    result_ptr.reset(new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result));
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return result_ptr.Pass();
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
137116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDatabase::State KeywordWebDataService::SetDefaultSearchProviderIDImpl(
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    TemplateURLID id,
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebDatabase* db) {
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return KeywordTable::FromWebDatabase(db)->SetDefaultSearchProviderID(id) ?
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
144116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebDatabase::State KeywordWebDataService::SetBuiltinKeywordVersionImpl(
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int version,
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    WebDatabase* db) {
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return KeywordTable::FromWebDatabase(db)->SetBuiltinKeywordVersion(version) ?
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
150