from sqlite3 import Connection def put(conn: Connection, name: str, content: bytes, content_type: str): with conn: conn.execute( "INSERT OR IGNORE INTO file (content) VALUES (?)", (content,), ) conn.execute( """ INSERT INTO link ( name, content_type, file_hash ) VALUES (?, ?, DATA_HASH(?)) ON CONFLICT DO UPDATE SET content_type = excluded.content_type, file_hash = excluded.file_hash""", (name, content_type, content), ) def get(conn: Connection, name: str): row = conn.execute( """SELECT link.content_type, file.hash, file.content FROM link JOIN file ON file.hash = link.file_hash WHERE name_hash = DATA_HASH(?)""", (name,), ).fetchone() return row def head(conn: Connection, name: str): row = conn.execute( """SELECT link.content_type, file.hash, length(file.content), CASE WHEN link.content_type LIKE 'text/x.redirect%' THEN file.content ELSE NULL END FROM link JOIN file ON file.hash = link.file_hash WHERE name_hash = DATA_HASH(?)""", (name,), ).fetchone() return row def delete(conn: Connection, name: str): with conn: conn.execute("DELETE FROM link WHERE name_hash = DATA_HASH(?)", (name,))