Let database_upgrader use the photodb instead of raw sql con.

This commit is contained in:
voussoir 2018-03-13 02:28:09 -07:00
parent 44d1fb2fff
commit f3eb6345f7

View file

@ -5,21 +5,21 @@ import sys
import etiquette import etiquette
def upgrade_1_to_2(sql): def upgrade_1_to_2(photodb):
''' '''
In this version, a column `tagged_at` was added to the Photos table, to keep In this version, a column `tagged_at` was added to the Photos table, to keep
track of the last time the photo's tags were edited (added or removed). track of the last time the photo's tags were edited (added or removed).
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('ALTER TABLE photos ADD COLUMN tagged_at INT') cur.execute('ALTER TABLE photos ADD COLUMN tagged_at INT')
def upgrade_2_to_3(sql): def upgrade_2_to_3(photodb):
''' '''
Preliminary support for user account management was added. This includes a `user` table Preliminary support for user account management was added. This includes a `user` table
with id, username, password hash, and a timestamp. with id, username, password hash, and a timestamp.
Plus some indices. Plus some indices.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute(''' cur.execute('''
CREATE TABLE IF NOT EXISTS users( CREATE TABLE IF NOT EXISTS users(
id TEXT, id TEXT,
@ -31,19 +31,19 @@ def upgrade_2_to_3(sql):
cur.execute('CREATE INDEX IF NOT EXISTS index_user_id ON users(id)') cur.execute('CREATE INDEX IF NOT EXISTS index_user_id ON users(id)')
cur.execute('CREATE INDEX IF NOT EXISTS index_user_username ON users(username COLLATE NOCASE)') cur.execute('CREATE INDEX IF NOT EXISTS index_user_username ON users(username COLLATE NOCASE)')
def upgrade_3_to_4(sql): def upgrade_3_to_4(photodb):
''' '''
Add an `author_id` column to Photos. Add an `author_id` column to Photos.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('ALTER TABLE photos ADD COLUMN author_id TEXT') cur.execute('ALTER TABLE photos ADD COLUMN author_id TEXT')
cur.execute('CREATE INDEX IF NOT EXISTS index_photo_author ON photos(author_id)') cur.execute('CREATE INDEX IF NOT EXISTS index_photo_author ON photos(author_id)')
def upgrade_4_to_5(sql): def upgrade_4_to_5(photodb):
''' '''
Add table `bookmarks` and its indices. Add table `bookmarks` and its indices.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute(''' cur.execute('''
CREATE TABLE IF NOT EXISTS bookmarks( CREATE TABLE IF NOT EXISTS bookmarks(
id TEXT, id TEXT,
@ -55,7 +55,7 @@ def upgrade_4_to_5(sql):
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_id ON bookmarks(id)') cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_id ON bookmarks(id)')
cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_author ON bookmarks(author_id)') cur.execute('CREATE INDEX IF NOT EXISTS index_bookmark_author ON bookmarks(author_id)')
def upgrade_5_to_6(sql): def upgrade_5_to_6(photodb):
''' '''
When Albums were first introduced, they shared the ID counter and When Albums were first introduced, they shared the ID counter and
relationship table with tags, because they were mostly identical at the time. relationship table with tags, because they were mostly identical at the time.
@ -70,7 +70,7 @@ def upgrade_5_to_6(sql):
# 1. Start the id_numbers.albums value at the tags value so that the number # 1. Start the id_numbers.albums value at the tags value so that the number
# can continue to increment safely and separately, instead of starting at # can continue to increment safely and separately, instead of starting at
# zero and bumping into existing albums. # zero and bumping into existing albums.
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('SELECT * FROM id_numbers WHERE tab == "tags"') cur.execute('SELECT * FROM id_numbers WHERE tab == "tags"')
last_id = cur.fetchone()[1] last_id = cur.fetchone()[1]
cur.execute('INSERT INTO id_numbers VALUES("albums", ?)', [last_id]) cur.execute('INSERT INTO id_numbers VALUES("albums", ?)', [last_id])
@ -103,7 +103,7 @@ def upgrade_5_to_6(sql):
[album_id, album_id] [album_id, album_id]
) )
def upgrade_6_to_7(sql): def upgrade_6_to_7(photodb):
''' '''
Most of the indices were renamed, so delete them and let them regenerate Most of the indices were renamed, so delete them and let them regenerate
next time. next time.
@ -112,7 +112,7 @@ def upgrade_6_to_7(sql):
separate table `album_associated_directories`, so that we can have albums separate table `album_associated_directories`, so that we can have albums
which load from multiple directories. which load from multiple directories.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('SELECT name FROM sqlite_master WHERE type == "index"') cur.execute('SELECT name FROM sqlite_master WHERE type == "index"')
indices = [x[0] for x in cur.fetchall()] indices = [x[0] for x in cur.fetchall()]
for index in indices: for index in indices:
@ -139,32 +139,30 @@ def upgrade_6_to_7(sql):
''') ''')
cur.execute('DROP TABLE deleting_albums') cur.execute('DROP TABLE deleting_albums')
def upgrade_7_to_8(sql): def upgrade_7_to_8(photodb):
''' '''
Give the Tags table a description field. Give the Tags table a description field.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('ALTER TABLE tags ADD COLUMN description TEXT') cur.execute('ALTER TABLE tags ADD COLUMN description TEXT')
def upgrade_8_to_9(sql): def upgrade_8_to_9(photodb):
''' '''
Give the Photos table a searchhidden field. Give the Photos table a searchhidden field.
''' '''
cur = sql.cursor() cur = photodb.sql.cursor()
cur.execute('ALTER TABLE photos ADD COLUMN searchhidden INT') cur.execute('ALTER TABLE photos ADD COLUMN searchhidden INT')
cur.execute('UPDATE photos SET searchhidden = 0') cur.execute('UPDATE photos SET searchhidden = 0')
cur.execute('CREATE INDEX index_photos_searchhidden on photos(searchhidden)') cur.execute('CREATE INDEX index_photos_searchhidden on photos(searchhidden)')
def upgrade_all(database_filename): def upgrade_all(data_directory):
''' '''
Given the filename of a phototagger database, apply all of the needed Given the directory containing a phototagger database, apply all of the
upgrade_x_to_y functions in order. needed upgrade_x_to_y functions in order.
''' '''
if not os.path.isfile(database_filename): photodb = etiquette.photodb.PhotoDB(data_directory, create=False, skip_version_check=True)
raise FileNotFoundError(database_filename)
sql = sqlite3.connect(database_filename) cur = photodb.sql.cursor()
cur = sql.cursor()
cur.execute('PRAGMA user_version') cur.execute('PRAGMA user_version')
current_version = cur.fetchone()[0] current_version = cur.fetchone()[0]
@ -178,20 +176,20 @@ def upgrade_all(database_filename):
print('Upgrading from %d to %d' % (current_version, version_number)) print('Upgrading from %d to %d' % (current_version, version_number))
upgrade_function = 'upgrade_%d_to_%d' % (current_version, version_number) upgrade_function = 'upgrade_%d_to_%d' % (current_version, version_number)
upgrade_function = eval(upgrade_function) upgrade_function = eval(upgrade_function)
upgrade_function(sql) upgrade_function(photodb)
sql.cursor().execute('PRAGMA user_version = %d' % version_number) photodb.sql.cursor().execute('PRAGMA user_version = %d' % version_number)
sql.commit() photodb.commit()
current_version = version_number current_version = version_number
print('Upgrades finished.') print('Upgrades finished.')
def upgrade_all_argparse(args): def upgrade_all_argparse(args):
return upgrade_all(database_filename=args.database_filename) return upgrade_all(data_directory=args.data_directory)
def main(argv): def main(argv):
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('database_filename') parser.add_argument('data_directory')
parser.set_defaults(func=upgrade_all_argparse) parser.set_defaults(func=upgrade_all_argparse)
args = parser.parse_args(argv) args = parser.parse_args(argv)