From 47032636b55718dd711670f19b753f4ada9e8f2f Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 17 Mar 2019 16:25:15 -0700 Subject: [PATCH] 'datasette serve -i immutable.db' option, refs #419 --- datasette/app.py | 14 +++++++++++--- datasette/cli.py | 11 ++++++++++- docs/datasette-serve-help.txt | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/datasette/app.py b/datasette/app.py index c292542f..5e656e5f 100644 --- a/datasette/app.py +++ b/datasette/app.py @@ -121,6 +121,7 @@ class Datasette: def __init__( self, files, + immutables=None, cache_headers=True, cors=False, inspect_data=None, @@ -133,7 +134,9 @@ class Datasette: config=None, version_note=None, ): - self.files = files + immutables = immutables or [] + self.files = files + immutables + self.immutables = set(immutables) if not self.files: self.files = [MEMORY] elif memory: @@ -322,7 +325,7 @@ class Datasette: raise Exception("Multiple files with same stem %s" % name) try: with sqlite3.connect( - "file:{}?immutable=1".format(path), uri=True + "file:{}?mode=ro".format(path), uri=True ) as conn: self.prepare_connection(conn) self._inspect[name] = { @@ -426,8 +429,13 @@ class Datasette: if info["file"] == ":memory:": conn = sqlite3.connect(":memory:") else: + # mode=ro or immutable=1? + if info["file"] in self.immutables: + qs = "immutable=1" + else: + qs = "mode=ro" conn = sqlite3.connect( - "file:{}?immutable=1".format(info["file"]), + "file:{}?{}".format(info["file"], qs), uri=True, check_same_thread=False, ) diff --git a/datasette/cli.py b/datasette/cli.py index 6fbc9908..8ae54f8f 100644 --- a/datasette/cli.py +++ b/datasette/cli.py @@ -267,6 +267,13 @@ def package( @cli.command() @click.argument("files", type=click.Path(exists=True), nargs=-1) +@click.option( + "-i", + "--immutable", + type=click.Path(exists=True), + help="Database files to open in immutable mode", + multiple=True, +) @click.option( "-h", "--host", default="127.0.0.1", help="host for server, defaults to 127.0.0.1" ) @@ -332,6 +339,7 @@ def package( ) def serve( files, + immutable, host, port, debug, @@ -376,9 +384,10 @@ def serve( if metadata: metadata_data = json.loads(metadata.read()) - click.echo("Serve! files={} on port {}".format(files, port)) + click.echo("Serve! files={} (immutables={}) on port {}".format(files, immutable, port)) ds = Datasette( files, + immutables=immutable, cache_headers=not debug and not reload, cors=cors, inspect_data=inspect_data, diff --git a/docs/datasette-serve-help.txt b/docs/datasette-serve-help.txt index 65b9aceb..7b7c3b09 100644 --- a/docs/datasette-serve-help.txt +++ b/docs/datasette-serve-help.txt @@ -5,6 +5,7 @@ Usage: datasette serve [OPTIONS] [FILES]... Serve up specified SQLite database files with a web UI Options: + -i, --immutable PATH Database files to open in immutable mode -h, --host TEXT host for server, defaults to 127.0.0.1 -p, --port INTEGER port for server, defaults to 8001 --debug Enable debug mode - useful for development