15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/web_database_table.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "components/webdata/common/webdata_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/connection.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/init_status.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sql/meta_table.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace base {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FilePath;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages a SQLite database that stores various web page meta data.
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WEBDATA_EXPORT WebDatabase {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum State {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    COMMIT_NOT_NEEDED,
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    COMMIT_NEEDED
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exposed publicly so the keyword table can access it.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kCurrentVersionNumber;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDatabase();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDatabase();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a database table. Ownership remains with the caller, which
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // must ensure that the lifetime of |table| exceeds this object's
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // lifetime. Must only be called before Init.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddTable(WebDatabaseTable* table);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Retrieves a table based on its |key|.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebDatabaseTable* GetTable(WebDatabaseTable::TypeKey key);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize the database given a name. The name defines where the SQLite
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file is. If this returns an error code, no other method should be called.
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Before calling this method, you must call AddTable for any
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WebDatabaseTable objects that are supposed to participate in
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // managing the database.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sql::InitStatus Init(const base::FilePath& db_name);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transactions management
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BeginTransaction();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CommitTransaction();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Exposed for testing only.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection* GetSQLConnection();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used by |Init()| to migration database schema from older versions to
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // current version.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  sql::InitStatus MigrateOldVersionsAsNeeded();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::Connection db_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sql::MetaTable meta_table_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Map of all the different tables that have been added to this
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // object. Non-owning.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::map<WebDatabaseTable::TypeKey, WebDatabaseTable*> TableMap;
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TableMap tables_;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDatabase);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
74