From e7b6749e2bc437ae7fc71b01dbf1213e2168782e Mon Sep 17 00:00:00 2001 From: Steven Murray <steven.murray@cern.ch> Date: Thu, 11 Aug 2016 15:42:33 +0200 Subject: [PATCH] Appropriate DB column names now end with _IN_BYTES --- catalogue/OracleCatalogue.cpp | 8 +++---- catalogue/RdbmsCatalogue.cpp | 32 +++++++++++++------------- catalogue/catalogue_common_schema.sql | 16 ++++++------- catalogue/catalogue_schema.pdf | Bin 94410 -> 94364 bytes 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/catalogue/OracleCatalogue.cpp b/catalogue/OracleCatalogue.cpp index 5f879826e0..06a9e94c1e 100644 --- a/catalogue/OracleCatalogue.cpp +++ b/catalogue/OracleCatalogue.cpp @@ -62,7 +62,7 @@ common::dataStructures::ArchiveFile OracleCatalogue::deleteArchiveFile( "ARCHIVE_FILE.DISK_FILE_USER AS DISK_FILE_USER," "ARCHIVE_FILE.DISK_FILE_GROUP AS DISK_FILE_GROUP," "ARCHIVE_FILE.DISK_FILE_RECOVERY_BLOB AS DISK_FILE_RECOVERY_BLOB," - "ARCHIVE_FILE.FILE_SIZE AS FILE_SIZE," + "ARCHIVE_FILE.SIZE_IN_BYTES AS SIZE_IN_BYTES," "ARCHIVE_FILE.CHECKSUM_TYPE AS CHECKSUM_TYPE," "ARCHIVE_FILE.CHECKSUM_VALUE AS CHECKSUM_VALUE," "ARCHIVE_FILE.STORAGE_CLASS_NAME AS STORAGE_CLASS_NAME," @@ -71,7 +71,7 @@ common::dataStructures::ArchiveFile OracleCatalogue::deleteArchiveFile( "TAPE_FILE.VID AS VID," "TAPE_FILE.FSEQ AS FSEQ," "TAPE_FILE.BLOCK_ID AS BLOCK_ID," - "TAPE_FILE.COMPRESSED_SIZE AS COMPRESSED_SIZE," + "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " "FROM " @@ -97,7 +97,7 @@ common::dataStructures::ArchiveFile OracleCatalogue::deleteArchiveFile( archiveFile->diskFileInfo.owner = selectRset->columnString("DISK_FILE_USER"); archiveFile->diskFileInfo.group = selectRset->columnString("DISK_FILE_GROUP"); archiveFile->diskFileInfo.recoveryBlob = selectRset->columnString("DISK_FILE_RECOVERY_BLOB"); - archiveFile->fileSize = selectRset->columnUint64("FILE_SIZE"); + archiveFile->fileSize = selectRset->columnUint64("SIZE_IN_BYTES"); archiveFile->checksumType = selectRset->columnString("CHECKSUM_TYPE"); archiveFile->checksumValue = selectRset->columnString("CHECKSUM_VALUE"); archiveFile->storageClass = selectRset->columnString("STORAGE_CLASS_NAME"); @@ -112,7 +112,7 @@ common::dataStructures::ArchiveFile OracleCatalogue::deleteArchiveFile( tapeFile.vid = selectRset->columnString("VID"); tapeFile.fSeq = selectRset->columnUint64("FSEQ"); tapeFile.blockId = selectRset->columnUint64("BLOCK_ID"); - tapeFile.compressedSize = selectRset->columnUint64("COMPRESSED_SIZE"); + tapeFile.compressedSize = selectRset->columnUint64("COMPRESSED_SIZE_IN_BYTES"); tapeFile.copyNb = selectRset->columnUint64("COPY_NB"); tapeFile.creationTime = selectRset->columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience diff --git a/catalogue/RdbmsCatalogue.cpp b/catalogue/RdbmsCatalogue.cpp index f5be4bd7e8..88ce043981 100644 --- a/catalogue/RdbmsCatalogue.cpp +++ b/catalogue/RdbmsCatalogue.cpp @@ -3281,7 +3281,7 @@ void RdbmsCatalogue::insertArchiveFile(rdbms::Conn &conn, const ArchiveFileRow & "DISK_FILE_USER," "DISK_FILE_GROUP," "DISK_FILE_RECOVERY_BLOB," - "FILE_SIZE," + "SIZE_IN_BYTES," "CHECKSUM_TYPE," "CHECKSUM_VALUE," "STORAGE_CLASS_NAME," @@ -3295,7 +3295,7 @@ void RdbmsCatalogue::insertArchiveFile(rdbms::Conn &conn, const ArchiveFileRow & ":DISK_FILE_USER," ":DISK_FILE_GROUP," ":DISK_FILE_RECOVERY_BLOB," - ":FILE_SIZE," + ":SIZE_IN_BYTES," ":CHECKSUM_TYPE," ":CHECKSUM_VALUE," ":STORAGE_CLASS_NAME," @@ -3310,7 +3310,7 @@ void RdbmsCatalogue::insertArchiveFile(rdbms::Conn &conn, const ArchiveFileRow & stmt->bindString(":DISK_FILE_USER", row.diskFileUser); stmt->bindString(":DISK_FILE_GROUP", row.diskFileGroup); stmt->bindString(":DISK_FILE_RECOVERY_BLOB", row.diskFileRecoveryBlob); - stmt->bindUint64(":FILE_SIZE", row.size); + stmt->bindUint64(":SIZE_IN_BYTES", row.size); stmt->bindString(":CHECKSUM_TYPE", row.checksumType); stmt->bindString(":CHECKSUM_VALUE", row.checksumValue); stmt->bindString(":STORAGE_CLASS_NAME", row.storageClassName); @@ -3419,7 +3419,7 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveFilesFo "ARCHIVE_FILE.DISK_FILE_USER AS DISK_FILE_USER," "ARCHIVE_FILE.DISK_FILE_GROUP AS DISK_FILE_GROUP," "ARCHIVE_FILE.DISK_FILE_RECOVERY_BLOB AS DISK_FILE_RECOVERY_BLOB," - "ARCHIVE_FILE.FILE_SIZE AS FILE_SIZE," + "ARCHIVE_FILE.SIZE_IN_BYTES AS SIZE_IN_BYTES," "ARCHIVE_FILE.CHECKSUM_TYPE AS CHECKSUM_TYPE," "ARCHIVE_FILE.CHECKSUM_VALUE AS CHECKSUM_VALUE," "ARCHIVE_FILE.STORAGE_CLASS_NAME AS STORAGE_CLASS_NAME," @@ -3428,7 +3428,7 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveFilesFo "TAPE_FILE.VID AS VID," "TAPE_FILE.FSEQ AS FSEQ," "TAPE_FILE.BLOCK_ID AS BLOCK_ID," - "TAPE_FILE.COMPRESSED_SIZE AS COMPRESSED_SIZE," + "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME, " "TAPE.TAPE_POOL_NAME AS TAPE_POOL_NAME " @@ -3535,7 +3535,7 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveFilesFo archiveFile.diskFileInfo.owner = rset->columnString("DISK_FILE_USER"); archiveFile.diskFileInfo.group = rset->columnString("DISK_FILE_GROUP"); archiveFile.diskFileInfo.recoveryBlob = rset->columnString("DISK_FILE_RECOVERY_BLOB"); - archiveFile.fileSize = rset->columnUint64("FILE_SIZE"); + archiveFile.fileSize = rset->columnUint64("SIZE_IN_BYTES"); archiveFile.checksumType = rset->columnString("CHECKSUM_TYPE"); archiveFile.checksumValue = rset->columnString("CHECKSUM_VALUE"); archiveFile.storageClass = rset->columnString("STORAGE_CLASS_NAME"); @@ -3553,7 +3553,7 @@ std::list<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveFilesFo tapeFile.vid = rset->columnString("VID"); tapeFile.fSeq = rset->columnUint64("FSEQ"); tapeFile.blockId = rset->columnUint64("BLOCK_ID"); - tapeFile.compressedSize = rset->columnUint64("COMPRESSED_SIZE"); + tapeFile.compressedSize = rset->columnUint64("COMPRESSED_SIZE_IN_BYTES"); tapeFile.copyNb = rset->columnUint64("COPY_NB"); tapeFile.creationTime = rset->columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile.checksumType; // Duplicated for convenience @@ -3577,8 +3577,8 @@ common::dataStructures::ArchiveFileSummary RdbmsCatalogue::getTapeFileSummary( try { std::string sql = "SELECT " - "COALESCE(SUM(ARCHIVE_FILE.FILE_SIZE), 0) AS TOTAL_BYTES," - "COALESCE(SUM(TAPE_FILE.COMPRESSED_SIZE), 0) AS TOTAL_COMPRESSED_BYTES," + "COALESCE(SUM(ARCHIVE_FILE.SIZE_IN_BYTES), 0) AS TOTAL_BYTES," + "COALESCE(SUM(TAPE_FILE.COMPRESSED_SIZE_IN_BYTES), 0) AS TOTAL_COMPRESSED_BYTES," "COUNT(ARCHIVE_FILE.ARCHIVE_FILE_ID) AS TOTAL_FILES " "FROM " "ARCHIVE_FILE " @@ -4265,7 +4265,7 @@ void RdbmsCatalogue::insertTapeFile( "VID," "FSEQ," "BLOCK_ID," - "COMPRESSED_SIZE," + "COMPRESSED_SIZE_IN_BYTES," "COPY_NB," "CREATION_TIME," "ARCHIVE_FILE_ID)" @@ -4273,7 +4273,7 @@ void RdbmsCatalogue::insertTapeFile( ":VID," ":FSEQ," ":BLOCK_ID," - ":COMPRESSED_SIZE," + ":COMPRESSED_SIZE_IN_BYTES," ":COPY_NB," ":CREATION_TIME," ":ARCHIVE_FILE_ID)"; @@ -4282,7 +4282,7 @@ void RdbmsCatalogue::insertTapeFile( stmt->bindString(":VID", tapeFile.vid); stmt->bindUint64(":FSEQ", tapeFile.fSeq); stmt->bindUint64(":BLOCK_ID", tapeFile.blockId); - stmt->bindUint64(":COMPRESSED_SIZE", tapeFile.compressedSize); + stmt->bindUint64(":COMPRESSED_SIZE_IN_BYTES", tapeFile.compressedSize); stmt->bindUint64(":COPY_NB", tapeFile.copyNb); stmt->bindUint64(":CREATION_TIME", now); stmt->bindUint64(":ARCHIVE_FILE_ID", archiveFileId); @@ -4361,7 +4361,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "ARCHIVE_FILE.DISK_FILE_USER AS DISK_FILE_USER," "ARCHIVE_FILE.DISK_FILE_GROUP AS DISK_FILE_GROUP," "ARCHIVE_FILE.DISK_FILE_RECOVERY_BLOB AS DISK_FILE_RECOVERY_BLOB," - "ARCHIVE_FILE.FILE_SIZE AS FILE_SIZE," + "ARCHIVE_FILE.SIZE_IN_BYTES AS SIZE_IN_BYTES," "ARCHIVE_FILE.CHECKSUM_TYPE AS CHECKSUM_TYPE," "ARCHIVE_FILE.CHECKSUM_VALUE AS CHECKSUM_VALUE," "ARCHIVE_FILE.STORAGE_CLASS_NAME AS STORAGE_CLASS_NAME," @@ -4370,7 +4370,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF "TAPE_FILE.VID AS VID," "TAPE_FILE.FSEQ AS FSEQ," "TAPE_FILE.BLOCK_ID AS BLOCK_ID," - "TAPE_FILE.COMPRESSED_SIZE AS COMPRESSED_SIZE," + "TAPE_FILE.COMPRESSED_SIZE_IN_BYTES AS COMPRESSED_SIZE_IN_BYTES," "TAPE_FILE.COPY_NB AS COPY_NB," "TAPE_FILE.CREATION_TIME AS TAPE_FILE_CREATION_TIME " "FROM " @@ -4394,7 +4394,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF archiveFile->diskFileInfo.owner = rset->columnString("DISK_FILE_USER"); archiveFile->diskFileInfo.group = rset->columnString("DISK_FILE_GROUP"); archiveFile->diskFileInfo.recoveryBlob = rset->columnString("DISK_FILE_RECOVERY_BLOB"); - archiveFile->fileSize = rset->columnUint64("FILE_SIZE"); + archiveFile->fileSize = rset->columnUint64("SIZE_IN_BYTES"); archiveFile->checksumType = rset->columnString("CHECKSUM_TYPE"); archiveFile->checksumValue = rset->columnString("CHECKSUM_VALUE"); archiveFile->storageClass = rset->columnString("STORAGE_CLASS_NAME"); @@ -4409,7 +4409,7 @@ std::unique_ptr<common::dataStructures::ArchiveFile> RdbmsCatalogue::getArchiveF tapeFile.vid = rset->columnString("VID"); tapeFile.fSeq = rset->columnUint64("FSEQ"); tapeFile.blockId = rset->columnUint64("BLOCK_ID"); - tapeFile.compressedSize = rset->columnUint64("COMPRESSED_SIZE"); + tapeFile.compressedSize = rset->columnUint64("COMPRESSED_SIZE_IN_BYTES"); tapeFile.copyNb = rset->columnUint64("COPY_NB"); tapeFile.creationTime = rset->columnUint64("TAPE_FILE_CREATION_TIME"); tapeFile.checksumType = archiveFile->checksumType; // Duplicated for convenience diff --git a/catalogue/catalogue_common_schema.sql b/catalogue/catalogue_common_schema.sql index 4e1fefbb0e..7fe14e49a9 100644 --- a/catalogue/catalogue_common_schema.sql +++ b/catalogue/catalogue_common_schema.sql @@ -163,7 +163,7 @@ CREATE TABLE ARCHIVE_FILE( DISK_FILE_USER VARCHAR2(100) NOT NULL, DISK_FILE_GROUP VARCHAR2(100) NOT NULL, DISK_FILE_RECOVERY_BLOB VARCHAR2(2000) NOT NULL, - FILE_SIZE INTEGER NOT NULL, + SIZE_IN_BYTES INTEGER NOT NULL, CHECKSUM_TYPE VARCHAR2(100) NOT NULL, CHECKSUM_VALUE VARCHAR2(100) NOT NULL, STORAGE_CLASS_NAME VARCHAR2(100) NOT NULL, @@ -174,13 +174,13 @@ CREATE TABLE ARCHIVE_FILE( REFERENCES STORAGE_CLASS(DISK_INSTANCE_NAME, STORAGE_CLASS_NAME) ); CREATE TABLE TAPE_FILE( - VID VARCHAR2(100) NOT NULL, - FSEQ INTEGER NOT NULL, - BLOCK_ID INTEGER NOT NULL, - COMPRESSED_SIZE INTEGER NOT NULL, - COPY_NB INTEGER NOT NULL, - CREATION_TIME INTEGER NOT NULL, - ARCHIVE_FILE_ID INTEGER NOT NULL, + VID VARCHAR2(100) NOT NULL, + FSEQ INTEGER NOT NULL, + BLOCK_ID INTEGER NOT NULL, + COMPRESSED_SIZE_IN_BYTES INTEGER NOT NULL, + COPY_NB INTEGER NOT NULL, + CREATION_TIME INTEGER NOT NULL, + ARCHIVE_FILE_ID INTEGER NOT NULL, CONSTRAINT TAPE_FILE_PK PRIMARY KEY(VID, FSEQ), CONSTRAINT TAPE_FILE_TAPE_FK FOREIGN KEY(VID) REFERENCES TAPE(VID), diff --git a/catalogue/catalogue_schema.pdf b/catalogue/catalogue_schema.pdf index 3c3f3032aa19cf04b9c6b168bb899167b956f6f1..571bcd3b389d425db50ef25c7c8ae0fc5695b871 100644 GIT binary patch delta 5771 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 delta 5821 zcmbR9koD9<)(tI8lP8#IP5x&ZJ-LF}Z1My%!^saVeohu;Gn?FRrVSQ9!)7|U-^`HF z3@j7OVK#Za^4G~+oTiic6^$4zHa}oCWtu#Z%N#81$!!J_W->GYi*LTfQ^7R(0I&9B z2jTF^4g#i=5AYgIULnA{xt3Fuaq@j3h+)%&p}Ne#x+cqun!`2uh=Db2F5pyTocu}x zWX-q9izPv}8#6*|nXD}h5q=^K5jFxFvpGi=V)?{^u*o+S%qAb;HDod}+g!-0z&N== z8EgeeYKaP1iqQyShqF4!u&<MUt3w=R47H?16C!S-1r>+bGWn=B)THpqpL9TOHDoe2 zfmkv@A1<}m04fEse{-~PCDY^$%3mf&nwd`)P&8yRG1y#SZN@Ztk2%OS+8~EjSb&&@ zOeRJU<8E0(jSHL1W(}2s*tB`6?PunCGfO+W;*z4	Xe5IcH<N`=4wR%sa6Cn_~Ns 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 FE&#_pzI*@x -- GitLab