From f7b1d683e9988e7d25e7c5bf94dbcbd5f3705dea Mon Sep 17 00:00:00 2001
From: Michael Davis <michael.davis@cern.ch>
Date: Fri, 16 Aug 2019 10:04:28 +0200
Subject: [PATCH] Removes NOT NULL constraint on the CHECKSUM_BLOB column

If CHECKSUM_BLOB is NULL, the code will fall back on CHECKSUM_ADLER32.
---
 catalogue/common_catalogue_schema.sql | 2 +-
 common/checksum/ChecksumBlob.cpp      | 4 +++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/catalogue/common_catalogue_schema.sql b/catalogue/common_catalogue_schema.sql
index 2c7e87a7f3..d6614edcf0 100644
--- a/catalogue/common_catalogue_schema.sql
+++ b/catalogue/common_catalogue_schema.sql
@@ -168,7 +168,7 @@ CREATE TABLE ARCHIVE_FILE(
   DISK_FILE_UID           NUMERIC(20, 0)  CONSTRAINT ARCHIVE_FILE_DFUID_NN  NOT NULL,
   DISK_FILE_GID           NUMERIC(20, 0)  CONSTRAINT ARCHIVE_FILE_DFGID_NN  NOT NULL,
   SIZE_IN_BYTES           NUMERIC(20, 0)  CONSTRAINT ARCHIVE_FILE_SIB_NN  NOT NULL,
-  CHECKSUM_BLOB           CHECKSUM_BLOB_TYPE CONSTRAINT ARCHIVE_FILE_CB1_NN  NOT NULL,
+  CHECKSUM_BLOB           CHECKSUM_BLOB_TYPE,
   CHECKSUM_ADLER32        NUMERIC(20, 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,
diff --git a/common/checksum/ChecksumBlob.cpp b/common/checksum/ChecksumBlob.cpp
index 84b0b646fc..507243fefc 100644
--- a/common/checksum/ChecksumBlob.cpp
+++ b/common/checksum/ChecksumBlob.cpp
@@ -113,7 +113,9 @@ void ChecksumBlob::deserialize(const std::string &bytearray) {
 
 void ChecksumBlob::deserializeOrSetAdler32(const std::string &bytearray, uint32_t adler32) {
   common::ChecksumBlob p_csb;
-  if(p_csb.ParseFromString(bytearray)) {
+  // A NULL value in the CHECKSUM_BLOB column will return an empty bytearray. If the bytearray is empty
+  // or otherwise invalid, default to using the contents of the CHECKSUM_ADLER32 column.
+  if(!bytearray.empty() && p_csb.ParseFromString(bytearray)) {
     ProtobufToChecksumBlob(p_csb, *this);
   } else {
     insert(ADLER32, adler32);
-- 
GitLab