Rename store_file table to filedir

This commit is contained in:
Jacob Hinkle 2022-09-22 10:03:44 -04:00
parent a5cbce3c66
commit 8d6395ecd1
4 changed files with 23 additions and 23 deletions

View File

@ -174,14 +174,14 @@ class FSEntry:
@classmethod
def from_db_index(cls, cursor, root_id=None, root_row=None):
"""Given id of an entry in store_file, recursively fill this object"""
"""Given id of an entry in filedir, recursively fill this object"""
fields = '(id, filename, filetype, unfrozen_perms, frozen, sha256, symlink_target)'
if root_row is None:
cursor.execute(f'SELECT {fields} FROM store_file WHERE id={root_id};')
cursor.execute(f'SELECT {fields} FROM filedir WHERE id={root_id};')
root_row = cursor.fetchone()
root_id, name, filetype, unfrozen_perms, frozen, sha256, symlink_target = root_row
# get children
cursor.execute(f'SELECT {fields} FROM store_file WHERE parent={root_id} ORDER BY name;')
cursor.execute(f'SELECT {fields} FROM filedir WHERE parent={root_id} ORDER BY name;')
rows = cursor.fetchall()
return cls(
name=name,

View File

@ -70,14 +70,14 @@ CREATE TABLE store (id INTEGER PRIMARY KEY NOT NULL,
FOREIGN KEY (machine) REFERENCES machine (id) ON UPDATE CASCADE
);
-- The store_file table holds all files AND DIRECTORIES that are tracked by the
-- The filedir table holds all files and directories that are tracked by the
-- store. Files and directories are distinguished by the filetype column. This
-- table also holds tracked files and directories that have been imported and
-- live outside the current store.
CREATE TABLE store_file (id INTEGER PRIMARY KEY NOT NULL,
CREATE TABLE filedir (id INTEGER PRIMARY KEY NOT NULL,
store INTEGER NOT NULL,
filename TEXT, -- only a filename, not a path
parent INTEGER REFERENCES store_file ON UPDATE CASCADE,
parent INTEGER REFERENCES filedir ON UPDATE CASCADE,
frozen BOOL NOT NULL,
filetype TEXT, -- One of 'LNK', 'DIR', 'REG', etc. See store.FSEntry.from_path for details
@ -95,23 +95,23 @@ CREATE TABLE store_file (id INTEGER PRIMARY KEY NOT NULL,
FOREIGN KEY (source_datum) REFERENCES datum (id) ON UPDATE CASCADE,
FOREIGN KEY (source_program) REFERENCES program (id) ON UPDATE CASCADE
);
CREATE TRIGGER insert_store_file BEFORE INSERT ON store_file
CREATE TRIGGER insert_filedir BEFORE INSERT ON filedir
BEGIN
SELECT
CASE
--WHEN NEW.parent IS NOT NULL AND (SELECT filetype FROM store_file WHERE id = NEW.parent) != 'DIR'
--WHEN NEW.parent IS NOT NULL AND (SELECT filetype FROM filedir WHERE id = NEW.parent) != 'DIR'
--THEN RAISE (ABORT, 'Parent is not listed as a directory')
WHEN NEW.parent IS NOT NULL AND NEW.store != (SELECT store FROM store_file WHERE id = NEW.parent)
WHEN NEW.parent IS NOT NULL AND NEW.store != (SELECT store FROM filedir WHERE id = NEW.parent)
THEN RAISE (ABORT, 'Parent directory resides in different store')
END;
END;
CREATE TRIGGER update_store_file BEFORE UPDATE ON store_file
CREATE TRIGGER update_filedir BEFORE UPDATE ON filedir
BEGIN
SELECT
CASE
--WHEN NEW.parent IS NOT NULL AND (SELECT filetype FROM store_file WHERE id = NEW.parent) != 'DIR'
--WHEN NEW.parent IS NOT NULL AND (SELECT filetype FROM filedir WHERE id = NEW.parent) != 'DIR'
--THEN RAISE (ABORT, 'Parent is not listed as a directory')
WHEN NEW.parent IS NOT NULL AND NEW.store != (SELECT store FROM store_file WHERE id = NEW.parent)
WHEN NEW.parent IS NOT NULL AND NEW.store != (SELECT store FROM filedir WHERE id = NEW.parent)
THEN RAISE (ABORT, 'Parent directory resides in different store')
END;
END;

View File

@ -139,7 +139,7 @@ class Store:
"""Return recursive structure containing FSEntry objects from db"""
# get the database id for the table entry in this store having name '.'
cur = self.conn.cursor()
cur.execute('SELECT id FROM store_file WHERE store=0 AND parent is NULL;')
cur.execute('SELECT id FROM filedir WHERE store=0 AND parent is NULL;')
root_id = cur.fetchone()
if root_id is None:
return fs.FSEntry.empty_root()
@ -166,7 +166,7 @@ class Store:
# create entries for all directories if they do not yet exist (top
# down)
# insert files and symlinks into store_file, computing checksums on
# insert files and symlinks into filedir, computing checksums on
# each
# update versions in nancy.db as appropriate

View File

@ -151,13 +151,13 @@ def insert_store(insert_machine):
def insert_directories(insert_store):
cur = insert_store
cur.executemany(
'INSERT INTO store_file VALUES '
'INSERT INTO filedir VALUES '
'(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[(
None, #id INTEGER PRIMARY KEY NOT NULL,
1, #store INTEGER NOT NULL,
'.', #filename TEXT, -- only a filename, not a path
None, #parent INTEGER REFERENCES store_file ON UPDATE CASCADE,
None, #parent INTEGER REFERENCES filedir ON UPDATE CASCADE,
False, #frozen BOOL NOT NULL,
'DIR', #filetype TEXT, -- One of 'LNK', 'DIR', 'REG', etc. See store.FSEntry.from_path for details
'dr-xr-xr--', #unfrozen_perms TEXT, -- stat.filemode(os.stat(path).st_mode): '-rw-rw-r--'
@ -169,7 +169,7 @@ def insert_directories(insert_store):
None, #id INTEGER PRIMARY KEY NOT NULL,
1, #store INTEGER NOT NULL,
'foo', #filename TEXT, -- only a filename, not a path
1, #parent INTEGER REFERENCES store_file ON UPDATE CASCADE,
1, #parent INTEGER REFERENCES filedir ON UPDATE CASCADE,
False, #frozen BOOL NOT NULL,
'DIR', #filetype TEXT, -- One of 'LNK', 'DIR', 'REG', etc. See store.FSEntry.from_path for details
'dr-xr-xr--', #unfrozen_perms TEXT, -- stat.filemode(os.stat(path).st_mode): '-rw-rw-r--'
@ -181,7 +181,7 @@ def insert_directories(insert_store):
None, #id INTEGER PRIMARY KEY NOT NULL,
2, #store INTEGER NOT NULL,
'.', #filename TEXT, -- only a filename, not a path
None, #parent INTEGER REFERENCES store_file ON UPDATE CASCADE,
None, #parent INTEGER REFERENCES filedir ON UPDATE CASCADE,
False, #frozen BOOL NOT NULL,
'DIR', #filetype TEXT, -- One of 'LNK', 'DIR', 'REG', etc. See store.FSEntry.from_path for details
'dr-xr-xr--', #unfrozen_perms TEXT, -- stat.filemode(os.stat(path).st_mode): '-rw-rw-r--'
@ -198,13 +198,13 @@ def test_crossstore_directory_insert(insert_directories):
with pytest.raises(sqlite3.IntegrityError):
# declaring directory as belonging to store 2, but parent's store is 1
cur.execute(
'INSERT INTO store_file VALUES '
'INSERT INTO filedir VALUES '
'(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
(
None, #id INTEGER PRIMARY KEY NOT NULL,
2, #store INTEGER NOT NULL,
'xstore_file', #filename TEXT, -- only a filename, not a path
1, #parent INTEGER REFERENCES store_file ON UPDATE CASCADE,
'some_filedir.txt', #filename TEXT, -- only a filename, not a path
1, #parent INTEGER REFERENCES filedir ON UPDATE CASCADE,
False, #frozen BOOL NOT NULL,
'DIR', #filetype TEXT, -- One of 'LNK', 'DIR', 'REG', etc. See store.FSEntry.from_path for details
'dr-xr-xr--', #unfrozen_perms TEXT, -- stat.filemode(os.stat(path).st_mode): '-rw-rw-r--'
@ -215,7 +215,7 @@ def test_crossstore_directory_insert(insert_directories):
))
for row in cur.connection.iterdump():
print(row)
cur.execute('SELECT * FROM store_file')
cur.execute('SELECT * FROM filedir')
print(cur.fetchall())
@ -223,7 +223,7 @@ def test_crossstore_directory_insert(insert_directories):
def insert_files(insert_directories):
cur = insert_directories
cur.executemany(
'INSERT INTO store_file VALUES '
'INSERT INTO filedir VALUES '
'(?, ?, ?, ?, ?, ?, ?, ?)',
[(
None,