From 04476ead53758044a5f272ae8696b63d6703115e Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Tue, 20 Mar 2018 18:25:08 -0700 Subject: [PATCH] --cache-size option, for controlling SQLite cache size --- datasette/app.py | 7 +++++-- datasette/cli.py | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index e7a5ce48..13138c5f 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -833,8 +833,8 @@ class RowView(RowTableShared): class Datasette: def __init__( self, files, num_threads=3, cache_headers=True, page_size=100, - max_returned_rows=1000, sql_time_limit_ms=1000, cors=False, - inspect_data=None, metadata=None, sqlite_extensions=None, + max_returned_rows=1000, sql_time_limit_ms=1000, cache_size=None, + cors=False, inspect_data=None, metadata=None, sqlite_extensions=None, template_dir=None, static_mounts=None): self.files = files self.num_threads = num_threads @@ -845,6 +845,7 @@ class Datasette: self.page_size = page_size self.max_returned_rows = max_returned_rows self.sql_time_limit_ms = sql_time_limit_ms + self.cache_size = cache_size self.cors = cors self._inspect = inspect_data self.metadata = metadata or {} @@ -901,6 +902,8 @@ class Datasette: conn.enable_load_extension(True) for extension in self.sqlite_extensions: conn.execute("SELECT load_extension('{}')".format(extension)) + if self.cache_size: + conn.execute('PRAGMA cache_size=-{}'.format(self.cache_size)) def inspect(self): if not self._inspect: diff --git a/datasette/cli.py b/datasette/cli.py index 5744d00a..5f5ee459 100644 --- a/datasette/cli.py +++ b/datasette/cli.py @@ -225,6 +225,7 @@ def package(files, tag, metadata, extra_options, branch, template_dir, static, * @click.option('--page_size', default=100, help='Page size - default is 100') @click.option('--max_returned_rows', default=1000, help='Max allowed rows to return at once - default is 1000. Set to 0 to disable check entirely.') @click.option('--sql_time_limit_ms', default=1000, help='Max time allowed for SQL queries in ms') +@click.option('--cache_size', default=None, help='SQLite per-database cache size in KB') @click.option( 'sqlite_extensions', '--load-extension', envvar='SQLITE_EXTENSIONS', multiple=True, type=click.Path(exists=True, resolve_path=True), help='Path to a SQLite extension to load' @@ -233,7 +234,7 @@ def package(files, tag, metadata, extra_options, branch, template_dir, static, * @click.option('-m', '--metadata', type=click.File(mode='r'), help='Path to JSON file containing license/source metadata') @click.option('--template-dir', type=click.Path(exists=True, file_okay=False, dir_okay=True), help='Path to directory containing custom templates') @click.option('--static', type=StaticMount(), help='mountpoint:path-to-directory for serving static files', multiple=True) -def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, sql_time_limit_ms, sqlite_extensions, inspect_file, metadata, template_dir, static): +def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, sql_time_limit_ms, cache_size, sqlite_extensions, inspect_file, metadata, template_dir, static): """Serve up specified SQLite database files with a web UI""" if reload: import hupper @@ -257,6 +258,7 @@ def serve(files, host, port, debug, reload, cors, page_size, max_returned_rows, page_size=page_size, max_returned_rows=max_returned_rows, sql_time_limit_ms=sql_time_limit_ms, + cache_size=cache_size, inspect_data=inspect_data, metadata=metadata_data, sqlite_extensions=sqlite_extensions,