2020-12-22 23:55:43 +00:00
|
|
|
import textwrap
|
|
|
|
|
|
|
|
|
2020-12-21 19:48:06 +00:00
|
|
|
async def init_internal_db(db):
|
2020-12-18 22:34:05 +00:00
|
|
|
await db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
textwrap.dedent(
|
|
|
|
"""
|
2021-07-16 19:44:58 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS databases (
|
2020-12-22 23:55:43 +00:00
|
|
|
database_name TEXT PRIMARY KEY,
|
|
|
|
path TEXT,
|
|
|
|
is_memory INTEGER,
|
|
|
|
schema_version INTEGER
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
"""
|
|
|
|
),
|
2020-12-18 22:34:05 +00:00
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
await db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
textwrap.dedent(
|
|
|
|
"""
|
2021-07-16 19:44:58 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS tables (
|
2020-12-22 23:55:43 +00:00
|
|
|
database_name TEXT,
|
|
|
|
table_name TEXT,
|
|
|
|
rootpage INTEGER,
|
|
|
|
sql TEXT,
|
2020-12-22 19:48:54 +00:00
|
|
|
PRIMARY KEY (database_name, table_name),
|
|
|
|
FOREIGN KEY (database_name) REFERENCES databases(database_name)
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
"""
|
|
|
|
),
|
2020-12-18 22:34:05 +00:00
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
await db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
textwrap.dedent(
|
|
|
|
"""
|
2021-07-16 19:44:58 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS columns (
|
2020-12-22 23:55:43 +00:00
|
|
|
database_name TEXT,
|
|
|
|
table_name TEXT,
|
|
|
|
cid INTEGER,
|
|
|
|
name TEXT,
|
|
|
|
type TEXT,
|
2020-12-18 22:34:05 +00:00
|
|
|
"notnull" INTEGER,
|
2020-12-22 23:55:43 +00:00
|
|
|
default_value TEXT, -- renamed from dflt_value
|
|
|
|
is_pk INTEGER, -- renamed from pk
|
|
|
|
hidden INTEGER,
|
2020-12-22 19:48:54 +00:00
|
|
|
PRIMARY KEY (database_name, table_name, name),
|
|
|
|
FOREIGN KEY (database_name) REFERENCES databases(database_name),
|
|
|
|
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
"""
|
|
|
|
),
|
2020-12-18 22:34:05 +00:00
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
await db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
textwrap.dedent(
|
|
|
|
"""
|
2021-07-16 19:44:58 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS indexes (
|
2020-12-22 23:55:43 +00:00
|
|
|
database_name TEXT,
|
|
|
|
table_name TEXT,
|
|
|
|
seq INTEGER,
|
|
|
|
name TEXT,
|
2020-12-18 22:34:05 +00:00
|
|
|
"unique" INTEGER,
|
2020-12-22 23:55:43 +00:00
|
|
|
origin TEXT,
|
|
|
|
partial INTEGER,
|
2020-12-22 19:48:54 +00:00
|
|
|
PRIMARY KEY (database_name, table_name, name),
|
|
|
|
FOREIGN KEY (database_name) REFERENCES databases(database_name),
|
|
|
|
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
"""
|
|
|
|
),
|
2020-12-18 22:34:05 +00:00
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
await db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
textwrap.dedent(
|
|
|
|
"""
|
2021-07-16 19:44:58 +00:00
|
|
|
CREATE TABLE IF NOT EXISTS foreign_keys (
|
2020-12-22 23:55:43 +00:00
|
|
|
database_name TEXT,
|
|
|
|
table_name TEXT,
|
|
|
|
id INTEGER,
|
|
|
|
seq INTEGER,
|
2020-12-18 22:34:05 +00:00
|
|
|
"table" TEXT,
|
|
|
|
"from" TEXT,
|
|
|
|
"to" TEXT,
|
2020-12-22 23:55:43 +00:00
|
|
|
on_update TEXT,
|
|
|
|
on_delete TEXT,
|
|
|
|
match TEXT,
|
2020-12-22 19:48:54 +00:00
|
|
|
PRIMARY KEY (database_name, table_name, id, seq),
|
|
|
|
FOREIGN KEY (database_name) REFERENCES databases(database_name),
|
|
|
|
FOREIGN KEY (database_name, table_name) REFERENCES tables(database_name, table_name)
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
"""
|
|
|
|
),
|
2020-12-18 22:34:05 +00:00
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2020-12-21 19:48:06 +00:00
|
|
|
async def populate_schema_tables(internal_db, db):
|
2020-12-18 22:34:05 +00:00
|
|
|
database_name = db.name
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
"DELETE FROM tables WHERE database_name = ?", [database_name], block=True
|
2020-12-18 22:34:05 +00:00
|
|
|
)
|
2020-12-22 23:55:43 +00:00
|
|
|
tables = (await db.execute("select * from sqlite_master WHERE type = 'table'")).rows
|
2020-12-18 22:34:05 +00:00
|
|
|
for table in tables:
|
|
|
|
table_name = table["name"]
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-18 22:34:05 +00:00
|
|
|
"""
|
2020-12-22 23:55:43 +00:00
|
|
|
INSERT INTO tables (database_name, table_name, rootpage, sql)
|
2020-12-18 22:34:05 +00:00
|
|
|
values (?, ?, ?, ?)
|
|
|
|
""",
|
|
|
|
[database_name, table_name, table["rootpage"], table["sql"]],
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
# And the columns
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
"DELETE FROM columns WHERE database_name = ? and table_name = ?",
|
2020-12-18 22:34:05 +00:00
|
|
|
[database_name, table_name],
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
columns = await db.table_column_details(table_name)
|
|
|
|
for column in columns:
|
|
|
|
params = {
|
|
|
|
**{"database_name": database_name, "table_name": table_name},
|
|
|
|
**column._asdict(),
|
|
|
|
}
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-18 22:34:05 +00:00
|
|
|
"""
|
2020-12-22 23:55:43 +00:00
|
|
|
INSERT INTO columns (
|
2020-12-18 22:34:05 +00:00
|
|
|
database_name, table_name, cid, name, type, "notnull", default_value, is_pk, hidden
|
|
|
|
) VALUES (
|
|
|
|
:database_name, :table_name, :cid, :name, :type, :notnull, :default_value, :is_pk, :hidden
|
|
|
|
)
|
|
|
|
""",
|
|
|
|
params,
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
# And the foreign_keys
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
"DELETE FROM foreign_keys WHERE database_name = ? and table_name = ?",
|
2020-12-18 22:34:05 +00:00
|
|
|
[database_name, table_name],
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
foreign_keys = (
|
|
|
|
await db.execute(f"PRAGMA foreign_key_list([{table_name}])")
|
|
|
|
).rows
|
|
|
|
for foreign_key in foreign_keys:
|
|
|
|
params = {
|
|
|
|
**{"database_name": database_name, "table_name": table_name},
|
|
|
|
**dict(foreign_key),
|
|
|
|
}
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-18 22:34:05 +00:00
|
|
|
"""
|
2020-12-22 23:55:43 +00:00
|
|
|
INSERT INTO foreign_keys (
|
2020-12-18 22:34:05 +00:00
|
|
|
database_name, table_name, "id", seq, "table", "from", "to", on_update, on_delete, match
|
|
|
|
) VALUES (
|
|
|
|
:database_name, :table_name, :id, :seq, :table, :from, :to, :on_update, :on_delete, :match
|
|
|
|
)
|
|
|
|
""",
|
|
|
|
params,
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
# And the indexes
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-22 23:55:43 +00:00
|
|
|
"DELETE FROM indexes WHERE database_name = ? and table_name = ?",
|
2020-12-18 22:34:05 +00:00
|
|
|
[database_name, table_name],
|
|
|
|
block=True,
|
|
|
|
)
|
|
|
|
indexes = (await db.execute(f"PRAGMA index_list([{table_name}])")).rows
|
|
|
|
for index in indexes:
|
|
|
|
params = {
|
|
|
|
**{"database_name": database_name, "table_name": table_name},
|
|
|
|
**dict(index),
|
|
|
|
}
|
2020-12-21 19:48:06 +00:00
|
|
|
await internal_db.execute_write(
|
2020-12-18 22:34:05 +00:00
|
|
|
"""
|
2020-12-22 23:55:43 +00:00
|
|
|
INSERT INTO indexes (
|
2020-12-18 22:34:05 +00:00
|
|
|
database_name, table_name, seq, name, "unique", origin, partial
|
|
|
|
) VALUES (
|
|
|
|
:database_name, :table_name, :seq, :name, :unique, :origin, :partial
|
|
|
|
)
|
|
|
|
""",
|
|
|
|
params,
|
|
|
|
block=True,
|
|
|
|
)
|