diff --git a/catalogue/3.0/mysql_catalogue_schema.sql b/catalogue/3.0/mysql_catalogue_schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..2e82a5ed9f85bdd6eeb1c315b7d9028e9fa3cdac --- /dev/null +++ b/catalogue/3.0/mysql_catalogue_schema.sql @@ -0,0 +1,372 @@ +CREATE TABLE ARCHIVE_FILE_ID( + ID BIGINT UNSIGNED, + CONSTRAINT ARCHIVE_FILE_ID_PK PRIMARY KEY(ID) +); +INSERT INTO ARCHIVE_FILE_ID(ID) VALUES(1); +CREATE TABLE LOGICAL_LIBRARY_ID( + ID BIGINT UNSIGNED, + CONSTRAINT LOGICAL_LIBRARY_ID_PK PRIMARY KEY(ID) +); +INSERT INTO LOGICAL_LIBRARY_ID(ID) VALUES(1); +CREATE TABLE STORAGE_CLASS_ID( + ID BIGINT UNSIGNED, + CONSTRAINT STORAGE_CLASS_ID_PK PRIMARY KEY(ID) +); +INSERT INTO STORAGE_CLASS_ID(ID) VALUES(1); +CREATE TABLE TAPE_POOL_ID( + ID BIGINT UNSIGNED, + CONSTRAINT TAPE_POOL_ID_PK PRIMARY KEY(ID) +); +INSERT INTO TAPE_POOL_ID(ID) VALUES(1); +CREATE TABLE VIRTUAL_ORGANIZATION_ID( + ID BIGINT UNSIGNED, + CONSTRAINT VIRTUAL_ORGANIZATION_ID_PK PRIMARY KEY(ID) +); +INSERT INTO VIRTUAL_ORGANIZATION_ID(ID) VALUES(1); +CREATE TABLE CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR BIGINT UNSIGNED CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL, + SCHEMA_VERSION_MINOR BIGINT UNSIGNED CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL, + NEXT_SCHEMA_VERSION_MAJOR BIGINT UNSIGNED, + NEXT_SCHEMA_VERSION_MINOR BIGINT UNSIGNED, + STATUS VARCHAR(100) +); +CREATE TABLE ADMIN_USER( + ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ADMIN_USER_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ADMIN_USER_LUT_NN NOT NULL, + CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME) +); +CREATE TABLE DISK_SYSTEM( + DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL, + FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL, + FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL, + REFRESH_INTERVAL BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL, + TARGETED_FREE_SPACE BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL, + SLEEP_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL, + CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME) +); +CREATE TABLE VIRTUAL_ORGANIZATION( + VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL, + VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL, + CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID), + CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME) +); +CREATE TABLE STORAGE_CLASS( + STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL, + STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL, + NB_COPIES TINYINT UNSIGNED CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL, + CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID), + CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME), + CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE TAPE_POOL( + TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT TAPE_POOL_TPI_NN NOT NULL, + TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT TAPE_POOL_VOI_NN NOT NULL, + NB_PARTIAL_TAPES BIGINT UNSIGNED CONSTRAINT TAPE_POOL_NPT_NN NOT NULL, + IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL, + SUPPLY VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT TAPE_POOL_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT TAPE_POOL_LUT_NN NOT NULL, + CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID), + CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME), + CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')), + CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE ARCHIVE_ROUTE( + STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL, + COPY_NB TINYINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL, + TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL, + CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB), + CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID) +); +CREATE TABLE LOGICAL_LIBRARY( + LOGICAL_LIBRARY_ID BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL, + LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL, + IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL, + CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID), + CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME), + CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')) +); +CREATE TABLE TAPE( + VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL, + MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL, + VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL, + LOGICAL_LIBRARY_ID BIGINT UNSIGNED CONSTRAINT TAPE_LLI_NN NOT NULL, + TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT TAPE_TPI_NN NOT NULL, + ENCRYPTION_KEY_NAME VARCHAR(100), + CAPACITY_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_CIB_NN NOT NULL, + DATA_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_DIB_NN NOT NULL, + LAST_FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_LF_NN NOT NULL, + NB_MASTER_FILES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL, + MASTER_DATA_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL, + IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL, + IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL, + IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL, + IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL, + IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL, + IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL, + DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL, + NB_COPY_NB_1 BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL, + COPY_NB_1_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL, + NB_COPY_NB_GT_1 BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL, + COPY_NB_GT_1_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL, + LABEL_DRIVE VARCHAR(100), + LABEL_TIME BIGINT UNSIGNED , + LAST_READ_DRIVE VARCHAR(100), + LAST_READ_TIME BIGINT UNSIGNED , + LAST_WRITE_DRIVE VARCHAR(100), + LAST_WRITE_TIME BIGINT UNSIGNED , + READ_MOUNT_COUNT BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL, + WRITE_MOUNT_COUNT BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT TAPE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT TAPE_LUT_NN NOT NULL, + CONSTRAINT TAPE_PK PRIMARY KEY(VID), + CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID), + CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')), + CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')), + CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')), + CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')), + CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')), + CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')), + CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1')) +); +CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID); +CREATE TABLE MOUNT_POLICY( + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL, + ARCHIVE_PRIORITY BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL, + ARCHIVE_MIN_REQUEST_AGE BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL, + RETRIEVE_PRIORITY BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL, + RETRIEVE_MIN_REQUEST_AGE BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL, + MAX_DRIVES_ALLOWED BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL, + CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL, + REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME), + CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_GROUP_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL, + REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME), + CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE ARCHIVE_FILE( + ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL, + DISK_FILE_UID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL, + DISK_FILE_GID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL, + SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL, + CHECKSUM_BLOB VARBINARY(200), + CHECKSUM_ADLER32 INT UNSIGNED CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL, + STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL, + CREATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL, + RECONCILIATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL, + IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID), + CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1')) +); +CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME); +CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID); +CREATE TABLE TAPE_FILE( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL, + FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_FILE_F_NN NOT NULL, + BLOCK_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL, + COPY_NB TINYINT UNSIGNED CONSTRAINT TAPE_FILE_CN_NN NOT NULL, + CREATION_TIME BIGINT UNSIGNED CONSTRAINT TAPE_FILE_CT_NN NOT NULL, + ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ BIGINT UNSIGNED , + WRITE_START_WRAP SMALLINT UNSIGNED, + WRITE_START_LPOS INT UNSIGNED, + WRITE_END_WRAP SMALLINT UNSIGNED, + WRITE_END_LPOS INT UNSIGNED, + READ_START_WRAP SMALLINT UNSIGNED, + READ_START_LPOS INT UNSIGNED, + READ_END_WRAP SMALLINT UNSIGNED, + READ_END_LPOS INT UNSIGNED, + CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE(VID, FSEQ) +); +CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID); +CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID); +CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ); +CREATE TABLE ACTIVITIES_WEIGHTS ( + DISK_INSTANCE_NAME VARCHAR(100), + ACTIVITY VARCHAR(100), + WEIGHT VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL, + CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL +); +CREATE TABLE USAGESTATS ( + GID INT UNSIGNED DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL, + TIMESTAMP BIGINT UNSIGNED DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL, + MAXFILEID BIGINT UNSIGNED, + FILECOUNT BIGINT UNSIGNED, + FILESIZE BIGINT UNSIGNED, + SEGCOUNT BIGINT UNSIGNED, + SEGSIZE BIGINT UNSIGNED, + SEG2COUNT BIGINT UNSIGNED, + SEG2SIZE BIGINT UNSIGNED, + CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP) +); +CREATE TABLE EXPERIMENTS ( + NAME VARCHAR(20), + GID INT UNSIGNED CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY +); +CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN( + ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL, + DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL, + DISK_FILE_UID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL, + DISK_FILE_GID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL, + SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL, + CHECKSUM_BLOB VARBINARY(200), + CHECKSUM_ADLER32 INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL, + STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL, + CREATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL, + RECONCILIATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL, + DELETION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL, + CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) +); +CREATE TABLE TAPE_FILE_RECYCLE_BIN( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL, + FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL, + BLOCK_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL, + COPY_NB TINYINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL, + CREATION_TIME BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL, + ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ BIGINT UNSIGNED, + WRITE_START_WRAP SMALLINT UNSIGNED, + WRITE_START_LPOS INT UNSIGNED, + WRITE_END_WRAP SMALLINT UNSIGNED, + WRITE_END_LPOS INT UNSIGNED, + READ_START_WRAP SMALLINT UNSIGNED, + READ_START_LPOS INT UNSIGNED, + READ_END_WRAP SMALLINT UNSIGNED, + READ_END_LPOS INT UNSIGNED, + CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ) +);INSERT INTO CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR, + SCHEMA_VERSION_MINOR, + STATUS) +VALUES( + 3, + 0, + 'PRODUCTION'); +ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT + CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING')); \ No newline at end of file diff --git a/catalogue/3.0/oracle_catalogue_schema.sql b/catalogue/3.0/oracle_catalogue_schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..b92c1d26b92a796ab5229aac4a91c28a325a83ff --- /dev/null +++ b/catalogue/3.0/oracle_catalogue_schema.sql @@ -0,0 +1,399 @@ +CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ + INCREMENT BY 1 + START WITH 4294967296 + NOMAXVALUE + MINVALUE 1 + NOCYCLE + CACHE 20 + NOORDER; +CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ + INCREMENT BY 1 + START WITH 4294967296 + NOMAXVALUE + MINVALUE 1 + NOCYCLE + CACHE 20 + NOORDER; +CREATE SEQUENCE STORAGE_CLASS_ID_SEQ + INCREMENT BY 1 + START WITH 4294967296 + NOMAXVALUE + MINVALUE 1 + NOCYCLE + CACHE 20 + NOORDER; +CREATE SEQUENCE TAPE_POOL_ID_SEQ + INCREMENT BY 1 + START WITH 4294967296 + NOMAXVALUE + MINVALUE 1 + NOCYCLE + CACHE 20 + NOORDER; +CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ + INCREMENT BY 1 + START WITH 4294967296 + NOMAXVALUE + MINVALUE 1 + NOCYCLE + CACHE 20 + NOORDER; +CREATE GLOBAL TEMPORARY TABLE TEMP_TAPE_FILE_INSERTION_BATCH( + VID VARCHAR2(100), + FSEQ NUMERIC(20, 0) , + BLOCK_ID NUMERIC(20, 0) , + LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) , + COPY_NB NUMERIC(3, 0) , + CREATION_TIME NUMERIC(20, 0) , + ARCHIVE_FILE_ID NUMERIC(20, 0) +) +ON COMMIT DELETE ROWS; +CREATE INDEX TEMP_T_F_I_B_AFI_IDX ON TEMP_TAPE_FILE_INSERTION_BATCH(ARCHIVE_FILE_ID); +CREATE TABLE CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL, + SCHEMA_VERSION_MINOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL, + NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0), + NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0), + STATUS VARCHAR2(100) +); +CREATE TABLE ADMIN_USER( + ADMIN_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_LUT_NN NOT NULL, + CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME) +); +CREATE TABLE DISK_SYSTEM( + DISK_SYSTEM_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL, + FILE_REGEXP VARCHAR2(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL, + FREE_SPACE_QUERY_URL VARCHAR2(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL, + REFRESH_INTERVAL NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL, + TARGETED_FREE_SPACE NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL, + SLEEP_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL, + CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME) +); +CREATE TABLE VIRTUAL_ORGANIZATION( + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL, + VIRTUAL_ORGANIZATION_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL, + CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID), + CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME) +); +CREATE TABLE STORAGE_CLASS( + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL, + STORAGE_CLASS_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL, + NB_COPIES NUMERIC(3, 0) CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL, + CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID), + CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME), + CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE TAPE_POOL( + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_TPI_NN NOT NULL, + TAPE_POOL_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_VOI_NN NOT NULL, + NB_PARTIAL_TAPES NUMERIC(20, 0) CONSTRAINT TAPE_POOL_NPT_NN NOT NULL, + IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL, + SUPPLY VARCHAR2(100), + USER_COMMENT VARCHAR2(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_LUT_NN NOT NULL, + CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID), + CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME), + CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')), + CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE ARCHIVE_ROUTE( + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL, + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL, + CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB), + CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID) +); +CREATE TABLE LOGICAL_LIBRARY( + LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL, + LOGICAL_LIBRARY_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL, + IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL, + CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID), + CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME), + CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')) +); +CREATE TABLE TAPE( + VID VARCHAR2(100) CONSTRAINT TAPE_V_NN NOT NULL, + MEDIA_TYPE VARCHAR2(100) CONSTRAINT TAPE_MT_NN NOT NULL, + VENDOR VARCHAR2(100) CONSTRAINT TAPE_V2_NN NOT NULL, + LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT TAPE_LLI_NN NOT NULL, + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_TPI_NN NOT NULL, + ENCRYPTION_KEY_NAME VARCHAR2(100), + CAPACITY_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_CIB_NN NOT NULL, + DATA_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_DIB_NN NOT NULL, + LAST_FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_LF_NN NOT NULL, + NB_MASTER_FILES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL, + MASTER_DATA_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL, + IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL, + IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL, + IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL, + IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL, + IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL, + IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL, + DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL, + NB_COPY_NB_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL, + COPY_NB_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL, + NB_COPY_NB_GT_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL, + COPY_NB_GT_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL, + LABEL_DRIVE VARCHAR2(100), + LABEL_TIME NUMERIC(20, 0) , + LAST_READ_DRIVE VARCHAR2(100), + LAST_READ_TIME NUMERIC(20, 0) , + LAST_WRITE_DRIVE VARCHAR2(100), + LAST_WRITE_TIME NUMERIC(20, 0) , + READ_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL, + WRITE_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT TAPE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_LUT_NN NOT NULL, + CONSTRAINT TAPE_PK PRIMARY KEY(VID), + CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID), + CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')), + CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')), + CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')), + CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')), + CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')), + CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')), + CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1')) +); +CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID); +CREATE TABLE MOUNT_POLICY( + MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL, + ARCHIVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL, + ARCHIVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL, + RETRIEVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL, + RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL, + MAX_DRIVES_ALLOWED NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL, + CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL, + REQUESTER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME), + CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_GROUP_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL, + REQUESTER_GROUP_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR2(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME), + CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE ARCHIVE_FILE( + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL, + DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL, + DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL, + SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL, + CHECKSUM_BLOB RAW(200), + CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL, + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL, + RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL, + IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL, + COLLOCATION_HINT VARCHAR2(100), + CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID), + CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1')) +); +CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME); +CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID); +CREATE TABLE TAPE_FILE( + VID VARCHAR2(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL, + FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_F_NN NOT NULL, + BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_CN_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CT_NN NOT NULL, + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR2(100), + SUPERSEDED_BY_FSEQ NUMERIC(20, 0) , + WRITE_START_WRAP NUMERIC(5, 0), + WRITE_START_LPOS NUMERIC(10, 0), + WRITE_END_WRAP NUMERIC(5, 0), + WRITE_END_LPOS NUMERIC(10, 0), + READ_START_WRAP NUMERIC(5, 0), + READ_START_LPOS NUMERIC(10, 0), + READ_END_WRAP NUMERIC(5, 0), + READ_END_LPOS NUMERIC(10, 0), + CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE(VID, FSEQ) +); +CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID); +CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID); +CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ); +CREATE TABLE ACTIVITIES_WEIGHTS ( + DISK_INSTANCE_NAME VARCHAR2(100), + ACTIVITY VARCHAR2(100), + WEIGHT VARCHAR2(100), + USER_COMMENT VARCHAR2(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL +); +CREATE TABLE USAGESTATS ( + GID NUMERIC(10, 0) DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL, + TIMESTAMP NUMERIC(20, 0) DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL, + MAXFILEID NUMERIC(20, 0), + FILECOUNT NUMERIC(20, 0), + FILESIZE NUMERIC(20, 0), + SEGCOUNT NUMERIC(20, 0), + SEGSIZE NUMERIC(20, 0), + SEG2COUNT NUMERIC(20, 0), + SEG2SIZE NUMERIC(20, 0), + CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP) +); +CREATE TABLE EXPERIMENTS ( + NAME VARCHAR2(20), + GID NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY +); +CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN( + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL, + DISK_FILE_ID_WHEN_DELETED VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL, + DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL, + DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL, + SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL, + CHECKSUM_BLOB RAW(200), + CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL, + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL, + RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL, + COLLOCATION_HINT VARCHAR2(100), + DISK_FILE_PATH VARCHAR2(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL, + DELETION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL, + CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) +); +CREATE TABLE TAPE_FILE_RECYCLE_BIN( + VID VARCHAR2(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL, + FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL, + BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL, + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR2(100), + SUPERSEDED_BY_FSEQ NUMERIC(20, 0), + WRITE_START_WRAP NUMERIC(5, 0), + WRITE_START_LPOS NUMERIC(10, 0), + WRITE_END_WRAP NUMERIC(5, 0), + WRITE_END_LPOS NUMERIC(10, 0), + READ_START_WRAP NUMERIC(5, 0), + READ_START_LPOS NUMERIC(10, 0), + READ_END_WRAP NUMERIC(5, 0), + READ_END_LPOS NUMERIC(10, 0), + CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ) +);INSERT INTO CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR, + SCHEMA_VERSION_MINOR, + STATUS) +VALUES( + 3, + 0, + 'PRODUCTION'); +ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (NEXT_SCHEMA_VERSION_MAJOR IS NOT NULL AND NEXT_SCHEMA_VERSION_MINOR IS NOT NULL AND STATUS='UPGRADING')) INITIALLY DEFERRED; + +COMMIT; diff --git a/catalogue/3.0/postgres_catalogue_schema.sql b/catalogue/3.0/postgres_catalogue_schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..4d2039e84d3d2d4ff50bd2c0ad9694ed06c78792 --- /dev/null +++ b/catalogue/3.0/postgres_catalogue_schema.sql @@ -0,0 +1,386 @@ +CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ + INCREMENT BY 1 + START WITH 1 + NO MAXVALUE + MINVALUE 1 + NO CYCLE + CACHE 20; +CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ + INCREMENT BY 1 + START WITH 1 + NO MAXVALUE + MINVALUE 1 + NO CYCLE + CACHE 20; +CREATE SEQUENCE STORAGE_CLASS_ID_SEQ + INCREMENT BY 1 + START WITH 1 + NO MAXVALUE + MINVALUE 1 + NO CYCLE + CACHE 20; +CREATE SEQUENCE TAPE_POOL_ID_SEQ + INCREMENT BY 1 + START WITH 1 + NO MAXVALUE + MINVALUE 1 + NO CYCLE + CACHE 20; +CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ + INCREMENT BY 1 + START WITH 1 + NO MAXVALUE + MINVALUE 1 + NO CYCLE + CACHE 20; +CREATE TABLE CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL, + SCHEMA_VERSION_MINOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL, + NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0), + NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0), + STATUS VARCHAR(100) +); +CREATE TABLE ADMIN_USER( + ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_LUT_NN NOT NULL, + CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME) +); +CREATE TABLE DISK_SYSTEM( + DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL, + FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL, + FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL, + REFRESH_INTERVAL NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL, + TARGETED_FREE_SPACE NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL, + SLEEP_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL, + CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME) +); +CREATE TABLE VIRTUAL_ORGANIZATION( + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL, + VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL, + CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID), + CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME) +); +CREATE TABLE STORAGE_CLASS( + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL, + STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL, + NB_COPIES NUMERIC(3, 0) CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL, + CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID), + CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME), + CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE TAPE_POOL( + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_TPI_NN NOT NULL, + TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_VOI_NN NOT NULL, + NB_PARTIAL_TAPES NUMERIC(20, 0) CONSTRAINT TAPE_POOL_NPT_NN NOT NULL, + IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL, + SUPPLY VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_LUT_NN NOT NULL, + CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID), + CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME), + CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')), + CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE ARCHIVE_ROUTE( + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL, + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL, + CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB), + CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID) +); +CREATE TABLE LOGICAL_LIBRARY( + LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL, + LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL, + IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL, + CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID), + CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME), + CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')) +); +CREATE TABLE TAPE( + VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL, + MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL, + VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL, + LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT TAPE_LLI_NN NOT NULL, + TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_TPI_NN NOT NULL, + ENCRYPTION_KEY_NAME VARCHAR(100), + CAPACITY_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_CIB_NN NOT NULL, + DATA_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_DIB_NN NOT NULL, + LAST_FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_LF_NN NOT NULL, + NB_MASTER_FILES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL, + MASTER_DATA_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL, + IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL, + IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL, + IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL, + IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL, + IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL, + IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL, + DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL, + NB_COPY_NB_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL, + COPY_NB_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL, + NB_COPY_NB_GT_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL, + COPY_NB_GT_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL, + LABEL_DRIVE VARCHAR(100), + LABEL_TIME NUMERIC(20, 0) , + LAST_READ_DRIVE VARCHAR(100), + LAST_READ_TIME NUMERIC(20, 0) , + LAST_WRITE_DRIVE VARCHAR(100), + LAST_WRITE_TIME NUMERIC(20, 0) , + READ_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL, + WRITE_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_LUT_NN NOT NULL, + CONSTRAINT TAPE_PK PRIMARY KEY(VID), + CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID), + CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')), + CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')), + CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')), + CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')), + CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')), + CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')), + CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1')) +); +CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID); +CREATE TABLE MOUNT_POLICY( + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL, + ARCHIVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL, + ARCHIVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL, + RETRIEVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL, + RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL, + MAX_DRIVES_ALLOWED NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL, + CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL, + REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME), + CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_GROUP_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL, + REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME), + CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE ARCHIVE_FILE( + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL, + DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL, + DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL, + SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL, + CHECKSUM_BLOB BYTEA, + CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL, + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL, + RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL, + IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID), + CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1')) +); +CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME); +CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID); +CREATE TABLE TAPE_FILE( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL, + FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_F_NN NOT NULL, + BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_CN_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CT_NN NOT NULL, + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ NUMERIC(20, 0) , + WRITE_START_WRAP NUMERIC(5, 0), + WRITE_START_LPOS NUMERIC(10, 0), + WRITE_END_WRAP NUMERIC(5, 0), + WRITE_END_LPOS NUMERIC(10, 0), + READ_START_WRAP NUMERIC(5, 0), + READ_START_LPOS NUMERIC(10, 0), + READ_END_WRAP NUMERIC(5, 0), + READ_END_LPOS NUMERIC(10, 0), + CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE(VID, FSEQ) +); +CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID); +CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID); +CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ); +CREATE TABLE ACTIVITIES_WEIGHTS ( + DISK_INSTANCE_NAME VARCHAR(100), + ACTIVITY VARCHAR(100), + WEIGHT VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL, + CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL +); +CREATE TABLE USAGESTATS ( + GID NUMERIC(10, 0) DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL, + TIMESTAMP NUMERIC(20, 0) DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL, + MAXFILEID NUMERIC(20, 0), + FILECOUNT NUMERIC(20, 0), + FILESIZE NUMERIC(20, 0), + SEGCOUNT NUMERIC(20, 0), + SEGSIZE NUMERIC(20, 0), + SEG2COUNT NUMERIC(20, 0), + SEG2SIZE NUMERIC(20, 0), + CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP) +); +CREATE TABLE EXPERIMENTS ( + NAME VARCHAR(20), + GID NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY +); +CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN( + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL, + DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL, + DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL, + DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL, + SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL, + CHECKSUM_BLOB BYTEA, + CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL, + STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL, + RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL, + DELETION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL, + CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) +); +CREATE TABLE TAPE_FILE_RECYCLE_BIN( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL, + FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL, + BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL, + COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL, + CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL, + ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ NUMERIC(20, 0), + WRITE_START_WRAP NUMERIC(5, 0), + WRITE_START_LPOS NUMERIC(10, 0), + WRITE_END_WRAP NUMERIC(5, 0), + WRITE_END_LPOS NUMERIC(10, 0), + READ_START_WRAP NUMERIC(5, 0), + READ_START_LPOS NUMERIC(10, 0), + READ_END_WRAP NUMERIC(5, 0), + READ_END_LPOS NUMERIC(10, 0), + CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ) +);INSERT INTO CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR, + SCHEMA_VERSION_MINOR, + STATUS) +VALUES( + 3, + 0, + 'PRODUCTION'); +ALTER TABLE ARCHIVE_FILE DROP CONSTRAINT + ARCHIVE_FILE_DIN_DFI_UN; +ALTER TABLE ARCHIVE_FILE ADD CONSTRAINT + ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) DEFERRABLE INITIALLY IMMEDIATE; +ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT + CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING')); diff --git a/catalogue/3.0/sqlite_catalogue_schema.sql b/catalogue/3.0/sqlite_catalogue_schema.sql new file mode 100644 index 0000000000000000000000000000000000000000..818c6b83db3bc7945c12b28b74434b24725557ea --- /dev/null +++ b/catalogue/3.0/sqlite_catalogue_schema.sql @@ -0,0 +1,360 @@ +CREATE TABLE ARCHIVE_FILE_ID( + ID INTEGER PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE LOGICAL_LIBRARY_ID( + ID INTEGER PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE STORAGE_CLASS_ID( + ID INTEGER PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE TAPE_POOL_ID( + ID INTEGER PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE VIRTUAL_ORGANIZATION_ID( + ID INTEGER PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR INTEGER CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL, + SCHEMA_VERSION_MINOR INTEGER CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL, + NEXT_SCHEMA_VERSION_MAJOR INTEGER, + NEXT_SCHEMA_VERSION_MINOR INTEGER, + STATUS VARCHAR(100) +); +CREATE TABLE ADMIN_USER( + ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT ADMIN_USER_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT ADMIN_USER_LUT_NN NOT NULL, + CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME) +); +CREATE TABLE DISK_SYSTEM( + DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL, + FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL, + FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL, + REFRESH_INTERVAL INTEGER CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL, + TARGETED_FREE_SPACE INTEGER CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL, + SLEEP_TIME INTEGER CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL, + CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME) +); +CREATE TABLE VIRTUAL_ORGANIZATION( + VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL, + VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL, + CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID), + CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME) +); +CREATE TABLE STORAGE_CLASS( + STORAGE_CLASS_ID INTEGER CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL, + STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL, + NB_COPIES INTEGER CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL, + CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID), + CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME), + CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE TAPE_POOL( + TAPE_POOL_ID INTEGER CONSTRAINT TAPE_POOL_TPI_NN NOT NULL, + TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL, + VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT TAPE_POOL_VOI_NN NOT NULL, + NB_PARTIAL_TAPES INTEGER CONSTRAINT TAPE_POOL_NPT_NN NOT NULL, + IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL, + SUPPLY VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT TAPE_POOL_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT TAPE_POOL_LUT_NN NOT NULL, + CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID), + CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME), + CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1')), + CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID) +); +CREATE TABLE ARCHIVE_ROUTE( + STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL, + COPY_NB INTEGER CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL, + TAPE_POOL_ID INTEGER CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL, + CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB), + CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID) +); +CREATE TABLE LOGICAL_LIBRARY( + LOGICAL_LIBRARY_ID INTEGER CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL, + LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL, + IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL, + CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID), + CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME), + CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')) +); +CREATE TABLE TAPE( + VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL, + MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL, + VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL, + LOGICAL_LIBRARY_ID INTEGER CONSTRAINT TAPE_LLI_NN NOT NULL, + TAPE_POOL_ID INTEGER CONSTRAINT TAPE_TPI_NN NOT NULL, + ENCRYPTION_KEY_NAME VARCHAR(100), + CAPACITY_IN_BYTES INTEGER CONSTRAINT TAPE_CIB_NN NOT NULL, + DATA_IN_BYTES INTEGER CONSTRAINT TAPE_DIB_NN NOT NULL, + LAST_FSEQ INTEGER CONSTRAINT TAPE_LF_NN NOT NULL, + NB_MASTER_FILES INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL, + MASTER_DATA_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL, + IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL, + IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL, + IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL, + IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL, + IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL, + IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL, + DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL, + NB_COPY_NB_1 INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL, + COPY_NB_1_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL, + NB_COPY_NB_GT_1 INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL, + COPY_NB_GT_1_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL, + LABEL_DRIVE VARCHAR(100), + LABEL_TIME INTEGER , + LAST_READ_DRIVE VARCHAR(100), + LAST_READ_TIME INTEGER , + LAST_WRITE_DRIVE VARCHAR(100), + LAST_WRITE_TIME INTEGER , + READ_MOUNT_COUNT INTEGER DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL, + WRITE_MOUNT_COUNT INTEGER DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT TAPE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT TAPE_LUT_NN NOT NULL, + CONSTRAINT TAPE_PK PRIMARY KEY(VID), + CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID), + CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID), + CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1')), + CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1')), + CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1')), + CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1')), + CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1')), + CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1')), + CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1')) +); +CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID); +CREATE TABLE MOUNT_POLICY( + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL, + ARCHIVE_PRIORITY INTEGER CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL, + ARCHIVE_MIN_REQUEST_AGE INTEGER CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL, + RETRIEVE_PRIORITY INTEGER CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL, + RETRIEVE_MIN_REQUEST_AGE INTEGER CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL, + MAX_DRIVES_ALLOWED INTEGER CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL, + CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL, + REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME), + CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE REQUESTER_GROUP_MOUNT_RULE( + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL, + REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL, + MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL, + USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL, + CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME), + CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME) + REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME) +); +CREATE TABLE ARCHIVE_FILE( + ARCHIVE_FILE_ID INTEGER CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL, + DISK_FILE_UID INTEGER CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL, + DISK_FILE_GID INTEGER CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL, + SIZE_IN_BYTES INTEGER CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL, + CHECKSUM_BLOB BLOB(200), + CHECKSUM_ADLER32 INTEGER CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL, + STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL, + CREATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL, + RECONCILIATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL, + IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID), + CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1')) +); +CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME); +CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID); +CREATE TABLE TAPE_FILE( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL, + FSEQ INTEGER CONSTRAINT TAPE_FILE_F_NN NOT NULL, + BLOCK_ID INTEGER CONSTRAINT TAPE_FILE_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES INTEGER CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL, + COPY_NB INTEGER CONSTRAINT TAPE_FILE_CN_NN NOT NULL, + CREATION_TIME INTEGER CONSTRAINT TAPE_FILE_CT_NN NOT NULL, + ARCHIVE_FILE_ID INTEGER CONSTRAINT TAPE_FILE_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ INTEGER , + WRITE_START_WRAP INTEGER, + WRITE_START_LPOS INTEGER, + WRITE_END_WRAP INTEGER, + WRITE_END_LPOS INTEGER, + READ_START_WRAP INTEGER, + READ_START_LPOS INTEGER, + READ_END_WRAP INTEGER, + READ_END_LPOS INTEGER, + CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE(VID, FSEQ) +); +CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID); +CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID); +CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ); +CREATE TABLE ACTIVITIES_WEIGHTS ( + DISK_INSTANCE_NAME VARCHAR(100), + ACTIVITY VARCHAR(100), + WEIGHT VARCHAR(100), + USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL, + CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL, + CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL, + CREATION_LOG_TIME INTEGER CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL, + LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL, + LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL, + LAST_UPDATE_TIME INTEGER CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL +); +CREATE TABLE USAGESTATS ( + GID INTEGER DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL, + TIMESTAMP INTEGER DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL, + MAXFILEID INTEGER, + FILECOUNT INTEGER, + FILESIZE INTEGER, + SEGCOUNT INTEGER, + SEGSIZE INTEGER, + SEG2COUNT INTEGER, + SEG2SIZE INTEGER, + CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP) +); +CREATE TABLE EXPERIMENTS ( + NAME VARCHAR(20), + GID INTEGER CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY +); +CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN( + ARCHIVE_FILE_ID INTEGER CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL, + DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL, + DISK_FILE_UID INTEGER CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL, + DISK_FILE_GID INTEGER CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL, + SIZE_IN_BYTES INTEGER CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL, + CHECKSUM_BLOB BLOB(200), + CHECKSUM_ADLER32 INTEGER CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL, + STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL, + CREATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL, + RECONCILIATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL, + DELETION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL, + CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) +); +CREATE TABLE TAPE_FILE_RECYCLE_BIN( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL, + FSEQ INTEGER CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL, + BLOCK_ID INTEGER CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES INTEGER CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL, + COPY_NB INTEGER CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL, + CREATION_TIME INTEGER CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL, + ARCHIVE_FILE_ID INTEGER CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ INTEGER, + WRITE_START_WRAP INTEGER, + WRITE_START_LPOS INTEGER, + WRITE_END_WRAP INTEGER, + WRITE_END_LPOS INTEGER, + READ_START_WRAP INTEGER, + READ_START_LPOS INTEGER, + READ_END_WRAP INTEGER, + READ_END_LPOS INTEGER, + CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ) +);INSERT INTO CTA_CATALOGUE( + SCHEMA_VERSION_MAJOR, + SCHEMA_VERSION_MINOR, + STATUS) +VALUES( + 3, + 0, + 'PRODUCTION'); diff --git a/catalogue/AllCatalogueSchema.hpp b/catalogue/AllCatalogueSchema.hpp index 0fe09a5a7cf1dcfb7cd75b4ca0e85e1bb074ed24..a51a7ceec372195357cd4f41de76c25d760980da 100644 --- a/catalogue/AllCatalogueSchema.hpp +++ b/catalogue/AllCatalogueSchema.hpp @@ -3800,6 +3800,1530 @@ namespace catalogue{ " CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));" }, } }, + {"3.0", + { + {"oracle", "CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ" + " INCREMENT BY 1" + " START WITH 4294967296" + " NOMAXVALUE" + " MINVALUE 1" + " NOCYCLE" + " CACHE 20" + " NOORDER;" + "CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ" + " INCREMENT BY 1" + " START WITH 4294967296" + " NOMAXVALUE" + " MINVALUE 1" + " NOCYCLE" + " CACHE 20" + " NOORDER;" + "CREATE SEQUENCE STORAGE_CLASS_ID_SEQ" + " INCREMENT BY 1" + " START WITH 4294967296" + " NOMAXVALUE" + " MINVALUE 1" + " NOCYCLE" + " CACHE 20" + " NOORDER;" + "CREATE SEQUENCE TAPE_POOL_ID_SEQ" + " INCREMENT BY 1" + " START WITH 4294967296" + " NOMAXVALUE" + " MINVALUE 1" + " NOCYCLE" + " CACHE 20" + " NOORDER;" + "CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ" + " INCREMENT BY 1" + " START WITH 4294967296" + " NOMAXVALUE" + " MINVALUE 1" + " NOCYCLE" + " CACHE 20" + " NOORDER;" + "CREATE GLOBAL TEMPORARY TABLE TEMP_TAPE_FILE_INSERTION_BATCH(" + " VID VARCHAR2(100)," + " FSEQ NUMERIC(20, 0) ," + " BLOCK_ID NUMERIC(20, 0) ," + " LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) ," + " COPY_NB NUMERIC(3, 0) ," + " CREATION_TIME NUMERIC(20, 0) ," + " ARCHIVE_FILE_ID NUMERIC(20, 0) " + ")" + "ON COMMIT DELETE ROWS;" + "CREATE INDEX TEMP_T_F_I_B_AFI_IDX ON TEMP_TAPE_FILE_INSERTION_BATCH(ARCHIVE_FILE_ID);" + "CREATE TABLE CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL," + " SCHEMA_VERSION_MINOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL," + " NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0)," + " NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0)," + " STATUS VARCHAR2(100)" + ");" + "CREATE TABLE ADMIN_USER(" + " ADMIN_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_LUT_NN NOT NULL," + " CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)" + ");" + "CREATE TABLE DISK_SYSTEM(" + " DISK_SYSTEM_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL," + " FILE_REGEXP VARCHAR2(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL," + " FREE_SPACE_QUERY_URL VARCHAR2(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL," + " REFRESH_INTERVAL NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL," + " TARGETED_FREE_SPACE NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL," + " SLEEP_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL," + " CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)" + ");" + "CREATE TABLE VIRTUAL_ORGANIZATION(" + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL," + " VIRTUAL_ORGANIZATION_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL," + " CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID)," + " CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)" + ");" + "CREATE TABLE STORAGE_CLASS(" + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL," + " STORAGE_CLASS_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL," + " NB_COPIES NUMERIC(3, 0) CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, " + " USER_COMMENT VARCHAR2(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL," + " CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID)," + " CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME)," + " CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE TAPE_POOL(" + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_TPI_NN NOT NULL," + " TAPE_POOL_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_VOI_NN NOT NULL," + " NB_PARTIAL_TAPES NUMERIC(20, 0) CONSTRAINT TAPE_POOL_NPT_NN NOT NULL," + " IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL," + " SUPPLY VARCHAR2(100)," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_LUT_NN NOT NULL," + " CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID)," + " CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME)," + " CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1'))," + " CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE ARCHIVE_ROUTE(" + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL," + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL," + " CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB)," + " CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)" + ");" + "CREATE TABLE LOGICAL_LIBRARY(" + " LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL," + " LOGICAL_LIBRARY_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL," + " IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL," + " CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME)," + " CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))" + ");" + "CREATE TABLE TAPE(" + " VID VARCHAR2(100) CONSTRAINT TAPE_V_NN NOT NULL," + " MEDIA_TYPE VARCHAR2(100) CONSTRAINT TAPE_MT_NN NOT NULL," + " VENDOR VARCHAR2(100) CONSTRAINT TAPE_V2_NN NOT NULL," + " LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT TAPE_LLI_NN NOT NULL," + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_TPI_NN NOT NULL," + " ENCRYPTION_KEY_NAME VARCHAR2(100)," + " CAPACITY_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_CIB_NN NOT NULL," + " DATA_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_DIB_NN NOT NULL," + " LAST_FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_LF_NN NOT NULL," + " NB_MASTER_FILES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL," + " MASTER_DATA_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL," + " IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL," + " IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL," + " IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL," + " IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL," + " IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL," + " IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL," + " DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL," + " NB_COPY_NB_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL," + " COPY_NB_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL," + " NB_COPY_NB_GT_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL," + " COPY_NB_GT_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL," + " LABEL_DRIVE VARCHAR2(100)," + " LABEL_TIME NUMERIC(20, 0) ," + " LAST_READ_DRIVE VARCHAR2(100)," + " LAST_READ_TIME NUMERIC(20, 0) ," + " LAST_WRITE_DRIVE VARCHAR2(100)," + " LAST_WRITE_TIME NUMERIC(20, 0) ," + " READ_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL," + " WRITE_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT TAPE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT TAPE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT TAPE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_LUT_NN NOT NULL," + " CONSTRAINT TAPE_PK PRIMARY KEY(VID)," + " CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1'))," + " CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1'))," + " CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1'))," + " CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))" + ");" + "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);" + "CREATE TABLE MOUNT_POLICY(" + " MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL," + " ARCHIVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL," + " ARCHIVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL," + " RETRIEVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL," + " RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL," + " MAX_DRIVES_ALLOWED NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL," + " CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL," + " REQUESTER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME)," + " CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL," + " REQUESTER_GROUP_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME)," + " CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE ARCHIVE_FILE(" + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL," + " DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL," + " DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL," + " SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL," + " CHECKSUM_BLOB RAW(200)," + " CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL," + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL," + " RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL," + " IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL," + " COLLOCATION_HINT VARCHAR2(100)," + " CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))" + ");" + "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);" + "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);" + "CREATE TABLE TAPE_FILE(" + " VID VARCHAR2(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL," + " FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_F_NN NOT NULL," + " BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_CN_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CT_NN NOT NULL," + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR2(100)," + " SUPERSEDED_BY_FSEQ NUMERIC(20, 0) ," + " WRITE_START_WRAP NUMERIC(5, 0)," + " WRITE_START_LPOS NUMERIC(10, 0)," + " WRITE_END_WRAP NUMERIC(5, 0)," + " WRITE_END_LPOS NUMERIC(10, 0)," + " READ_START_WRAP NUMERIC(5, 0)," + " READ_START_LPOS NUMERIC(10, 0)," + " READ_END_WRAP NUMERIC(5, 0)," + " READ_END_LPOS NUMERIC(10, 0)," + " CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE(VID, FSEQ)" + ");" + "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);" + "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);" + "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);" + "CREATE TABLE ACTIVITIES_WEIGHTS (" + " DISK_INSTANCE_NAME VARCHAR2(100)," + " ACTIVITY VARCHAR2(100)," + " WEIGHT VARCHAR2(100)," + " USER_COMMENT VARCHAR2(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR2(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL" + ");" + "CREATE TABLE USAGESTATS (" + " GID NUMERIC(10, 0) DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL," + " TIMESTAMP NUMERIC(20, 0) DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL," + " MAXFILEID NUMERIC(20, 0)," + " FILECOUNT NUMERIC(20, 0)," + " FILESIZE NUMERIC(20, 0)," + " SEGCOUNT NUMERIC(20, 0)," + " SEGSIZE NUMERIC(20, 0)," + " SEG2COUNT NUMERIC(20, 0)," + " SEG2SIZE NUMERIC(20, 0)," + " CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)" + ");" + "CREATE TABLE EXPERIMENTS (" + " NAME VARCHAR2(20)," + " GID NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY" + ");" + "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(" + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL," + " DISK_FILE_ID_WHEN_DELETED VARCHAR2(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL," + " DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL," + " DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL," + " SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL," + " CHECKSUM_BLOB RAW(200)," + " CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL," + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL," + " RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL," + " COLLOCATION_HINT VARCHAR2(100)," + " DISK_FILE_PATH VARCHAR2(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL," + " DELETION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL," + " CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)" + ");" + "CREATE TABLE TAPE_FILE_RECYCLE_BIN(" + " VID VARCHAR2(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL," + " FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL," + " BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL," + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR2(100)," + " SUPERSEDED_BY_FSEQ NUMERIC(20, 0)," + " WRITE_START_WRAP NUMERIC(5, 0)," + " WRITE_START_LPOS NUMERIC(10, 0)," + " WRITE_END_WRAP NUMERIC(5, 0)," + " WRITE_END_LPOS NUMERIC(10, 0)," + " READ_START_WRAP NUMERIC(5, 0)," + " READ_START_LPOS NUMERIC(10, 0)," + " READ_END_WRAP NUMERIC(5, 0)," + " READ_END_LPOS NUMERIC(10, 0)," + " CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)" + ");INSERT INTO CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR," + " SCHEMA_VERSION_MINOR," + " STATUS)" + "VALUES(" + " 3," + " 0," + " 'PRODUCTION');" + "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (NEXT_SCHEMA_VERSION_MAJOR IS NOT NULL AND NEXT_SCHEMA_VERSION_MINOR IS NOT NULL AND STATUS='UPGRADING')) INITIALLY DEFERRED;" + "" + "COMMIT;" + }, + {"mysql", "CREATE TABLE ARCHIVE_FILE_ID(" + " ID BIGINT UNSIGNED," + " CONSTRAINT ARCHIVE_FILE_ID_PK PRIMARY KEY(ID)" + ");" + "INSERT INTO ARCHIVE_FILE_ID(ID) VALUES(1);" + "CREATE TABLE LOGICAL_LIBRARY_ID(" + " ID BIGINT UNSIGNED," + " CONSTRAINT LOGICAL_LIBRARY_ID_PK PRIMARY KEY(ID)" + ");" + "INSERT INTO LOGICAL_LIBRARY_ID(ID) VALUES(1);" + "CREATE TABLE STORAGE_CLASS_ID(" + " ID BIGINT UNSIGNED," + " CONSTRAINT STORAGE_CLASS_ID_PK PRIMARY KEY(ID)" + ");" + "INSERT INTO STORAGE_CLASS_ID(ID) VALUES(1);" + "CREATE TABLE TAPE_POOL_ID(" + " ID BIGINT UNSIGNED," + " CONSTRAINT TAPE_POOL_ID_PK PRIMARY KEY(ID)" + ");" + "INSERT INTO TAPE_POOL_ID(ID) VALUES(1);" + "CREATE TABLE VIRTUAL_ORGANIZATION_ID(" + " ID BIGINT UNSIGNED," + " CONSTRAINT VIRTUAL_ORGANIZATION_ID_PK PRIMARY KEY(ID)" + ");" + "INSERT INTO VIRTUAL_ORGANIZATION_ID(ID) VALUES(1);" + "CREATE TABLE CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR BIGINT UNSIGNED CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL," + " SCHEMA_VERSION_MINOR BIGINT UNSIGNED CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL," + " NEXT_SCHEMA_VERSION_MAJOR BIGINT UNSIGNED," + " NEXT_SCHEMA_VERSION_MINOR BIGINT UNSIGNED," + " STATUS VARCHAR(100)" + ");" + "CREATE TABLE ADMIN_USER(" + " ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ADMIN_USER_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ADMIN_USER_LUT_NN NOT NULL," + " CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)" + ");" + "CREATE TABLE DISK_SYSTEM(" + " DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL," + " FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL," + " FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL," + " REFRESH_INTERVAL BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL," + " TARGETED_FREE_SPACE BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL," + " SLEEP_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL," + " CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)" + ");" + "CREATE TABLE VIRTUAL_ORGANIZATION(" + " VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL," + " VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL," + " CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID)," + " CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)" + ");" + "CREATE TABLE STORAGE_CLASS(" + " STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL," + " STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL," + " NB_COPIES TINYINT UNSIGNED CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, " + " USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL," + " CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID)," + " CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME)," + " CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE TAPE_POOL(" + " TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT TAPE_POOL_TPI_NN NOT NULL," + " TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID BIGINT UNSIGNED CONSTRAINT TAPE_POOL_VOI_NN NOT NULL," + " NB_PARTIAL_TAPES BIGINT UNSIGNED CONSTRAINT TAPE_POOL_NPT_NN NOT NULL," + " IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL," + " SUPPLY VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT TAPE_POOL_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT TAPE_POOL_LUT_NN NOT NULL," + " CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID)," + " CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME)," + " CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1'))," + " CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE ARCHIVE_ROUTE(" + " STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL," + " COPY_NB TINYINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL," + " TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL," + " CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB)," + " CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)" + ");" + "CREATE TABLE LOGICAL_LIBRARY(" + " LOGICAL_LIBRARY_ID BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL," + " LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL," + " IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL," + " CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME)," + " CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))" + ");" + "CREATE TABLE TAPE(" + " VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL," + " MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL," + " VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL," + " LOGICAL_LIBRARY_ID BIGINT UNSIGNED CONSTRAINT TAPE_LLI_NN NOT NULL," + " TAPE_POOL_ID BIGINT UNSIGNED CONSTRAINT TAPE_TPI_NN NOT NULL," + " ENCRYPTION_KEY_NAME VARCHAR(100)," + " CAPACITY_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_CIB_NN NOT NULL," + " DATA_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_DIB_NN NOT NULL," + " LAST_FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_LF_NN NOT NULL," + " NB_MASTER_FILES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL," + " MASTER_DATA_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL," + " IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL," + " IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL," + " IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL," + " IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL," + " IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL," + " IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL," + " DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL," + " NB_COPY_NB_1 BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL," + " COPY_NB_1_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL," + " NB_COPY_NB_GT_1 BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL," + " COPY_NB_GT_1_IN_BYTES BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL," + " LABEL_DRIVE VARCHAR(100)," + " LABEL_TIME BIGINT UNSIGNED ," + " LAST_READ_DRIVE VARCHAR(100)," + " LAST_READ_TIME BIGINT UNSIGNED ," + " LAST_WRITE_DRIVE VARCHAR(100)," + " LAST_WRITE_TIME BIGINT UNSIGNED ," + " READ_MOUNT_COUNT BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL," + " WRITE_MOUNT_COUNT BIGINT UNSIGNED DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT TAPE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT TAPE_LUT_NN NOT NULL," + " CONSTRAINT TAPE_PK PRIMARY KEY(VID)," + " CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1'))," + " CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1'))," + " CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1'))," + " CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))" + ");" + "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);" + "CREATE TABLE MOUNT_POLICY(" + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL," + " ARCHIVE_PRIORITY BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL," + " ARCHIVE_MIN_REQUEST_AGE BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL," + " RETRIEVE_PRIORITY BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL," + " RETRIEVE_MIN_REQUEST_AGE BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL," + " MAX_DRIVES_ALLOWED BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL," + " CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL," + " REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME)," + " CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL," + " REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME)," + " CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE ARCHIVE_FILE(" + " ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL," + " DISK_FILE_UID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL," + " DISK_FILE_GID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL," + " SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL," + " CHECKSUM_BLOB VARBINARY(200)," + " CHECKSUM_ADLER32 INT UNSIGNED CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL," + " STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL," + " CREATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL," + " RECONCILIATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL," + " IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))" + ");" + "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);" + "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);" + "CREATE TABLE TAPE_FILE(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL," + " FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_FILE_F_NN NOT NULL," + " BLOCK_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL," + " COPY_NB TINYINT UNSIGNED CONSTRAINT TAPE_FILE_CN_NN NOT NULL," + " CREATION_TIME BIGINT UNSIGNED CONSTRAINT TAPE_FILE_CT_NN NOT NULL," + " ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ BIGINT UNSIGNED ," + " WRITE_START_WRAP SMALLINT UNSIGNED," + " WRITE_START_LPOS INT UNSIGNED," + " WRITE_END_WRAP SMALLINT UNSIGNED," + " WRITE_END_LPOS INT UNSIGNED," + " READ_START_WRAP SMALLINT UNSIGNED," + " READ_START_LPOS INT UNSIGNED," + " READ_END_WRAP SMALLINT UNSIGNED," + " READ_END_LPOS INT UNSIGNED," + " CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE(VID, FSEQ)" + ");" + "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);" + "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);" + "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);" + "CREATE TABLE ACTIVITIES_WEIGHTS (" + " DISK_INSTANCE_NAME VARCHAR(100)," + " ACTIVITY VARCHAR(100)," + " WEIGHT VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME BIGINT UNSIGNED CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME BIGINT UNSIGNED CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL" + ");" + "CREATE TABLE USAGESTATS (" + " GID INT UNSIGNED DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL," + " TIMESTAMP BIGINT UNSIGNED DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL," + " MAXFILEID BIGINT UNSIGNED," + " FILECOUNT BIGINT UNSIGNED," + " FILESIZE BIGINT UNSIGNED," + " SEGCOUNT BIGINT UNSIGNED," + " SEGSIZE BIGINT UNSIGNED," + " SEG2COUNT BIGINT UNSIGNED," + " SEG2SIZE BIGINT UNSIGNED," + " CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)" + ");" + "CREATE TABLE EXPERIMENTS (" + " NAME VARCHAR(20)," + " GID INT UNSIGNED CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY" + ");" + "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(" + " ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL," + " DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL," + " DISK_FILE_UID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL," + " DISK_FILE_GID INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL," + " SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL," + " CHECKSUM_BLOB VARBINARY(200)," + " CHECKSUM_ADLER32 INT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL," + " STORAGE_CLASS_ID BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL," + " CREATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL," + " RECONCILIATION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL," + " DELETION_TIME BIGINT UNSIGNED CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL," + " CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)" + ");" + "CREATE TABLE TAPE_FILE_RECYCLE_BIN(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL," + " FSEQ BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL," + " BLOCK_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL," + " COPY_NB TINYINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL," + " CREATION_TIME BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL," + " ARCHIVE_FILE_ID BIGINT UNSIGNED CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ BIGINT UNSIGNED," + " WRITE_START_WRAP SMALLINT UNSIGNED," + " WRITE_START_LPOS INT UNSIGNED," + " WRITE_END_WRAP SMALLINT UNSIGNED," + " WRITE_END_LPOS INT UNSIGNED," + " READ_START_WRAP SMALLINT UNSIGNED," + " READ_START_LPOS INT UNSIGNED," + " READ_END_WRAP SMALLINT UNSIGNED," + " READ_END_LPOS INT UNSIGNED," + " CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)" + ");INSERT INTO CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR," + " SCHEMA_VERSION_MINOR," + " STATUS)" + "VALUES(" + " 3," + " 0," + " 'PRODUCTION');" + "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT " + " CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));" + }, + {"sqlite", "CREATE TABLE ARCHIVE_FILE_ID(" + " ID INTEGER PRIMARY KEY AUTOINCREMENT" + ");" + "CREATE TABLE LOGICAL_LIBRARY_ID(" + " ID INTEGER PRIMARY KEY AUTOINCREMENT" + ");" + "CREATE TABLE STORAGE_CLASS_ID(" + " ID INTEGER PRIMARY KEY AUTOINCREMENT" + ");" + "CREATE TABLE TAPE_POOL_ID(" + " ID INTEGER PRIMARY KEY AUTOINCREMENT" + ");" + "CREATE TABLE VIRTUAL_ORGANIZATION_ID(" + " ID INTEGER PRIMARY KEY AUTOINCREMENT" + ");" + "CREATE TABLE CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR INTEGER CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL," + " SCHEMA_VERSION_MINOR INTEGER CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL," + " NEXT_SCHEMA_VERSION_MAJOR INTEGER," + " NEXT_SCHEMA_VERSION_MINOR INTEGER," + " STATUS VARCHAR(100)" + ");" + "CREATE TABLE ADMIN_USER(" + " ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT ADMIN_USER_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT ADMIN_USER_LUT_NN NOT NULL," + " CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)" + ");" + "CREATE TABLE DISK_SYSTEM(" + " DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL," + " FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL," + " FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL," + " REFRESH_INTERVAL INTEGER CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL," + " TARGETED_FREE_SPACE INTEGER CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL," + " SLEEP_TIME INTEGER CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL," + " CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)" + ");" + "CREATE TABLE VIRTUAL_ORGANIZATION(" + " VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL," + " VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL," + " CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID)," + " CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)" + ");" + "CREATE TABLE STORAGE_CLASS(" + " STORAGE_CLASS_ID INTEGER CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL," + " STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL," + " NB_COPIES INTEGER CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, " + " USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL," + " CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID)," + " CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME)," + " CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE TAPE_POOL(" + " TAPE_POOL_ID INTEGER CONSTRAINT TAPE_POOL_TPI_NN NOT NULL," + " TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID INTEGER CONSTRAINT TAPE_POOL_VOI_NN NOT NULL," + " NB_PARTIAL_TAPES INTEGER CONSTRAINT TAPE_POOL_NPT_NN NOT NULL," + " IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL," + " SUPPLY VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT TAPE_POOL_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT TAPE_POOL_LUT_NN NOT NULL," + " CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID)," + " CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME)," + " CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1'))," + " CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE ARCHIVE_ROUTE(" + " STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL," + " COPY_NB INTEGER CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL," + " TAPE_POOL_ID INTEGER CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL," + " CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB)," + " CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)" + ");" + "CREATE TABLE LOGICAL_LIBRARY(" + " LOGICAL_LIBRARY_ID INTEGER CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL," + " LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL," + " IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL," + " CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME)," + " CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))" + ");" + "CREATE TABLE TAPE(" + " VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL," + " MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL," + " VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL," + " LOGICAL_LIBRARY_ID INTEGER CONSTRAINT TAPE_LLI_NN NOT NULL," + " TAPE_POOL_ID INTEGER CONSTRAINT TAPE_TPI_NN NOT NULL," + " ENCRYPTION_KEY_NAME VARCHAR(100)," + " CAPACITY_IN_BYTES INTEGER CONSTRAINT TAPE_CIB_NN NOT NULL," + " DATA_IN_BYTES INTEGER CONSTRAINT TAPE_DIB_NN NOT NULL," + " LAST_FSEQ INTEGER CONSTRAINT TAPE_LF_NN NOT NULL," + " NB_MASTER_FILES INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL," + " MASTER_DATA_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL," + " IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL," + " IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL," + " IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL," + " IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL," + " IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL," + " IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL," + " DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL," + " NB_COPY_NB_1 INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL," + " COPY_NB_1_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL," + " NB_COPY_NB_GT_1 INTEGER DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL," + " COPY_NB_GT_1_IN_BYTES INTEGER DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL," + " LABEL_DRIVE VARCHAR(100)," + " LABEL_TIME INTEGER ," + " LAST_READ_DRIVE VARCHAR(100)," + " LAST_READ_TIME INTEGER ," + " LAST_WRITE_DRIVE VARCHAR(100)," + " LAST_WRITE_TIME INTEGER ," + " READ_MOUNT_COUNT INTEGER DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL," + " WRITE_MOUNT_COUNT INTEGER DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT TAPE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT TAPE_LUT_NN NOT NULL," + " CONSTRAINT TAPE_PK PRIMARY KEY(VID)," + " CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1'))," + " CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1'))," + " CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1'))," + " CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))" + ");" + "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);" + "CREATE TABLE MOUNT_POLICY(" + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL," + " ARCHIVE_PRIORITY INTEGER CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL," + " ARCHIVE_MIN_REQUEST_AGE INTEGER CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL," + " RETRIEVE_PRIORITY INTEGER CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL," + " RETRIEVE_MIN_REQUEST_AGE INTEGER CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL," + " MAX_DRIVES_ALLOWED INTEGER CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL," + " CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL," + " REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME)," + " CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL," + " REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME)," + " CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE ARCHIVE_FILE(" + " ARCHIVE_FILE_ID INTEGER CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL," + " DISK_FILE_UID INTEGER CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL," + " DISK_FILE_GID INTEGER CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL," + " SIZE_IN_BYTES INTEGER CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL," + " CHECKSUM_BLOB BLOB(200)," + " CHECKSUM_ADLER32 INTEGER CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL," + " STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL," + " CREATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL," + " RECONCILIATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL," + " IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))" + ");" + "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);" + "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);" + "CREATE TABLE TAPE_FILE(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL," + " FSEQ INTEGER CONSTRAINT TAPE_FILE_F_NN NOT NULL," + " BLOCK_ID INTEGER CONSTRAINT TAPE_FILE_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES INTEGER CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL," + " COPY_NB INTEGER CONSTRAINT TAPE_FILE_CN_NN NOT NULL," + " CREATION_TIME INTEGER CONSTRAINT TAPE_FILE_CT_NN NOT NULL," + " ARCHIVE_FILE_ID INTEGER CONSTRAINT TAPE_FILE_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ INTEGER ," + " WRITE_START_WRAP INTEGER," + " WRITE_START_LPOS INTEGER," + " WRITE_END_WRAP INTEGER," + " WRITE_END_LPOS INTEGER," + " READ_START_WRAP INTEGER," + " READ_START_LPOS INTEGER," + " READ_END_WRAP INTEGER," + " READ_END_LPOS INTEGER," + " CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE(VID, FSEQ)" + ");" + "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);" + "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);" + "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);" + "CREATE TABLE ACTIVITIES_WEIGHTS (" + " DISK_INSTANCE_NAME VARCHAR(100)," + " ACTIVITY VARCHAR(100)," + " WEIGHT VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME INTEGER CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME INTEGER CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL" + ");" + "CREATE TABLE USAGESTATS (" + " GID INTEGER DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL," + " TIMESTAMP INTEGER DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL," + " MAXFILEID INTEGER," + " FILECOUNT INTEGER," + " FILESIZE INTEGER," + " SEGCOUNT INTEGER," + " SEGSIZE INTEGER," + " SEG2COUNT INTEGER," + " SEG2SIZE INTEGER," + " CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)" + ");" + "CREATE TABLE EXPERIMENTS (" + " NAME VARCHAR(20)," + " GID INTEGER CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY" + ");" + "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(" + " ARCHIVE_FILE_ID INTEGER CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL," + " DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL," + " DISK_FILE_UID INTEGER CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL," + " DISK_FILE_GID INTEGER CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL," + " SIZE_IN_BYTES INTEGER CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL," + " CHECKSUM_BLOB BLOB(200)," + " CHECKSUM_ADLER32 INTEGER CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL," + " STORAGE_CLASS_ID INTEGER CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL," + " CREATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL," + " RECONCILIATION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL," + " DELETION_TIME INTEGER CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL," + " CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)" + ");" + "CREATE TABLE TAPE_FILE_RECYCLE_BIN(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL," + " FSEQ INTEGER CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL," + " BLOCK_ID INTEGER CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES INTEGER CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL," + " COPY_NB INTEGER CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL," + " CREATION_TIME INTEGER CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL," + " ARCHIVE_FILE_ID INTEGER CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ INTEGER," + " WRITE_START_WRAP INTEGER," + " WRITE_START_LPOS INTEGER," + " WRITE_END_WRAP INTEGER," + " WRITE_END_LPOS INTEGER," + " READ_START_WRAP INTEGER," + " READ_START_LPOS INTEGER," + " READ_END_WRAP INTEGER," + " READ_END_LPOS INTEGER," + " CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)" + ");INSERT INTO CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR," + " SCHEMA_VERSION_MINOR," + " STATUS)" + "VALUES(" + " 3," + " 0," + " 'PRODUCTION');" + }, + {"postgres", "CREATE SEQUENCE ARCHIVE_FILE_ID_SEQ" + " INCREMENT BY 1" + " START WITH 1" + " NO MAXVALUE" + " MINVALUE 1" + " NO CYCLE" + " CACHE 20;" + "CREATE SEQUENCE LOGICAL_LIBRARY_ID_SEQ" + " INCREMENT BY 1" + " START WITH 1" + " NO MAXVALUE" + " MINVALUE 1" + " NO CYCLE" + " CACHE 20;" + "CREATE SEQUENCE STORAGE_CLASS_ID_SEQ" + " INCREMENT BY 1" + " START WITH 1" + " NO MAXVALUE" + " MINVALUE 1" + " NO CYCLE" + " CACHE 20;" + "CREATE SEQUENCE TAPE_POOL_ID_SEQ" + " INCREMENT BY 1" + " START WITH 1" + " NO MAXVALUE" + " MINVALUE 1" + " NO CYCLE" + " CACHE 20;" + "CREATE SEQUENCE VIRTUAL_ORGANIZATION_ID_SEQ" + " INCREMENT BY 1" + " START WITH 1" + " NO MAXVALUE" + " MINVALUE 1" + " NO CYCLE" + " CACHE 20;" + "CREATE TABLE CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM1_NN NOT NULL," + " SCHEMA_VERSION_MINOR NUMERIC(20, 0) CONSTRAINT CTA_CATALOGUE_SVM2_NN NOT NULL," + " NEXT_SCHEMA_VERSION_MAJOR NUMERIC(20, 0)," + " NEXT_SCHEMA_VERSION_MINOR NUMERIC(20, 0)," + " STATUS VARCHAR(100)" + ");" + "CREATE TABLE ADMIN_USER(" + " ADMIN_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_AUN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ADMIN_USER_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ADMIN_USER_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ADMIN_USER_LUT_NN NOT NULL," + " CONSTRAINT ADMIN_USER_PK PRIMARY KEY(ADMIN_USER_NAME)" + ");" + "CREATE TABLE DISK_SYSTEM(" + " DISK_SYSTEM_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_DSNM_NN NOT NULL," + " FILE_REGEXP VARCHAR(100) CONSTRAINT DISK_SYSTEM_FR_NN NOT NULL," + " FREE_SPACE_QUERY_URL VARCHAR(1000) CONSTRAINT DISK_SYSTEM_FSQU_NN NOT NULL," + " REFRESH_INTERVAL NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_RI_NN NOT NULL," + " TARGETED_FREE_SPACE NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_TFS_NN NOT NULL," + " SLEEP_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_ST_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT DISK_SYSTEM_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT DISK_SYSTEM_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT DISK_SYSTEM_LUT_NN NOT NULL," + " CONSTRAINT NAME_PK PRIMARY KEY(DISK_SYSTEM_NAME)" + ");" + "CREATE TABLE VIRTUAL_ORGANIZATION(" + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_VOI_NN NOT NULL," + " VIRTUAL_ORGANIZATION_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_VON_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT VIRTUAL_ORGANIZATION_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT VIRTUAL_ORGANIZATION_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT VIRTUAL_ORGANIZATION_LUT_NN NOT NULL," + " CONSTRAINT VIRTUAL_ORGANIZATION_PK PRIMARY KEY(VIRTUAL_ORGANIZATION_ID)," + " CONSTRAINT VIRTUAL_ORGANIZATION_VON_UN UNIQUE(VIRTUAL_ORGANIZATION_NAME)" + ");" + "CREATE TABLE STORAGE_CLASS(" + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_SCI_NN NOT NULL," + " STORAGE_CLASS_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_SCN_NN NOT NULL," + " NB_COPIES NUMERIC(3, 0) CONSTRAINT STORAGE_CLASS_NC_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_VOI_NN NOT NULL, " + " USER_COMMENT VARCHAR(1000) CONSTRAINT STORAGE_CLASS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT STORAGE_CLASS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT STORAGE_CLASS_LUT_NN NOT NULL," + " CONSTRAINT STORAGE_CLASS_PK PRIMARY KEY(STORAGE_CLASS_ID)," + " CONSTRAINT STORAGE_CLASS_SCN_UN UNIQUE(STORAGE_CLASS_NAME)," + " CONSTRAINT STORAGE_CLASS_VOI_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE TAPE_POOL(" + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_TPI_NN NOT NULL," + " TAPE_POOL_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_TPN_NN NOT NULL," + " VIRTUAL_ORGANIZATION_ID NUMERIC(20, 0) CONSTRAINT TAPE_POOL_VOI_NN NOT NULL," + " NB_PARTIAL_TAPES NUMERIC(20, 0) CONSTRAINT TAPE_POOL_NPT_NN NOT NULL," + " IS_ENCRYPTED CHAR(1) CONSTRAINT TAPE_POOL_IE_NN NOT NULL," + " SUPPLY VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_POOL_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_POOL_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_POOL_LUT_NN NOT NULL," + " CONSTRAINT TAPE_POOL_PK PRIMARY KEY(TAPE_POOL_ID)," + " CONSTRAINT TAPE_POOL_TPN_UN UNIQUE(TAPE_POOL_NAME)," + " CONSTRAINT TAPE_POOL_IS_ENCRYPTED_BOOL_CK CHECK(IS_ENCRYPTED IN ('0', '1'))," + " CONSTRAINT TAPE_POOL_VO_FK FOREIGN KEY(VIRTUAL_ORGANIZATION_ID) REFERENCES VIRTUAL_ORGANIZATION(VIRTUAL_ORGANIZATION_ID)" + ");" + "CREATE TABLE ARCHIVE_ROUTE(" + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_SCI_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT ARCHIVE_ROUTE_CN_NN NOT NULL," + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_TPI_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ARCHIVE_ROUTE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ARCHIVE_ROUTE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_ROUTE_LUT_NN NOT NULL," + " CONSTRAINT ARCHIVE_ROUTE_PK PRIMARY KEY(STORAGE_CLASS_ID, COPY_NB)," + " CONSTRAINT ARCHIVE_ROUTE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_ROUTE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT ARCHIVE_ROUTE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT ARCHIVE_ROUTE_SCI_TPI_UN UNIQUE(STORAGE_CLASS_ID, TAPE_POOL_ID)" + ");" + "CREATE TABLE LOGICAL_LIBRARY(" + " LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LLI_NN NOT NULL," + " LOGICAL_LIBRARY_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LLN_NN NOT NULL," + " IS_DISABLED CHAR(1) DEFAULT '0' CONSTRAINT LOGICAL_LIBRARY_ID_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT LOGICAL_LIBRARY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT LOGICAL_LIBRARY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT LOGICAL_LIBRARY_LUT_NN NOT NULL," + " CONSTRAINT LOGICAL_LIBRARY_PK PRIMARY KEY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT LOGICAL_LIBRARY_LLN_UN UNIQUE(LOGICAL_LIBRARY_NAME)," + " CONSTRAINT LOGICAL_LIBRARY_ID_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))" + ");" + "CREATE TABLE TAPE(" + " VID VARCHAR(100) CONSTRAINT TAPE_V_NN NOT NULL," + " MEDIA_TYPE VARCHAR(100) CONSTRAINT TAPE_MT_NN NOT NULL," + " VENDOR VARCHAR(100) CONSTRAINT TAPE_V2_NN NOT NULL," + " LOGICAL_LIBRARY_ID NUMERIC(20, 0) CONSTRAINT TAPE_LLI_NN NOT NULL," + " TAPE_POOL_ID NUMERIC(20, 0) CONSTRAINT TAPE_TPI_NN NOT NULL," + " ENCRYPTION_KEY_NAME VARCHAR(100)," + " CAPACITY_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_CIB_NN NOT NULL," + " DATA_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_DIB_NN NOT NULL," + " LAST_FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_LF_NN NOT NULL," + " NB_MASTER_FILES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_MASTER_FILES_NN NOT NULL," + " MASTER_DATA_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_MASTER_DATA_IN_BYTES_NN NOT NULL," + " IS_DISABLED CHAR(1) CONSTRAINT TAPE_ID_NN NOT NULL," + " IS_FULL CHAR(1) CONSTRAINT TAPE_IF_NN NOT NULL," + " IS_READ_ONLY CHAR(1) CONSTRAINT TAPE_IRO_NN NOT NULL," + " IS_FROM_CASTOR CHAR(1) CONSTRAINT TAPE_IFC_NN NOT NULL," + " IS_ARCHIVED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IA_NN NOT NULL," + " IS_EXPORTED CHAR(1) DEFAULT '0' CONSTRAINT TAPE_IE_NN NOT NULL," + " DIRTY CHAR(1) DEFAULT '1' CONSTRAINT TAPE_DIRTY_NN NOT NULL," + " NB_COPY_NB_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_1_NN NOT NULL," + " COPY_NB_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_1_IN_BYTES_NN NOT NULL," + " NB_COPY_NB_GT_1 NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_NB_COPY_NB_GT_1_NN NOT NULL," + " COPY_NB_GT_1_IN_BYTES NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_COPY_NB_GT_1_IN_BYTES_NN NOT NULL," + " LABEL_DRIVE VARCHAR(100)," + " LABEL_TIME NUMERIC(20, 0) ," + " LAST_READ_DRIVE VARCHAR(100)," + " LAST_READ_TIME NUMERIC(20, 0) ," + " LAST_WRITE_DRIVE VARCHAR(100)," + " LAST_WRITE_TIME NUMERIC(20, 0) ," + " READ_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_RMC_NN NOT NULL," + " WRITE_MOUNT_COUNT NUMERIC(20, 0) DEFAULT 0 CONSTRAINT TAPE_WMC_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT TAPE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT TAPE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT TAPE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT TAPE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT TAPE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT TAPE_LUT_NN NOT NULL," + " CONSTRAINT TAPE_PK PRIMARY KEY(VID)," + " CONSTRAINT TAPE_LOGICAL_LIBRARY_FK FOREIGN KEY(LOGICAL_LIBRARY_ID) REFERENCES LOGICAL_LIBRARY(LOGICAL_LIBRARY_ID)," + " CONSTRAINT TAPE_TAPE_POOL_FK FOREIGN KEY(TAPE_POOL_ID) REFERENCES TAPE_POOL(TAPE_POOL_ID)," + " CONSTRAINT TAPE_IS_DISABLED_BOOL_CK CHECK(IS_DISABLED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FULL_BOOL_CK CHECK(IS_FULL IN ('0', '1'))," + " CONSTRAINT TAPE_IS_READ_ONLY_BOOL_CK CHECK(IS_READ_ONLY IN ('0', '1'))," + " CONSTRAINT TAPE_IS_FROM_CASTOR_BOOL_CK CHECK(IS_FROM_CASTOR IN ('0', '1'))," + " CONSTRAINT TAPE_IS_ARCHVIED_BOOL_CK CHECK(IS_ARCHIVED IN ('0', '1'))," + " CONSTRAINT TAPE_IS_EXPORTED_BOOL_CK CHECK(IS_EXPORTED IN ('0', '1'))," + " CONSTRAINT TAPE_DIRTY_BOOL_CK CHECK(DIRTY IN ('0','1'))" + ");" + "CREATE INDEX TAPE_TAPE_POOL_ID_IDX ON TAPE(TAPE_POOL_ID);" + "CREATE TABLE MOUNT_POLICY(" + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_MPN_NN NOT NULL," + " ARCHIVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AP_NN NOT NULL," + " ARCHIVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_AMRA_NN NOT NULL," + " RETRIEVE_PRIORITY NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RP_NN NOT NULL," + " RETRIEVE_MIN_REQUEST_AGE NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_RMRA_NN NOT NULL," + " MAX_DRIVES_ALLOWED NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_MDA_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT MOUNT_POLICY_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT MOUNT_POLICY_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT MOUNT_POLICY_LUT_NN NOT NULL," + " CONSTRAINT MOUNT_POLICY_PK PRIMARY KEY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_DIN_NN NOT NULL," + " REQUESTER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_RN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_NAME)," + " CONSTRAINT RQSTER_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE REQUESTER_GROUP_MOUNT_RULE(" + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_DIN_NN NOT NULL," + " REQUESTER_GROUP_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_RGN_NN NOT NULL," + " MOUNT_POLICY_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_MPN_NN NOT NULL," + " USER_COMMENT VARCHAR(1000) CONSTRAINT RQSTER_GRP_RULE_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT RQSTER_GRP_RULE_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT RQSTER_GRP_RULE_LUT_NN NOT NULL," + " CONSTRAINT RQSTER_GRP_RULE_PK PRIMARY KEY(DISK_INSTANCE_NAME, REQUESTER_GROUP_NAME)," + " CONSTRAINT RQSTER_GRP_RULE_MNT_PLC_FK FOREIGN KEY(MOUNT_POLICY_NAME)" + " REFERENCES MOUNT_POLICY(MOUNT_POLICY_NAME)" + ");" + "CREATE TABLE ARCHIVE_FILE(" + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_DFI_NN NOT NULL," + " DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFUID_NN NOT NULL," + " DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_DFGID_NN NOT NULL," + " SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SIB_NN NOT NULL," + " CHECKSUM_BLOB BYTEA," + " CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_CB2_NN NOT NULL," + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_SCI_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_CT2_NN NOT NULL," + " RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RT_NN NOT NULL," + " IS_DELETED CHAR(1) DEFAULT '0' CONSTRAINT ARCHIVE_FILE_ID_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " CONSTRAINT ARCHIVE_FILE_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_STORAGE_CLASS_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_ID_BOOL_CK CHECK(IS_DELETED IN ('0', '1'))" + ");" + "CREATE INDEX ARCHIVE_FILE_DIN_IDX ON ARCHIVE_FILE(DISK_INSTANCE_NAME);" + "CREATE INDEX ARCHIVE_FILE_DFI_IDX ON ARCHIVE_FILE(DISK_FILE_ID);" + "CREATE TABLE TAPE_FILE(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_V_NN NOT NULL," + " FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_F_NN NOT NULL," + " BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CSIB_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_CN_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_CT_NN NOT NULL," + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ NUMERIC(20, 0) ," + " WRITE_START_WRAP NUMERIC(5, 0)," + " WRITE_START_LPOS NUMERIC(10, 0)," + " WRITE_END_WRAP NUMERIC(5, 0)," + " WRITE_END_LPOS NUMERIC(10, 0)," + " READ_START_WRAP NUMERIC(5, 0)," + " READ_START_LPOS NUMERIC(10, 0)," + " READ_END_WRAP NUMERIC(5, 0)," + " READ_END_LPOS NUMERIC(10, 0)," + " CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE(VID, FSEQ)" + ");" + "CREATE INDEX TAPE_FILE_VID_IDX ON TAPE_FILE(VID);" + "CREATE INDEX TAPE_FILE_ARCHIVE_FILE_ID_IDX ON TAPE_FILE(ARCHIVE_FILE_ID);" + "CREATE INDEX TAPE_FILE_SBV_SBF_IDX ON TAPE_FILE(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ);" + "CREATE TABLE ACTIVITIES_WEIGHTS (" + " DISK_INSTANCE_NAME VARCHAR(100)," + " ACTIVITY VARCHAR(100)," + " WEIGHT VARCHAR(100)," + " USER_COMMENT VARCHAR(1000) CONSTRAINT ACTIV_WEIGHTS_UC_NN NOT NULL," + " CREATION_LOG_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLUN_NN NOT NULL," + " CREATION_LOG_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_CLHN_NN NOT NULL," + " CREATION_LOG_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_CLT_NN NOT NULL," + " LAST_UPDATE_USER_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUUN_NN NOT NULL," + " LAST_UPDATE_HOST_NAME VARCHAR(100) CONSTRAINT ACTIV_WEIGHTS_LUHN_NN NOT NULL," + " LAST_UPDATE_TIME NUMERIC(20, 0) CONSTRAINT ACTIV_WEIGHTS_LUT_NN NOT NULL" + ");" + "CREATE TABLE USAGESTATS (" + " GID NUMERIC(10, 0) DEFAULT 0 CONSTRAINT USAGESTATS_GID_NN NOT NULL," + " TIMESTAMP NUMERIC(20, 0) DEFAULT 0 CONSTRAINT USAGESTATS_TS_NN NOT NULL," + " MAXFILEID NUMERIC(20, 0)," + " FILECOUNT NUMERIC(20, 0)," + " FILESIZE NUMERIC(20, 0)," + " SEGCOUNT NUMERIC(20, 0)," + " SEGSIZE NUMERIC(20, 0)," + " SEG2COUNT NUMERIC(20, 0)," + " SEG2SIZE NUMERIC(20, 0)," + " CONSTRAINT USAGESTATS_GID_TS_PK PRIMARY KEY (GID, TIMESTAMP)" + ");" + "CREATE TABLE EXPERIMENTS (" + " NAME VARCHAR(20)," + " GID NUMERIC(10, 0) CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY" + ");" + "CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN(" + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL," + " DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL," + " DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL," + " DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL," + " DISK_FILE_UID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL," + " DISK_FILE_GID NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL," + " SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL," + " CHECKSUM_BLOB BYTEA," + " CHECKSUM_ADLER32 NUMERIC(10, 0) CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL," + " STORAGE_CLASS_ID NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL," + " RECONCILIATION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL," + " COLLOCATION_HINT VARCHAR(100)," + " DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL," + " DELETION_TIME NUMERIC(20, 0) CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL," + " CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID)," + " CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID)" + ");" + "CREATE TABLE TAPE_FILE_RECYCLE_BIN(" + " VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL," + " FSEQ NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL," + " BLOCK_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL," + " LOGICAL_SIZE_IN_BYTES NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL," + " COPY_NB NUMERIC(3, 0) CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL," + " CREATION_TIME NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL," + " ARCHIVE_FILE_ID NUMERIC(20, 0) CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL," + " SUPERSEDED_BY_VID VARCHAR(100)," + " SUPERSEDED_BY_FSEQ NUMERIC(20, 0)," + " WRITE_START_WRAP NUMERIC(5, 0)," + " WRITE_START_LPOS NUMERIC(10, 0)," + " WRITE_END_WRAP NUMERIC(5, 0)," + " WRITE_END_LPOS NUMERIC(10, 0)," + " READ_START_WRAP NUMERIC(5, 0)," + " READ_START_LPOS NUMERIC(10, 0)," + " READ_END_WRAP NUMERIC(5, 0)," + " READ_END_LPOS NUMERIC(10, 0)," + " CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ)," + " CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID)" + " REFERENCES TAPE(VID)," + " CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID)" + " REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID)," + " CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID)," + " CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0)," + " CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ)" + " REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ)" + ");INSERT INTO CTA_CATALOGUE(" + " SCHEMA_VERSION_MAJOR," + " SCHEMA_VERSION_MINOR," + " STATUS)" + "VALUES(" + " 3," + " 0," + " 'PRODUCTION');" + "ALTER TABLE ARCHIVE_FILE DROP CONSTRAINT" + " ARCHIVE_FILE_DIN_DFI_UN;" + "ALTER TABLE ARCHIVE_FILE ADD CONSTRAINT" + " ARCHIVE_FILE_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) DEFERRABLE INITIALLY IMMEDIATE;" + "ALTER TABLE CTA_CATALOGUE ADD CONSTRAINT " + " CATALOGUE_STATUS_CONTENT_CK CHECK((NEXT_SCHEMA_VERSION_MAJOR IS NULL AND NEXT_SCHEMA_VERSION_MINOR IS NULL AND STATUS='PRODUCTION') OR (STATUS='UPGRADING'));" + }, + } }, }; }} diff --git a/catalogue/ArchiveFileBuilder.cpp b/catalogue/ArchiveFileBuilder.cpp index f82727e3402f2e246c33e5849da7ecb3e1d099ae..b81ea83ff3f29fe9e7ab4ef57eb34324c6507b55 100644 --- a/catalogue/ArchiveFileBuilder.cpp +++ b/catalogue/ArchiveFileBuilder.cpp @@ -24,95 +24,7 @@ namespace cta { namespace catalogue { -//------------------------------------------------------------------------------ -// constructor -//------------------------------------------------------------------------------ -ArchiveFileBuilder::ArchiveFileBuilder(log::Logger &log): - m_log(log) { -} -//------------------------------------------------------------------------------ -// append -//------------------------------------------------------------------------------ -std::unique_ptr<common::dataStructures::ArchiveFile> ArchiveFileBuilder::append( - const common::dataStructures::ArchiveFile &tapeFile) { - - // If there is currently no ArchiveFile object under construction - if(nullptr == m_archiveFile.get()) { - // If the tape file represents an ArchiveFile object with no tape files - if(tapeFile.tapeFiles.empty()) { - // Archive file is already complete - return std::unique_ptr<common::dataStructures::ArchiveFile>(new common::dataStructures::ArchiveFile(tapeFile)); - } - - // If the tape file exists then it must be alone - if(tapeFile.tapeFiles.size() != 1) { - exception::Exception ex; - ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" << - tapeFile.tapeFiles.size(); - throw ex; - } - - // Start constructing one - m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile)); - - // There could be more tape files so return incomplete - return std::unique_ptr<common::dataStructures::ArchiveFile>(); - } - - // If the tape file represents an ArchiveFile object with no tape files - if(tapeFile.tapeFiles.empty()) { - // The ArchiveFile object under construction is complete, - // therefore return it and start the construction of the next - std::unique_ptr<common::dataStructures::ArchiveFile> tmp; - tmp = std::move(m_archiveFile); - m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile)); - return tmp; - } - - // If the tape file to be appended belongs to the ArchiveFile object - // currently under construction - if(tapeFile.archiveFileID == m_archiveFile->archiveFileID) { - - // The tape file must exist and must be alone - if(tapeFile.tapeFiles.size() != 1) { - exception::Exception ex; - ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" << - tapeFile.tapeFiles.size() << " archiveFileID=" << tapeFile.archiveFileID; - throw ex; - } - - // Append the tape file - m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front()); - - // There could be more tape files so return incomplete - return std::unique_ptr<common::dataStructures::ArchiveFile>(); - } - - // Reaching this point means the tape file to be appended belongs to the next - // ArchiveFile to be constructed. - - // ArchiveFile object under construction is complete, - // therefore return it and start the construction of the next - std::unique_ptr<common::dataStructures::ArchiveFile> tmp; - tmp = std::move(m_archiveFile); - m_archiveFile.reset(new common::dataStructures::ArchiveFile(tapeFile)); - return tmp; -} - -//------------------------------------------------------------------------------ -// getArchiveFile -//------------------------------------------------------------------------------ -common::dataStructures::ArchiveFile *ArchiveFileBuilder::getArchiveFile() { - return m_archiveFile.get(); -} - -//------------------------------------------------------------------------------ -// clear -//------------------------------------------------------------------------------ -void ArchiveFileBuilder::clear() { - m_archiveFile.reset(); -} } // namespace catalogue } // namespace cta diff --git a/catalogue/ArchiveFileBuilder.hpp b/catalogue/ArchiveFileBuilder.hpp index f05f1b191fef028fd8eec3fe5ce5b672b2f28d50..782417192247693be9aadf760c367650653d995b 100644 --- a/catalogue/ArchiveFileBuilder.hpp +++ b/catalogue/ArchiveFileBuilder.hpp @@ -29,7 +29,9 @@ namespace catalogue { /** * Builds ArchiveFile objects from a stream of tape files ordered by archive ID * and then copy number. + * The template T is an ArchiveFile or a DeletedArchiveFile */ +template<typename T> class ArchiveFileBuilder { public: @@ -65,7 +67,7 @@ public: * @param tapeFile The tape file to be appended or an archive file with no * tape files at all. */ - std::unique_ptr<common::dataStructures::ArchiveFile> append(const common::dataStructures::ArchiveFile &tapeFile); + std::unique_ptr<T> append(const T &tapeFile); /** * Returns a pointer to the ArchiveFile object currently under construction. @@ -75,7 +77,7 @@ public: * @return The ArchiveFile object currently under construction or nullptr * if there isn't one. */ - common::dataStructures::ArchiveFile *getArchiveFile(); + T *getArchiveFile(); /** * If there is an ArchiveFile under construction then it is forgotten. @@ -92,9 +94,104 @@ private: /** * The Archivefile object currently under construction. */ - std::unique_ptr<common::dataStructures::ArchiveFile> m_archiveFile; + std::unique_ptr<T> m_archiveFile; }; // class ArchiveFileBuilder +//------------------------------------------------------------------------------ +// constructor +//------------------------------------------------------------------------------ +template<typename T> +ArchiveFileBuilder<T>::ArchiveFileBuilder(log::Logger &log): + m_log(log) { +} + +//------------------------------------------------------------------------------ +// append +//------------------------------------------------------------------------------ +template<typename T> +std::unique_ptr<T> ArchiveFileBuilder<T>::append( + const T &tapeFile) { + + // If there is currently no ArchiveFile object under construction + if(nullptr == m_archiveFile.get()) { + // If the tape file represents an ArchiveFile object with no tape files + if(tapeFile.tapeFiles.empty()) { + // Archive file is already complete + return std::unique_ptr<T>(new T(tapeFile)); + } + + // If the tape file exists then it must be alone + if(tapeFile.tapeFiles.size() != 1) { + exception::Exception ex; + ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" << + tapeFile.tapeFiles.size(); + throw ex; + } + + // Start constructing one + m_archiveFile.reset(new T(tapeFile)); + + // There could be more tape files so return incomplete + return std::unique_ptr<T>(); + } + + // If the tape file represents an ArchiveFile object with no tape files + if(tapeFile.tapeFiles.empty()) { + // The ArchiveFile object under construction is complete, + // therefore return it and start the construction of the next + std::unique_ptr<T> tmp; + tmp = std::move(m_archiveFile); + m_archiveFile.reset(new T(tapeFile)); + return tmp; + } + + // If the tape file to be appended belongs to the ArchiveFile object + // currently under construction + if(tapeFile.archiveFileID == m_archiveFile->archiveFileID) { + + // The tape file must exist and must be alone + if(tapeFile.tapeFiles.size() != 1) { + exception::Exception ex; + ex.getMessage() << __FUNCTION__ << " failed: Expected exactly one tape file to be appended at a time: actual=" << + tapeFile.tapeFiles.size() << " archiveFileID=" << tapeFile.archiveFileID; + throw ex; + } + + // Append the tape file + m_archiveFile->tapeFiles.push_back(tapeFile.tapeFiles.front()); + + // There could be more tape files so return incomplete + return std::unique_ptr<T>(); + } + + // Reaching this point means the tape file to be appended belongs to the next + // ArchiveFile to be constructed. + + // ArchiveFile object under construction is complete, + // therefore return it and start the construction of the next + std::unique_ptr<T> tmp; + tmp = std::move(m_archiveFile); + m_archiveFile.reset(new T(tapeFile)); + return tmp; +} + +//------------------------------------------------------------------------------ +// getArchiveFile +//------------------------------------------------------------------------------ +template<typename T> +T *ArchiveFileBuilder<T>::getArchiveFile() { + return m_archiveFile.get(); +} + +//------------------------------------------------------------------------------ +// clear +//------------------------------------------------------------------------------ +template<typename T> +void ArchiveFileBuilder<T>::clear() { + m_archiveFile.reset(); +} + + } // namespace catalogue } // namespace cta diff --git a/catalogue/CMakeLists.txt b/catalogue/CMakeLists.txt index 1b22008d88d19cd021a84e92fb5533e494065a14..8272cd4be527ca2ba5df69ebd73b32e78044644b 100644 --- a/catalogue/CMakeLists.txt +++ b/catalogue/CMakeLists.txt @@ -36,6 +36,8 @@ set (CATALOGUE_LIB_SRC_FILES CatalogueFactoryFactory.cpp CatalogueSchema.cpp CmdLineTool.cpp + DeletedArchiveFileItor.cpp + DeletedArchiveFileItorImpl.cpp InMemoryCatalogue.cpp InMemoryCatalogueFactory.cpp MysqlCatalogue.cpp @@ -52,6 +54,7 @@ set (CATALOGUE_LIB_SRC_FILES RdbmsCatalogue.cpp RdbmsCatalogueGetArchiveFilesForRepackItor.cpp RdbmsCatalogueGetArchiveFilesItor.cpp + RdbmsCatalogueGetDeletedArchiveFilesItor.cpp SchemaCreatingSqliteCatalogue.cpp SqliteCatalogue.cpp SqliteCatalogueFactory.cpp @@ -172,6 +175,7 @@ add_custom_command (OUTPUT sqlite_catalogue_schema.sql mysql_catalogue_schema.sq ${CMAKE_CURRENT_SOURCE_DIR}/CreateAllSchemasCppFile.sh ${CMAKE_CURRENT_SOURCE_DIR}/AllCatalogueSchema.hpp.in ${CMAKE_CURRENT_SOURCE_DIR}/insert_cta_catalogue_version.sql.in + create_catalogue_schema_directory ) add_custom_command(OUTPUT sqlite_catalogue_schema.cpp diff --git a/catalogue/Catalogue.hpp b/catalogue/Catalogue.hpp index bd17b9e813b9c07c50a0dc229f3cfbcfc01e6c17..16a0837b030a3c549615a7237274f1f51117bec0 100644 --- a/catalogue/Catalogue.hpp +++ b/catalogue/Catalogue.hpp @@ -33,6 +33,7 @@ #include "common/dataStructures/ArchiveJob.hpp" #include "common/dataStructures/ArchiveRoute.hpp" #include "common/dataStructures/CancelRetrieveRequest.hpp" +#include "common/dataStructures/DeleteArchiveRequest.hpp" #include "common/dataStructures/DiskFileInfo.hpp" #include "common/dataStructures/DriveState.hpp" #include "common/dataStructures/EntryLog.hpp" @@ -64,6 +65,7 @@ #include "common/log/Logger.hpp" #include "common/optional.hpp" #include "SchemaVersion.hpp" +#include "DeletedArchiveFileItor.hpp" #include <list> #include <map> @@ -420,8 +422,9 @@ public: * * @param admin The administrator. * @param vid The volume identifier of the tape to be reclaimed. + * @param lc the logContext */ - virtual void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) = 0; + virtual void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) = 0; /** * Checks the specified tape for the tape label command. @@ -684,6 +687,16 @@ public: virtual ArchiveFileItor getArchiveFilesItor( const TapeFileSearchCriteria &searchCriteria = TapeFileSearchCriteria()) const = 0; + /** + * Returns the specified deleted archive files. Please note that the list of files + * is ordered by archive file ID. + * + * @param searchCriteria The search criteria. + * @return The deleted archive files. + */ + virtual DeletedArchiveFileItor getDeletedArchiveFilesItor( + const TapeFileSearchCriteria &searchCriteria = TapeFileSearchCriteria()) const = 0; + /** * Returns the specified files in tape file sequence order. * @@ -822,6 +835,28 @@ public: */ virtual void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) = 0; + + /** + * Insert the tape files and ArchiveFiles entries in the recycle-bin and delete + * them from the TAPE_FILE and ARCHIVE_FILE tables + * @param request the DeleteRequest object that holds information about the file to delete. + * @param lc the logContext + */ + virtual void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, + log::LogContext & lc) = 0; + + /** + * + * Deletes the specified archive file and its associated tape copies from the + * recycle-bin + * + * Please note that this method is idempotent. If the file to be deleted does + * not exist in the CTA catalogue then this method returns without error. + * + * @param archiveFileId The unique identifier of the archive file. + * @param lc The log context. + */ + virtual void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) = 0; }; // class Catalogue diff --git a/catalogue/CatalogueRetryWrapper.hpp b/catalogue/CatalogueRetryWrapper.hpp index c142c3769690bbda728fbfc133f5d3ea1ff8e60c..03e4f18763078542fdbebac9685b233f9cb5afee 100644 --- a/catalogue/CatalogueRetryWrapper.hpp +++ b/catalogue/CatalogueRetryWrapper.hpp @@ -268,8 +268,8 @@ public: return retryOnLostConnection(m_log, [&]{return m_catalogue->getAllTapes();}, m_maxTriesToConnect); } - void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) override { - return retryOnLostConnection(m_log, [&]{return m_catalogue->reclaimTape(admin, vid);}, m_maxTriesToConnect); + void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) override { + return retryOnLostConnection(m_log, [&]{return m_catalogue->reclaimTape(admin, vid,lc);}, m_maxTriesToConnect); } void checkTapeForLabel(const std::string &vid) override { @@ -463,6 +463,14 @@ public: ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override { return retryOnLostConnection(m_log, [&]{return m_catalogue->getArchiveFilesItor(searchCriteria);}, m_maxTriesToConnect); } + + DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override { + return retryOnLostConnection(m_log, [&]{return m_catalogue->getDeletedArchiveFilesItor(searchCriteria);}, m_maxTriesToConnect); + } + + void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc){ + return retryOnLostConnection(m_log,[&]{return m_catalogue->deleteFileFromRecycleBin(archiveFileId,lc);},m_maxTriesToConnect); + } std::list<common::dataStructures::ArchiveFile> getFilesForRepack(const std::string &vid, const uint64_t startFSeq, const uint64_t maxNbFiles) const override { return retryOnLostConnection(m_log, [&]{return m_catalogue->getFilesForRepack(vid, startFSeq, maxNbFiles);}, m_maxTriesToConnect); @@ -515,6 +523,11 @@ public: void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) override { return retryOnLostConnection(m_log, [&]{return m_catalogue->updateDiskFileId(archiveFileId, diskInstance, diskFileId);}, m_maxTriesToConnect); } + + void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, + log::LogContext & lc) override { + return retryOnLostConnection(m_log,[&]{return m_catalogue->moveArchiveFileToRecycleBin(request,lc);},m_maxTriesToConnect); + } protected: diff --git a/catalogue/CatalogueTest.cpp b/catalogue/CatalogueTest.cpp index 8ea3eeb159ebf99a1803d4daf8eb761a18c8a0c1..d97cd243661207e987db5d7cf0c6e48f11028580 100644 --- a/catalogue/CatalogueTest.cpp +++ b/catalogue/CatalogueTest.cpp @@ -53,6 +53,7 @@ #include "common/threading/Thread.hpp" #include "common/threading/Mutex.hpp" #include "common/threading/MutexLocker.hpp" +#include "DeletedArchiveFileItor.hpp" #include <algorithm> #include <gtest/gtest.h> @@ -144,6 +145,19 @@ void cta_catalogue_CatalogueTest::SetUp() { m_catalogue->deleteArchiveFile(archiveFile.diskInstance, archiveFile.archiveFileID, dummyLc); } } + { + //Delete all the entries from the recycle bin + auto itor = m_catalogue->getDeletedArchiveFilesItor(); + std::list<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles; + while(itor.hasMore()){ + deletedArchiveFiles.push_back(itor.next()); + } + + for(const auto &deletedArchiveFile: deletedArchiveFiles){ + log::LogContext dummyLc(m_dummyLog); + m_catalogue->deleteFileFromRecycleBin(deletedArchiveFile.archiveFileID,dummyLc); + } + } { const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); for(auto &tape: tapes) { @@ -14490,7 +14504,7 @@ TEST_P(cta_catalogue_CatalogueTest, checkTapeForLabel_one_tape_file_reclaimed_ta m_catalogue->deleteArchiveFile(diskInstanceName1, archiveFileId, dummyLc); m_catalogue->setTapeFull(m_admin, vid1, true); - m_catalogue->reclaimTape(m_admin, vid1); + m_catalogue->reclaimTape(m_admin, vid1,dummyLc); ASSERT_NO_THROW(m_catalogue->checkTapeForLabel(vid1)); } @@ -14720,6 +14734,7 @@ TEST_P(cta_catalogue_CatalogueTest, checkTapeForLabel_empty_vid) { TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) { using namespace cta; + log::LogContext dummyLc(m_dummyLog); ASSERT_TRUE(m_catalogue->getTapes().empty()); const std::string mediaType = "media_type"; @@ -14776,7 +14791,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) { } m_catalogue->setTapeFull(m_admin, vid, true); - m_catalogue->reclaimTape(m_admin, vid); + m_catalogue->reclaimTape(m_admin, vid, dummyLc); { const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); @@ -14811,6 +14826,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_0_no_tape_files) { TEST_P(cta_catalogue_CatalogueTest, reclaimTape_not_full_lastFSeq_0_no_tape_files) { using namespace cta; + log::LogContext dummyLc(m_dummyLog); ASSERT_TRUE(m_catalogue->getTapes().empty()); const std::string mediaType = "media_type"; @@ -14866,15 +14882,15 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_not_full_lastFSeq_0_no_tape_file const common::dataStructures::EntryLog lastModificationLog = tape.lastModificationLog; ASSERT_EQ(creationLog, lastModificationLog); } - - ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid), exception::UserError); + ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid, dummyLc), exception::UserError); } TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) { using namespace cta; + log::LogContext dummyLc(m_dummyLog); + const std::string diskInstanceName1 = "disk_instance_1"; - ASSERT_TRUE(m_catalogue->getTapes().empty()); const std::string vid1 = "VID123"; @@ -15028,7 +15044,6 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) { } { - log::LogContext dummyLc(m_dummyLog); m_catalogue->deleteArchiveFile(diskInstanceName1, file1Written.archiveFileId, dummyLc); } @@ -15067,7 +15082,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) { } m_catalogue->setTapeFull(m_admin, vid1, true); - m_catalogue->reclaimTape(m_admin, vid1); + m_catalogue->reclaimTape(m_admin, vid1, dummyLc); { const std::list<common::dataStructures::Tape> tapes = m_catalogue->getTapes(); @@ -15102,6 +15117,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_no_tape_files) { TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) { using namespace cta; + log::LogContext dummyLc(m_dummyLog); const std::string diskInstanceName1 = "disk_instance_1"; @@ -15259,12 +15275,13 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file) { } m_catalogue->setTapeFull(m_admin, vid1, true); - ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid1), exception::UserError); + ASSERT_THROW(m_catalogue->reclaimTape(m_admin, vid1, dummyLc), exception::UserError); } TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_superseded) { using namespace cta; + log::LogContext dummyLc(m_dummyLog); const std::string diskInstanceName1 = "disk_instance_1"; ASSERT_TRUE(m_catalogue->getTapes().empty()); @@ -15460,7 +15477,7 @@ TEST_P(cta_catalogue_CatalogueTest, reclaimTape_full_lastFSeq_1_one_tape_file_su ASSERT_EQ("", tf.supersededByVid); } - ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1)); + ASSERT_NO_THROW(m_catalogue->reclaimTape(m_admin, vid1, dummyLc)); { //Test that the tape with vid1 is reclaimed @@ -15928,4 +15945,262 @@ TEST_P(cta_catalogue_CatalogueTest, updateDiskFileId) { } } +TEST_P(cta_catalogue_CatalogueTest, moveFilesToRecycleBin) { + using namespace cta; + + const std::string vid1 = "VID123"; + const std::string vid2 = "VID456"; + const std::string mediaType = "media_type"; + const std::string vendor = "vendor"; + const std::string logicalLibraryName = "logical_library_name"; + const bool logicalLibraryIsDisabled= false; + const std::string tapePoolName1 = "tape_pool_name_1"; + const std::string tapePoolName2 = "tape_pool_name_2"; + const std::string vo = "vo"; + const uint64_t nbPartialTapes = 1; + const bool isEncrypted = true; + const cta::optional<std::string> supply("value for the supply pool mechanism"); + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const bool readOnlyValue = true; + const std::string comment = "Create tape"; + const std::string diskInstance = "disk_instance"; + + m_catalogue->createLogicalLibrary(m_admin, logicalLibraryName, logicalLibraryIsDisabled, "Create logical library"); + + createVo(vo); + m_catalogue->createTapePool(m_admin, tapePoolName1, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool"); + + common::dataStructures::StorageClass storageClass; + + storageClass.name = "storage_class"; + storageClass.nbCopies = 2; + storageClass.comment = "Create storage class"; + storageClass.vo.name = vo; + m_catalogue->createStorageClass(m_admin, storageClass); + + const std::string tapeDrive = "tape_drive"; + m_catalogue->createTapePool(m_admin, tapePoolName2, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool"); + + m_catalogue->createTape(m_admin, vid1, mediaType, vendor, logicalLibraryName, tapePoolName1, capacityInBytes, + disabledValue, fullValue, readOnlyValue, comment); + + m_catalogue->createTape(m_admin, vid2, mediaType, vendor, logicalLibraryName, tapePoolName2, capacityInBytes, + disabledValue, fullValue, readOnlyValue, comment); + + ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore()); + const uint64_t nbArchiveFiles = 10; // Must be a multiple of 2 for this test + const uint64_t archiveFileSize = 2 * 1000 * 1000 * 1000; + + std::set<catalogue::TapeItemWrittenPointer> tapeFilesWrittenCopy1; + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + std::ostringstream diskFileId; + diskFileId << (12345677 + i); + + std::ostringstream diskFilePath; + diskFilePath << "/test/file"<<i; + + // Tape copy 1 written to tape + auto fileWrittenUP=cta::make_unique<cta::catalogue::TapeFileWritten>(); + auto & fileWritten = *fileWrittenUP; + fileWritten.archiveFileId = i; + fileWritten.diskInstance = diskInstance; + fileWritten.diskFileId = diskFileId.str(); + fileWritten.diskFilePath = diskFilePath.str(); + fileWritten.diskFileOwnerUid = PUBLIC_DISK_USER; + fileWritten.diskFileGid = PUBLIC_DISK_GROUP; + fileWritten.size = archiveFileSize; + fileWritten.checksumBlob.insert(checksum::ADLER32, "1357"); + fileWritten.storageClassName = storageClass.name; + fileWritten.vid = vid1; + fileWritten.fSeq = i; + fileWritten.blockId = i * 100; + fileWritten.copyNb = 1; + fileWritten.tapeDrive = tapeDrive; + tapeFilesWrittenCopy1.emplace(fileWrittenUP.release()); + } + m_catalogue->filesWrittenToTape(tapeFilesWrittenCopy1); + { + ASSERT_TRUE(m_catalogue->getArchiveFilesItor().hasMore()); + } + log::LogContext dummyLc(m_dummyLog); + for(auto & tapeItemWritten: tapeFilesWrittenCopy1){ + cta::catalogue::TapeFileWritten * tapeItem = static_cast<cta::catalogue::TapeFileWritten *>(tapeItemWritten.get()); + cta::common::dataStructures::DeleteArchiveRequest req; + req.archiveFileID = tapeItem->archiveFileId; + req.diskFileId = tapeItem->diskFileId; + req.diskFilePath = tapeItem->diskFilePath; + req.diskInstance = tapeItem->diskInstance; + ASSERT_NO_THROW(m_catalogue->moveArchiveFileToRecycleBin(req,dummyLc)); + } + ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore()); + + std::vector<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles; + { + cta::catalogue::DeletedArchiveFileItor itor = m_catalogue->getDeletedArchiveFilesItor(); + while(itor.hasMore()){ + deletedArchiveFiles.push_back(itor.next()); + } + } + //And test that these files are there. + //Run the unit test for all the databases + ASSERT_EQ(nbArchiveFiles,deletedArchiveFiles.size()); + + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + + auto deletedArchiveFile = deletedArchiveFiles[i-1]; + + std::ostringstream diskFileId; + diskFileId << (12345677 + i); + + std::ostringstream diskFilePath; + diskFilePath << "/test/file"<<i; + + ASSERT_EQ(i,deletedArchiveFile.archiveFileID); + ASSERT_EQ(diskInstance,deletedArchiveFile.diskInstance); + ASSERT_EQ(diskFileId.str(),deletedArchiveFile.diskFileId); + ASSERT_EQ(diskFilePath.str(),deletedArchiveFile.diskFilePath); + ASSERT_EQ(PUBLIC_DISK_USER,deletedArchiveFile.diskFileInfo.owner_uid); + ASSERT_EQ(PUBLIC_DISK_GROUP,deletedArchiveFile.diskFileInfo.gid); + ASSERT_EQ(archiveFileSize,deletedArchiveFile.fileSize); + ASSERT_EQ(cta::checksum::ChecksumBlob(checksum::ADLER32, "1357"),deletedArchiveFile.checksumBlob); + ASSERT_EQ(storageClass.name,deletedArchiveFile.storageClass); + ASSERT_EQ(diskFileId.str(),deletedArchiveFile.diskFileIdWhenDeleted); + + auto tapeFile = deletedArchiveFile.tapeFiles.at(1); + ASSERT_EQ(vid1,tapeFile.vid); + ASSERT_EQ(i,tapeFile.fSeq); + ASSERT_EQ(i * 100,tapeFile.blockId); + ASSERT_EQ(1, tapeFile.copyNb); + ASSERT_EQ(archiveFileSize,tapeFile.fileSize); + ASSERT_TRUE(tapeFile.supersededByVid.empty()); + ASSERT_EQ(0,tapeFile.supersededByFSeq); + } + + //Let's try the deletion of the files from the recycle-bin. + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + m_catalogue->deleteFileFromRecycleBin(i,dummyLc); + } + + { + auto itor = m_catalogue->getDeletedArchiveFilesItor(); + ASSERT_FALSE(itor.hasMore()); + } + //Delete an archive file from the recycle-bin should be idempotent + ASSERT_NO_THROW(m_catalogue->deleteFileFromRecycleBin(12532,dummyLc)); + +} + +TEST_P(cta_catalogue_CatalogueTest, reclaimTapeRemovesFilesFromRecycleBin) { + using namespace cta; + + const std::string vid1 = "VID123"; + const std::string vid2 = "VID456"; + const std::string mediaType = "media_type"; + const std::string vendor = "vendor"; + const std::string logicalLibraryName = "logical_library_name"; + const bool logicalLibraryIsDisabled= false; + const std::string tapePoolName1 = "tape_pool_name_1"; + const std::string tapePoolName2 = "tape_pool_name_2"; + const std::string vo = "vo"; + const uint64_t nbPartialTapes = 1; + const bool isEncrypted = true; + const cta::optional<std::string> supply("value for the supply pool mechanism"); + const uint64_t capacityInBytes = (uint64_t)10 * 1000 * 1000 * 1000 * 1000; + const bool disabledValue = true; + const bool fullValue = false; + const bool readOnlyValue = true; + const std::string comment = "Create tape"; + const std::string diskInstance = "disk_instance"; + + m_catalogue->createLogicalLibrary(m_admin, logicalLibraryName, logicalLibraryIsDisabled, "Create logical library"); + + createVo(vo); + m_catalogue->createTapePool(m_admin, tapePoolName1, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool"); + + common::dataStructures::StorageClass storageClass; + + storageClass.name = "storage_class"; + storageClass.nbCopies = 2; + storageClass.comment = "Create storage class"; + storageClass.vo.name = vo; + m_catalogue->createStorageClass(m_admin, storageClass); + + const std::string tapeDrive = "tape_drive"; + m_catalogue->createTapePool(m_admin, tapePoolName2, vo, nbPartialTapes, isEncrypted, supply, "Create tape pool"); + + m_catalogue->createTape(m_admin, vid1, mediaType, vendor, logicalLibraryName, tapePoolName1, capacityInBytes, + disabledValue, fullValue, readOnlyValue, comment); + + m_catalogue->createTape(m_admin, vid2, mediaType, vendor, logicalLibraryName, tapePoolName2, capacityInBytes, + disabledValue, fullValue, readOnlyValue, comment); + + ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore()); + const uint64_t nbArchiveFiles = 10; // Must be a multiple of 2 for this test + const uint64_t archiveFileSize = 2 * 1000 * 1000 * 1000; + + std::set<catalogue::TapeItemWrittenPointer> tapeFilesWrittenCopy1; + for(uint64_t i = 1; i <= nbArchiveFiles; i++) { + std::ostringstream diskFileId; + diskFileId << (12345677 + i); + + std::ostringstream diskFilePath; + diskFilePath << "/test/file"<<i; + + // Tape copy 1 written to tape + auto fileWrittenUP=cta::make_unique<cta::catalogue::TapeFileWritten>(); + auto & fileWritten = *fileWrittenUP; + fileWritten.archiveFileId = i; + fileWritten.diskInstance = diskInstance; + fileWritten.diskFileId = diskFileId.str(); + fileWritten.diskFilePath = diskFilePath.str(); + fileWritten.diskFileOwnerUid = PUBLIC_DISK_USER; + fileWritten.diskFileGid = PUBLIC_DISK_GROUP; + fileWritten.size = archiveFileSize; + fileWritten.checksumBlob.insert(checksum::ADLER32, "1357"); + fileWritten.storageClassName = storageClass.name; + fileWritten.vid = vid1; + fileWritten.fSeq = i; + fileWritten.blockId = i * 100; + fileWritten.copyNb = 1; + fileWritten.tapeDrive = tapeDrive; + tapeFilesWrittenCopy1.emplace(fileWrittenUP.release()); + } + m_catalogue->filesWrittenToTape(tapeFilesWrittenCopy1); + { + ASSERT_TRUE(m_catalogue->getArchiveFilesItor().hasMore()); + } + log::LogContext dummyLc(m_dummyLog); + for(auto & tapeItemWritten: tapeFilesWrittenCopy1){ + cta::catalogue::TapeFileWritten * tapeItem = static_cast<cta::catalogue::TapeFileWritten *>(tapeItemWritten.get()); + cta::common::dataStructures::DeleteArchiveRequest req; + req.archiveFileID = tapeItem->archiveFileId; + req.diskFileId = tapeItem->diskFileId; + req.diskFilePath = tapeItem->diskFilePath; + req.diskInstance = tapeItem->diskInstance; + ASSERT_NO_THROW(m_catalogue->moveArchiveFileToRecycleBin(req,dummyLc)); + } + ASSERT_FALSE(m_catalogue->getArchiveFilesItor().hasMore()); + + std::vector<common::dataStructures::DeletedArchiveFile> deletedArchiveFiles; + { + cta::catalogue::DeletedArchiveFileItor itor = m_catalogue->getDeletedArchiveFilesItor(); + while(itor.hasMore()){ + deletedArchiveFiles.push_back(itor.next()); + } + } + //And test that these files are there. + //Run the unit test for all the databases + ASSERT_EQ(nbArchiveFiles,deletedArchiveFiles.size()); + + //Reclaim the tape + m_catalogue->setTapeFull(m_admin,vid1,true); + m_catalogue->reclaimTape(m_admin,vid1, dummyLc); + { + auto itor = m_catalogue->getDeletedArchiveFilesItor(); + ASSERT_FALSE(itor.hasMore()); + } +} + } // namespace unitTests diff --git a/catalogue/DeletedArchiveFileItor.cpp b/catalogue/DeletedArchiveFileItor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..083e48e7f75be626e0d5f6fcc48bc4e25d44e811 --- /dev/null +++ b/catalogue/DeletedArchiveFileItor.cpp @@ -0,0 +1,90 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DeletedArchiveFileItor.hpp" +#include "DeletedArchiveFileItorImpl.hpp" + + +namespace cta { +namespace catalogue { + + +//------------------------------------------------------------------------------ +// constructor +//------------------------------------------------------------------------------ +DeletedArchiveFileItor::DeletedArchiveFileItor(): + m_impl(nullptr) { +} + +//------------------------------------------------------------------------------ +// constructor +//------------------------------------------------------------------------------ +DeletedArchiveFileItor::DeletedArchiveFileItor(DeletedArchiveFileItorImpl *const impl): + m_impl(impl) { + if(nullptr == impl) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: Pointer to implementation object is null"); + } +} + +//------------------------------------------------------------------------------ +// constructor +//------------------------------------------------------------------------------ +DeletedArchiveFileItor::DeletedArchiveFileItor(DeletedArchiveFileItor &&other): + m_impl(other.m_impl) { + other.m_impl = nullptr; +} + +//------------------------------------------------------------------------------ +// destructor +//------------------------------------------------------------------------------ +DeletedArchiveFileItor::~DeletedArchiveFileItor() { + delete m_impl; +} + +//------------------------------------------------------------------------------ +// operator= +//------------------------------------------------------------------------------ +DeletedArchiveFileItor &DeletedArchiveFileItor::operator=(DeletedArchiveFileItor &&rhs) { + m_impl = rhs.m_impl; + rhs.m_impl = nullptr; + return *this; +} + +//------------------------------------------------------------------------------ +// hasMore +//------------------------------------------------------------------------------ +bool DeletedArchiveFileItor::hasMore() const { + if(nullptr == m_impl) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + "This iterator is invalid"); + } + return m_impl->hasMore(); +} + +//------------------------------------------------------------------------------ +// next +//------------------------------------------------------------------------------ +common::dataStructures::DeletedArchiveFile DeletedArchiveFileItor::next() { + if(nullptr == m_impl) { + throw exception::Exception(std::string(__FUNCTION__) + " failed: " + "This iterator is invalid"); + } + return m_impl->next(); +} + +}} \ No newline at end of file diff --git a/catalogue/DeletedArchiveFileItor.hpp b/catalogue/DeletedArchiveFileItor.hpp new file mode 100644 index 0000000000000000000000000000000000000000..5401e6e1435d88f804f2299281ec69bfa7cb418b --- /dev/null +++ b/catalogue/DeletedArchiveFileItor.hpp @@ -0,0 +1,90 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "common/dataStructures/DeletedArchiveFile.hpp" + +namespace cta { +namespace catalogue { + +class DeletedArchiveFileItorImpl; + +class Catalogue; + +class DeletedArchiveFileItor { +public: + + /** + * Constructor. + */ + DeletedArchiveFileItor(); + + /** + * Constructor. + * + * @param impl The object actually implementing this iterator. + */ + DeletedArchiveFileItor(DeletedArchiveFileItorImpl *const impl); + + /** + * Deletion of copy constructor. + */ + DeletedArchiveFileItor(const DeletedArchiveFileItor &) = delete; + + /** + * Move constructor. + * + * @param other The other object to be moved. + */ + DeletedArchiveFileItor(DeletedArchiveFileItor &&other); + + /** + * Destructor. + */ + ~DeletedArchiveFileItor(); + + /** + * Deletion of copy assignment. + */ + DeletedArchiveFileItor &operator=(const DeletedArchiveFileItor &) = delete; + + /** + * Move assignment. + */ + DeletedArchiveFileItor &operator=(DeletedArchiveFileItor &&rhs); + + /** + * Returns true if a call to next would return another archive file. + */ + bool hasMore() const; + + /** + * Returns the next archive or throws an exception if there isn't one. + */ + common::dataStructures::DeletedArchiveFile next(); + +private: + + /** + * The object actually implementing this iterator. + */ + DeletedArchiveFileItorImpl *m_impl; +}; + +}} diff --git a/catalogue/DeletedArchiveFileItorImpl.cpp b/catalogue/DeletedArchiveFileItorImpl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..58a1da2c69d863ea3645f885c83aa9f6f61d10cd --- /dev/null +++ b/catalogue/DeletedArchiveFileItorImpl.cpp @@ -0,0 +1,30 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DeletedArchiveFileItorImpl.hpp" + +namespace cta { +namespace catalogue { + +//------------------------------------------------------------------------------ +// destructor +//------------------------------------------------------------------------------ +DeletedArchiveFileItorImpl::~DeletedArchiveFileItorImpl() { +} + +}} \ No newline at end of file diff --git a/catalogue/DeletedArchiveFileItorImpl.hpp b/catalogue/DeletedArchiveFileItorImpl.hpp new file mode 100644 index 0000000000000000000000000000000000000000..c4673e5edbed655fe3280d5c5317b17c8954cd32 --- /dev/null +++ b/catalogue/DeletedArchiveFileItorImpl.hpp @@ -0,0 +1,51 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "common/dataStructures/DeletedArchiveFile.hpp" + +namespace cta { +namespace catalogue { + +/** + * Abstract class defining the interface to an iterator over a list of archive + * files. + */ +class DeletedArchiveFileItorImpl { +public: + + /** + * Destructor. + */ + virtual ~DeletedArchiveFileItorImpl() = 0; + + /** + * Returns true if a call to next would return another archive file. + */ + virtual bool hasMore() = 0; + + /** + * Returns the next archive or throws an exception if there isn't one. + */ + virtual common::dataStructures::DeletedArchiveFile next() = 0; + +}; // class DeletedArchiveFileItorImpl + + +}} diff --git a/catalogue/DropSchemaCmd.cpp b/catalogue/DropSchemaCmd.cpp index e4201b6415e1cd5ce79d11c4dcf0157b68b8607e..1de1022bd8fecfbe18c1d13319acb82093253540 100644 --- a/catalogue/DropSchemaCmd.cpp +++ b/catalogue/DropSchemaCmd.cpp @@ -139,6 +139,8 @@ void DropSchemaCmd::dropSqliteCatalogueSchema(rdbms::Conn &conn) { "TEMP_TAPE_FILE", "DATABASECHANGELOGLOCK", /* Liquibase specific table */ "DATABASECHANGELOG", /* Liquibase specific table */ + "TAPE_FILE_RECYCLE_BIN", + "ARCHIVE_FILE_RECYCLE_BIN", "ARCHIVE_FILE", "ARCHIVE_FILE_ID", "TAPE", @@ -178,6 +180,9 @@ void DropSchemaCmd::dropMysqlCatalogueSchema(rdbms::Conn &conn) { "TEMP_TAPE_FILE", "DATABASECHANGELOGLOCK", /* Liquibase specific table */ "DATABASECHANGELOG", /* Liquibase specific table */ + "FILE_RECYCLE_BIN", + "TAPE_FILE_RECYCLE_BIN", + "ARCHIVE_FILE_RECYCLE_BIN", "ARCHIVE_FILE", "ARCHIVE_FILE_ID", "TAPE", @@ -233,7 +238,10 @@ void DropSchemaCmd::dropOracleCatalogueSchema(rdbms::Conn &conn) { "CTA_CATALOGUE", "ARCHIVE_ROUTE", "TAPE_FILE", + "FILE_RECYCLE_BIN", "ARCHIVE_FILE", + "TAPE_FILE_RECYCLE_BIN", + "ARCHIVE_FILE_RECYCLE_BIN", "TAPE", "TEMP_TAPE_FILE_BATCH", "TEMP_TAPE_FILE_INSERTION_BATCH", @@ -284,7 +292,10 @@ void DropSchemaCmd::dropPostgresCatalogueSchema(rdbms::Conn &conn) { "TEMP_TAPE_FILE", "DATABASECHANGELOGLOCK", /* Liquibase specific table */ "DATABASECHANGELOG", /* Liquibase specific table */ + "FILE_RECYCLE_BIN", "ARCHIVE_FILE", + "TAPE_FILE_RECYCLE_BIN", + "ARCHIVE_FILE_RECYCLE_BIN", "TAPE", "REQUESTER_MOUNT_RULE", "REQUESTER_GROUP_MOUNT_RULE", diff --git a/catalogue/DummyCatalogue.hpp b/catalogue/DummyCatalogue.hpp index 0f44eb6ea60973a7f175fb6dc7337969ab55d42d..32ac4ed189649e5b4e0ac6145bbb3371b6de8bca 100644 --- a/catalogue/DummyCatalogue.hpp +++ b/catalogue/DummyCatalogue.hpp @@ -69,6 +69,8 @@ public: std::list<common::dataStructures::AdminUser> getAdminUsers() const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } common::dataStructures::ArchiveFile getArchiveFileById(const uint64_t id) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } + DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } + void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) {throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented");} std::list<common::dataStructures::ArchiveFile> getFilesForRepack(const std::string &vid, const uint64_t startFSeq, const uint64_t maxNbFiles) const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } ArchiveFileItor getArchiveFilesForRepackItor(const std::string &vid, const uint64_t startFSeq) const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } std::list<common::dataStructures::ArchiveRoute> getArchiveRoutes() const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } @@ -132,7 +134,7 @@ public: common::dataStructures::ArchiveFileQueueCriteria getArchiveFileQueueCriteria(const std::string &diskInstanceName, const std::string &storageClassName, const common::dataStructures::RequesterIdentity &user) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } common::dataStructures::RetrieveFileQueueCriteria prepareToRetrieveFile(const std::string& diskInstanceName, const uint64_t archiveFileId, const common::dataStructures::RequesterIdentity& user, const optional<std::string>& activity, log::LogContext& lc) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } - void reclaimTape(const common::dataStructures::SecurityIdentity& admin, const std::string& vid) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } + void reclaimTape(const common::dataStructures::SecurityIdentity& admin, const std::string& vid, cta::log::LogContext & lc) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } void checkTapeForLabel(const std::string& vid) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } uint64_t getNbFilesOnTape(const std::string& vid) const override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } void setTapeDisabled(const common::dataStructures::SecurityIdentity& admin, const std::string& vid, const bool disabledValue) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } @@ -149,7 +151,8 @@ public: void tapeMountedForRetrieve(const std::string& vid, const std::string& drive) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } bool tapePoolExists(const std::string& tapePoolName) const { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) override { throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented"); } - + void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, + log::LogContext & lc) override {throw exception::Exception(std::string("In ")+__PRETTY_FUNCTION__+": not implemented");} // Special functions for unit tests. void addEnabledTape(const std::string & vid) { threading::MutexLocker lm(m_tapeEnablingMutex); diff --git a/catalogue/MysqlCatalogue.cpp b/catalogue/MysqlCatalogue.cpp index 831accb15c64a448293086e386818a4a8cd321c1..6d0c15f72808d9219dbcdca9a726ebed8f7b593e 100644 --- a/catalogue/MysqlCatalogue.cpp +++ b/catalogue/MysqlCatalogue.cpp @@ -28,6 +28,7 @@ #include "rdbms/AutoRollback.hpp" #include "rdbms/ConstraintError.hpp" #include "rdbms/PrimaryKeyError.hpp" +#include "common/log/TimingList.hpp" namespace cta { namespace catalogue { @@ -562,13 +563,15 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons stmt.bindUint64(":ARCHIVE_FILE_ID", archiveFileId); stmt.executeNonQuery(); } + + const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); for(auto &vidToSetDirty: vidsToSetDirty){ //We deleted the TAPE_FILE so the tapes containing them should be set as dirty setTapeDirty(conn,vidToSetDirty); } - const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter); { const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; @@ -596,6 +599,7 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons .add("selectFromArchiveFileTime", selectFromArchiveFileTime) .add("deleteFromTapeFileTime", deleteFromTapeFileTime) .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime) + .add("setTapeDirtyTime",setTapeDirtyTime) .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; @@ -620,5 +624,57 @@ void MysqlCatalogue::deleteArchiveFile(const std::string &diskInstanceName, cons } } +void MysqlCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc){ + try { + utils::Timer t; + log::TimingList tl; + //We currently do an INSERT INTO and a DELETE FROM + //in a single transaction + conn.executeNonQuery("START TRANSACTION"); + copyArchiveFileToRecycleBin(conn,request); + tl.insertAndReset("insertToRecycleBinTime",t); + deleteArchiveFileAndTapeFiles(conn,request); + tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",request.archiveFileID); + spc.add("diskFileId",request.diskFileId); + spc.add("diskFilePath",request.diskFilePath); + spc.add("diskInstance",request.diskInstance); + tl.addToLog(spc); + lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +void MysqlCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext &lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do two delete in one transaction + conn.executeNonQuery("START TRANSACTION"); + deleteTapeFilesFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteTapeFilesTime",t); + deleteArchiveFileFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteArchiveFileTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",archiveFileId); + tl.addToLog(spc); + lc.log(log::INFO,"In MysqlCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + } // namespace catalogue } // namespace cta diff --git a/catalogue/MysqlCatalogue.hpp b/catalogue/MysqlCatalogue.hpp index 211cb387d06e97794ff76b2f8c92f63a0b67b0f2..12054e3c1dc5908f4336ef6eb298a38eeffbefc2 100644 --- a/catalogue/MysqlCatalogue.hpp +++ b/catalogue/MysqlCatalogue.hpp @@ -155,6 +155,22 @@ protected: void deleteArchiveFile(const std::string &instanceName, const uint64_t archiveFileId, log::LogContext &lc) override; + /** + * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables + * and deletes the ARCHIVE_FILE and TAPE_FILE entries. + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + * @param lc the log context + */ + void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn,const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override; + + /** + * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction + * @param conn the database connection + * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin + */ + void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc) override; + private: /** diff --git a/catalogue/OracleCatalogue.cpp b/catalogue/OracleCatalogue.cpp index 0658274f7662330fb66f02691b9f2f2803fc5512..b653fad570c13ae5c3aabfd09f7f9fa01b37dd31 100644 --- a/catalogue/OracleCatalogue.cpp +++ b/catalogue/OracleCatalogue.cpp @@ -31,6 +31,7 @@ #include "rdbms/rdbms.hpp" #include "rdbms/wrapper/OcciColumn.hpp" #include "rdbms/wrapper/OcciStmt.hpp" +#include "common/log/TimingList.hpp" #include <algorithm> namespace cta { @@ -885,12 +886,14 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con stmt.executeNonQuery(); } + const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + //Set the tapes where the files have been deleted to dirty for(auto &vidToSetDirty: vidsToSetDirty){ setTapeDirty(conn,vidToSetDirty); } - const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter); { const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; @@ -918,6 +921,7 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("createStmtTime", createStmtTime) .add("selectFromArchiveFileTime", selectFromArchiveFileTime) .add("deleteFromTapeFileTime", deleteFromTapeFileTime) + .add("setTapeDirtyTime",setTapeDirtyTime) .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime) .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { @@ -946,5 +950,63 @@ void OracleCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con } } +//------------------------------------------------------------------------------ +// copyArchiveFileToRecycleBinAndDelete +//------------------------------------------------------------------------------ +void OracleCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc){ + try { + utils::Timer t; + log::TimingList tl; + //We currently do an INSERT INTO and a DELETE FROM + //in a single transaction + conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_OFF); + copyArchiveFileToRecycleBin(conn,request); + tl.insertAndReset("insertToRecycleBinTime",t); + conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_ON); + deleteArchiveFileAndTapeFiles(conn,request); + tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",request.archiveFileID); + spc.add("diskFileId",request.diskFileId); + spc.add("diskFilePath",request.diskFilePath); + spc.add("diskInstance",request.diskInstance); + tl.addToLog(spc); + lc.log(log::INFO,"In OracleCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteTapeFilesAndArchiveFileFromRecycleBin +//------------------------------------------------------------------------------ +void OracleCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do two delete in one transaction + conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_OFF); + deleteTapeFilesFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteTapeFilesTime",t); + conn.setAutocommitMode(rdbms::AutocommitMode::AUTOCOMMIT_ON); + deleteArchiveFileFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteArchiveFileTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",archiveFileId); + tl.addToLog(spc); + lc.log(log::INFO,"In OracleCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + + + } // namespace catalogue } // namespace cta diff --git a/catalogue/OracleCatalogue.hpp b/catalogue/OracleCatalogue.hpp index 3d4efbdf8f77187871638cb2f9ef3d647c820e3d..cf3e63f6d5d26a3f77d1d0426b6ce96b7530b845 100644 --- a/catalogue/OracleCatalogue.hpp +++ b/catalogue/OracleCatalogue.hpp @@ -184,6 +184,22 @@ private: */ void idempotentBatchInsertArchiveFiles(rdbms::Conn &conn, const std::set<TapeFileWritten> &events); + /** + * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables + * and deletes the ARCHIVE_FILE and TAPE_FILE entries. + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + * @param lc the log context + */ + void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override; + + /** + * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction + * @param conn the database connection + * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin + */ + void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) override; + /** * The size and checksum of a file. */ diff --git a/catalogue/PostgresCatalogue.cpp b/catalogue/PostgresCatalogue.cpp index 0b692bb996349cbaaab2a0bad3decffc4f588172..4b43f137a8e76d18b2fcd2385c485d869567bc9b 100644 --- a/catalogue/PostgresCatalogue.cpp +++ b/catalogue/PostgresCatalogue.cpp @@ -29,6 +29,7 @@ #include "rdbms/rdbms.hpp" #include "rdbms/wrapper/PostgresColumn.hpp" #include "rdbms/wrapper/PostgresStmt.hpp" +#include "common/log/TimingList.hpp" #include <algorithm> namespace cta { @@ -818,12 +819,14 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c stmt.executeNonQuery(); } + const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + for(auto &vidToSetDirty: vidsToSetDirty){ //We deleted the TAPE_FILE so the tapes containing them should be set as dirty setTapeDirty(conn,vidToSetDirty); } - const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter); { const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; @@ -853,6 +856,7 @@ void PostgresCatalogue::deleteArchiveFile(const std::string &diskInstanceName, c .add("selectFromArchiveFileTime", selectFromArchiveFileTime) .add("deleteFromTapeFileTime", deleteFromTapeFileTime) .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime) + .add("setTapeDirtyTime",setTapeDirtyTime) .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; @@ -893,6 +897,63 @@ void PostgresCatalogue::beginCreateTemporarySetDeferred(rdbms::Conn &conn) const conn.executeNonQuery("SET CONSTRAINTS ARCHIVE_FILE_DIN_DFI_UN DEFERRED"); } +//------------------------------------------------------------------------------ +// copyArchiveFileToRecycleBinAndDelete +//------------------------------------------------------------------------------ +void PostgresCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do an INSERT INTO and a DELETE FROM + //in a single transaction + conn.executeNonQuery("BEGIN"); + copyArchiveFileToRecycleBin(conn,request); + tl.insertAndReset("insertToRecycleBinTime",t); + deleteArchiveFileAndTapeFiles(conn,request); + tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",request.archiveFileID); + spc.add("diskFileId",request.diskFileId); + spc.add("diskFilePath",request.diskFilePath); + spc.add("diskInstance",request.diskInstance); + tl.addToLog(spc); + lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteTapeFilesAndArchiveFileFromRecycleBin +//------------------------------------------------------------------------------ +void PostgresCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do two delete in one transaction + conn.executeNonQuery("BEGIN"); + deleteTapeFilesFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteTapeFilesTime",t); + deleteArchiveFileFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteArchiveFileTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",archiveFileId); + tl.addToLog(spc); + lc.log(log::INFO,"In PostgresCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} } // namespace catalogue } // namespace cta diff --git a/catalogue/PostgresCatalogue.hpp b/catalogue/PostgresCatalogue.hpp index 6db30ef340b2ad597f55ccd74f055ad48bca3aef..79038231eb6986c45434ad8a9da1eadfe81c0554 100644 --- a/catalogue/PostgresCatalogue.hpp +++ b/catalogue/PostgresCatalogue.hpp @@ -218,6 +218,22 @@ private: * @param events The tape file written events. */ void insertTapeFileBatchIntoTempTable(rdbms::Conn &conn, const std::set<TapeFileWritten> &events) const; + + /** + * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables + * and deletes the ARCHIVE_FILE and TAPE_FILE entries. + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + * @param lc the log context + */ + void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override; + + /** + * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction + * @param conn the database connection + * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin + */ + virtual void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc); }; // class PostgresCatalogue diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index aaa3f63c405d24b3c69d9ec2a0c792cd17de311f..489044b125cdb79b8f40f0b630e38cbaa817253f 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -60,6 +60,9 @@ #include "rdbms/AutoRollback.hpp" #include "version.h" #include "SchemaVersion.hpp" +#include "RdbmsCatalogueGetDeletedArchiveFilesItor.hpp" +#include "common/log/DummyLogger.hpp" +#include "common/log/TimingList.hpp" #include <ctype.h> #include <memory> @@ -3238,13 +3241,16 @@ void RdbmsCatalogue::resetTapeCounters(rdbms::Conn& conn, const common::dataStru //------------------------------------------------------------------------------ // reclaimTape //------------------------------------------------------------------------------ -void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) { +void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) { try{ + log::TimingList tl; + utils::Timer t; auto conn = m_connPool.getConn(); TapeSearchCriteria searchCriteria; searchCriteria.vid = vid; const auto tapes = getTapes(conn, searchCriteria); + tl.insertAndReset("getTapesTime",t); if(tapes.empty()) { throw exception::UserError(std::string("Cannot reclaim tape ") + vid + " because it does not exist"); @@ -3255,9 +3261,20 @@ void RdbmsCatalogue::reclaimTape(const common::dataStructures::SecurityIdentity } //The tape exists and is full, we can try to reclaim it if(getNbNonSupersededFilesOnTape(conn,vid) == 0){ + tl.insertAndReset("getNbNonSupersededFilesOnTapeTime",t); //There is no non-superseded files on the tape, we can reclaim it : delete the files and reset the counters deleteTapeFiles(conn,vid); + tl.insertAndReset("deleteTapeFilesTime",t); + deleteFilesFromRecycleBin(conn,vid,lc); + tl.insertAndReset("deleteFileFromRecycleBinTime",t); resetTapeCounters(conn,admin,vid); + tl.insertAndReset("resetTapeCountersTime",t); + log::ScopedParamContainer spc(lc); + spc.add("vid",vid); + spc.add("host",admin.host); + spc.add("username",admin.username); + tl.addToLog(spc); + lc.log(log::INFO,"In RdbmsCatalogue::reclaimTape(), tape reclaimed."); } else { throw exception::UserError(std::string("Cannot reclaim tape ") + vid + " because there is at least one tape" " file in the catalogue that is on the tape"); @@ -5935,6 +5952,24 @@ ArchiveFileItor RdbmsCatalogue::getArchiveFilesItor(const TapeFileSearchCriteria } } +//------------------------------------------------------------------------------ +// getDeletedArchiveFilesItor +//------------------------------------------------------------------------------ +DeletedArchiveFileItor RdbmsCatalogue::getDeletedArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const { + + checkTapeFileSearchCriteria(searchCriteria); + + try { + auto impl = new RdbmsCatalogueGetDeletedArchiveFilesItor(m_log, m_archiveFileListingConnPool, searchCriteria); + return DeletedArchiveFileItor(impl); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + //------------------------------------------------------------------------------ // getFilesForRepack //------------------------------------------------------------------------------ @@ -7408,6 +7443,24 @@ void RdbmsCatalogue::checkTapeFileWrittenFieldsAreSet(const std::string &calling } } +//------------------------------------------------------------------------------ +// checkDeleteRequestConsistency +//------------------------------------------------------------------------------ +void RdbmsCatalogue::checkDeleteRequestConsistency(const cta::common::dataStructures::DeleteArchiveRequest deleteRequest, const cta::common::dataStructures::ArchiveFile& archiveFile) const { + if(deleteRequest.diskInstance != archiveFile.diskInstance){ + std::ostringstream msg; + msg << "Failed to move archive file with ID " << deleteRequest.archiveFileID << " to the recycle-bin because the disk instance of " + "the request does not match that of the archived file: archiveFileId=" << archiveFile.archiveFileID << " requestDiskInstance=" << deleteRequest.diskInstance << " archiveFileDiskInstance=" << + archiveFile.diskInstance; + throw cta::exception::Exception(msg.str()); + } + if(deleteRequest.diskFilePath.empty()){ + std::ostringstream msg; + msg << "Failed to move archive file with ID " << deleteRequest.archiveFileID << " to the recycle-bin because the disk file path has not been provided."; + throw cta::exception::Exception(msg.str()); + } +} + //------------------------------------------------------------------------------ // checkTapeItemWrittenFieldsAreSet //------------------------------------------------------------------------------ @@ -7551,5 +7604,334 @@ void RdbmsCatalogue::updateDiskFileId(const uint64_t archiveFileId, const std::s } } +//------------------------------------------------------------------------------ +// moveArchiveFileToRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, + log::LogContext & lc) { + cta::common::dataStructures::ArchiveFile archiveFile; + utils::Timer t, totalTime; + log::TimingList tl; + try{ + archiveFile = getArchiveFileById(request.archiveFileID); + tl.insertAndReset("getArchiveFileByIdTime",t); + } catch (cta::exception::Exception &ex){ + log::ScopedParamContainer spc(lc); + spc.add("fileId", request.archiveFileID); + lc.log(log::WARNING, "Ignoring request to delete archive file because it does not exist in the catalogue"); + return; + } + try { + checkDeleteRequestConsistency(request,archiveFile); + tl.insertAndReset("checkDeleteRequestConsistency",t); + } catch(const cta::exception::Exception & ex){ + log::ScopedParamContainer spc(lc); + spc.add("fileId", std::to_string(request.archiveFileID)) + .add("diskInstance", archiveFile.diskInstance) + .add("requestDiskInstance", request.diskInstance) + .add("diskFileId", archiveFile.diskFileId) + .add("diskFileInfo.owner_uid", archiveFile.diskFileInfo.owner_uid) + .add("diskFileInfo.gid", archiveFile.diskFileInfo.gid) + .add("fileSize", std::to_string(archiveFile.fileSize)) + .add("checksumBlob", archiveFile.checksumBlob) + .add("creationTime", std::to_string(archiveFile.creationTime)) + .add("reconciliationTime", std::to_string(archiveFile.reconciliationTime)) + .add("diskFilePath",request.diskFilePath) + .add("errorMessage",ex.getMessageValue()) + .add("storageClass", archiveFile.storageClass); + for(auto it=archiveFile.tapeFiles.begin(); it!=archiveFile.tapeFiles.end(); it++) { + std::stringstream tapeCopyLogStream; + tapeCopyLogStream << "copy number: " << static_cast<int>(it->copyNb) + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " fileSize: " << it->fileSize + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; + spc.add("TAPE FILE", tapeCopyLogStream.str()); + } + lc.log(log::WARNING, "Failed to move archive file to recycle-bin."); + + exception::UserError ue; + ue.getMessage() << "Failed to move archive file with ID " << request.archiveFileID << " to the recycle-bin. errorMessage=" << ex.getMessageValue(); + throw ue; + } + + try { + //All checks are good, we can move the file to the recycle-bin + auto conn = m_connPool.getConn(); + rdbms::AutoRollback autoRollback(conn); + copyArchiveFileToRecycleBinAndDelete(conn,request,lc); + tl.insertAndReset("copyArchiveFileToRecycleBinAndDeleteTime",t); + tl.insertAndReset("totalTime",totalTime); + log::ScopedParamContainer spc(lc); + spc.add("fileId", std::to_string(request.archiveFileID)) + .add("diskInstance", archiveFile.diskInstance) + .add("requestDiskInstance", request.diskInstance) + .add("diskFileId", archiveFile.diskFileId) + .add("diskFileInfo.owner_uid", archiveFile.diskFileInfo.owner_uid) + .add("diskFileInfo.gid", archiveFile.diskFileInfo.gid) + .add("fileSize", std::to_string(archiveFile.fileSize)) + .add("checksumBlob", archiveFile.checksumBlob) + .add("creationTime", std::to_string(archiveFile.creationTime)) + .add("reconciliationTime", std::to_string(archiveFile.reconciliationTime)) + .add("storageClass", archiveFile.storageClass); + for(auto it=archiveFile.tapeFiles.begin(); it!=archiveFile.tapeFiles.end(); it++) { + std::stringstream tapeCopyLogStream; + tapeCopyLogStream << "copy number: " << static_cast<int>(it->copyNb) + << " vid: " << it->vid + << " fSeq: " << it->fSeq + << " blockId: " << it->blockId + << " creationTime: " << it->creationTime + << " fileSize: " << it->fileSize + << " supersededByVid: " << it->supersededByVid + << " supersededByFSeq: " << it->supersededByFSeq; + spc.add("TAPE FILE", tapeCopyLogStream.str()); + } + tl.addToLog(spc); + lc.log(log::INFO, "In RdbmsCatalogue::moveArchiveFileToRecycleBin(): ArchiveFile moved to the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// insertArchiveFileToRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::copyArchiveFileToRecycleBin(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request) { + + try{ + const char *const afRecycleBinInsertSql = + "INSERT INTO ARCHIVE_FILE_RECYCLE_BIN " + "(" + "ARCHIVE_FILE_ID," + "DISK_INSTANCE_NAME," + "DISK_FILE_ID," + "DISK_FILE_ID_WHEN_DELETED," + "DISK_FILE_UID," + "DISK_FILE_GID," + "SIZE_IN_BYTES," + "CHECKSUM_BLOB," + "CHECKSUM_ADLER32," + "STORAGE_CLASS_ID," + "CREATION_TIME," + "RECONCILIATION_TIME," + "COLLOCATION_HINT," + "DISK_FILE_PATH," + "DELETION_TIME" + ") SELECT " + "ARCHIVE_FILE.ARCHIVE_FILE_ID," + "ARCHIVE_FILE.DISK_INSTANCE_NAME," + "ARCHIVE_FILE.DISK_FILE_ID," + ":DISK_FILE_ID_WHEN_DELETED," + "ARCHIVE_FILE.DISK_FILE_UID," + "ARCHIVE_FILE.DISK_FILE_GID," + "ARCHIVE_FILE.SIZE_IN_BYTES," + "ARCHIVE_FILE.CHECKSUM_BLOB," + "ARCHIVE_FILE.CHECKSUM_ADLER32," + "ARCHIVE_FILE.STORAGE_CLASS_ID," + "ARCHIVE_FILE.CREATION_TIME," + "ARCHIVE_FILE.RECONCILIATION_TIME," + "ARCHIVE_FILE.COLLOCATION_HINT," + ":DISK_FILE_PATH," + ":DELETION_TIME " + "FROM " + "ARCHIVE_FILE " + "JOIN " + "STORAGE_CLASS ON ARCHIVE_FILE.STORAGE_CLASS_ID = STORAGE_CLASS.STORAGE_CLASS_ID " + "WHERE " + "ARCHIVE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + //const auto getConnTime = t.secs(utils::Timer::resetCounter); + auto insertArchiveFileStmt = conn.createStmt(afRecycleBinInsertSql); + insertArchiveFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID); + insertArchiveFileStmt.bindString(":DISK_FILE_PATH",request.diskFilePath); + insertArchiveFileStmt.bindString(":DISK_FILE_ID_WHEN_DELETED",request.diskFileId); + const time_t now = time(nullptr); + insertArchiveFileStmt.bindUint64(":DELETION_TIME",now); + + insertArchiveFileStmt.executeNonQuery(); + + const char *const tfRecycleBinInsertSql = + "INSERT INTO TAPE_FILE_RECYCLE_BIN" + "(" + "VID," + "FSEQ," + "BLOCK_ID," + "LOGICAL_SIZE_IN_BYTES," + "COPY_NB," + "CREATION_TIME," + "ARCHIVE_FILE_ID," + "SUPERSEDED_BY_VID," + "SUPERSEDED_BY_FSEQ," + "WRITE_START_WRAP," + "WRITE_START_LPOS," + "WRITE_END_WRAP," + "WRITE_END_LPOS," + "READ_START_WRAP," + "READ_START_LPOS," + "READ_END_WRAP," + "READ_END_LPOS" + ") SELECT " + "TAPE_FILE.VID," + "TAPE_FILE.FSEQ," + "TAPE_FILE.BLOCK_ID," + "TAPE_FILE.LOGICAL_SIZE_IN_BYTES," + "TAPE_FILE.COPY_NB," + "TAPE_FILE.CREATION_TIME," + "TAPE_FILE.ARCHIVE_FILE_ID," + "TAPE_FILE.SUPERSEDED_BY_VID," + "TAPE_FILE.SUPERSEDED_BY_FSEQ," + "TAPE_FILE.WRITE_START_WRAP," + "TAPE_FILE.WRITE_START_LPOS," + "TAPE_FILE.WRITE_END_WRAP," + "TAPE_FILE.WRITE_END_LPOS," + "TAPE_FILE.READ_START_WRAP," + "TAPE_FILE.READ_START_LPOS," + "TAPE_FILE.READ_END_WRAP," + "TAPE_FILE.READ_END_LPOS " + "FROM " + "TAPE_FILE " + "WHERE TAPE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + auto insertTapeFileStmt = conn.createStmt(tfRecycleBinInsertSql); + insertTapeFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID); + + insertTapeFileStmt.executeNonQuery(); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteArchiveFileAndTapeFiles +//------------------------------------------------------------------------------ +void RdbmsCatalogue::deleteArchiveFileAndTapeFiles(rdbms::Conn& conn, const common::dataStructures::DeleteArchiveRequest& request) { + try { + const char *const deleteTapeFilesSql = + "DELETE FROM " + "TAPE_FILE " + "WHERE TAPE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + auto deleteTapeFilesStmt = conn.createStmt(deleteTapeFilesSql); + deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID); + deleteTapeFilesStmt.executeNonQuery(); + + const char *const deleteArchiveFileSql = + "DELETE FROM " + "ARCHIVE_FILE " + "WHERE ARCHIVE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + auto deleteArchiveFileStmt = conn.createStmt(deleteArchiveFileSql); + deleteArchiveFileStmt.bindUint64(":ARCHIVE_FILE_ID",request.archiveFileID); + deleteArchiveFileStmt.executeNonQuery(); + + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteFileFromRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc) { + try { + auto conn = m_connPool.getConn(); + rdbms::AutoRollback autoRollback(conn); + deleteTapeFilesAndArchiveFileFromRecycleBin(conn,archiveFileId,lc); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteTapeFilesFromRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::deleteTapeFilesFromRecycleBin(cta::rdbms::Conn & conn, const uint64_t archiveFileId) { + try { + const char *const deleteTapeFilesSql = + "DELETE FROM " + "TAPE_FILE_RECYCLE_BIN " + "WHERE TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + auto deleteTapeFilesStmt = conn.createStmt(deleteTapeFilesSql); + deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); + deleteTapeFilesStmt.executeNonQuery(); + + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteTapeFilesFromRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::deleteArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId) { + try { + const char *const deleteArchiveFileSql = + "DELETE FROM " + "ARCHIVE_FILE_RECYCLE_BIN " + "WHERE ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + + auto deleteTapeFilesStmt = conn.createStmt(deleteArchiveFileSql); + deleteTapeFilesStmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); + deleteTapeFilesStmt.executeNonQuery(); + + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteFilesFromRecycleBin +//------------------------------------------------------------------------------ +void RdbmsCatalogue::deleteFilesFromRecycleBin(rdbms::Conn & conn, const std::string& vid, cta::log::LogContext & lc) { + try { + const char *const selectArchiveFileIdSql = + "SELECT " + "TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID AS ARCHIVE_FILE_ID " + "FROM " + "TAPE_FILE_RECYCLE_BIN " + "WHERE " + "TAPE_FILE_RECYCLE_BIN.VID = :VID"; + + auto selectFileStmt = conn.createStmt(selectArchiveFileIdSql); + selectFileStmt.bindString(":VID",vid); + auto rset = selectFileStmt.executeQuery(); + std::set<uint64_t> archiveFileIds; + while(rset.next()){ + archiveFileIds.insert(rset.columnUint64("ARCHIVE_FILE_ID")); + } + rdbms::AutoRollback rollback(conn); + for(auto archiveFileId: archiveFileIds){ + deleteTapeFilesAndArchiveFileFromRecycleBin(conn,archiveFileId,lc); + } + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + } // namespace catalogue } // namespace cta diff --git a/catalogue/RdbmsCatalogue.hpp b/catalogue/RdbmsCatalogue.hpp index fb1c7d0ee09218fa7b5c37fa7f12b195789b183e..e854587272a16e9ff901e2811a0104f6d197154e 100644 --- a/catalogue/RdbmsCatalogue.hpp +++ b/catalogue/RdbmsCatalogue.hpp @@ -405,8 +405,9 @@ public: * * @param admin The administrator. * @param vid The volume identifier of the tape to be reclaimed. + * @param lc the logContext */ - void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid) override; + void reclaimTape(const common::dataStructures::SecurityIdentity &admin, const std::string &vid, cta::log::LogContext & lc) override; /** * Checks the specified tape for the tape label command. @@ -712,6 +713,15 @@ public: */ ArchiveFileItor getArchiveFilesItor(const TapeFileSearchCriteria &searchCriteria) const override; + /** + * Returns the specified deleted archive files. Please note that the list of files + * is ordered by archive file ID. + * + * @param searchCriteria The search criteria. + * @return The deleted archive files. + */ + DeletedArchiveFileItor getDeletedArchiveFilesItor(const TapeFileSearchCriteria& searchCriteria) const override; + /** * Returns the specified files in tape file sequence order. * @@ -1503,6 +1513,14 @@ protected: * @param event The evnt to be checked. */ void checkTapeFileWrittenFieldsAreSet(const std::string &callingFunc, const TapeFileWritten &event) const; + + /** + * Throws an exception if the delete request passed in parameter is not consistent + * to allow a deletion of the ArchiveFile from the Catalogue. + * @param deleteRequest, the deleteRequest to check the consistency. + * @param archiveFile the ArchiveFile to delete to check the deleteRequest consistency against. + */ + void checkDeleteRequestConsistency(const cta::common::dataStructures::DeleteArchiveRequest deleteRequest, const cta::common::dataStructures::ArchiveFile & archiveFile) const; /** * Returns a cached version of the result of calling isAdmin(). @@ -1618,6 +1636,74 @@ protected: void updateDiskFileId(uint64_t archiveFileId, const std::string &diskInstance, const std::string &diskFileId) override; + /** + * Insert the tape files and ArchiveFiles entries in the recycle-bin and delete + * them from the TAPE_FILE and ARCHIVE_FILE tables + * @param request the DeleteRequest object that holds information about the file to delete. + * @param lc the logContext + */ + void moveArchiveFileToRecycleBin(const common::dataStructures::DeleteArchiveRequest &request, + log::LogContext & lc) override; + + /** + * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables + * and deletes the ARCHIVE_FILE and TAPE_FILE entries. + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + * @param lc the log context + */ + virtual void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn,const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) = 0; + + /** + * Copies the ARCHIVE_FILE and TAPE_FILE entries to the recycle-bin tables + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + */ + void copyArchiveFileToRecycleBin(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request); + + + /** + * Delete the TAPE_FILE and ARCHIVE_FILE entries from the Catalogue + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + */ + void deleteArchiveFileAndTapeFiles(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest & request); + + /** + * Delete the archiveFile and the associated tape files from the recycle-bin + * @param archiveFileId the archiveFileId of the archive file to delete + * @param lc the logContext + */ + void deleteFileFromRecycleBin(const uint64_t archiveFileId, log::LogContext &lc); + + /** + * Delete the archiveFile and the associated tape files that are on the specified tape from the recycle-bin + * @param vid the vid of the tape where the files to be deleted are located + * @param lc the logContext + */ + void deleteFilesFromRecycleBin(rdbms::Conn & conn,const std::string & vid, log::LogContext & lc); + + /** + * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction + * @param conn the database connection + * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin + */ + virtual void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId, log::LogContext & lc) = 0; + + /** + * Delete the tape files from the TAPE_FILE recycle-bin + * @param conn the database connection + * @param archiveFileId the archiveFileId of the tape files to delete + */ + void deleteTapeFilesFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId); + + /** + * Delete the archive file from the ARCHIVE_FILE recycle-bin + * @param conn the database connection + * @param archiveFileId the archiveFileId of the archive file to delete + */ + void deleteArchiveFileFromRecycleBin(rdbms::Conn & conn, const uint64_t archiveFileId); + /** * Cached versions of tape copy to tape tape pool mappings for specific * storage classes. diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp index 94ca4177f8e2387f8ac4ff96f17ef489fe973c66..ffcca772d33d6f772b06491a22b661fe263f20c9 100644 --- a/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp +++ b/catalogue/RdbmsCatalogueGetArchiveFilesForRepackItor.hpp @@ -25,6 +25,7 @@ #include "rdbms/ConnPool.hpp" #include "rdbms/Stmt.hpp" #include "rdbms/Rset.hpp" +#include "common/dataStructures/ArchiveFile.hpp" namespace cta { namespace catalogue { @@ -112,7 +113,7 @@ private: * Builds ArchiveFile objects from a stream of tape files ordered by archive * ID and then copy number. */ - ArchiveFileBuilder m_archiveFileBuilder; + ArchiveFileBuilder<cta::common::dataStructures::ArchiveFile> m_archiveFileBuilder; }; // class RdbmsCatalogueGetArchiveFilesForRepackItor diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp index 052deabb6d29369cd1aacaafcda04bf52c580450..b1258fb43bb464531fd1c6a41288608397c01357 100644 --- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp +++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.cpp @@ -132,7 +132,7 @@ RdbmsCatalogueGetArchiveFilesItor::RdbmsCatalogueGetArchiveFilesItor( searchCriteria.tapePool; if(thereIsAtLeastOneSearchCriteria) { - sql += " WHERE "; + sql += " WHERE "; } bool addedAWhereConstraint = false; diff --git a/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp b/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp index dacdaf62acb1d31bd9feeb7d9216cc47ac1202ff..3d48a82e2602d8011e7fbbe9f24b36241ba1170e 100644 --- a/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp +++ b/catalogue/RdbmsCatalogueGetArchiveFilesItor.hpp @@ -21,6 +21,7 @@ #include "catalogue/ArchiveFileBuilder.hpp" #include "catalogue/ArchiveFileItorImpl.hpp" #include "catalogue/TapeFileSearchCriteria.hpp" +#include "common/dataStructures/ArchiveFile.hpp" #include "common/log/Logger.hpp" #include "rdbms/ConnPool.hpp" #include "rdbms/Stmt.hpp" @@ -113,7 +114,7 @@ private: * Builds ArchiveFile objects from a stream of tape files ordered by archive * ID and then copy number. */ - ArchiveFileBuilder m_archiveFileBuilder; + ArchiveFileBuilder<cta::common::dataStructures::ArchiveFile> m_archiveFileBuilder; }; // class RdbmsCatalogueGetArchiveFilesItor diff --git a/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b5f1a6b1732e872d25f04c2cd2d6c761acd75369 --- /dev/null +++ b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.cpp @@ -0,0 +1,312 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "RdbmsCatalogueGetDeletedArchiveFilesItor.hpp" +#include "common/log/LogContext.hpp" +#include "common/exception/UserError.hpp" + +namespace cta { +namespace catalogue { + + namespace { + /** + * Populates an ArchiveFile object with the current column values of the + * specified result set. + * + * @param rset The result set to be used to populate the ArchiveFile object. + * @return The populated ArchiveFile object. + */ + static common::dataStructures::DeletedArchiveFile populateDeletedArchiveFile(const rdbms::Rset &rset) { + rset.columnUint64("ARCHIVE_FILE_ID"); + if(!rset.columnIsNull("VID")) { + rset.columnUint64("COPY_NB"); + } + common::dataStructures::DeletedArchiveFile deletedArchiveFile; + + deletedArchiveFile.archiveFileID = rset.columnUint64("ARCHIVE_FILE_ID"); + deletedArchiveFile.diskInstance = rset.columnString("DISK_INSTANCE_NAME"); + deletedArchiveFile.diskFileId = rset.columnString("DISK_FILE_ID"); + deletedArchiveFile.diskFileInfo.owner_uid = rset.columnUint64("DISK_FILE_UID"); + deletedArchiveFile.diskFileInfo.gid = rset.columnUint64("DISK_FILE_GID"); + deletedArchiveFile.fileSize = rset.columnUint64("SIZE_IN_BYTES"); + deletedArchiveFile.checksumBlob.deserializeOrSetAdler32(rset.columnBlob("CHECKSUM_BLOB"), rset.columnUint64("CHECKSUM_ADLER32")); + deletedArchiveFile.storageClass = rset.columnString("STORAGE_CLASS_NAME"); + deletedArchiveFile.creationTime = rset.columnUint64("ARCHIVE_FILE_CREATION_TIME"); + deletedArchiveFile.reconciliationTime = rset.columnUint64("RECONCILIATION_TIME"); + deletedArchiveFile.diskFileIdWhenDeleted = rset.columnString("DISK_FILE_ID_WHEN_DELETED"); + deletedArchiveFile.diskFilePath = rset.columnString("DISK_FILE_PATH"); + deletedArchiveFile.deletionTime = rset.columnUint64("DELETION_TIME"); + // If there is a tape file + if (!rset.columnIsNull("VID")) { + common::dataStructures::TapeFile tapeFile; + tapeFile.vid = rset.columnString("VID"); + tapeFile.fSeq = rset.columnUint64("FSEQ"); + tapeFile.blockId = rset.columnUint64("BLOCK_ID"); + tapeFile.fileSize = rset.columnUint64("LOGICAL_SIZE_IN_BYTES"); + tapeFile.copyNb = rset.columnUint64("COPY_NB"); + tapeFile.creationTime = rset.columnUint64("TAPE_FILE_CREATION_TIME"); + tapeFile.checksumBlob = deletedArchiveFile.checksumBlob; // Duplicated for convenience + if(!rset.columnIsNull("SUPERSEDED_BY_VID") && !rset.columnIsNull("SUPERSEDED_BY_FSEQ")){ + tapeFile.supersededByVid = rset.columnString("SUPERSEDED_BY_VID"); + tapeFile.supersededByFSeq = rset.columnUint64("SUPERSEDED_BY_FSEQ"); + } + deletedArchiveFile.tapeFiles.push_back(tapeFile); + } + + return deletedArchiveFile; + } +} // anonymous namespace + +RdbmsCatalogueGetDeletedArchiveFilesItor::RdbmsCatalogueGetDeletedArchiveFilesItor( + log::Logger &log, + rdbms::ConnPool &connPool, + const TapeFileSearchCriteria &searchCriteria): + m_log(log), + m_connPool(connPool), + m_searchCriteria(searchCriteria), + m_rsetIsEmpty(true), + m_hasMoreHasBeenCalled(false), + m_archiveFileBuilder(log) { + try { + std::string sql = + "SELECT " + "ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID AS ARCHIVE_FILE_ID," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_INSTANCE_NAME AS DISK_INSTANCE_NAME," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID AS DISK_FILE_ID," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_UID AS DISK_FILE_UID," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_GID AS DISK_FILE_GID," + "ARCHIVE_FILE_RECYCLE_BIN.SIZE_IN_BYTES AS SIZE_IN_BYTES," + "ARCHIVE_FILE_RECYCLE_BIN.CHECKSUM_BLOB AS CHECKSUM_BLOB," + "ARCHIVE_FILE_RECYCLE_BIN.CHECKSUM_ADLER32 AS CHECKSUM_ADLER32," + "STORAGE_CLASS.STORAGE_CLASS_NAME AS STORAGE_CLASS_NAME," + "ARCHIVE_FILE_RECYCLE_BIN.CREATION_TIME AS ARCHIVE_FILE_CREATION_TIME," + "ARCHIVE_FILE_RECYCLE_BIN.RECONCILIATION_TIME AS RECONCILIATION_TIME," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID_WHEN_DELETED AS DISK_FILE_ID_WHEN_DELETED," + "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_PATH AS DISK_FILE_PATH," + "ARCHIVE_FILE_RECYCLE_BIN.DELETION_TIME AS DELETION_TIME," + "TAPE_FILE_RECYCLE_BIN.VID AS VID," + "TAPE_FILE_RECYCLE_BIN.FSEQ AS FSEQ," + "TAPE_FILE_RECYCLE_BIN.BLOCK_ID AS BLOCK_ID," + "TAPE_FILE_RECYCLE_BIN.LOGICAL_SIZE_IN_BYTES AS LOGICAL_SIZE_IN_BYTES," + "TAPE_FILE_RECYCLE_BIN.COPY_NB AS COPY_NB," + "TAPE_FILE_RECYCLE_BIN.CREATION_TIME AS TAPE_FILE_CREATION_TIME, " + "TAPE_FILE_RECYCLE_BIN.SUPERSEDED_BY_VID AS SUPERSEDED_BY_VID, " + "TAPE_FILE_RECYCLE_BIN.SUPERSEDED_BY_FSEQ AS SUPERSEDED_BY_FSEQ, " + "TAPE_POOL.TAPE_POOL_NAME AS TAPE_POOL_NAME " + "FROM " + "ARCHIVE_FILE_RECYCLE_BIN " + "INNER JOIN STORAGE_CLASS ON " + "ARCHIVE_FILE_RECYCLE_BIN.STORAGE_CLASS_ID = STORAGE_CLASS.STORAGE_CLASS_ID " + "LEFT OUTER JOIN TAPE_FILE_RECYCLE_BIN ON " + "ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = TAPE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID " + "LEFT OUTER JOIN TAPE ON " + "TAPE_FILE_RECYCLE_BIN.VID = TAPE.VID " + "INNER JOIN TAPE_POOL ON " + "TAPE.TAPE_POOL_ID = TAPE_POOL.TAPE_POOL_ID"; + + const bool thereIsAtLeastOneSearchCriteria = + searchCriteria.archiveFileId || + searchCriteria.diskInstance || + searchCriteria.diskFileId || + searchCriteria.diskFileOwnerUid || + searchCriteria.diskFileGid || + searchCriteria.storageClass || + searchCriteria.vid || + searchCriteria.tapeFileCopyNb || + searchCriteria.tapePool; + + if(thereIsAtLeastOneSearchCriteria) { + sql += " WHERE "; + } + + bool addedAWhereConstraint = false; + + if(searchCriteria.archiveFileId) { + sql += " ARCHIVE_FILE_RECYCLE_BIN.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + addedAWhereConstraint = true; + } + if(searchCriteria.diskInstance) { + if(addedAWhereConstraint) sql += " AND "; + sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_INSTANCE_NAME = :DISK_INSTANCE_NAME"; + addedAWhereConstraint = true; + } + if(searchCriteria.diskFileId) { + if(addedAWhereConstraint) sql += " AND "; + sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_ID = :DISK_FILE_ID"; + addedAWhereConstraint = true; + } + if(searchCriteria.diskFileOwnerUid) { + if(addedAWhereConstraint) sql += " AND "; + sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_UID = :DISK_FILE_UID"; + addedAWhereConstraint = true; + } + if(searchCriteria.diskFileGid) { + if(addedAWhereConstraint) sql += " AND "; + sql += "ARCHIVE_FILE_RECYCLE_BIN.DISK_FILE_GID = :DISK_FILE_GID"; + addedAWhereConstraint = true; + } + if(searchCriteria.storageClass) { + if(addedAWhereConstraint) sql += " AND "; + sql += "STORAGE_CLASS.STORAGE_CLASS_NAME = :STORAGE_CLASS_NAME"; + addedAWhereConstraint = true; + } + if(searchCriteria.vid) { + if(addedAWhereConstraint) sql += " AND "; + sql += "TAPE_FILE_RECYCLE_BIN.VID = :VID"; + addedAWhereConstraint = true; + } + if(searchCriteria.tapeFileCopyNb) { + if(addedAWhereConstraint) sql += " AND "; + sql += "TAPE_FILE_RECYCLE_BIN.COPY_NB = :TAPE_FILE_COPY_NB"; + addedAWhereConstraint = true; + } + if(searchCriteria.tapePool) { + if(addedAWhereConstraint) sql += " AND "; + sql += "TAPE_POOL.TAPE_POOL_NAME = :TAPE_POOL_NAME"; + } + + // Order by FSEQ if we are listing the contents of a tape, else order by + // archive file ID + if(searchCriteria.vid) { + sql += " ORDER BY FSEQ"; + } else { + sql += " ORDER BY ARCHIVE_FILE_ID, COPY_NB"; + } + + m_conn = connPool.getConn(); + m_stmt = m_conn.createStmt(sql); + if(searchCriteria.archiveFileId) { + m_stmt.bindUint64(":ARCHIVE_FILE_ID", searchCriteria.archiveFileId.value()); + } + if(searchCriteria.diskInstance) { + m_stmt.bindString(":DISK_INSTANCE_NAME", searchCriteria.diskInstance.value()); + } + if(searchCriteria.diskFileId) { + m_stmt.bindString(":DISK_FILE_ID", searchCriteria.diskFileId.value()); + } + if(searchCriteria.diskFileOwnerUid) { + m_stmt.bindUint64(":DISK_FILE_UID", searchCriteria.diskFileOwnerUid.value()); + } + if(searchCriteria.diskFileGid) { + m_stmt.bindUint64(":DISK_FILE_GID", searchCriteria.diskFileGid.value()); + } + if(searchCriteria.storageClass) { + m_stmt.bindString(":STORAGE_CLASS_NAME", searchCriteria.storageClass.value()); + } + if(searchCriteria.vid) { + m_stmt.bindString(":VID", searchCriteria.vid.value()); + } + if(searchCriteria.tapeFileCopyNb) { + m_stmt.bindUint64(":TAPE_FILE_COPY_NB", searchCriteria.tapeFileCopyNb.value()); + } + if(searchCriteria.tapePool) { + m_stmt.bindString(":TAPE_POOL_NAME", searchCriteria.tapePool.value()); + } + m_rset = m_stmt.executeQuery(); + + { + log::LogContext lc(m_log); + lc.log(log::INFO, "RdbmsCatalogueGetDeletedArchiveFilesItor - immediately after m_stmt.executeQuery()"); + } + + m_rsetIsEmpty = !m_rset.next(); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +RdbmsCatalogueGetDeletedArchiveFilesItor::~RdbmsCatalogueGetDeletedArchiveFilesItor() { +} + +bool RdbmsCatalogueGetDeletedArchiveFilesItor::hasMore() { + m_hasMoreHasBeenCalled = true; + + if(m_rsetIsEmpty) { + // If there is an ArchiveFile object under construction + if(nullptr != m_archiveFileBuilder.getArchiveFile()) { + return true; + } else { + return false; + } + } else { + return true; + } +} + + +common::dataStructures::DeletedArchiveFile RdbmsCatalogueGetDeletedArchiveFilesItor::next() { + try { + if(!m_hasMoreHasBeenCalled) { + throw exception::Exception("hasMore() must be called before next()"); + } + m_hasMoreHasBeenCalled = false; + + // If there are no more rows in the result set + if(m_rsetIsEmpty) { + // There must be an ArchiveFile object currently under construction + if(nullptr == m_archiveFileBuilder.getArchiveFile()) { + throw exception::Exception("next() was called with no more rows in the result set and no ArchiveFile object" + " under construction"); + } + + // Return the ArchiveFile object that must now be complete and clear the + // ArchiveFile builder + common::dataStructures::DeletedArchiveFile tmp = *m_archiveFileBuilder.getArchiveFile(); + m_archiveFileBuilder.clear(); + return tmp; + } + + while(true) { + auto archiveFile = populateDeletedArchiveFile(m_rset); + + auto completeArchiveFile = m_archiveFileBuilder.append(archiveFile); + + m_rsetIsEmpty = !m_rset.next(); + + // If the ArchiveFile object under construction is complete + if (nullptr != completeArchiveFile.get()) { + return *completeArchiveFile; + // The ArchiveFile object under construction is not complete + } else { + if(m_rsetIsEmpty) { + // There must be an ArchiveFile object currently under construction + if (nullptr == m_archiveFileBuilder.getArchiveFile()) { + throw exception::Exception("next() was called with no more rows in the result set and no ArchiveFile object" + " under construction"); + } + + // Return the ArchiveFile object that must now be complete and clear the + // ArchiveFile builder + common::dataStructures::DeletedArchiveFile * tmp = m_archiveFileBuilder.getArchiveFile(); + m_archiveFileBuilder.clear(); + return *tmp; + } + } + } + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +}} \ No newline at end of file diff --git a/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp new file mode 100644 index 0000000000000000000000000000000000000000..73f0d9e72231eb0947e5d9084bd372848f7f9ed9 --- /dev/null +++ b/catalogue/RdbmsCatalogueGetDeletedArchiveFilesItor.hpp @@ -0,0 +1,118 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "DeletedArchiveFileItorImpl.hpp" +#include "common/log/Logger.hpp" +#include "rdbms/ConnPool.hpp" +#include "rdbms/Stmt.hpp" +#include "rdbms/Rset.hpp" +#include "TapeFileSearchCriteria.hpp" +#include "ArchiveFileBuilder.hpp" +#include "common/dataStructures/DeletedArchiveFile.hpp" + + +namespace cta { +namespace catalogue { + +class RdbmsCatalogueGetDeletedArchiveFilesItor: public DeletedArchiveFileItorImpl { +public: + + /** + * Constructor. + * + * @param log Object representing the API to the CTA logging system. + * @param connPool The database connection pool. + * @param searchCriteria The search criteria to be used when listing archive + * files. + */ + RdbmsCatalogueGetDeletedArchiveFilesItor( + log::Logger &log, + rdbms::ConnPool &connPool, + const TapeFileSearchCriteria &searchCriteria); + + /** + * Destructor. + */ + ~RdbmsCatalogueGetDeletedArchiveFilesItor() override; + + /** + * Returns true if a call to next would return another archive file. + */ + bool hasMore() override; + + /** + * Returns the next archive or throws an exception if there isn't one. + */ + common::dataStructures::DeletedArchiveFile next() override; + +private: + + /** + * Object representing the API to the CTA logging system. + */ + log::Logger &m_log; + + /** + * The database connection pool. + */ + rdbms::ConnPool &m_connPool; + + /** + * The search criteria to be used when listing archive files. + */ + TapeFileSearchCriteria m_searchCriteria; + + /** + * True if the result set is empty. + */ + bool m_rsetIsEmpty; + + /** + * True if hasMore() has been called and the corresponding call to next() has + * not. + * + * This member-variable is used to prevent next() being called before + * hasMore(). + */ + bool m_hasMoreHasBeenCalled; + + /** + * The database connection. + */ + rdbms::Conn m_conn; + + /** + * The database statement. + */ + rdbms::Stmt m_stmt; + + /** + * The result set of archive files that is to be iterated over. + */ + rdbms::Rset m_rset; + + /** + * Builds ArchiveFile objects from a stream of tape files ordered by archive + * ID and then copy number. + */ + ArchiveFileBuilder<cta::common::dataStructures::DeletedArchiveFile> m_archiveFileBuilder; +}; + +}} diff --git a/catalogue/SqliteCatalogue.cpp b/catalogue/SqliteCatalogue.cpp index 0b77f36b3c7d03a158ed906200fd7df52d06a497..aa421d86064dcf7c8c911b4bd6d0506878807b08 100644 --- a/catalogue/SqliteCatalogue.cpp +++ b/catalogue/SqliteCatalogue.cpp @@ -28,6 +28,7 @@ #include "rdbms/AutoRollback.hpp" #include "rdbms/ConstraintError.hpp" #include "rdbms/PrimaryKeyError.hpp" +#include "common/log/TimingList.hpp" namespace cta { namespace catalogue { @@ -126,6 +127,8 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con stmt.executeNonQuery(); } + const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + std::set<std::string> vidsToSetDirty; //We will insert the vids to set dirty in a set so that //we limit the calls to setTapeDirty to the number of tapes that contained the deleted tape files @@ -137,7 +140,7 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con setTapeDirty(conn,vidToSetDirty); } - const auto deleteFromTapeFileTime = t.secs(utils::Timer::resetCounter); + const auto setTapeDirtyTime = t.secs(utils::Timer::resetCounter); { const char *const sql = "DELETE FROM ARCHIVE_FILE WHERE ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID;"; @@ -165,6 +168,7 @@ void SqliteCatalogue::deleteArchiveFile(const std::string &diskInstanceName, con .add("getArchiveFileTime", getArchiveFileTime) .add("deleteFromTapeFileTime", deleteFromTapeFileTime) .add("deleteFromArchiveFileTime", deleteFromArchiveFileTime) + .add("setTapeDirtyTime",setTapeDirtyTime) .add("commitTime", commitTime); for(auto it=archiveFile->tapeFiles.begin(); it!=archiveFile->tapeFiles.end(); it++) { std::stringstream tapeCopyLogStream; @@ -501,5 +505,64 @@ void SqliteCatalogue::fileWrittenToTape(rdbms::Conn &conn, const TapeFileWritten } } +//------------------------------------------------------------------------------ +// copyArchiveFileToRecycleBinAndDelete +//------------------------------------------------------------------------------ +void SqliteCatalogue::copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do an INSERT INTO and a DELETE FROM + //in a single transaction + conn.executeNonQuery("BEGIN TRANSACTION"); + copyArchiveFileToRecycleBin(conn,request); + tl.insertAndReset("insertToRecycleBinTime",t); + deleteArchiveFileAndTapeFiles(conn,request); + tl.insertAndReset("deleteArchiveFileAndTapeFilesTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",request.archiveFileID); + spc.add("diskFileId",request.diskFileId); + spc.add("diskFilePath",request.diskFilePath); + spc.add("diskInstance",request.diskInstance); + tl.addToLog(spc); + lc.log(log::INFO,"In MysqlCatalogue::moveArchiveFileToRecycleBinAndDelete: ArchiveFile moved to the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + +//------------------------------------------------------------------------------ +// deleteTapeFilesAndArchiveFileFromRecycleBin +//------------------------------------------------------------------------------ +void SqliteCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) { + try { + utils::Timer t; + log::TimingList tl; + //We currently do two delete in one transaction + conn.executeNonQuery("BEGIN TRANSACTION"); + deleteTapeFilesFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteTapeFilesTime",t); + deleteArchiveFileFromRecycleBin(conn,archiveFileId); + tl.insertAndReset("deleteArchiveFileTime",t); + conn.commit(); + tl.insertAndReset("commitTime",t); + log::ScopedParamContainer spc(lc); + spc.add("archiveFileId",archiveFileId); + tl.addToLog(spc); + lc.log(log::INFO,"In SqliteCatalogue::deleteTapeFilesAndArchiveFileFromRecycleBin: tape files and archiveFiles deleted from the recycle-bin."); + } catch(exception::UserError &) { + throw; + } catch(exception::Exception &ex) { + ex.getMessage().str(std::string(__FUNCTION__) + ": " + ex.getMessage().str()); + throw; + } +} + + } // namespace catalogue } // namespace cta diff --git a/catalogue/SqliteCatalogue.hpp b/catalogue/SqliteCatalogue.hpp index 205d82769b18f02665dcd982246540bae681efa5..a0a01144b8d4e136bcf7b84162a8b7cfe800f008 100644 --- a/catalogue/SqliteCatalogue.hpp +++ b/catalogue/SqliteCatalogue.hpp @@ -162,7 +162,23 @@ protected: * @param events The tape file written events. */ void filesWrittenToTape(const std::set<TapeItemWrittenPointer> &events) override; - + + /** + * Copy the archiveFile and the associated tape files from the ARCHIVE_FILE and TAPE_FILE tables to the recycle-bin tables + * and deletes the ARCHIVE_FILE and TAPE_FILE entries. + * @param conn the database connection + * @param request the request that contains the necessary informations to identify the archiveFile to copy to the recycle-bin + * @param lc the log context + */ + void copyArchiveFileToRecycleBinAndDelete(rdbms::Conn & conn, const common::dataStructures::DeleteArchiveRequest &request, log::LogContext & lc) override; + + /** + * Delete the TapeFiles and the ArchiveFile from the recycle-bin in one transaction + * @param conn the database connection + * @param archiveFileId the archiveFileId of the file to delete from the recycle-bin + */ + void deleteTapeFilesAndArchiveFileFromRecycleBin(rdbms::Conn& conn, const uint64_t archiveFileId, log::LogContext& lc) override; + private: /** diff --git a/catalogue/TapeFileSearchCriteria.hpp b/catalogue/TapeFileSearchCriteria.hpp index 8ce77fa56aaa3793de0d571c159ce36890a723e4..3ce165e1635592256fa49a46f4c687b718501b47 100644 --- a/catalogue/TapeFileSearchCriteria.hpp +++ b/catalogue/TapeFileSearchCriteria.hpp @@ -83,7 +83,7 @@ struct TapeFileSearchCriteria { * The name of a tape pool. */ optional<std::string> tapePool; - + }; // struct TapeFileSearchCriteria } // namespace catalogue diff --git a/catalogue/common_catalogue_schema.sql b/catalogue/common_catalogue_schema.sql index b03bab6dd2a23505f6b94f63d78af03f4a0db701..cccdc10470edb42536f1afadd095b0402910591b 100644 --- a/catalogue/common_catalogue_schema.sql +++ b/catalogue/common_catalogue_schema.sql @@ -288,3 +288,51 @@ CREATE TABLE EXPERIMENTS ( NAME VARCHAR(20), GID UINT32TYPE CONSTRAINT EXPERIMENTS_GID_PK PRIMARY KEY ); +CREATE TABLE ARCHIVE_FILE_RECYCLE_BIN( + ARCHIVE_FILE_ID UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_AFI_NN NOT NULL, + DISK_INSTANCE_NAME VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DIN_NN NOT NULL, + DISK_FILE_ID VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFI_NN NOT NULL, + DISK_FILE_ID_WHEN_DELETED VARCHAR(100) CONSTRAINT ARCHIVE_FILE_RB_DFIWD_NN NOT NULL, + DISK_FILE_UID UINT32TYPE CONSTRAINT ARCHIVE_FILE_RB_DFUID_NN NOT NULL, + DISK_FILE_GID UINT32TYPE CONSTRAINT ARCHIVE_FILE_RB_DFGID_NN NOT NULL, + SIZE_IN_BYTES UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_SIB_NN NOT NULL, + CHECKSUM_BLOB CHECKSUM_BLOB_TYPE, + CHECKSUM_ADLER32 UINT32TYPE CONSTRAINT ARCHIVE_FILE_RB_CB2_NN NOT NULL, + STORAGE_CLASS_ID UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_SCI_NN NOT NULL, + CREATION_TIME UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_CT2_NN NOT NULL, + RECONCILIATION_TIME UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_RT_NN NOT NULL, + COLLOCATION_HINT VARCHAR(100), + DISK_FILE_PATH VARCHAR(2000) CONSTRAINT ARCHIVE_FILE_RB_DFP_NN NOT NULL, + DELETION_TIME UINT64TYPE CONSTRAINT ARCHIVE_FILE_RB_DT_NN NOT NULL, + CONSTRAINT ARCHIVE_FILE_RB_PK PRIMARY KEY(ARCHIVE_FILE_ID), + CONSTRAINT ARCHIVE_FILE_RB_SC_FK FOREIGN KEY(STORAGE_CLASS_ID) REFERENCES STORAGE_CLASS(STORAGE_CLASS_ID), + CONSTRAINT ARCHIVE_FILE_RB_DIN_DFI_UN UNIQUE(DISK_INSTANCE_NAME, DISK_FILE_ID) +); +CREATE TABLE TAPE_FILE_RECYCLE_BIN( + VID VARCHAR(100) CONSTRAINT TAPE_FILE_RB_V_NN NOT NULL, + FSEQ UINT64TYPE CONSTRAINT TAPE_FILE_RB_F_NN NOT NULL, + BLOCK_ID UINT64TYPE CONSTRAINT TAPE_FILE_RB_BI_NN NOT NULL, + LOGICAL_SIZE_IN_BYTES UINT64TYPE CONSTRAINT TAPE_FILE_RB_CSIB_NN NOT NULL, + COPY_NB UINT8TYPE CONSTRAINT TAPE_FILE_RB_CN_NN NOT NULL, + CREATION_TIME UINT64TYPE CONSTRAINT TAPE_FILE_RB_CT_NN NOT NULL, + ARCHIVE_FILE_ID UINT64TYPE CONSTRAINT TAPE_FILE_RB_AFI_NN NOT NULL, + SUPERSEDED_BY_VID VARCHAR(100), + SUPERSEDED_BY_FSEQ UINT64TYPE, + WRITE_START_WRAP UINT16TYPE, + WRITE_START_LPOS UINT32TYPE, + WRITE_END_WRAP UINT16TYPE, + WRITE_END_LPOS UINT32TYPE, + READ_START_WRAP UINT16TYPE, + READ_START_LPOS UINT32TYPE, + READ_END_WRAP UINT16TYPE, + READ_END_LPOS UINT32TYPE, + CONSTRAINT TAPE_FILE_RB_PK PRIMARY KEY(VID, FSEQ), + CONSTRAINT TAPE_FILE_RB_TAPE_FK FOREIGN KEY(VID) + REFERENCES TAPE(VID), + CONSTRAINT TAPE_FILE_RB_ARCHIVE_FILE_FK FOREIGN KEY(ARCHIVE_FILE_ID) + REFERENCES ARCHIVE_FILE_RECYCLE_BIN(ARCHIVE_FILE_ID), + CONSTRAINT TAPE_FILE_RB_VID_BLOCK_ID_UN UNIQUE(VID, BLOCK_ID), + CONSTRAINT TAPE_FILE_RB_COPY_NB_GT_0_CK CHECK(COPY_NB > 0), + CONSTRAINT TAPE_FILE_RB_SS_VID_FSEQ_FK FOREIGN KEY(SUPERSEDED_BY_VID, SUPERSEDED_BY_FSEQ) + REFERENCES TAPE_FILE_RECYCLE_BIN(VID, FSEQ) +); \ No newline at end of file diff --git a/cmake/CTAVersions.cmake b/cmake/CTAVersions.cmake index dc13954698be3830f9bfb97aa897b453754b8afb..e26723e6446bcfa6fbff1d5d33ae7d6d7422fd97 100644 --- a/cmake/CTAVersions.cmake +++ b/cmake/CTAVersions.cmake @@ -4,7 +4,7 @@ set(CTA_RELEASE 1) set(XROOTD_SSI_PROTOBUF_INTERFACE_VERSION "v0.0") # Catalogue Schema Version -set(CTA_CATALOGUE_SCHEMA_VERSION_MAJOR 2) +set(CTA_CATALOGUE_SCHEMA_VERSION_MAJOR 3) set(CTA_CATALOGUE_SCHEMA_VERSION_MINOR 0) # Shared object internal version (used in SONAME) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index ba0230ae4a051c6469d2f4542982dc8661d18435..b2996524de4cec27a98a7af9a684699c837db792 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -43,6 +43,7 @@ set (COMMON_LIB_SRC_FILES dataStructures/ArchiveRequest.cpp dataStructures/ArchiveRoute.cpp dataStructures/CancelRetrieveRequest.cpp + dataStructures/DeletedArchiveFile.cpp dataStructures/DeleteArchiveRequest.cpp dataStructures/DesiredDriveState.cpp dataStructures/DiskFileInfo.cpp diff --git a/common/dataStructures/ArchiveFile.hpp b/common/dataStructures/ArchiveFile.hpp index f5e7f974455941ce0971905c843ebc1fc0ee29a5..f1ef39e95f0689e6f4063e021976c5692637a20d 100644 --- a/common/dataStructures/ArchiveFile.hpp +++ b/common/dataStructures/ArchiveFile.hpp @@ -36,7 +36,7 @@ namespace dataStructures { struct ArchiveFile { ArchiveFile(); - + /** * Equality operator that does NOT compare the creationTime and * reconciliationTime member-variables. diff --git a/common/dataStructures/DeleteArchiveRequest.cpp b/common/dataStructures/DeleteArchiveRequest.cpp index c477234cd13ed1548b7d3e21272c776ff46a5b8e..ccfae394f713630e9a736caeb21014697202d96f 100644 --- a/common/dataStructures/DeleteArchiveRequest.cpp +++ b/common/dataStructures/DeleteArchiveRequest.cpp @@ -35,7 +35,8 @@ DeleteArchiveRequest::DeleteArchiveRequest(): //------------------------------------------------------------------------------ bool DeleteArchiveRequest::operator==(const DeleteArchiveRequest &rhs) const { return requester==rhs.requester - && archiveFileID==rhs.archiveFileID && address==rhs.address; + && archiveFileID==rhs.archiveFileID && address==rhs.address && diskFileId == rhs.diskFileId + && diskFilePath == rhs.diskFilePath && recycleTime == rhs.recycleTime && diskInstance == rhs.diskInstance; } //------------------------------------------------------------------------------ @@ -51,6 +52,10 @@ bool DeleteArchiveRequest::operator!=(const DeleteArchiveRequest &rhs) const { std::ostream &operator<<(std::ostream &os, const DeleteArchiveRequest &obj) { os << "(requester=" << obj.requester << " archiveFileID=" << obj.archiveFileID + << " diskFileId=" << obj.diskFileId + << " diskFilePath=" << obj.diskFilePath + << " recycleTime=" << obj.recycleTime + << " instanceName=" << obj.diskInstance << " address=" << (obj.address ? obj.address.value() : "null") <<")"; return os; } diff --git a/common/dataStructures/DeleteArchiveRequest.hpp b/common/dataStructures/DeleteArchiveRequest.hpp index d7060d252ee696a927be0df68d174e1bd307dead..ec7c75bab2fd3de81384d66b897cabfb0c3e2941 100644 --- a/common/dataStructures/DeleteArchiveRequest.hpp +++ b/common/dataStructures/DeleteArchiveRequest.hpp @@ -45,6 +45,10 @@ struct DeleteArchiveRequest { RequesterIdentity requester; uint64_t archiveFileID; cta::optional<std::string> address; + std::string diskFilePath; + std::string diskFileId; + std::string diskInstance; + time_t recycleTime; }; // struct DeleteArchiveRequest diff --git a/common/dataStructures/DeletedArchiveFile.cpp b/common/dataStructures/DeletedArchiveFile.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c10aaa31670128794056f7feaf111caab85205d0 --- /dev/null +++ b/common/dataStructures/DeletedArchiveFile.cpp @@ -0,0 +1,27 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "DeletedArchiveFile.hpp" + +namespace cta { +namespace common { +namespace dataStructures { + + DeletedArchiveFile::DeletedArchiveFile():ArchiveFile(){} + +}}} \ No newline at end of file diff --git a/common/dataStructures/DeletedArchiveFile.hpp b/common/dataStructures/DeletedArchiveFile.hpp new file mode 100644 index 0000000000000000000000000000000000000000..47270b25bc67bb43fe4346d5dd4c7a0797d34245 --- /dev/null +++ b/common/dataStructures/DeletedArchiveFile.hpp @@ -0,0 +1,37 @@ +/* + * The CERN Tape Archive (CTA) project + * Copyright (C) 2019 CERN + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#include "ArchiveFile.hpp" + + +namespace cta { +namespace common { +namespace dataStructures { + +struct DeletedArchiveFile: public ArchiveFile { + + DeletedArchiveFile(); + + std::string diskFilePath; + std::string diskFileIdWhenDeleted; + time_t deletionTime; +}; + +}}} \ No newline at end of file diff --git a/scheduler/Scheduler.cpp b/scheduler/Scheduler.cpp index 085986a314019bd6aef9666093ee59a7c1744300..d642652bcc624ef6100911cd6c571866e0708c9e 100644 --- a/scheduler/Scheduler.cpp +++ b/scheduler/Scheduler.cpp @@ -250,15 +250,17 @@ void Scheduler::deleteArchive(const std::string &instanceName, const common::dat // fully queued, or partially queued. // First, make sure the file is not queued anymore. utils::Timer t; - + log::TimingList tl; if(request.address) { //Check if address is provided, we can remove the request from the objectstore m_db.cancelArchive(request,lc); } - m_catalogue.deleteArchiveFile(instanceName, request.archiveFileID, lc); - auto catalogueTime = t.secs(cta::utils::Timer::resetCounter); + tl.insertAndReset("schedulerDbTime",t); + //m_catalogue.deleteArchiveFile(instanceName, request.archiveFileID, lc); + m_catalogue.moveArchiveFileToRecycleBin(request,lc); + tl.insertAndReset("catalogueTime",t); log::ScopedParamContainer spc(lc); - spc.add("catalogueTime", catalogueTime); + tl.addToLog(spc); lc.log(log::INFO, "In Scheduler::deleteArchive(): success."); } diff --git a/xroot_plugins/XrdSsiCtaRequestMessage.cpp b/xroot_plugins/XrdSsiCtaRequestMessage.cpp index a78cbafda01f510c8808ff5280859eaeb9ef6a41..1e79a1f61225005d8a058f9466379511a46d0412 100644 --- a/xroot_plugins/XrdSsiCtaRequestMessage.cpp +++ b/xroot_plugins/XrdSsiCtaRequestMessage.cpp @@ -614,15 +614,20 @@ void RequestMessage::processDELETE(const cta::eos::Notification ¬ification, c // Validate received protobuf checkIsNotEmptyString(notification.cli().user().username(), "notification.cli.user.username"); checkIsNotEmptyString(notification.cli().user().groupname(), "notification.cli.user.groupname"); + checkIsNotEmptyString(notification.file().lpath(), "notification.file.lpath"); // Unpack message cta::common::dataStructures::DeleteArchiveRequest request; request.requester.name = notification.cli().user().username(); request.requester.group = notification.cli().user().groupname(); + std::string lpath = notification.file().lpath(); + uint64_t diskFileId = notification.file().fid(); + request.diskFilePath = lpath; + request.diskFileId = std::to_string(diskFileId); + request.diskInstance = m_cliIdentity.username; // CTA Archive ID is an EOS extended attribute, i.e. it is stored as a string, which // must be converted to a valid uint64_t - auto archiveFileIdItor = notification.file().xattr().find("sys.archive.file_id"); if(notification.file().xattr().end() == archiveFileIdItor) { // Fall back to the old xattr format @@ -640,7 +645,10 @@ void RequestMessage::processDELETE(const cta::eos::Notification ¬ification, c auto archiveRequestAddrItor = notification.file().xattr().find("sys.cta.archive.objectstore.id"); if(archiveRequestAddrItor != notification.file().xattr().end()){ //We have the ArchiveRequest's objectstore address. - request.address = archiveRequestAddrItor->second; + std::string objectstoreAddress = archiveRequestAddrItor->second; + if(!objectstoreAddress.empty()){ + request.address = archiveRequestAddrItor->second; + } } // Delete the file from the catalogue or from the objectstore if archive request is created @@ -651,6 +659,7 @@ void RequestMessage::processDELETE(const cta::eos::Notification ¬ification, c cta::log::ScopedParamContainer params(m_lc); params.add("fileId", request.archiveFileID) .add("address", (request.address ? request.address.value() : "null")) + .add("filePath",request.diskFilePath) .add("schedulerTime", t.secs()); m_lc.log(cta::log::INFO, "In RequestMessage::processDELETE(): archive file deleted."); @@ -1591,7 +1600,7 @@ void RequestMessage::processTape_Reclaim(cta::xrd::Response &response) auto &vid = getRequired(OptionString::VID); - m_catalogue.reclaimTape(m_cliIdentity, vid); + m_catalogue.reclaimTape(m_cliIdentity, vid,m_lc); response.set_type(cta::xrd::Response::RSP_SUCCESS); }