1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
#define COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
#include <map>
#include <string>
#include "base/files/file_path.h"
#include "base/memory/raw_ptr.h"
#include "components/webdata/common/web_database_table.h"
#include "components/webdata/common/webdata_export.h"
#include "sql/database.h"
#include "sql/init_status.h"
#include "sql/meta_table.h"
#include "sql/transaction.h"
namespace os_crypt_async {
class Encryptor;
}
// This class manages a SQLite database that stores various web page meta data.
class WEBDATA_EXPORT WebDatabase {
public:
enum State { COMMIT_NOT_NEEDED, COMMIT_NEEDED };
// Current database version number.
//
// Note: when changing the current version number, corresponding changes must
// happen in the unit tests, and new migration test added to
// `WebDatabaseMigrationTest`.
static constexpr int kCurrentVersionNumber = 141;
// To support users who are upgrading from older versions of Chrome, we enable
// migrating from any database version newer than `kDeprecatedVersionNumber`.
// If an upgrading user has a database version of `kDeprecatedVersionNumber`
// or lower, their database will be fully deleted and recreated instead
// (losing all data previously in it).
//
// To determine this migration window, we support the same Chrome versions
// that Chrome Sync does. Any database version that was added before the
// oldest Chrome version that sync supports can be dropped from the Chromium
// codebase (i.e., increment `kDeprecatedVersionNumber` and remove related
// tests + support files).
//
// Note the difference between database version and Chrome version! To
// determine the database version for a given Chrome version, check out the
// git branch for the Chrome version, and look at `kCurrentVersionNumber` in
// that branch.
//
// To determine the versions of Chrome that Chrome Sync supports, see
// `max_client_version_to_reject` in server_chrome_sync_config.proto (internal
// only).
static constexpr int kDeprecatedVersionNumber = 82;
// Use this as a path to create an in-memory database.
static const base::FilePath::CharType kInMemoryPath[];
WebDatabase();
WebDatabase(const WebDatabase&) = delete;
WebDatabase& operator=(const WebDatabase&) = delete;
virtual ~WebDatabase();
// Adds a database table. Ownership remains with the caller, which
// must ensure that the lifetime of |table| exceeds this object's
// lifetime. Must only be called before Init.
void AddTable(WebDatabaseTable* table);
// Retrieves a table based on its |key|.
WebDatabaseTable* GetTable(WebDatabaseTable::TypeKey key);
// Call before Init() to set the error callback to be used for the
// underlying database connection.
void set_error_callback(const sql::Database::ErrorCallback& error_callback) {
db_.set_error_callback(error_callback);
}
// Initialize the database given a name. The name defines where the SQLite
// file is. If this returns an error code, no other method should be called.
//
// Before calling this method, you must call AddTable for any
// WebDatabaseTable objects that are supposed to participate in
// managing the database.
//
// `encryptor` must not be null except in test code.
sql::InitStatus Init(const base::FilePath& db_name,
const os_crypt_async::Encryptor* encryptor = nullptr);
// Transactions management
void BeginTransaction();
void CommitTransaction();
// Acquire a scoped transaction. The `AcquireTransaction` is meant to replace
// the `BeginTransaction` / `CommitTransaction` transaction management and
// both are exclusive.
//
// Returns an sql::Transaction which automatically rolls back uncommitted
// transactions when going out of scope. If this method fails, no transaction
// is returned but the database will still execute statements, but they will
// be enclosed in their own implicit transaction.
std::unique_ptr<sql::Transaction> AcquireTransaction();
std::string GetDiagnosticInfo(int extended_error, sql::Statement* statement);
// Exposed for testing only.
sql::Database* GetSQLConnection();
private:
// Used by |Init()| to migration database schema from older versions to
// current version.
sql::InitStatus MigrateOldVersionsAsNeeded();
// Migrates this database to |version|. Returns false if there was
// migration work to do and it failed, true otherwise.
//
// Implementations may set |*update_compatible_version| to true if
// the compatible version should be changed to |version|.
// Implementations should otherwise not modify this parameter.
bool MigrateToVersion(int version, bool* update_compatible_version);
bool MigrateToVersion58DropWebAppsAndIntents();
bool MigrateToVersion79DropLoginsTable();
bool MigrateToVersion105DropIbansTable();
sql::Database db_;
sql::MetaTable meta_table_;
// Sets when the scoped transaction should be used instead of the
// BeginTransaction/CommitTransaction transaction APIs. Sets to true when
// part of the 'SqlScopedTransactionWebDatabase' Finch experiment.
const bool use_scoped_transaction_;
// Map of all the different tables that have been added to this
// object. Non-owning.
std::map<WebDatabaseTable::TypeKey, raw_ptr<WebDatabaseTable>> tables_;
};
#endif // COMPONENTS_WEBDATA_COMMON_WEB_DATABASE_H_
|