diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index fe837177a802284800b3eda873826d15bdad22ec..a1cae844e0cceb92514065822c00a45d32365a98 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -7710,22 +7710,85 @@ void RdbmsCatalogue::insertTapeFile( stmt.executeNonQuery(); } { + uint64_t fileRecycleLogId = getNextFileRecyleLogId(conn); const char *const sql = - "UPDATE TAPE_FILE SET " - "SUPERSEDED_BY_VID=:NEW_VID, " //VID of the new file - "SUPERSEDED_BY_FSEQ=:NEW_FSEQ " //FSEQ of the new file - "WHERE" - " TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID AND" - " TAPE_FILE.COPY_NB=:COPY_NB AND" - " ( TAPE_FILE.VID <> :NEW_VID2 OR TAPE_FILE.FSEQ <> :NEW_FSEQ2 )"; - + "INSERT INTO FILE_RECYCLE_LOG (" + "FILE_RECYCLE_LOG_ID," + "VID," + "FSEQ," + "BLOCK_ID," + "LOGICAL_SIZE_IN_BYTES," + "COPY_NB," + "TAPE_FILE_CREATION_TIME," + "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," + "ARCHIVE_FILE_CREATION_TIME," + "RECONCILIATION_TIME," + "COLLOCATION_HINT," + "REASON_LOG," + "RECYCLE_LOG_TIME" + ") SELECT " + ":FILE_RECYCLE_LOG_ID," + "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," + "ARCHIVE_FILE.DISK_INSTANCE_NAME AS DISK_INSTANCE_NAME," + "ARCHIVE_FILE.DISK_FILE_ID AS DISK_FILE_ID," + "ARCHIVE_FILE.DISK_FILE_ID AS DISK_FILE_ID_2," + "ARCHIVE_FILE.DISK_FILE_UID AS DISK_FILE_UID," + "ARCHIVE_FILE.DISK_FILE_GID AS DISK_FILE_GID," + "ARCHIVE_FILE.SIZE_IN_BYTES AS SIZE_IN_BYTES," + "ARCHIVE_FILE.CHECKSUM_BLOB AS CHECKSUM_BLOB," + "ARCHIVE_FILE.CHECKSUM_ADLER32 AS CHECKSUM_ADLER32," + "ARCHIVE_FILE.STORAGE_CLASS_ID AS STORAGE_CLASS_ID," + "ARCHIVE_FILE.CREATION_TIME AS ARCHIVE_FILE_CREATION_TIME," + "ARCHIVE_FILE.RECONCILIATION_TIME AS RECONCILIATION_TIME," + "ARCHIVE_FILE.COLLOCATION_HINT AS COLLOCATION_HINT," + ":REASON_LOG," + ":RECYCLE_LOG_TIME " + "FROM " + "ARCHIVE_FILE " + "JOIN TAPE_FILE ON " + "ARCHIVE_FILE.ARCHIVE_FILE_ID = TAPE_FILE.ARCHIVE_FILE_ID AND TAPE_FILE.COPY_NB=:COPY_NB AND TAPE_FILE.VID <> :NEW_VID AND TAPE_FILE.FSEQ <> :NEW_FSEQ " + "WHERE " + "ARCHIVE_FILE.ARCHIVE_FILE_ID = :ARCHIVE_FILE_ID"; + auto stmt = conn.createStmt(sql); - stmt.bindString(":NEW_VID", tapeFile.vid); - stmt.bindUint64(":NEW_FSEQ", tapeFile.fSeq); - stmt.bindString(":NEW_VID2", tapeFile.vid); - stmt.bindUint64(":NEW_FSEQ2", tapeFile.fSeq); - stmt.bindUint64(":ARCHIVE_FILE_ID", archiveFileId); - stmt.bindUint64(":COPY_NB", tapeFile.copyNb); + + stmt.bindUint64(":FILE_RECYCLE_LOG_ID",fileRecycleLogId); + std::string fileRecycleLog = "REPACK"; + stmt.bindString(":REASON_LOG",fileRecycleLog); + stmt.bindUint64(":RECYCLE_LOG_TIME",time(nullptr)); + + stmt.bindUint8(":COPY_NB",tapeFile.copyNb); + stmt.bindString(":NEW_VID",tapeFile.vid); + stmt.bindUint64(":NEW_FSEQ",tapeFile.fSeq); + stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); + + stmt.executeNonQuery(); + } + { + const char *const sql = + "DELETE FROM " + "TAPE_FILE " + "WHERE COPY_NB=:COPY_NB AND (VID<>:VID OR TAPE_FILE.FSEQ<>:FSEQ) AND TAPE_FILE.ARCHIVE_FILE_ID=:ARCHIVE_FILE_ID"; + auto stmt = conn.createStmt(sql); + stmt.bindUint8(":COPY_NB",tapeFile.copyNb); + stmt.bindString(":VID",tapeFile.vid); + stmt.bindUint64(":FSEQ",tapeFile.fSeq); + stmt.bindUint64(":ARCHIVE_FILE_ID",archiveFileId); stmt.executeNonQuery(); } conn.commit();