118 lines
3.5 KiB
Python
118 lines
3.5 KiB
Python
create_table_statements = dict(
|
|
# TODO: Duration REAL GENERATED ALWAYS AS etc.?
|
|
executions="""
|
|
CREATE TABLE IF NOT EXISTS Executions (
|
|
ExecutionId INTEGER PRIMARY KEY,
|
|
StartDate DATE NOT NULL,
|
|
FinishDate DATE,
|
|
Completed BOOLEAN DEFAULT 0 NOT NULL)
|
|
""",
|
|
|
|
exceptions="""
|
|
CREATE TABLE IF NOT EXISTS Exceptions (
|
|
ExceptionId INTEGER PRIMARY KEY,
|
|
Name TEXT NOT NULL,
|
|
Fail BOOLEAN NOT NULL)
|
|
""",
|
|
|
|
ips="""
|
|
CREATE TABLE IF NOT EXISTS Ips (
|
|
IpId INTEGER PRIMARY KEY,
|
|
AsStr TEXT GENERATED ALWAYS AS (
|
|
Cast(AsInt >> 24 & 255 AS TEXT) || '.' ||
|
|
Cast(AsInt >> 16 & 255 AS TEXT) || '.' ||
|
|
Cast(AsInt >> 8 & 255 AS TEXT) || '.' ||
|
|
Cast(AsInt & 255 AS TEXT)
|
|
) STORED NOT NULL,
|
|
AsInt INTEGER UNIQUE CHECK(AsInt >= 0 AND AsInt < 1 << 32) NOT NULL,
|
|
China BOOLEAN DEFAULT 0 NOT NULL,
|
|
BlockTarget BOOLEAN DEFAULT 0 NOT NULL,
|
|
Server BOOLEAN DEFAULT 0 NOT NULL,
|
|
RedirectTarget BOOLEAN DEFAULT 0 NOT NULL,
|
|
GfwTarget BOOLEAN DEFAULT 0 NOT NULL,
|
|
CountryCode TEXT)
|
|
""",
|
|
|
|
kinds="""
|
|
CREATE TABLE IF NOT EXISTS Kinds (
|
|
KindId INTEGER PRIMARY KEY,
|
|
Name TEXT UNIQUE NOT NULL,
|
|
ExpectExceptionId INTEGER,
|
|
FOREIGN KEY(ExpectExceptionId) REFERENCES Exceptions(ExceptionId))
|
|
""",
|
|
|
|
domains="""
|
|
CREATE TABLE IF NOT EXISTS Domains (
|
|
DomainId INTEGER PRIMARY KEY,
|
|
Name TEXT UNIQUE NOT NULL,
|
|
KindId INTEGER,
|
|
FOREIGN KEY(KindId) REFERENCES Kinds(KindId))
|
|
""",
|
|
|
|
# NOTE: that RecordId is *not* the rowid here
|
|
# since records can contain multiple IPs,
|
|
# and thereby span multiple rows.
|
|
# TODO: indexing stuff, cascade deletion stuff.
|
|
records="""
|
|
CREATE TABLE IF NOT EXISTS Records (
|
|
RecordId INTEGER NOT NULL,
|
|
IpId INTEGER,
|
|
FOREIGN KEY(IpId) REFERENCES Ips(IpId))
|
|
""",
|
|
|
|
messages="""
|
|
CREATE TABLE IF NOT EXISTS Messages (
|
|
MessageId INTEGER PRIMARY KEY,
|
|
ExecutionId INTEGER,
|
|
ServerId INTEGER NOT NULL,
|
|
DomainId INTEGER NOT NULL,
|
|
RecordId INTEGER,
|
|
ExceptionId INTEGER,
|
|
Failed BOOLEAN DEFAULT 0 NOT NULL,
|
|
FOREIGN KEY(ServerId) REFERENCES Ips(IpId),
|
|
FOREIGN KEY(ExecutionId) REFERENCES Executions(ExecutionId),
|
|
FOREIGN KEY(DomainId) REFERENCES Domains(DomainId),
|
|
FOREIGN KEY(ExceptionId) REFERENCES Exceptions(ExceptionId))
|
|
""",
|
|
# this fails because RecordId is not UNIQUE:
|
|
# FOREIGN KEY(RecordId) REFERENCES Records(RecordId)
|
|
)
|
|
|
|
create_view_statements = [
|
|
"""
|
|
CREATE VIEW Results AS
|
|
SELECT
|
|
Messages.ExecutionId,
|
|
ServerIps.AsStr as Server,
|
|
Kinds.Name as Kind,
|
|
Domains.Name as Name,
|
|
RecordIps.AsStr as Address,
|
|
Exceptions.Name as Exception,
|
|
Messages.Failed as Failed
|
|
FROM Messages
|
|
LEFT JOIN Domains ON Messages.DomainId = Domains.DomainId
|
|
LEFT JOIN Kinds ON Domains.KindId = Kinds.KindId
|
|
LEFT JOIN Ips AS ServerIps ON Messages.ServerId = ServerIps.IpId
|
|
LEFT JOIN Records ON Messages.RecordId = Records.RecordId
|
|
LEFT JOIN Ips as RecordIps ON Records.IpId = RecordIps.IpId
|
|
LEFT JOIN Exceptions ON Messages.ExceptionId = Exceptions.ExceptionId
|
|
""",
|
|
]
|
|
|
|
table_triggers = dict(
|
|
messages=[
|
|
# TODO: more triggers. (before update, and also for Records table)
|
|
"""
|
|
CREATE TRIGGER IF NOT EXISTS RecordExists
|
|
BEFORE INSERT
|
|
ON Messages
|
|
BEGIN
|
|
SELECT CASE
|
|
WHEN NEW.RecordId NOTNULL AND NOT EXISTS(
|
|
SELECT 1 FROM Records WHERE Records.RecordID = NEW.RecordId)
|
|
THEN raise(FAIL, "RecordId does not exist")
|
|
END;
|
|
END
|
|
""",
|
|
])
|