diff --git a/patches/patch20240127-8.0-SNAPSHOT/patch.sql b/patches/patch20240127-8.0-SNAPSHOT/patch.sql index 18f1b3e22dce7470c0ccbf2fa29d908dad0efcc9..02faf660a17973a333034a4007c521969da4b0b5 100644 --- a/patches/patch20240127-8.0-SNAPSHOT/patch.sql +++ b/patches/patch20240127-8.0-SNAPSHOT/patch.sql @@ -40,7 +40,7 @@ ALTER TABLE archive_files DROP COLUMN hash; -- Add new fields to files table... ALTER TABLE files ADD COLUMN IF NOT EXISTS ( - hash_algorithm VARBINARY(255) NULL DEFAULT NULL, + hash_algorithm VARBINARY(255) NULL DEFAULT 'SHA-512', parent_directory INT UNSIGNED DEFAULT NULL, mimetype VARBINARY(255) DEFAULT NULL, file_storage_id VARBINARY(255) NOT NULL DEFAULT "DEFAULT", @@ -50,7 +50,7 @@ ALTER TABLE files ADD COLUMN IF NOT EXISTS ( -- ... and to the corresponding archive_files table. ALTER TABLE archive_files ADD COLUMN IF NOT EXISTS ( checked_timestamp BIGINT NOT NULL DEFAULT 0, - hash_algorithm VARBINARY(255) NULL DEFAULT NULL, + hash_algorithm VARBINARY(255) NULL DEFAULT 'SHA-512', parent_directory INT UNSIGNED DEFAULT NULL, mimetype VARBINARY(255) DEFAULT NULL, file_storage_id VARBINARY(255) NOT NULL DEFAULT "DEFAULT", @@ -64,7 +64,7 @@ ALTER TABLE files ADD FOREIGN KEY (parent_directory) REFERENCES entities (id); ALTER TABLE archive_files ADD FOREIGN KEY (parent_directory) REFERENCES entities (id) ON DELETE CASCADE; -ALTER TABLE entities MODIFY COLUMN `role` enum('RECORDTYPE','RECORD','FILE','DOMAIN','PROPERTY','DATATYPE','ROLE','QUERYTEMPLATE', 'DIRECTORY') COLLATE utf8_unicode_ci NOT NULL; +ALTER TABLE entities MODIFY COLUMN `role` enum('RECORDTYPE','RECORD','FILE','_REPLACEMENT','PROPERTY','DATATYPE','ROLE','QUERYTEMPLATE', 'DIRECTORY') COLLATE utf8_unicode_ci NOT NULL; -- Add a new special role "DIRECTORY" INSERT IGNORE INTO entities (id, description, role, acl) VALUES (9, "The directory role.", "ROLE", 0); @@ -146,9 +146,7 @@ BEGIN -- this is the case when all parent directories of the current file have been processed. SET dir_exists = FALSE; SET done = FALSE; - LEAVE loop2; - END IF; - + LEAVE loop2; END IF; -- remove the trailing slash for convenience. SET dir_path_no_trailing_slash = LEFT(dir_path, CHAR_LENGTH(dir_path)-1); diff --git a/tests/test_autotap.sql b/tests/test_autotap.sql index 117c9a63ebb6fcf53d7e5fc4a7968f9aa9a733b9..ea575acf1372b25a900bc8fc9a3e473e39cdc572 100644 --- a/tests/test_autotap.sql +++ b/tests/test_autotap.sql @@ -724,7 +724,7 @@ SELECT tap.col_collation_is('_caosdb_schema_unit_tests','entities','description' -- COLUMN entities.role SELECT tap.has_column('_caosdb_schema_unit_tests','entities','role',''); -SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','role','enum(\'RECORDTYPE\',\'RECORD\',\'FILE\',\'_REPLACEMENT\',\'PROPERTY\',\'DATATYPE\',\'ROLE\',\'QUERYTEMPLATE\')',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','entities','role','enum(\'RECORDTYPE\',\'RECORD\',\'FILE\',\'_REPLACEMENT\',\'PROPERTY\',\'DATATYPE\',\'ROLE\',\'QUERYTEMPLATE\',\'DIRECTORY\')',''); SELECT tap.col_extra_is('_caosdb_schema_unit_tests','entities','role','',''); SELECT tap.col_default_is('_caosdb_schema_unit_tests','entities','role',NULL,''); SELECT tap.col_charset_is('_caosdb_schema_unit_tests','entities','role','utf8',''); @@ -909,15 +909,15 @@ SELECT tap.table_collation_is('_caosdb_schema_unit_tests','files','utf8_unicode_ SELECT tap.table_engine_is('_caosdb_schema_unit_tests','files','InnoDB',''); -- COLUMNS -SELECT tap.columns_are('_caosdb_schema_unit_tests','files','`file_id`,`path`,`size`,`hash`,`hash_algorithm`,`checked_timestamp`,`mimetype`,`file_storage_id`,`file_key`',''); +SELECT tap.columns_are('_caosdb_schema_unit_tests','files','`file_id`,`path`,`size`,`hash`,`hash_algorithm`,`checked_timestamp`,`mimetype`,`file_storage_id`,`file_key`,`parent_directory`',''); ----- TODO COLUMN files.parent_directory ---SELECT tap.has_column('_caosdb_schema_unit_tests','files','parent_directory',''); ---SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','parent_directory','int(10) unsigned',''); ---SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','parent_directory','',''); ---SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','parent_directory','NULL',''); ---SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,''); ---SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,''); +-- TODO COLUMN files.parent_directory +SELECT tap.has_column('_caosdb_schema_unit_tests','files','parent_directory',''); +SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','parent_directory','int(10) unsigned',''); +SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','parent_directory','',''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','parent_directory','NULL',''); +SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,''); +SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','parent_directory',NULL,''); -- TODO COLUMN files.hash_algorithm SELECT tap.has_column('_caosdb_schema_unit_tests','files','hash_algorithm',''); @@ -974,7 +974,7 @@ SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','path','utf8_uni SELECT tap.has_column('_caosdb_schema_unit_tests','files','size',''); SELECT tap.col_column_type_is('_caosdb_schema_unit_tests','files','size','bigint(20) unsigned',''); SELECT tap.col_extra_is('_caosdb_schema_unit_tests','files','size','',''); -SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','size',NULL,''); +SELECT tap.col_default_is('_caosdb_schema_unit_tests','files','size','NULL',''); SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','size',NULL,''); SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','size',NULL,''); @@ -997,7 +997,7 @@ SELECT tap.col_charset_is('_caosdb_schema_unit_tests','files','checked_timestamp SELECT tap.col_collation_is('_caosdb_schema_unit_tests','files','checked_timestamp',NULL,''); -- CONSTRAINTS -SELECT tap.constraints_are('_caosdb_schema_unit_tests','files','`PRIMARY`,`fil_file_id_entity`,`path`',''); +SELECT tap.constraints_are('_caosdb_schema_unit_tests','files','`PRIMARY`,`fil_file_id_entity`,`path`,`files_ibfk_1`',''); -- CONSTRAINT files.fil_file_id_entity @@ -1006,6 +1006,12 @@ SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','fil_file_id_e SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT',''); SELECT tap.fk_on_update('_caosdb_schema_unit_tests','files','fil_file_id_entity','RESTRICT',''); +-- CONSTRAINT files.files_ibfk_1 + +SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','files_ibfk_1',''); +SELECT tap.constraint_type_is('_caosdb_schema_unit_tests','files','files_ibfk_1','FOREIGN KEY',''); +SELECT tap.fk_on_delete('_caosdb_schema_unit_tests','files','files_ibfk_1','RESTRICT',''); +SELECT tap.fk_on_update('_caosdb_schema_unit_tests','files','files_ibfk_1','RESTRICT',''); -- CONSTRAINT files.PRIMARY SELECT tap.has_constraint('_caosdb_schema_unit_tests','files','PRIMARY',''); diff --git a/tests/test_directory_patch.sql b/tests/test_directory_patch.sql new file mode 100644 index 0000000000000000000000000000000000000000..24da84e58cc6c4a596d56a1a26461ca8b2b24bf2 --- /dev/null +++ b/tests/test_directory_patch.sql @@ -0,0 +1,39 @@ + +USE _caosdb_schema_unit_tests; + +BEGIN; +CALL tap.no_plan(); + +-- SETUP +INSERT INTO entities (id, role, acl) VALUES +(52, "FILE", 0), +(53, "FILE", 0), +(54, "FILE", 0), +(55, "FILE", 0), +(56, "FILE", 0), +(57, "FILE", 0); + + +INSERT INTO files (file_id, path, size, file_key) VALUES +(52, "file_at_root_a", 256, "file_at_root_a"), +(53, "file_at_root_b", 256, "file_at_root_b"), +(54, "level1/file_at_level1_a", 256, "level1/file_at_level1_a"), +(55, "level1/file_at_level1_b", 256, "level1/file_at_level1_b"), +(56, "level1/level2/file_at_level2_a", 256, "level1/level2/file_at_level2_a"), +(57, "level1/level2/file_at_level2_b", 256, "level1/level2/file_at_level2_b"); + + +SELECT tap.eq(COUNT(*), 7, "7 rows in test_files") FROM files; + +-- TEST _create_dirs + +CALL _create_dirs(); + +SELECT tap.eq(COUNT(*), 9, "9 rows in test_files") FROM files; +SELECT tap.eq(COUNT(*), 1, "one dir level1") FROM files WHERE path="level1"; +SELECT tap.eq(COUNT(*), 1, "one dir level1/level2") FROM files WHERE path="level1/level2"; + + + +CALL tap.finish(); +ROLLBACK;