diff --git a/LTA/ltastorageoverview/lib/create_db_ltastorageoverview.sql b/LTA/ltastorageoverview/lib/create_db_ltastorageoverview.sql index eb04a709eceafb3fe71631e5c38f3689e3345988..9810a47d7818ddbd9a5d5613ed0a102cf9b0f119 100644 --- a/LTA/ltastorageoverview/lib/create_db_ltastorageoverview.sql +++ b/LTA/ltastorageoverview/lib/create_db_ltastorageoverview.sql @@ -95,7 +95,7 @@ CREATE TABLE scraper.last_directory_visit ( CREATE TABLE metainfo.directory_stats ( id serial, - directory_id integer NOT NULL REFERENCES lta.directory ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, + directory_id integer UNIQUE NOT NULL REFERENCES lta.directory ON DELETE CASCADE DEFERRABLE INITIALLY IMMEDIATE, num_files integer, total_file_size bigint, min_file_size bigint, @@ -154,6 +154,47 @@ CREATE TRIGGER trigger_directory_inserted FOR EACH ROW EXECUTE PROCEDURE lta.on_directory_inserted_add_directory_closure_entry(); +-------------------------------------------------------------------------------- + +DROP TRIGGER IF EXISTS trigger_fileinfo_inserted ON lta.fileinfo; +DROP FUNCTION IF EXISTS lta.on_fileinfo_inserted_add_directory_stats(); + +CREATE OR REPLACE FUNCTION lta.on_fileinfo_inserted_add_directory_stats() + RETURNS trigger AS +$BODY$ +BEGIN + INSERT INTO metainfo.directory_stats (directory_id) + VALUES (new.directory_id) + ON CONFLICT DO NOTHING ; + + CREATE TEMPORARY TABLE temp_fileinfo_for_dirstats + ON COMMIT DROP + AS (SELECT fi.size, fi.creation_date FROM lta.fileinfo fi + WHERE fi.directory_id = NEW.directory_id) ; + + UPDATE metainfo.directory_stats SET + num_files=(SELECT count(size) FROM temp_fileinfo_for_dirstats), + total_file_size=(SELECT sum(size) FROM temp_fileinfo_for_dirstats), + min_file_size=(SELECT min(size) FROM temp_fileinfo_for_dirstats), + max_file_size=(SELECT max(size) FROM temp_fileinfo_for_dirstats), + min_file_creation_date=(SELECT min(creation_date) FROM temp_fileinfo_for_dirstats), + max_file_creation_date=(SELECT max(creation_date) FROM temp_fileinfo_for_dirstats) + WHERE directory_id = NEW.directory_id ; + + RETURN NEW; +END; +$BODY$ + LANGUAGE plpgsql VOLATILE + COST 100; + +CREATE TRIGGER trigger_fileinfo_inserted + AFTER INSERT + ON lta.fileinfo + FOR EACH ROW + EXECUTE PROCEDURE lta.on_fileinfo_inserted_add_directory_stats(); + +-------------------------------------------------------------------------------- + -- END TRIGGERS