Add column for photo's st_dev, st_ino to facilitate lost&found.
This commit is contained in:
parent
5f9627da61
commit
9578dc4d67
4 changed files with 82 additions and 5 deletions
|
@ -42,7 +42,7 @@ ffmpeg = _load_ffmpeg()
|
||||||
|
|
||||||
# Database #########################################################################################
|
# Database #########################################################################################
|
||||||
|
|
||||||
DATABASE_VERSION = 14
|
DATABASE_VERSION = 15
|
||||||
DB_VERSION_PRAGMA = f'''
|
DB_VERSION_PRAGMA = f'''
|
||||||
PRAGMA user_version = {DATABASE_VERSION};
|
PRAGMA user_version = {DATABASE_VERSION};
|
||||||
'''
|
'''
|
||||||
|
@ -91,6 +91,7 @@ CREATE INDEX IF NOT EXISTS index_bookmarks_author_id on bookmarks(author_id);
|
||||||
CREATE TABLE IF NOT EXISTS photos(
|
CREATE TABLE IF NOT EXISTS photos(
|
||||||
id TEXT PRIMARY KEY NOT NULL,
|
id TEXT PRIMARY KEY NOT NULL,
|
||||||
filepath TEXT COLLATE NOCASE,
|
filepath TEXT COLLATE NOCASE,
|
||||||
|
dev_ino TEXT,
|
||||||
override_filename TEXT COLLATE NOCASE,
|
override_filename TEXT COLLATE NOCASE,
|
||||||
extension TEXT,
|
extension TEXT,
|
||||||
width INT,
|
width INT,
|
||||||
|
@ -108,6 +109,7 @@ CREATE TABLE IF NOT EXISTS photos(
|
||||||
);
|
);
|
||||||
CREATE INDEX IF NOT EXISTS index_photos_id on photos(id);
|
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_filepath on photos(filepath COLLATE NOCASE);
|
||||||
|
CREATE INDEX IF NOT EXISTS index_photos_dev_ino on photos(dev_ino);
|
||||||
CREATE INDEX IF NOT EXISTS index_photos_override_filename on
|
CREATE INDEX IF NOT EXISTS index_photos_override_filename on
|
||||||
photos(override_filename COLLATE NOCASE);
|
photos(override_filename COLLATE NOCASE);
|
||||||
CREATE INDEX IF NOT EXISTS index_photos_created on photos(created);
|
CREATE INDEX IF NOT EXISTS index_photos_created on photos(created);
|
||||||
|
|
|
@ -951,16 +951,19 @@ class Photo(ObjectBase):
|
||||||
self.photodb.log.debug('Reloading metadata for %s', self)
|
self.photodb.log.debug('Reloading metadata for %s', self)
|
||||||
|
|
||||||
self.bytes = None
|
self.bytes = None
|
||||||
|
self.dev_ino = None
|
||||||
self.width = None
|
self.width = None
|
||||||
self.height = None
|
self.height = None
|
||||||
self.area = None
|
self.area = None
|
||||||
self.ratio = None
|
self.ratio = None
|
||||||
self.duration = None
|
self.duration = None
|
||||||
|
|
||||||
try:
|
if self.real_path.is_file:
|
||||||
self.bytes = self.real_path.size
|
stat = self.real_path.stat
|
||||||
except pathclass.NotExists:
|
self.bytes = stat.st_size
|
||||||
pass
|
(dev, ino) = (stat.st_dev, stat.st_ino)
|
||||||
|
if dev and ino:
|
||||||
|
self.dev_ino = f'{dev},{ino}'
|
||||||
|
|
||||||
if self.bytes is None:
|
if self.bytes is None:
|
||||||
pass
|
pass
|
||||||
|
@ -986,6 +989,7 @@ class Photo(ObjectBase):
|
||||||
'ratio': self.ratio,
|
'ratio': self.ratio,
|
||||||
'duration': self.duration,
|
'duration': self.duration,
|
||||||
'bytes': self.bytes,
|
'bytes': self.bytes,
|
||||||
|
'dev_ino': self.dev_ino,
|
||||||
}
|
}
|
||||||
self.photodb.sql_update(table='photos', pairs=data, where_key='id')
|
self.photodb.sql_update(table='photos', pairs=data, where_key='id')
|
||||||
|
|
||||||
|
|
|
@ -389,6 +389,16 @@ class PDBPhotoMixin:
|
||||||
def get_photo(self, id):
|
def get_photo(self, id):
|
||||||
return self.get_thing_by_id('photo', id)
|
return self.get_thing_by_id('photo', id)
|
||||||
|
|
||||||
|
def get_photo_by_inode(self, dev, ino):
|
||||||
|
dev_ino = f'{dev},{ino}'
|
||||||
|
query = 'SELECT * FROM photos WHERE dev_ino == ?'
|
||||||
|
bindings = [dev_ino]
|
||||||
|
photo_row = self.sql_select_one(query, bindings)
|
||||||
|
if photo_row is None:
|
||||||
|
raise exceptions.NoSuchPhoto(dev_ino)
|
||||||
|
photo = self.get_cached_instance('photo', photo_row)
|
||||||
|
return photo
|
||||||
|
|
||||||
def get_photo_by_path(self, filepath):
|
def get_photo_by_path(self, filepath):
|
||||||
filepath = pathclass.Path(filepath)
|
filepath = pathclass.Path(filepath)
|
||||||
query = 'SELECT * FROM photos WHERE filepath == ?'
|
query = 'SELECT * FROM photos WHERE filepath == ?'
|
||||||
|
@ -470,6 +480,7 @@ class PDBPhotoMixin:
|
||||||
'author_id': author_id,
|
'author_id': author_id,
|
||||||
'searchhidden': searchhidden,
|
'searchhidden': searchhidden,
|
||||||
# These will be filled in during the metadata stage.
|
# These will be filled in during the metadata stage.
|
||||||
|
'dev_ino': None,
|
||||||
'bytes': None,
|
'bytes': None,
|
||||||
'width': None,
|
'width': None,
|
||||||
'height': None,
|
'height': None,
|
||||||
|
|
|
@ -261,6 +261,66 @@ def upgrade_13_to_14(photodb):
|
||||||
photodb.config['user']['max_username_length'] = photodb.config['user'].pop('max_length')
|
photodb.config['user']['max_username_length'] = photodb.config['user'].pop('max_length')
|
||||||
photodb.save_config()
|
photodb.save_config()
|
||||||
|
|
||||||
|
def upgrade_14_to_15(photodb):
|
||||||
|
'''
|
||||||
|
Added the dev_ino column to photos.
|
||||||
|
'''
|
||||||
|
photodb.sql_execute('PRAGMA foreign_keys = OFF')
|
||||||
|
photodb.sql_execute('BEGIN')
|
||||||
|
photodb.sql_execute('ALTER TABLE photos RENAME TO photos_old')
|
||||||
|
photodb.sql_execute('''
|
||||||
|
CREATE TABLE photos(
|
||||||
|
id TEXT PRIMARY KEY NOT NULL,
|
||||||
|
filepath TEXT COLLATE NOCASE,
|
||||||
|
dev_ino TEXT,
|
||||||
|
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,
|
||||||
|
searchhidden INT,
|
||||||
|
FOREIGN KEY(author_id) REFERENCES users(id)
|
||||||
|
);
|
||||||
|
''')
|
||||||
|
photodb.sql_execute('''
|
||||||
|
INSERT INTO photos SELECT
|
||||||
|
id,
|
||||||
|
filepath,
|
||||||
|
NULL,
|
||||||
|
override_filename,
|
||||||
|
extension,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
ratio,
|
||||||
|
area,
|
||||||
|
duration,
|
||||||
|
bytes,
|
||||||
|
created,
|
||||||
|
thumbnail,
|
||||||
|
tagged_at,
|
||||||
|
author_id,
|
||||||
|
searchhidden
|
||||||
|
FROM photos_old
|
||||||
|
''')
|
||||||
|
photodb.sql_execute('DROP TABLE photos_old')
|
||||||
|
photodb.sql_execute('CREATE INDEX index_photos_dev_ino ON photos(dev_ino);')
|
||||||
|
for photo in photodb.get_photos_by_recent():
|
||||||
|
if not photo.real_path.is_file:
|
||||||
|
continue
|
||||||
|
stat = photo.real_path.stat
|
||||||
|
(dev, ino) = (stat.st_dev, stat.st_ino)
|
||||||
|
if dev == 0 or ino == 0:
|
||||||
|
continue
|
||||||
|
dev_ino = f'{dev},{ino}'
|
||||||
|
photodb.sql_execute('UPDATE photos SET dev_ino = ? WHERE id == ?', [dev_ino, photo.id])
|
||||||
|
|
||||||
def upgrade_all(data_directory):
|
def upgrade_all(data_directory):
|
||||||
'''
|
'''
|
||||||
Given the directory containing a phototagger database, apply all of the
|
Given the directory containing a phototagger database, apply all of the
|
||||||
|
|
Loading…
Reference in a new issue