Add search_db function

This takes a number of arguments that can help narrow down a search
query. It's not safe against % injection so be careful :^)

Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
2023-07-31 00:01:48 -07:00
parent cf4fd799b4
commit 5f34b353bb

View File

@@ -1,4 +1,5 @@
import sqlite3 import sqlite3
import sys
from typing import Optional from typing import Optional
@@ -50,15 +51,53 @@ def get_db(db_path: str = DB_PATH):
def search_db( def search_db(
board: Optional[str] = None, board: str = "",
reason: Optional[str] = None, reason: str = "",
name: Optional[str] = None, name: str = "",
com: Optional[str] = None, com: str = "",
sub: Optional[str] = None, sub: str = "",
time_before: int = 0, time_before: int = sys.maxsize,
time_after: int = 0, time_after: int = 0,
md5: Optional[str] = None, md5: str = "",
limit: int = 100,
page: int = 0,
): ):
query = """ db = get_db()
SELECT action, board, length, post, thumb_path, reason result = db.execute(
""" """
select *
from bans
where
(:board is null or board like :board_like)
and (:reason = "" or reason like :reason_like)
and (:name = "" or name like :name_like)
and (:com = "" or com like :com_like)
and (:sub = "" or sub like :sub_like)
and (time <= :time_before)
and (time >= :time_after)
and (:md5 = "" or md5 like :md5_like)
order by id desc
limit :limit
offset :offset
""",
{
"board": board,
"board_like": f"%{board}%",
"reason": reason,
"reason_like": f"%{reason}%",
"name": name,
"name_like": f"%{name}%",
"com": com,
"com_like": f"%{com}%",
"sub": sub,
"sub_like": f"%{sub}%",
"time_before": time_before,
"time_after": time_after,
"md5": md5,
"md5_like": f"%{md5}%",
"limit": limit,
"offset": limit * page,
}
)
return list(result.fetchall())