diff --git a/sqlite3/Files/README.md b/sqlite3/Files/README.md index 0d64959..3111a2f 100644 --- a/sqlite3/Files/README.md +++ b/sqlite3/Files/README.md @@ -1,4 +1,5 @@ ```python +# files.py import pandas as pd class Files: @@ -6,7 +7,7 @@ class Files: def __init__(self, db='files.sqlite'): import sqlite3 if not db.endswith('.sqlite'): db += '.sqlite' - self.conn = sqlite3.connect(db, isolation_level=None) + self.conn = sqlite3.connect(db, isolation_level=None, timeout=60) self.conn.row_factory = sqlite3.Row self("PRAGMA journal_mode=WAL") self("CREATE TABLE IF NOT EXISTS files (filename TEXT PRIMARY KEY, content BLOB)") @@ -16,13 +17,14 @@ class Files: def __setitem__(self, filename, content) -> None: assert isinstance(filename, str) - if isinstance(content, str): - content = content.encode() + if isinstance(content, str): content = content.encode() assert isinstance(content, bytes) self("INSERT OR REPLACE INTO files VALUES (?,?)", (filename, content)) def __getitem__(self, filename) -> bytes: - return self("SELECT content FROM files WHERE filename=?", (filename,)).content[0] + result = self("SELECT content FROM files WHERE filename=?", (filename,)) + if result.empty: raise KeyError(filename) + return result.content[0] def __delitem__(self, filename) -> None: self("DELETE FROM files WHERE filename=?", (filename,)) @@ -34,23 +36,36 @@ class Files: def __contains__(self, filename: str) -> bool: return not self("SELECT 1 FROM files WHERE filename=?", (filename,)).empty - def __len__(self) -> int: - return self("SELECT COUNT(*) FROM files").iloc[0, 0] - + def __len__(self): return self("SELECT COUNT(*) FROM files").iloc[0, 0] + def __enter__(self): return self + def __exit__(self, exc_type, exc_val, exc_tb): self.close() + def __del__(self): self.close() + + def close(self): + if self.conn: + self('PRAGMA wal_checkpoint(FULL)') + self.conn.close() + self.conn = None if __name__ == "__main__": - files = Files() - for filename in files: - print(files[filename]) - files['hello'] = 'world' - print(files['hello']) - print(len(files)) - print('hello' in files) - for filename in files: + fs = Files() + for filename in fs: + print(filename, fs[filename]) + fs['hello'] = 'world' + print(fs['hello']) + print(len(fs)) + + print('hello' in fs) + for filename in fs: print(filename) - del files['hello'] - for filename in files: + del fs['hello'] + for filename in fs: print(filename) + with Files() as fs: + fs['world'] = '1234' + print(fs['world']) + print(len(fs)) + ``` \ No newline at end of file