0

Remove config setters from sql/database.h

Most of the setters for configuration options for a SQLite database only
worked before the database was opened and were no-ops otherwise. This
led to confusing semantics and needing to support unnatural behaviour in
other parts of sql/ code.

This change removes the setters for the database config now encapsulated
in the DatabaseOptions struct. This struct is only set once as part of a
new constructor.

All feature code has already been migrated to use the new constructor
instead of the setter methods.

Bug: 1126968
Change-Id: I13474fbb87c7f2da386e83fb8d1fe3d8c44ab963
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2627941
Commit-Queue: Shubham Aggarwal <shuagga@microsoft.com>
Reviewed-by: Victor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#848097}
This commit is contained in:
Shubham Aggarwal
2021-01-28 15:11:23 +00:00
committed by Chromium LUCI CQ
parent c80c885674
commit b30a0cee48

@ -56,6 +56,19 @@ struct COMPONENT_EXPORT(SQL) DatabaseOptions {
// If true, the database can only be opened by one process at a time.
//
// SQLite supports a locking protocol that allows multiple processes to safely
// operate on the same database at the same time. The locking protocol is used
// on every transaction, and comes with a small performance penalty.
//
// Setting this to true causes the locking protocol to be used once, when the
// database is opened. No other process will be able to access the database at
// the same time.
//
// More details at https://www.sqlite.org/pragma.html#pragma_locking_mode
//
// SQLite's locking protocol is summarized at
// https://www.sqlite.org/c3ref/io_methods.html
//
// Exclusive mode is strongly recommended. It reduces the I/O cost of setting
// up a transaction. It also removes the need of handling transaction failures
// due to lock contention.
@ -67,6 +80,13 @@ struct COMPONENT_EXPORT(SQL) DatabaseOptions {
// Chrome features yet. In particular, our custom database recovery code does
// not support the WAL log file.
//
// WAL mode is currently not fully supported on FuchsiaOS. It will only be
// turned on if the database is also using exclusive locking mode.
// (https://crbug.com/1082059)
//
// Note: Changing page size is not supported when in WAL mode. So running
// 'PRAGMA page_size = <new-size>' will result in no-ops.
//
// More details at https://www.sqlite.org/wal.html
bool wal_mode =
base::FeatureList::IsEnabled(sql::features::kEnableWALModeByDefault);
@ -76,6 +96,8 @@ struct COMPONENT_EXPORT(SQL) DatabaseOptions {
// Larger page sizes result in shallower B-trees, because they allow an inner
// page to hold more keys. On the flip side, larger page sizes may result in
// more I/O when making small changes to existing records.
//
// Must be a power of two between 512 and 65536 inclusive.
int page_size = kDefaultPageSize;
// The size of in-memory cache, in pages.
@ -116,70 +138,12 @@ class COMPONENT_EXPORT(SQL) Database {
// Pre-init configuration ----------------------------------------------------
// Sets the page size that will be used when creating a new database. This
// must be called before Init(), and will only have an effect on new
// databases.
//
// The page size must be a power of two between 512 and 65536 inclusive.
void set_page_size(int page_size) {
DCHECK_GE(page_size, 512);
DCHECK_LE(page_size, 65536);
DCHECK(!(page_size & (page_size - 1)))
<< "page_size must be a power of two";
options_.page_size = page_size;
}
// The page size that will be used when creating a new database.
int page_size() const { return options_.page_size; }
// Sets the number of pages that will be cached in memory by sqlite. The
// total cache size in bytes will be page_size * cache_size. This must be
// called before Open() to have an effect.
void set_cache_size(int cache_size) {
DCHECK_GE(cache_size, 0);
options_.cache_size = cache_size;
}
// Returns whether a database will be opened in WAL mode.
bool UseWALMode() const;
// Enables/disables WAL mode (https://www.sqlite.org/wal.html) when
// opening a new database.
//
// WAL mode is currently not fully supported on FuchsiaOS. It will only be
// turned on if the database is also using exclusive locking mode.
// (https://crbug.com/1082059)
//
// Note: Changing page size is not supported when in WAL mode. So running
// 'PRAGMA page_size = <new-size>' or using set_page_size will result in
// no-ops.
//
// This must be called before Open() to have an effect.
void want_wal_mode(bool enabled) { options_.wal_mode = enabled; }
// Makes database accessible by only one process at a time.
//
// TODO(https://crbug.com/1120969): This should be the default mode. The
// "NORMAL" mode should be opt-in.
//
// SQLite supports a locking protocol that allows multiple processes to safely
// operate on the same database at the same time. The locking protocol is used
// on every transaction, and comes with a small performance penalty.
//
// Calling this method causes the locking protocol to be used once, when the
// database is opened. No other process will be able to access the database at
// the same time.
//
// This method must be called before Open() to have an effect.
//
// More details at https://www.sqlite.org/pragma.html#pragma_locking_mode
//
// SQLite's locking protocol is summarized at
// https://www.sqlite.org/c3ref/io_methods.html
void set_exclusive_locking() { options_.exclusive_locking = true; }
// Call to use alternative status-tracking for mmap. Usually this is tracked
// in the meta table, but some databases have no meta table.
// TODO(shess): Maybe just have all databases use the alt option?