1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef COMPONENTS_WEBDATA_COMMON_WEB_DATA_SERVICE_BACKEND_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define COMPONENTS_WEBDATA_COMMON_WEB_DATA_SERVICE_BACKEND_H_ 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback_forward.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/compiler_specific.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/file_path.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/ref_counted.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/ref_counted_delete_on_message_loop.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_vector.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_service.h" 17a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "components/webdata/common/webdata_export.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDatabase; 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDatabaseTable; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDataRequest; 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDataRequestManager; 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace tracked_objects { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Location; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// WebDataServiceBackend handles all database tasks posted by 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// WebDatabaseService. It is refcounted to allow asynchronous destruction on the 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// DB thread. 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 32a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// TODO(caitkp): Rename this class to WebDatabaseBackend. 33a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 34a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class WEBDATA_EXPORT WebDataServiceBackend 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) : public base::RefCountedDeleteOnMessageLoop<WebDataServiceBackend> { 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) class Delegate { 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public: 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~Delegate() {} 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Invoked when the backend has finished loading the db. 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void DBLoaded(sql::InitStatus status) = 0; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) }; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) WebDataServiceBackend(const base::FilePath& path, 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Delegate* delegate, 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const scoped_refptr<base::MessageLoopProxy>& db_thread); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Must call only before InitDatabaseWithCallback. 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void AddTable(scoped_ptr<WebDatabaseTable> table); 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Initializes the database and notifies caller via callback when complete. 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Callback is called synchronously. 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void InitDatabase(); 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Opens the database file from the profile path if an init has not yet been 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // attempted. Separated from the constructor to ease construction/destruction 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of this object on one thread but database access on the DB thread. Returns 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the status of the database. 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sql::InitStatus LoadDatabaseIfNecessary(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Shuts down the database. 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ShutdownDatabase(); 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Task wrappers to update requests and and notify |request_manager_|. These 66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // are used in cases where the request is being made from the UI thread and an 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // asyncronous callback is required to notify the client of |request|'s 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // completion. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DBWriteTaskWrapper( 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebDatabaseService::WriteTask& task, 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebDataRequest> request); 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void DBReadTaskWrapper( 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const WebDatabaseService::ReadTask& task, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebDataRequest> request); 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 76a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Task runners to run database tasks. 77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) void ExecuteWriteTask(const WebDatabaseService::WriteTask& task); 78a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<WDTypedResult> ExecuteReadTask( 79a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const WebDatabaseService::ReadTask& task); 80a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const scoped_refptr<WebDataRequestManager>& request_manager() { 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return request_manager_; 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebDatabase* database() { return db_.get(); } 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) protected: 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) friend class base::RefCountedDeleteOnMessageLoop<WebDataServiceBackend>; 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) friend class base::DeleteHelper<WebDataServiceBackend>; 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 91a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ~WebDataServiceBackend(); 92a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commit the current transaction. 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Commit(); 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Path to database file. 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::FilePath db_path_; 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The tables that participate in managing the database. These are 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // owned here but other than that this class does nothing with 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // them. Their initialization is in whatever factory creates 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // WebDatabaseService, and lookup by type is provided by the 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // WebDatabase class. The tables need to be owned by this refcounted 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // object, or they themselves would need to be refcounted. Owning 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // them here rather than having WebDatabase own them makes for 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // easier unit testing of WebDatabase. 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ScopedVector<WebDatabaseTable> tables_; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<WebDatabase> db_; 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Keeps track of all pending requests made to the db. 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<WebDataRequestManager> request_manager_; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // State of database initialization. Used to prevent the executing of tasks 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // before the db is ready. 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) sql::InitStatus init_status_; 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // True if an attempt has been made to load the database (even if the attempt 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // fails), used to avoid continually trying to reinit if the db init fails. 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool init_complete_; 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Delegate. See the class definition above for more information. 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<Delegate> delegate_; 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebDataServiceBackend); 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // COMPONENTS_WEBDATA_COMMON_WEB_DATA_SERVICE_BACKEND_H_ 130