nomen/nomen/db.py

82 lines
2.2 KiB
Python

import logging
import sqlite3
import aiosqlite
from .migrator import dumb_migrate_db
from .utils import contains
log = logging.getLogger("nomen.db")
log.setLevel(logging.INFO)
schema = """
PRAGMA user_version = 1;
PRAGMA main.synchronous = NORMAL;
PRAGMA foreign_keys = ON;
CREATE TABLE keywords (
guild_id INTEGER NOT NULL,
keyword TEXT NOT NULL,
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
regex INTEGER NOT NULL DEFAULT 0 CHECK(regex IN (0, 1)),
count INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE guilds (
guild_id INTEGER NOT NULL PRIMARY KEY,
prefix TEXT NOT NULL DEFAULT ">"
)
WITHOUT ROWID;
CREATE TABLE users (
user_id INTEGER NOT NULL PRIMARY KEY,
disabled INTEGER NOT NULL DEFAULT 0 CHECK(disabled IN (0, 1)),
use_embed INTEGER NOT NULL DEFAULT 1 CHECK(use_embed IN (0, 1)),
notify_self INTEGER NOT NULL DEFAULT 0 CHECK(notify_self IN (0, 1)),
bots_notify INTEGER NOT NULL DEFAULT 0 CHECK(bots_notify IN (0, 1))
)
WITHOUT ROWID;
CREATE TABLE user_ignores (
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
guild_id INTEGER NOT NULL,
target INTEGER NOT NULL,
PRIMARY KEY (user_id, guild_id, target)
);
CREATE TABLE user_blocks (
user_id INTEGER NOT NULL REFERENCES users ON DELETE CASCADE,
target INTEGER NOT NULL,
PRIMARY KEY (user_id, target)
);
CREATE INDEX keywords_index ON keywords(user_id);
CREATE INDEX user_ignores_index ON user_ignores(user_id);
CREATE INDEX user_blocks_index ON user_blocks(user_id);
"""
def run_db_migrations(db_file):
log.debug(f"Running automatic migration on {db_file}")
with sqlite3.connect(db_file) as db:
if dumb_migrate_db(db, schema):
log.info(f"Migrated {db_file}")
log.debug("Finished running automatic migration")
async def setup_db(db_file):
log.debug(f"Connecting to {db_file}")
db = await aiosqlite.connect(db_file)
log.debug("Running start script")
await db.executescript("""
PRAGMA optimize(0x10002);
""")
log.debug("Adding contains function")
await db.create_function("contains", 3, contains, deterministic=True)
log.debug("Done setting up DB")
return db