mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
minimaws: remove need for explicit schema step
This commit is contained in:
parent
d96933356c
commit
3eb9ddfa16
@ -11,6 +11,124 @@ if sys.version_info >= (3, 4):
|
||||
|
||||
|
||||
class SchemaQueries(object):
|
||||
CREATE_FEATURETYPE = \
|
||||
'CREATE TABLE featuretype (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' UNIQUE (name ASC))'
|
||||
CREATE_SOURCEFILE = \
|
||||
'CREATE TABLE sourcefile (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' filename TEXT NOT NULL,\n' \
|
||||
' UNIQUE (filename ASC))'
|
||||
CREATE_MACHINE = \
|
||||
'CREATE TABLE machine (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' shortname TEXT NOT NULL,\n' \
|
||||
' description TEXT NOT NULL,\n' \
|
||||
' sourcefile INTEGER NOT NULL,\n' \
|
||||
' isdevice INTEGER NOT NULL,\n' \
|
||||
' runnable INTEGER NOT NULL,\n' \
|
||||
' UNIQUE (shortname ASC),\n' \
|
||||
' UNIQUE (description ASC),\n' \
|
||||
' FOREIGN KEY (sourcefile) REFERENCES sourcefile (id))'
|
||||
CREATE_SYSTEM = \
|
||||
'CREATE TABLE system (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' year TEXT NOT NULL,\n' \
|
||||
' manufacturer TEXT NOT NULL,\n' \
|
||||
' FOREIGN KEY (id) REFERENCES machine (id))'
|
||||
CREATE_CLONEOF = \
|
||||
'CREATE TABLE cloneof (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' parent TEXT NOT NULL,\n' \
|
||||
' FOREIGN KEY (id) REFERENCES machine (id))'
|
||||
CREATE_ROMOF = \
|
||||
'CREATE TABLE romof (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' parent TEXT NOT NULL,\n' \
|
||||
' FOREIGN KEY (id) REFERENCES machine (id))'
|
||||
CREATE_BIOSSET = \
|
||||
'CREATE TABLE biosset (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' machine INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' description TEXT NOT NULL,\n' \
|
||||
' UNIQUE (machine ASC, name ASC),\n' \
|
||||
' FOREIGN KEY (machine) REFERENCES machine (id))'
|
||||
CREATE_BIOSSETDEFAULT = \
|
||||
'CREATE TABLE biossetdefault (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' FOREIGN KEY (id) REFERENCES biosset (id))'
|
||||
CREATE_DEVICEREFERENCE = \
|
||||
'CREATE TABLE devicereference (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' machine INTEGER NOT NULL,\n' \
|
||||
' device INTEGER NOT NULL,\n' \
|
||||
' UNIQUE (machine ASC, device ASC),\n' \
|
||||
' FOREIGN KEY (machine) REFERENCES machine (id),\n' \
|
||||
' FOREIGN KEY (device) REFERENCES machine (id))'
|
||||
CREATE_DIPSWITCH = \
|
||||
'CREATE TABLE dipswitch (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' machine INTEGER NOT NULL,\n' \
|
||||
' isconfig INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' tag TEXT NOT NULL,\n' \
|
||||
' mask INTEGER NOT NULL,\n' \
|
||||
' --UNIQUE (machine ASC, tag ASC, mask ASC), not necessarily true, need to expose port conditions\n' \
|
||||
' FOREIGN KEY (machine) REFERENCES machine (id))'
|
||||
CREATE_DIPLOCATION = \
|
||||
'CREATE TABLE diplocation (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' dipswitch INTEGER NOT NULL,\n' \
|
||||
' bit INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' num INTEGER NOT NULL,\n' \
|
||||
' inverted INTEGER NOT NULL,\n' \
|
||||
' UNIQUE (dipswitch ASC, bit ASC),\n' \
|
||||
' FOREIGN KEY (dipswitch) REFERENCES dipswitch (id))'
|
||||
CREATE_DIPVALUE = \
|
||||
'CREATE TABLE dipvalue (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' dipswitch INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' value INTEGER NOT NULL,\n' \
|
||||
' isdefault INTEGER NOT NULL,\n' \
|
||||
' FOREIGN KEY (dipswitch) REFERENCES dipswitch (id))'
|
||||
CREATE_FEATURE = \
|
||||
'CREATE TABLE feature (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' machine INTEGER NOT NULL,\n' \
|
||||
' featuretype INTEGER NOT NULL,\n' \
|
||||
' status INTEGER NOT NULL,\n' \
|
||||
' overall INTEGER NOT NULL,\n' \
|
||||
' UNIQUE (machine ASC, featuretype ASC),\n' \
|
||||
' FOREIGN KEY (machine) REFERENCES machine (id),\n' \
|
||||
' FOREIGN KEY (featuretype) REFERENCES featuretype (id))'
|
||||
CREATE_SLOT = \
|
||||
'CREATE TABLE slot (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' machine INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' UNIQUE (machine ASC, name ASC),\n' \
|
||||
' FOREIGN KEY (machine) REFERENCES machine (id))'
|
||||
CREATE_SLOTOPTION = \
|
||||
'CREATE TABLE slotoption (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' slot INTEGER NOT NULL,\n' \
|
||||
' device INTEGER NOT NULL,\n' \
|
||||
' name TEXT NOT NULL,\n' \
|
||||
' UNIQUE (slot ASC, name ASC),\n' \
|
||||
' FOREIGN KEY (slot) REFERENCES slot (id),\n' \
|
||||
' FOREIGN KEY (device) REFERENCES machine (id))'
|
||||
CREATE_SLOTDEFAULT = \
|
||||
'CREATE TABLE slotdefault (\n' \
|
||||
' id INTEGER PRIMARY KEY,\n' \
|
||||
' slotoption INTEGER NOT NULL,\n' \
|
||||
' FOREIGN KEY (id) REFERENCES slot (id),\n' \
|
||||
' FOREIGN KEY (slotoption) REFERENCES slotoption (id))'
|
||||
|
||||
CREATE_TEMPORARY_DEVICEREFERENCE = 'CREATE TEMPORARY TABLE temp_devicereference (id INTEGER PRIMARY KEY, machine INTEGER NOT NULL, device TEXT NOT NULL, UNIQUE (machine, device))'
|
||||
CREATE_TEMPORARY_SLOTOPTION = 'CREATE TEMPORARY TABLE temp_slotoption (id INTEGER PRIMARY KEY, slot INTEGER NOT NULL, device TEXT NOT NULL, name TEXT NOT NULL)'
|
||||
CREATE_TEMPORARY_SLOTDEFAULT = 'CREATE TEMPORARY TABLE temp_slotdefault (id INTEGER PRIMARY KEY, slotoption INTEGER NOT NULL)'
|
||||
@ -47,6 +165,51 @@ class SchemaQueries(object):
|
||||
|
||||
DROP_DIPSWITCH_MACHINE_ISCONFIG = 'DROP INDEX IF EXISTS dipswitch_machine_isconfig'
|
||||
|
||||
CREATE_TABLES = (
|
||||
CREATE_FEATURETYPE,
|
||||
CREATE_SOURCEFILE,
|
||||
CREATE_MACHINE,
|
||||
CREATE_SYSTEM,
|
||||
CREATE_CLONEOF,
|
||||
CREATE_ROMOF,
|
||||
CREATE_BIOSSET,
|
||||
CREATE_BIOSSETDEFAULT,
|
||||
CREATE_DEVICEREFERENCE,
|
||||
CREATE_DIPSWITCH,
|
||||
CREATE_DIPLOCATION,
|
||||
CREATE_DIPVALUE,
|
||||
CREATE_FEATURE,
|
||||
CREATE_SLOT,
|
||||
CREATE_SLOTOPTION,
|
||||
CREATE_SLOTDEFAULT)
|
||||
|
||||
CREATE_TEMPORARY_TABLES = (
|
||||
CREATE_TEMPORARY_DEVICEREFERENCE,
|
||||
CREATE_TEMPORARY_SLOTOPTION,
|
||||
CREATE_TEMPORARY_SLOTDEFAULT)
|
||||
|
||||
CREATE_INDEXES = (
|
||||
INDEX_MACHINE_ISDEVICE_SHORTNAME,
|
||||
INDEX_MACHINE_ISDEVICE_DESCRIPTION,
|
||||
INDEX_MACHINE_RUNNABLE_SHORTNAME,
|
||||
INDEX_MACHINE_RUNNABLE_DESCRIPTION,
|
||||
INDEX_SYSTEM_YEAR,
|
||||
INDEX_SYSTEM_MANUFACTURER,
|
||||
INDEX_ROMOF_PARENT,
|
||||
INDEX_CLONEOF_PARENT,
|
||||
INDEX_DIPSWITCH_MACHINE_ISCONFIG)
|
||||
|
||||
DROP_INDEXES = (
|
||||
DROP_MACHINE_ISDEVICE_SHORTNAME,
|
||||
DROP_MACHINE_ISDEVICE_DESCRIPTION,
|
||||
DROP_MACHINE_RUNNABLE_SHORTNAME,
|
||||
DROP_MACHINE_RUNNABLE_DESCRIPTION,
|
||||
DROP_SYSTEM_YEAR,
|
||||
DROP_SYSTEM_MANUFACTURER,
|
||||
DROP_ROMOF_PARENT,
|
||||
DROP_CLONEOF_PARENT,
|
||||
DROP_DIPSWITCH_MACHINE_ISCONFIG)
|
||||
|
||||
|
||||
class UpdateQueries(object):
|
||||
ADD_FEATURETYPE = 'INSERT OR IGNORE INTO featuretype (name) VALUES (?)'
|
||||
@ -362,6 +525,7 @@ class UpdateConnection(object):
|
||||
def __init__(self, database, **kwargs):
|
||||
super(UpdateConnection, self).__init__(**kwargs)
|
||||
self.dbconn = sqlite3.connect(database)
|
||||
self.dbconn.execute('PRAGMA page_size = 4096')
|
||||
self.dbconn.execute('PRAGMA foreign_keys = ON')
|
||||
|
||||
def commit(self):
|
||||
@ -377,10 +541,16 @@ class UpdateConnection(object):
|
||||
return UpdateCursor(self.dbconn)
|
||||
|
||||
def prepare_for_load(self):
|
||||
self.drop_indexes()
|
||||
self.dbconn.execute(SchemaQueries.CREATE_TEMPORARY_DEVICEREFERENCE)
|
||||
self.dbconn.execute(SchemaQueries.CREATE_TEMPORARY_SLOTOPTION)
|
||||
self.dbconn.execute(SchemaQueries.CREATE_TEMPORARY_SLOTDEFAULT)
|
||||
# here be dragons - this is a poor man's DROP ALL TABLES etc.
|
||||
self.dbconn.execute('PRAGMA writable_schema = 1')
|
||||
self.dbconn.execute('delete from sqlite_master where type in (\'table\', \'index\', \'trigger\')')
|
||||
self.dbconn.execute('PRAGMA writable_schema = 0')
|
||||
for query in SchemaQueries.DROP_INDEXES:
|
||||
self.dbconn.execute(query)
|
||||
for query in SchemaQueries.CREATE_TABLES:
|
||||
self.dbconn.execute(query)
|
||||
for query in SchemaQueries.CREATE_TEMPORARY_TABLES:
|
||||
self.dbconn.execute(query)
|
||||
self.dbconn.commit()
|
||||
|
||||
def finalise_load(self):
|
||||
@ -393,27 +563,6 @@ class UpdateConnection(object):
|
||||
self.dbconn.execute(UpdateQueries.FINALISE_SLOTDEFAULTS)
|
||||
self.dbconn.commit()
|
||||
self.dbconn.execute(SchemaQueries.DROP_TEMPORARY_SLOTDEFAULT)
|
||||
self.create_indexes()
|
||||
for query in SchemaQueries.CREATE_INDEXES:
|
||||
self.dbconn.execute(query)
|
||||
self.dbconn.commit()
|
||||
|
||||
def drop_indexes(self):
|
||||
self.dbconn.execute(SchemaQueries.DROP_MACHINE_ISDEVICE_SHORTNAME)
|
||||
self.dbconn.execute(SchemaQueries.DROP_MACHINE_ISDEVICE_DESCRIPTION)
|
||||
self.dbconn.execute(SchemaQueries.DROP_MACHINE_RUNNABLE_SHORTNAME)
|
||||
self.dbconn.execute(SchemaQueries.DROP_MACHINE_RUNNABLE_DESCRIPTION)
|
||||
self.dbconn.execute(SchemaQueries.DROP_SYSTEM_YEAR)
|
||||
self.dbconn.execute(SchemaQueries.DROP_SYSTEM_MANUFACTURER)
|
||||
self.dbconn.execute(SchemaQueries.DROP_ROMOF_PARENT)
|
||||
self.dbconn.execute(SchemaQueries.DROP_CLONEOF_PARENT)
|
||||
self.dbconn.execute(SchemaQueries.DROP_DIPSWITCH_MACHINE_ISCONFIG)
|
||||
|
||||
def create_indexes(self):
|
||||
self.dbconn.execute(SchemaQueries.INDEX_MACHINE_ISDEVICE_SHORTNAME)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_MACHINE_ISDEVICE_DESCRIPTION)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_MACHINE_RUNNABLE_SHORTNAME)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_MACHINE_RUNNABLE_DESCRIPTION)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_SYSTEM_YEAR)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_SYSTEM_MANUFACTURER)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_ROMOF_PARENT)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_CLONEOF_PARENT)
|
||||
self.dbconn.execute(SchemaQueries.INDEX_DIPSWITCH_MACHINE_ISCONFIG)
|
||||
|
@ -1,119 +0,0 @@
|
||||
PRAGMA page_size = 4096;
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
CREATE TABLE featuretype (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
UNIQUE (name ASC));
|
||||
|
||||
CREATE TABLE sourcefile (
|
||||
id INTEGER PRIMARY KEY,
|
||||
filename TEXT NOT NULL,
|
||||
UNIQUE (filename ASC));
|
||||
|
||||
CREATE TABLE machine (
|
||||
id INTEGER PRIMARY KEY,
|
||||
shortname TEXT NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
sourcefile INTEGER NOT NULL,
|
||||
isdevice INTEGER NOT NULL,
|
||||
runnable INTEGER NOT NULL,
|
||||
UNIQUE (shortname ASC),
|
||||
UNIQUE (description ASC),
|
||||
FOREIGN KEY (sourcefile) REFERENCES sourcefile (id));
|
||||
|
||||
CREATE TABLE system (
|
||||
id INTEGER PRIMARY KEY,
|
||||
year TEXT NOT NULL,
|
||||
manufacturer TEXT NOT NULL,
|
||||
FOREIGN KEY (id) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE cloneof (
|
||||
id INTEGER PRIMARY KEY,
|
||||
parent TEXT NOT NULL,
|
||||
FOREIGN KEY (id) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE romof (
|
||||
id INTEGER PRIMARY KEY,
|
||||
parent TEXT NOT NULL,
|
||||
FOREIGN KEY (id) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE biosset (
|
||||
id INTEGER PRIMARY KEY,
|
||||
machine INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
UNIQUE (machine ASC, name ASC),
|
||||
FOREIGN KEY (machine) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE biossetdefault (
|
||||
id INTEGER PRIMARY KEY,
|
||||
FOREIGN KEY (id) REFERENCES biosset (id));
|
||||
|
||||
CREATE TABLE devicereference (
|
||||
id INTEGER PRIMARY KEY,
|
||||
machine INTEGER NOT NULL,
|
||||
device INTEGER NOT NULL,
|
||||
UNIQUE (machine ASC, device ASC),
|
||||
FOREIGN KEY (machine) REFERENCES machine (id),
|
||||
FOREIGN KEY (device) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE dipswitch (
|
||||
id INTEGER PRIMARY KEY,
|
||||
machine INTEGER NOT NULL,
|
||||
isconfig INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
tag TEXT NOT NULL,
|
||||
mask INTEGER NOT NULL,
|
||||
--UNIQUE (machine ASC, tag ASC, mask ASC), not necessarily true, need to expose port conditions
|
||||
FOREIGN KEY (machine) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE diplocation (
|
||||
id INTEGER PRIMARY KEY,
|
||||
dipswitch INTEGER NOT NULL,
|
||||
bit INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
num INTEGER NOT NULL,
|
||||
inverted INTEGER NOT NULL,
|
||||
UNIQUE (dipswitch ASC, bit ASC),
|
||||
FOREIGN KEY (dipswitch) REFERENCES dipswitch (id));
|
||||
|
||||
CREATE TABLE dipvalue (
|
||||
id INTEGER PRIMARY KEY,
|
||||
dipswitch INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
value INTEGER NOT NULL,
|
||||
isdefault INTEGER NOT NULL,
|
||||
FOREIGN KEY (dipswitch) REFERENCES dipswitch (id));
|
||||
|
||||
CREATE TABLE feature (
|
||||
id INTEGER PRIMARY KEY,
|
||||
machine INTEGER NOT NULL,
|
||||
featuretype INTEGER NOT NULL,
|
||||
status INTEGER NOT NULL,
|
||||
overall INTEGER NOT NULL,
|
||||
UNIQUE (machine ASC, featuretype ASC),
|
||||
FOREIGN KEY (machine) REFERENCES machine (id),
|
||||
FOREIGN KEY (featuretype) REFERENCES featuretype (id));
|
||||
|
||||
CREATE TABLE slot (
|
||||
id INTEGER PRIMARY KEY,
|
||||
machine INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
UNIQUE (machine ASC, name ASC),
|
||||
FOREIGN KEY (machine) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE slotoption (
|
||||
id INTEGER PRIMARY KEY,
|
||||
slot INTEGER NOT NULL,
|
||||
device INTEGER NOT NULL,
|
||||
name TEXT NOT NULL,
|
||||
UNIQUE (slot ASC, name ASC),
|
||||
FOREIGN KEY (slot) REFERENCES slot (id),
|
||||
FOREIGN KEY (device) REFERENCES machine (id));
|
||||
|
||||
CREATE TABLE slotdefault (
|
||||
id INTEGER PRIMARY KEY,
|
||||
slotoption INTEGER NOT NULL,
|
||||
FOREIGN KEY (id) REFERENCES slot (id),
|
||||
FOREIGN KEY (slotoption) REFERENCES slotoption (id));
|
Loading…
Reference in New Issue
Block a user