diff options
Diffstat (limited to 'db')
-rw-r--r-- | db/db_manager.py | 143 |
1 files changed, 74 insertions, 69 deletions
diff --git a/db/db_manager.py b/db/db_manager.py index f9b10c3..ad2fd14 100644 --- a/db/db_manager.py +++ b/db/db_manager.py @@ -4,6 +4,40 @@ import sqlite3 class DbManager: + + create_album_table = "CREATE TABLE IF NOT EXISTS album (id INTEGER "\ + "PRIMARY KEY, name TEXT, date TEXT, musicbrainz_albumid TEXT)" + create_album_artist_table = "CREATE TABLE IF NOT EXISTS album_artist ("\ + "album_id INTEGER, artist_id INTEGER, CONSTRAINT ALBUM_ARTIST_PK "\ + "PRIMARY KEY (album_id, artist_id), CONSTRAINT ALBUM_ARTIST_FK_ALBUM "\ + "FOREIGN KEY (album_id) REFERENCES album(id), CONSTRAINT "\ + "ALBUM_ARTIST_FK_ARTIST FOREIGN KEY(artist_id) REFERENCES artist(id))" + create_album_track_table = "CREATE TABLE IF NOT EXISTS album_track ("\ + "album_id INTEGER, track_id INTEGER, CONSTRAINT ALBUM_TRACK_PK "\ + "PRIMARY KEY (album_id, track_id), FOREIGN KEY(album_id) REFERENCES "\ + "album(id), FOREIGN KEY(track_id) REFERENCES track(id))" + create_artist_table = "CREATE TABLE IF NOT EXISTS artist (id INTEGER "\ + "PRIMARY KEY, name TEXT(2000000000), sortname TEXT(2000000000), "\ + "musicbrainz_artistid TEXT(2000000000))" + create_artist_track_table = "CREATE TABLE IF NOT EXISTS artist_track ("\ + "artist_id INTEGER, track_id INTEGER, CONSTRAINT ARTIST_TRACK_PK "\ + "PRIMARY KEY (artist_id, track_id), FOREIGN KEY(artist_id) "\ + "REFERENCES artist(id), FOREIGN KEY(track_id) REFERENCES track(id))" + create_track_table = "CREATE TABLE IF NOT EXISTS track (id INTEGER, "\ + "tracknumber INTEGER, name TEXT(2000000000), grouping "\ + "TEXT(2000000000), filename TEXT(2000000000), CONSTRAINT TRACK_PK "\ + "PRIMARY KEY (id))" + create_musicbrainz_artist_index = "CREATE UNIQUE INDEX IF NOT EXISTS "\ + "artist_musicbrainz_artistid ON artist(musicbrainz_artistid ASC)" + create_track_filename_index = "CREATE INDEX IF NOT EXISTS "\ + "track_filename_IDX ON track(filename)" + create_track_grouping_index = "CREATE INDEX IF NOT EXISTS "\ + "track_grouping_IDX ON track(grouping)" + create_track_name_index = "CREATE INDEX IF NOT EXISTS track_name_IDX ON "\ + "track(name)" + create_track_number_index = "CREATE INDEX IF NOT EXISTS "\ + "track_tracknumber_IDX ON track(tracknumber)" + class __DbManager: config = configparser.ConfigParser() config.read("mach2.ini") @@ -57,25 +91,30 @@ class DbManager: yield("COMMIT;") - def __init__(self): + def __init__(self, db=None): new_db = False cache_size_kb = 9766 - if not os.path.isfile(self.config["DEFAULT"]["database"]): - new_db = True + if db: + self.conn = sqlite3.connect(db) - if new_db: - self.conn = sqlite3.connect(":memory:") - self.create_tables() else: - self.conn = sqlite3.connect(self.config["DEFAULT"]["database"]) - library_info = os.stat(self.config["DEFAULT"]["database"]) - cache_size_kb = round((library_info.st_size * 1.2) / 1024) + if not os.path.isfile(self.config["DEFAULT"]["database"]): + new_db = True - cursor = self.conn.cursor() - # Setting pragma with ? placeholder produces an error - cursor.execute("pragma cache_size=-%s" % cache_size_kb) - cursor.close() + if new_db: + self.conn = sqlite3.connect(":memory:") + self.create_tables() + else: + self.conn = sqlite3.connect( + self.config["DEFAULT"]["database"]) + library_info = os.stat(self.config["DEFAULT"]["database"]) + cache_size_kb = round((library_info.st_size * 1.2) / 1024) + + cursor = self.conn.cursor() + # Setting pragma with ? placeholder produces an error + cursor.execute("pragma cache_size=-%s" % cache_size_kb) + cursor.close() self.conn.row_factory = sqlite3.Row @@ -96,6 +135,12 @@ class DbManager: def __str__(self): return repr(self) + def execute(self, script, parameters=None): + if parameters: + return self.conn.execute(script, parameters) + + return self.conn.execute(script) + def commit(self): return self.conn.commit() @@ -109,65 +154,25 @@ class DbManager: return self.conn.interrupt() def create_tables(self): - cursor = self.conn.cursor() - cursor.execute("""CREATE TABLE IF NOT EXISTS album (id - INTEGER PRIMARY KEY, name TEXT, date TEXT, - musicbrainz_albumid TEXT)""") - cursor.execute("""CREATE TABLE IF NOT EXISTS album_artist ( - album_id INTEGER, - artist_id INTEGER, - CONSTRAINT ALBUM_ARTIST_PK PRIMARY KEY (album_id, - artist_id), - CONSTRAINT ALBUM_ARTIST_FK_ALBUM FOREIGN KEY (album_id) - REFERENCES album(id), - CONSTRAINT ALBUM_ARTIST_FK_ARTIST FOREIGN KEY - (artist_id) REFERENCES artist(id) - )""") - cursor.execute("""CREATE TABLE IF NOT EXISTS album_track ( - album_id INTEGER, - track_id INTEGER, - CONSTRAINT ALBUM_TRACK_PK PRIMARY KEY (album_id, - track_id), - FOREIGN KEY(album_id) REFERENCES album(id), - FOREIGN KEY(track_id) REFERENCES track(id) - )""") - cursor.execute("""CREATE TABLE IF NOT EXISTS artist (id - INTEGER PRIMARY KEY, name - TEXT(2000000000), sortname TEXT(2000000000), - musicbrainz_artistid TEXT(2000000000))""") - cursor.execute("""CREATE TABLE IF NOT EXISTS artist_track ( - artist_id INTEGER, - track_id INTEGER, - CONSTRAINT ARTIST_TRACK_PK PRIMARY KEY (artist_id, - track_id), - FOREIGN KEY(artist_id) REFERENCES artist(id), - FOREIGN KEY(track_id) REFERENCES track(id) - )""") - cursor.execute("""CREATE TABLE IF NOT EXISTS track ( - id INTEGER, - tracknumber INTEGER, - name TEXT(2000000000), - grouping TEXT(2000000000), - filename TEXT(2000000000), - CONSTRAINT TRACK_PK PRIMARY KEY (id) - )""") - cursor.execute("""CREATE UNIQUE INDEX IF NOT EXISTS - artist_musicbrainz_artistid ON - artist(musicbrainz_artistid ASC)""") - cursor.execute("""CREATE INDEX IF NOT EXISTS track_filename_IDX - ON track(filename)""") - cursor.execute("""CREATE INDEX IF NOT EXISTS track_grouping_IDX - ON track(grouping)""") - cursor.execute("""CREATE INDEX IF NOT EXISTS track_name_IDX ON - track(name)""") - cursor.execute("""CREATE INDEX IF NOT EXISTS - track_tracknumber_IDX ON track(tracknumber)""") - cursor.close() + with self.conn: + self.conn.execute(DbManager.create_album_table) + self.conn.execute(DbManager.create_album_artist_table) + self.conn.execute(DbManager.create_album_track_table) + self.conn.execute(DbManager.create_artist_table) + self.conn.execute(DbManager.create_artist_track_table) + self.conn.execute(DbManager.create_track_table) + self.conn.execute(DbManager.create_musicbrainz_artist_index) + self.conn.execute(DbManager.create_track_filename_index) + self.conn.execute(DbManager.create_track_grouping_index) + self.conn.execute(DbManager.create_track_name_index) + self.conn.execute(DbManager.create_track_number_index) instance = None - def __new__(self): - if not DbManager.instance: + def __new__(self, db=None): + if db: + return DbManager.__DbManager(db) + elif not DbManager.instance: DbManager.instance = DbManager.__DbManager() return DbManager.instance |