summaryrefslogtreecommitdiffstats
path: root/chrome/browser/webdata/keyword_web_data_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/webdata/keyword_web_data_service.cc')
-rw-r--r--chrome/browser/webdata/keyword_web_data_service.cc149
1 files changed, 149 insertions, 0 deletions
diff --git a/chrome/browser/webdata/keyword_web_data_service.cc b/chrome/browser/webdata/keyword_web_data_service.cc
new file mode 100644
index 0000000..44aaa1b
--- /dev/null
+++ b/chrome/browser/webdata/keyword_web_data_service.cc
@@ -0,0 +1,149 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/webdata/keyword_web_data_service.h"
+
+#include "base/bind.h"
+#include "chrome/browser/webdata/keyword_table.h"
+#include "components/search_engines/template_url_data.h"
+#include "components/webdata/common/web_data_results.h"
+#include "components/webdata/common/web_database_service.h"
+
+using base::Bind;
+
+WDKeywordsResult::WDKeywordsResult()
+ : default_search_provider_id(0),
+ builtin_keyword_version(0) {
+}
+
+WDKeywordsResult::~WDKeywordsResult() {}
+
+KeywordWebDataService::BatchModeScoper::BatchModeScoper(
+ KeywordWebDataService* service)
+ : service_(service) {
+ if (service_)
+ service_->AdjustBatchModeLevel(true);
+}
+
+KeywordWebDataService::BatchModeScoper::~BatchModeScoper() {
+ if (service_)
+ service_->AdjustBatchModeLevel(false);
+}
+
+KeywordWebDataService::KeywordWebDataService(
+ scoped_refptr<WebDatabaseService> wdbs,
+ scoped_refptr<base::MessageLoopProxy> ui_thread,
+ const ProfileErrorCallback& callback)
+ : WebDataServiceBase(wdbs, callback, ui_thread),
+ batch_mode_level_(0) {
+}
+
+void KeywordWebDataService::AddKeyword(const TemplateURLData& data) {
+ if (batch_mode_level_) {
+ queued_keyword_operations_.push_back(
+ KeywordTable::Operation(KeywordTable::ADD, data));
+ } else {
+ AdjustBatchModeLevel(true);
+ AddKeyword(data);
+ AdjustBatchModeLevel(false);
+ }
+}
+
+void KeywordWebDataService::RemoveKeyword(TemplateURLID id) {
+ if (batch_mode_level_) {
+ TemplateURLData data;
+ data.id = id;
+ queued_keyword_operations_.push_back(
+ KeywordTable::Operation(KeywordTable::REMOVE, data));
+ } else {
+ AdjustBatchModeLevel(true);
+ RemoveKeyword(id);
+ AdjustBatchModeLevel(false);
+ }
+}
+
+void KeywordWebDataService::UpdateKeyword(const TemplateURLData& data) {
+ if (batch_mode_level_) {
+ queued_keyword_operations_.push_back(
+ KeywordTable::Operation(KeywordTable::UPDATE, data));
+ } else {
+ AdjustBatchModeLevel(true);
+ UpdateKeyword(data);
+ AdjustBatchModeLevel(false);
+ }
+}
+
+WebDataServiceBase::Handle KeywordWebDataService::GetKeywords(
+ WebDataServiceConsumer* consumer) {
+ return wdbs_->ScheduleDBTaskWithResult(
+ FROM_HERE, Bind(&KeywordWebDataService::GetKeywordsImpl, this), consumer);
+}
+
+void KeywordWebDataService::SetDefaultSearchProviderID(TemplateURLID id) {
+ wdbs_->ScheduleDBTask(
+ FROM_HERE,
+ Bind(&KeywordWebDataService::SetDefaultSearchProviderIDImpl, this, id));
+}
+
+void KeywordWebDataService::SetBuiltinKeywordVersion(int version) {
+ wdbs_->ScheduleDBTask(
+ FROM_HERE,
+ Bind(&KeywordWebDataService::SetBuiltinKeywordVersionImpl,
+ this, version));
+}
+
+KeywordWebDataService::~KeywordWebDataService() {
+ DCHECK(!batch_mode_level_);
+}
+
+void KeywordWebDataService::AdjustBatchModeLevel(bool entering_batch_mode) {
+ if (entering_batch_mode) {
+ ++batch_mode_level_;
+ } else {
+ DCHECK(batch_mode_level_);
+ --batch_mode_level_;
+ if (!batch_mode_level_ && !queued_keyword_operations_.empty()) {
+ wdbs_->ScheduleDBTask(
+ FROM_HERE,
+ Bind(&KeywordWebDataService::PerformKeywordOperationsImpl, this,
+ queued_keyword_operations_));
+ queued_keyword_operations_.clear();
+ }
+ }
+}
+
+WebDatabase::State KeywordWebDataService::PerformKeywordOperationsImpl(
+ const KeywordTable::Operations& operations,
+ WebDatabase* db) {
+ return KeywordTable::FromWebDatabase(db)->PerformOperations(operations) ?
+ WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
+}
+
+scoped_ptr<WDTypedResult> KeywordWebDataService::GetKeywordsImpl(
+ WebDatabase* db) {
+ scoped_ptr<WDTypedResult> result_ptr;
+ WDKeywordsResult result;
+ if (KeywordTable::FromWebDatabase(db)->GetKeywords(&result.keywords)) {
+ result.default_search_provider_id =
+ KeywordTable::FromWebDatabase(db)->GetDefaultSearchProviderID();
+ result.builtin_keyword_version =
+ KeywordTable::FromWebDatabase(db)->GetBuiltinKeywordVersion();
+ result_ptr.reset(new WDResult<WDKeywordsResult>(KEYWORDS_RESULT, result));
+ }
+ return result_ptr.Pass();
+}
+
+WebDatabase::State KeywordWebDataService::SetDefaultSearchProviderIDImpl(
+ TemplateURLID id,
+ WebDatabase* db) {
+ return KeywordTable::FromWebDatabase(db)->SetDefaultSearchProviderID(id) ?
+ WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
+}
+
+WebDatabase::State KeywordWebDataService::SetBuiltinKeywordVersionImpl(
+ int version,
+ WebDatabase* db) {
+ return KeywordTable::FromWebDatabase(db)->SetBuiltinKeywordVersion(version) ?
+ WebDatabase::COMMIT_NEEDED : WebDatabase::COMMIT_NOT_NEEDED;
+}