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#ifndef COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/ref_counted.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/keyword_table.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_id.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/webdata/common/web_data_service_base.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/webdata/common/web_database.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace base {
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass MessageLoopProxy;
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WDTypedResult;
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebDatabaseService;
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct TemplateURLData;
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct WDKeywordsResult {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WDKeywordsResult();
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ~WDKeywordsResult();
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KeywordTable::Keywords keywords;
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Identifies the ID of the TemplateURL that is the default search. A value of
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // 0 indicates there is no default search provider.
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int64 default_search_provider_id;
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Version of the built-in keywords. A value of 0 indicates a first run.
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int builtin_keyword_version;
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass WebDataServiceConsumer;
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass KeywordWebDataService : public WebDataServiceBase {
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Instantiate this to turn on batch mode on the provided |service|
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // until the scoper is destroyed.  When batch mode is on, calls to any of the
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // three keyword table modification functions below will result in locally
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // queueing the operation; on setting this back to false, all the
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // modifications will be performed at once.  This is a performance
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // optimization; see comments on KeywordTable::PerformOperations().
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // If multiple scopers are in-scope simultaneously, batch mode will only be
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // exited when all are destroyed.  If |service| is NULL, the object will do
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // nothing.
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  class BatchModeScoper {
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   public:
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    explicit BatchModeScoper(KeywordWebDataService* service);
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ~BatchModeScoper();
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch   private:
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    KeywordWebDataService* service_;
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DISALLOW_COPY_AND_ASSIGN(BatchModeScoper);
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  };
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KeywordWebDataService(scoped_refptr<WebDatabaseService> wdbs,
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        scoped_refptr<base::MessageLoopProxy> ui_thread,
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        const ProfileErrorCallback& callback);
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // As the database processes requests at a later date, all deletion is
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // done on the background thread.
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Many of the keyword related methods do not return a handle. This is because
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // the caller (TemplateURLService) does not need to know when the request is
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // done.
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddKeyword(const TemplateURLData& data);
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void RemoveKeyword(TemplateURLID id);
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void UpdateKeyword(const TemplateURLData& data);
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Fetches the keywords.
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // On success, consumer is notified with WDResult<KeywordTable::Keywords>.
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Handle GetKeywords(WebDataServiceConsumer* consumer);
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sets the ID of the default search provider.
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetDefaultSearchProviderID(TemplateURLID id);
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Sets the version of the builtin keywords.
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SetBuiltinKeywordVersion(int version);
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~KeywordWebDataService();
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Called by the BatchModeScoper (see comments there).
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AdjustBatchModeLevel(bool entering_batch_mode);
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //////////////////////////////////////////////////////////////////////////////
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The following methods are only invoked on the DB thread.
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  //////////////////////////////////////////////////////////////////////////////
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebDatabase::State PerformKeywordOperationsImpl(
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const KeywordTable::Operations& operations,
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      WebDatabase* db);
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<WDTypedResult> GetKeywordsImpl(WebDatabase* db);
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebDatabase::State SetDefaultSearchProviderIDImpl(TemplateURLID id,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                    WebDatabase* db);
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  WebDatabase::State SetBuiltinKeywordVersionImpl(int version, WebDatabase* db);
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  size_t batch_mode_level_;
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KeywordTable::Operations queued_keyword_operations_;
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(KeywordWebDataService);
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif  // COMPONENTS_SEARCH_ENGINES_KEYWORD_WEB_DATA_SERVICE_H__
111