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