42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
# db_users_search.py
|
|
import sqlite3
|
|
from contextlib import contextmanager
|
|
|
|
DB_PATH = "app.db"
|
|
|
|
@contextmanager
|
|
def get_conn():
|
|
conn = sqlite3.connect(DB_PATH, check_same_thread=False)
|
|
conn.row_factory = sqlite3.Row
|
|
try:
|
|
yield conn
|
|
conn.commit()
|
|
finally:
|
|
conn.close()
|
|
|
|
def search_users(q: str, limit: int, offset: int):
|
|
q = (q or "").strip()
|
|
like = f"%{q}%"
|
|
with get_conn() as conn:
|
|
rows = conn.execute("""
|
|
SELECT id, username, display_name, email, role, is_active, created_at
|
|
FROM users
|
|
WHERE (? = '')
|
|
OR (username LIKE ? COLLATE NOCASE
|
|
OR display_name LIKE ? COLLATE NOCASE
|
|
OR email LIKE ? COLLATE NOCASE)
|
|
ORDER BY username
|
|
LIMIT ? OFFSET ?
|
|
""", (q, like, like, like, limit, offset)).fetchall()
|
|
|
|
total = conn.execute("""
|
|
SELECT COUNT(*)
|
|
FROM users
|
|
WHERE (? = '')
|
|
OR (username LIKE ? COLLATE NOCASE
|
|
OR display_name LIKE ? COLLATE NOCASE
|
|
OR email LIKE ? COLLATE NOCASE)
|
|
""", (q, like, like, like)).fetchone()[0]
|
|
|
|
return [dict(r) for r in rows], int(total)
|