Move DB_INIT to constants; auto parse column names.
This commit is contained in:
		
							parent
							
								
									ec4b5b014b
								
							
						
					
					
						commit
						14750eafc5
					
				
					 2 changed files with 155 additions and 198 deletions
				
			
		|  | @ -14,85 +14,142 @@ except converter.ffmpeg.FFMpegError: | ||||||
| 
 | 
 | ||||||
| FILENAME_BADCHARS = '\\/:*?<>|"' | FILENAME_BADCHARS = '\\/:*?<>|"' | ||||||
| 
 | 
 | ||||||
| ALLOWED_ORDERBY_COLUMNS = [ | # Note: Setting user_version pragma in init sequence is safe because it only | ||||||
|     'extension', | # happens after the out-of-date check occurs, so no chance of accidentally | ||||||
|     'width', | # overwriting it. | ||||||
|     'height', | DATABASE_VERSION = 8 | ||||||
|     'ratio', | DB_INIT = ''' | ||||||
|     'area', | PRAGMA count_changes = OFF; | ||||||
|     'duration', | PRAGMA cache_size = 10000; | ||||||
|     'bytes', | PRAGMA user_version = {user_version}; | ||||||
|     'created', |  | ||||||
|     'tagged_at', |  | ||||||
|     'random', |  | ||||||
| ] |  | ||||||
| 
 | 
 | ||||||
| SQL_LASTID_COLUMNS = [ | ---------------------------------------------------------------------------------------------------- | ||||||
|     'table', | CREATE TABLE IF NOT EXISTS album_associated_directories( | ||||||
|     'last_id', |     albumid TEXT, | ||||||
| ] |     directory TEXT COLLATE NOCASE | ||||||
| SQL_ALBUM_DIRECTORY_COLUMNS = [ | ); | ||||||
|     'albumid', | CREATE INDEX IF NOT EXISTS index_album_associated_directories_albumid on | ||||||
|     'directory', |     album_associated_directories(albumid); | ||||||
| ] | CREATE INDEX IF NOT EXISTS index_album_associated_directories_directory on | ||||||
| SQL_ALBUM_COLUMNS = [ |     album_associated_directories(directory); | ||||||
|     'id', | ---------------------------------------------------------------------------------------------------- | ||||||
|     'title', | CREATE TABLE IF NOT EXISTS album_group_rel( | ||||||
|     'description', |     parentid TEXT, | ||||||
| ] |     memberid TEXT | ||||||
| SQL_BOOKMARK_COLUMNS = [ | ); | ||||||
|     'id', | CREATE INDEX IF NOT EXISTS index_album_group_rel_parentid on album_group_rel(parentid); | ||||||
|     'title', | CREATE INDEX IF NOT EXISTS index_album_group_rel_memberid on album_group_rel(memberid); | ||||||
|     'url', | ---------------------------------------------------------------------------------------------------- | ||||||
|     'author_id', | CREATE TABLE IF NOT EXISTS album_photo_rel( | ||||||
| ] |     albumid TEXT, | ||||||
| SQL_PHOTO_COLUMNS = [ |     photoid TEXT | ||||||
|     'id', | ); | ||||||
|     'filepath', | CREATE INDEX IF NOT EXISTS index_album_photo_rel_albumid on album_photo_rel(albumid); | ||||||
|     'override_filename', | CREATE INDEX IF NOT EXISTS index_album_photo_rel_photoid on album_photo_rel(photoid); | ||||||
|     'extension', | ---------------------------------------------------------------------------------------------------- | ||||||
|     'width', | CREATE TABLE IF NOT EXISTS albums( | ||||||
|     'height', |     id TEXT, | ||||||
|     'ratio', |     title TEXT, | ||||||
|     'area', |     description TEXT | ||||||
|     'duration', | ); | ||||||
|     'bytes', | CREATE INDEX IF NOT EXISTS index_albums_id on albums(id); | ||||||
|     'created', | ---------------------------------------------------------------------------------------------------- | ||||||
|     'thumbnail', | CREATE TABLE IF NOT EXISTS bookmarks( | ||||||
|     'tagged_at', |     id TEXT, | ||||||
|     'author_id', |     title TEXT, | ||||||
| ] |     url TEXT, | ||||||
| SQL_TAG_COLUMNS = [ |     author_id TEXT | ||||||
|     'id', | ); | ||||||
|     'name', | CREATE INDEX IF NOT EXISTS index_bookmarks_id on bookmarks(id); | ||||||
|     'description', | CREATE INDEX IF NOT EXISTS index_bookmarks_author on bookmarks(author_id); | ||||||
| ] | ---------------------------------------------------------------------------------------------------- | ||||||
| SQL_SYN_COLUMNS = [ | CREATE TABLE IF NOT EXISTS id_numbers( | ||||||
|     'name', |     tab TEXT, | ||||||
|     'master', |     last_id TEXT | ||||||
| ] | ); | ||||||
| SQL_ALBUMGROUP_COLUMNS = [ | ---------------------------------------------------------------------------------------------------- | ||||||
|     'parentid', | CREATE TABLE IF NOT EXISTS photo_tag_rel( | ||||||
|     'memberid', |     photoid TEXT, | ||||||
| ] |     tagid TEXT | ||||||
| SQL_ALBUMPHOTO_COLUMNS = [ | ); | ||||||
|     'albumid', | CREATE INDEX IF NOT EXISTS index_photo_tag_rel_photoid on photo_tag_rel(photoid); | ||||||
|     'photoid', | CREATE INDEX IF NOT EXISTS index_photo_tag_rel_tagid on photo_tag_rel(tagid); | ||||||
| ] | ---------------------------------------------------------------------------------------------------- | ||||||
| SQL_PHOTOTAG_COLUMNS = [ | CREATE TABLE IF NOT EXISTS photos( | ||||||
|     'photoid', |     id TEXT, | ||||||
|     'tagid', |     filepath TEXT COLLATE NOCASE, | ||||||
| ] |     override_filename TEXT COLLATE NOCASE, | ||||||
| SQL_TAGGROUP_COLUMNS = [ |     extension TEXT, | ||||||
|     'parentid', |     width INT, | ||||||
|     'memberid', |     height INT, | ||||||
| ] |     ratio REAL, | ||||||
| SQL_USER_COLUMNS = [ |     area INT, | ||||||
|     'id', |     duration INT, | ||||||
|     'username', |     bytes INT, | ||||||
|     'password', |     created INT, | ||||||
|     'created', |     thumbnail TEXT, | ||||||
| ] |     tagged_at INT, | ||||||
|  |     author_id TEXT | ||||||
|  | ); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_id on photos(id); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_filepath on photos(filepath COLLATE NOCASE); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_override_filename on | ||||||
|  |     photos(override_filename COLLATE NOCASE); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_created on photos(created); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_extension on photos(extension); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_photos_author_id on photos(author_id); | ||||||
|  | ---------------------------------------------------------------------------------------------------- | ||||||
|  | CREATE TABLE IF NOT EXISTS tag_group_rel( | ||||||
|  |     parentid TEXT, | ||||||
|  |     memberid TEXT | ||||||
|  | ); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_tag_group_rel_parentid on tag_group_rel(parentid); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_tag_group_rel_memberid on tag_group_rel(memberid); | ||||||
|  | ---------------------------------------------------------------------------------------------------- | ||||||
|  | CREATE TABLE IF NOT EXISTS tag_synonyms( | ||||||
|  |     name TEXT, | ||||||
|  |     mastername TEXT | ||||||
|  | ); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_tag_synonyms_name on tag_synonyms(name); | ||||||
|  | ---------------------------------------------------------------------------------------------------- | ||||||
|  | CREATE TABLE IF NOT EXISTS tags( | ||||||
|  |     id TEXT, | ||||||
|  |     name TEXT, | ||||||
|  |     description TEXT | ||||||
|  | ); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_tags_id on tags(id); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_tags_name on tags(name); | ||||||
|  | ---------------------------------------------------------------------------------------------------- | ||||||
|  | CREATE TABLE IF NOT EXISTS users( | ||||||
|  |     id TEXT, | ||||||
|  |     username TEXT COLLATE NOCASE, | ||||||
|  |     password BLOB, | ||||||
|  |     created INT | ||||||
|  | ); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_users_id on users(id); | ||||||
|  | CREATE INDEX IF NOT EXISTS index_users_username on users(username COLLATE NOCASE); | ||||||
|  | '''.format(user_version=DATABASE_VERSION) | ||||||
|  | 
 | ||||||
|  | def _extract_column_names(table): | ||||||
|  |     statement = DB_INIT.split('CREATE TABLE IF NOT EXISTS %s(' % table)[1] | ||||||
|  |     statement = statement.split(');')[0] | ||||||
|  |     statement = statement.replace('\n', ' ') | ||||||
|  |     columns = statement.split(',') | ||||||
|  |     columns = [column.strip().split(' ')[0] for column in columns] | ||||||
|  |     return columns | ||||||
|  | 
 | ||||||
|  | SQL_LASTID_COLUMNS = _extract_column_names('id_numbers') | ||||||
|  | SQL_ALBUM_DIRECTORY_COLUMNS = _extract_column_names('album_associated_directories') | ||||||
|  | SQL_ALBUM_COLUMNS = _extract_column_names('albums') | ||||||
|  | SQL_BOOKMARK_COLUMNS = _extract_column_names('bookmarks') | ||||||
|  | SQL_PHOTO_COLUMNS = _extract_column_names('photos') | ||||||
|  | SQL_TAG_COLUMNS = _extract_column_names('tags') | ||||||
|  | SQL_SYN_COLUMNS = _extract_column_names('tag_synonyms') | ||||||
|  | SQL_ALBUMGROUP_COLUMNS = _extract_column_names('album_group_rel') | ||||||
|  | SQL_ALBUMPHOTO_COLUMNS = _extract_column_names('album_photo_rel') | ||||||
|  | SQL_PHOTOTAG_COLUMNS = _extract_column_names('photo_tag_rel') | ||||||
|  | SQL_TAGGROUP_COLUMNS = _extract_column_names('tag_group_rel') | ||||||
|  | SQL_USER_COLUMNS = _extract_column_names('users') | ||||||
| 
 | 
 | ||||||
| _sql_dictify = lambda columns: {key:index for (index, key) in enumerate(columns)} | _sql_dictify = lambda columns: {key:index for (index, key) in enumerate(columns)} | ||||||
| SQL_ALBUM = _sql_dictify(SQL_ALBUM_COLUMNS) | SQL_ALBUM = _sql_dictify(SQL_ALBUM_COLUMNS) | ||||||
|  | @ -108,6 +165,19 @@ SQL_TAG = _sql_dictify(SQL_TAG_COLUMNS) | ||||||
| SQL_TAGGROUP = _sql_dictify(SQL_TAGGROUP_COLUMNS) | SQL_TAGGROUP = _sql_dictify(SQL_TAGGROUP_COLUMNS) | ||||||
| SQL_USER = _sql_dictify(SQL_USER_COLUMNS) | SQL_USER = _sql_dictify(SQL_USER_COLUMNS) | ||||||
| 
 | 
 | ||||||
|  | ALLOWED_ORDERBY_COLUMNS = [ | ||||||
|  |     'extension', | ||||||
|  |     'width', | ||||||
|  |     'height', | ||||||
|  |     'ratio', | ||||||
|  |     'area', | ||||||
|  |     'duration', | ||||||
|  |     'bytes', | ||||||
|  |     'created', | ||||||
|  |     'tagged_at', | ||||||
|  |     'random', | ||||||
|  | ] | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| # Errors and warnings | # Errors and warnings | ||||||
| WARNING_MINMAX_INVALID = 'Field "{field}": "{value}" is not a valid request. Ignored.' | WARNING_MINMAX_INVALID = 'Field "{field}": "{value}" is not a valid request. Ignored.' | ||||||
|  |  | ||||||
|  | @ -27,123 +27,6 @@ from voussoirkit import sqlhelpers | ||||||
| logging.basicConfig() | logging.basicConfig() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Note: Setting user_version pragma in init sequence is safe because it only |  | ||||||
| # happens after the out-of-date check occurs, so no chance of accidentally |  | ||||||
| # overwriting it. |  | ||||||
| DATABASE_VERSION = 8 |  | ||||||
| DB_INIT = ''' |  | ||||||
| PRAGMA count_changes = OFF; |  | ||||||
| PRAGMA cache_size = 10000; |  | ||||||
| PRAGMA user_version = {user_version}; |  | ||||||
| 
 |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS album_associated_directories( |  | ||||||
|     albumid TEXT, |  | ||||||
|     directory TEXT COLLATE NOCASE |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_associated_directories_albumid on |  | ||||||
|     album_associated_directories(albumid); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_associated_directories_directory on |  | ||||||
|     album_associated_directories(directory); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS album_group_rel( |  | ||||||
|     parentid TEXT, |  | ||||||
|     memberid TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_group_rel_parentid on album_group_rel(parentid); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_group_rel_memberid on album_group_rel(memberid); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS album_photo_rel( |  | ||||||
|     albumid TEXT, |  | ||||||
|     photoid TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_photo_rel_albumid on album_photo_rel(albumid); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_album_photo_rel_photoid on album_photo_rel(photoid); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS albums( |  | ||||||
|     id TEXT, |  | ||||||
|     title TEXT, |  | ||||||
|     description TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_albums_id on albums(id); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS bookmarks( |  | ||||||
|     id TEXT, |  | ||||||
|     title TEXT, |  | ||||||
|     url TEXT, |  | ||||||
|     author_id TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_bookmarks_id on bookmarks(id); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_bookmarks_author on bookmarks(author_id); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS id_numbers( |  | ||||||
|     tab TEXT, |  | ||||||
|     last_id TEXT |  | ||||||
| ); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS photo_tag_rel( |  | ||||||
|     photoid TEXT, |  | ||||||
|     tagid TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photo_tag_rel_photoid on photo_tag_rel(photoid); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photo_tag_rel_tagid on photo_tag_rel(tagid); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS photos( |  | ||||||
|     id TEXT, |  | ||||||
|     filepath TEXT COLLATE NOCASE, |  | ||||||
|     override_filename TEXT COLLATE NOCASE, |  | ||||||
|     extension TEXT, |  | ||||||
|     width INT, |  | ||||||
|     height INT, |  | ||||||
|     ratio REAL, |  | ||||||
|     area INT, |  | ||||||
|     duration INT, |  | ||||||
|     bytes INT, |  | ||||||
|     created INT, |  | ||||||
|     thumbnail TEXT, |  | ||||||
|     tagged_at INT, |  | ||||||
|     author_id TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_id on photos(id); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_filepath on photos(filepath COLLATE NOCASE); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_override_filename on |  | ||||||
|     photos(override_filename COLLATE NOCASE); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_created on photos(created); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_extension on photos(extension); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_photos_author_id on photos(author_id); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS tag_group_rel( |  | ||||||
|     parentid TEXT, |  | ||||||
|     memberid TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_tag_group_rel_parentid on tag_group_rel(parentid); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_tag_group_rel_memberid on tag_group_rel(memberid); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS tag_synonyms( |  | ||||||
|     name TEXT, |  | ||||||
|     mastername TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_tag_synonyms_name on tag_synonyms(name); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS tags( |  | ||||||
|     id TEXT, |  | ||||||
|     name TEXT, |  | ||||||
|     description TEXT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_tags_id on tags(id); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_tags_name on tags(name); |  | ||||||
| ---------------------------------------------------------------------------------------------------- |  | ||||||
| CREATE TABLE IF NOT EXISTS users( |  | ||||||
|     id TEXT, |  | ||||||
|     username TEXT COLLATE NOCASE, |  | ||||||
|     password BLOB, |  | ||||||
|     created INT |  | ||||||
| ); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_users_id on users(id); |  | ||||||
| CREATE INDEX IF NOT EXISTS index_users_username on users(username COLLATE NOCASE); |  | ||||||
| '''.format(user_version=DATABASE_VERSION) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| def _helper_filenamefilter(subject, terms): | def _helper_filenamefilter(subject, terms): | ||||||
|     basename = subject.lower() |     basename = subject.lower() | ||||||
|     return all(term in basename for term in terms) |     return all(term in basename for term in terms) | ||||||
|  | @ -1143,10 +1026,14 @@ class PhotoDB(PDBAlbumMixin, PDBBookmarkMixin, PDBPhotoMixin, PDBTagMixin, PDBUs | ||||||
|         if existing_database: |         if existing_database: | ||||||
|             cur.execute('PRAGMA user_version') |             cur.execute('PRAGMA user_version') | ||||||
|             existing_version = cur.fetchone()[0] |             existing_version = cur.fetchone()[0] | ||||||
|             if existing_version != DATABASE_VERSION: |             if existing_version != constants.DATABASE_VERSION: | ||||||
|                 raise exceptions.DatabaseOutOfDate(current=existing_version, new=DATABASE_VERSION) |                 exc = exceptions.DatabaseOutOfDate( | ||||||
|  |                     current=existing_version, | ||||||
|  |                     new=constants.DATABASE_VERSION, | ||||||
|  |                 ) | ||||||
|  |                 raise exc | ||||||
| 
 | 
 | ||||||
|         statements = DB_INIT.split(';') |         statements = constants.DB_INIT.split(';') | ||||||
|         for statement in statements: |         for statement in statements: | ||||||
|             cur.execute(statement) |             cur.execute(statement) | ||||||
|         self.sql.commit() |         self.sql.commit() | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue