ripgrep
til/pytest/async-fixtures.md
20 async def ds_with_route():
21 ds = Datasette()
22 db = Database(ds, is_memory=True, memory_name="route-name-db")
23 ds.add_database(db, name="name", route="route-name")
24 await db.execute_write_script(
datasette-copy-to-memory/tests/test_copy_to_memory.py
110 await ds.invoke_startup()
111 response = await ds.client.get("/-/databases.json")
112 names_and_memory = {r["name"]: r["is_memory"] for r in response.json()}
113 assert names_and_memory == expected_names_and_memory
datasette/tests/test_routes.py
64 await ds.invoke_startup()
65 ds.remove_database("_memory")
66 db = Database(ds, is_memory=True, memory_name="route-name-db")
67 ds.add_database(db, name="original-name", route="custom-route-name")
68 await db.execute_write_script(
84 "size": 0,
85 "is_mutable": True,
86 "is_memory": True,
87 "hash": None,
88 }
datasette/tests/test_internals_database.py
591
592 def test_mtime_ns_is_none_for_memory(app_client):
593 memory_db = Database(app_client.ds, is_memory=True)
594 assert memory_db.is_memory is True
595 assert None is memory_db.mtime_ns
596
597
598 def test_is_mutable(app_client):
599 assert Database(app_client.ds, is_memory=True).is_mutable is True
600 assert Database(app_client.ds, is_memory=True, is_mutable=True).is_mutable is True
601 assert Database(app_client.ds, is_memory=True, is_mutable=False).is_mutable is False
602
603
datasette/tests/test_internals_datasette.py
datasette/tests/test_cli.py
325 "name": "does_not_exist_yet",
326 "is_mutable": True,
327 "is_memory": False,
328 "hash": None,
329 }.items() <= databases[0].items()
datasette/tests/test_api.py
761 assert None == extra_database["hash"]
762 assert True == extra_database["is_mutable"]
763 assert False == extra_database["is_memory"]
764
765 assert "fixtures" == fixtures_database["name"]
766 assert fixtures_database["hash"] is not None
767 assert False == fixtures_database["is_mutable"]
768 assert False == fixtures_database["is_memory"]
769
770
datasette/tests/fixtures.py
172 # to try and avoid too many open files error
173 for db in ds.databases.values():
174 if not db.is_memory:
175 db.close()
176
datasette/docs/introspection.rst
datasette/docs/internals.rst
868 .. _database_constructor:
869
870 Database(ds, path=None, is_mutable=True, is_memory=False, memory_name=None)
871 ---------------------------------------------------------------------------
872
884 Set this to ``False`` to cause Datasette to open the file in immutable mode.
885
886 ``is_memory`` - boolean
887 Use this to create non-shared memory connections.
888
890 Use this to create a named in-memory database. Unlike regular memory databases these can be accessed by multiple threads and will persist an changes made to them for the lifetime of the Datasette server process.
891
892 The first argument is the ``datasette`` instance you are attaching to, the second is a ``path=``, then ``is_mutable`` and ``is_memory`` are both optional arguments.
893
894 .. _database_hash:
1098 Is this database mutable, and allowed to accept writes?
1099
1100``db.is_memory`` - boolean
1101 Is this database an in-memory database?
1102
datasette/datasette/views/database.py
155 "allow_download": datasette.setting("allow_download")
156 and not db.is_mutable
157 and not db.is_memory,
158 "attached_databases": attached_databases,
159 "alternate_url_json": alternate_url_json,
299 raise DatasetteError("Invalid database", status=404)
300
301 if db.is_memory:
302 raise DatasetteError("Cannot download in-memory databases", status=404)
303 if not datasette.setting("allow_download") or db.is_mutable:
datasette/datasette/utils/internal_db.py
9 database_name TEXT PRIMARY KEY,
10 path TEXT,
11 is_memory INTEGER,
12 schema_version INTEGER
13 );
datasette/datasette/database.py
34 path=None,
35 is_mutable=True,
36 is_memory=False,
37 memory_name=None,
38 mode=None,
43 self.path = path
44 self.is_mutable = is_mutable
45 self.is_memory = is_memory
46 self.memory_name = memory_name
47 if memory_name is not None:
48 self.is_memory = True
49 self.cached_hash = None
50 self.cached_size = None
96 conn.execute("PRAGMA query_only=1")
97 return conn
98 if self.is_memory:
99 return sqlite3.connect(":memory:", uri=True)
100
327 if self.cached_hash is not None:
328 return self.cached_hash
329 elif self.is_mutable or self.is_memory:
330 return None
331 elif self.ds.inspect_data and self.ds.inspect_data.get(self.name):
341 if self.cached_size is not None:
342 return self.cached_size
343 elif self.is_memory:
344 return 0
345 elif self.is_mutable:
376 @property
377 def mtime_ns(self):
378 if self.is_memory:
379 return None
380 return Path(self.path).stat().st_mtime_ns
541 if self.is_mutable:
542 tags.append("mutable")
543 if self.is_memory:
544 tags.append("memory")
545 if self.hash:
datasette/datasette/cli.py
814 if (
815 ds.crossdb
816 and len([db for db in ds.databases.values() if not db.is_memory])
817 > SQLITE_LIMIT_ATTACHED
818 ):
datasette/datasette/app.py
305 if memory or crossdb or not self.files:
306 self.add_database(
307 Database(self, is_mutable=False, is_memory=True), name="_memory"
308 )
309 for file in self.files:
483 continue
484 placeholders = "(?, ?, ?, ?)"
485 values = [database_name, str(db.path), db.is_memory, schema_version]
486 if db.path is None:
487 placeholders = "(?, null, ?, ?)"
488 values = [database_name, db.is_memory, schema_version]
489 await internal_db.execute_write(
490 """
491 INSERT OR REPLACE INTO catalog_databases (database_name, path, is_memory, schema_version)
492 VALUES {}
493 """.format(
795 count = 0
796 for db_name, db in self.databases.items():
797 if count >= SQLITE_LIMIT_ATTACHED or db.is_memory:
798 continue
799 sql = 'ATTACH DATABASE "file:{path}?{qs}" AS [{name}];'.format(
1059 "size": d.size,
1060 "is_mutable": d.is_mutable,
1061 "is_memory": d.is_memory,
1062 "hash": d.hash,
1063 }