Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions grants/ispyb_processing.sql
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ GRANT EXECUTE ON PROCEDURE `retrieve_reprocessing_by_dc` TO 'ispyb_processing';
GRANT EXECUTE ON PROCEDURE `update_reprocessing_status` TO 'ispyb_processing';

GRANT EXECUTE ON PROCEDURE `upsert_processing_program` TO 'ispyb_processing';
GRANT EXECUTE ON PROCEDURE `upsert_processing_program_v2` TO 'ispyb_processing';
GRANT EXECUTE ON PROCEDURE `upsert_processing_program_attachment` TO 'ispyb_processing';
GRANT EXECUTE ON PROCEDURE upsert_processing_program_attachment_v2 TO 'ispyb_processing';
GRANT EXECUTE ON PROCEDURE upsert_processing_program_message TO 'ispyb_processing';
Expand Down
125 changes: 107 additions & 18 deletions schemas/ispyb/routines.sql
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/*M!999999\- enable the sandbox mode */

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
Expand Down Expand Up @@ -11126,15 +11127,15 @@ CREATE PROCEDURE `upsert_processing_program`(
p_recordTimestamp datetime
)
MODIFIES SQL DATA
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates exis'
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates existing row if uts processingStatus is NULL + other conditions.'
BEGIN
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
DECLARE row_processingEndTime datetime DEFAULT NULL;



IF p_id IS NULL THEN

INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
VALUES (
Expand All @@ -11146,45 +11147,43 @@ BEGIN
p_commandLine,
p_programs,
p_environment,

IFNULL(p_recordTimestamp, NOW())
);
SET p_id = LAST_INSERT_ID();
ELSE
START TRANSACTION;
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
FROM AutoProcProgram
WHERE autoProcProgramId = p_id;




WHERE autoProcProgramId = p_id;





IF row_processingStatus IS NULL AND (
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN

UPDATE AutoProcProgram
SET

processingStatus = p_status,


processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),

processingEndTime = IFNULL(p_updateTimestamp, NOW()),

processingMessage = IFNULL(p_updateMessage, processingMessage),
processingJobId = IFNULL(p_processingJobId, processingJobId),
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
processingPrograms = IFNULL(p_programs, processingPrograms),
processingEnvironment = IFNULL(p_environment, processingEnvironment)
WHERE autoProcProgramId = p_id;
END IF;
COMMIT;
END IF;

COMMIT;
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
Expand Down Expand Up @@ -11319,6 +11318,95 @@ DELIMITER ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = '' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `upsert_processing_program_v2` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb3 */ ;
/*!50003 SET character_set_results = utf8mb3 */ ;
/*!50003 SET collation_connection = utf8mb3_general_ci */ ;
DELIMITER ;;
CREATE PROCEDURE `upsert_processing_program_v2`(
INOUT p_id int(11) unsigned,
p_commandLine varchar(255),
p_programs varchar(255),
p_status int(11),
p_updateMessage varchar(80),
p_startTimestamp datetime,
p_updateTimestamp datetime,
p_environment varchar(255),
p_processingJobId int(11) unsigned,
p_processingPipelineId int(11) unsigned,
p_recordTimestamp datetime
)
MODIFIES SQL DATA
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates existing row if uts processingStatus is NULL + other conditions.'
BEGIN
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
DECLARE row_processingEndTime datetime DEFAULT NULL;



IF p_id IS NULL THEN

INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
processingPipelineId, processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
VALUES (
p_status,
p_startTimestamp,
p_updateTimestamp,
p_updateMessage,
p_processingJobId,
p_processingPipelineId,
p_commandLine,
p_programs,
p_environment,

IFNULL(p_recordTimestamp, NOW())
);
SET p_id = LAST_INSERT_ID();
ELSE
START TRANSACTION;
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
FROM AutoProcProgram
WHERE autoProcProgramId = p_id;





IF row_processingStatus IS NULL AND (
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN

UPDATE AutoProcProgram
SET

processingStatus = p_status,


processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),

processingEndTime = IFNULL(p_updateTimestamp, NOW()),

processingMessage = IFNULL(p_updateMessage, processingMessage),
processingJobId = IFNULL(p_processingJobId, processingJobId),
processingPipelineId = IFNULL(p_processingPipelineId, processingPipelineId),
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
processingPrograms = IFNULL(p_programs, processingPrograms),
processingEnvironment = IFNULL(p_environment, processingEnvironment)
WHERE autoProcProgramId = p_id;
END IF;
COMMIT;
END IF;
END ;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = '' */ ;
/*!50003 DROP PROCEDURE IF EXISTS `upsert_proposal` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
Expand Down Expand Up @@ -12115,6 +12203,7 @@ DELIMITER ;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

/*M!999999\- enable the sandbox mode */

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
Expand Down
38 changes: 18 additions & 20 deletions schemas/ispyb/stored_programs/sp_upsert_processing_program.sql
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,19 @@ CREATE OR REPLACE DEFINER=`ispyb_root`@`%` PROCEDURE `upsert_processing_program`
BEGIN
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
DECLARE row_processingEndTime datetime DEFAULT NULL;

-- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

IF p_id IS NULL THEN
-- creates a new row in AutoProcProgram with processingJobId set, and all the other values populated with the given values,
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
VALUES (
p_status,
p_status,
p_startTimestamp,
p_updateTimestamp,
p_updateMessage,
p_processingJobId,
p_updateMessage,
p_processingJobId,
p_commandLine,
p_programs,
p_environment,
Expand All @@ -39,38 +39,36 @@ BEGIN
SET p_id = LAST_INSERT_ID();
ELSE
START TRANSACTION;
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
FROM AutoProcProgram
WHERE autoProcProgramId = p_id;
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
FROM AutoProcProgram
WHERE autoProcProgramId = p_id;

-- If the existing value in processingStatus is not NULL then the row must not be updated. Stop reading here.
-- If the existing value in processingEndTime is not NULL and update time is not NULL and
-- processingEndTime is greater (>) than update time and the new status value is NULL then the row must not be
-- If the existing value in processingEndTime is not NULL and update time is not NULL and
-- processingEndTime is greater (>) than update time and the new status value is NULL then the row must not be
-- updated. Stop reading here.
IF row_processingStatus IS NULL AND (
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN

UPDATE AutoProcProgram
SET
UPDATE AutoProcProgram
SET
-- Write status to processingStatus
processingStatus = p_status,
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
-- then write NOW() instead
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
-- Write update time to processingEndTime. If update time is NULL then write NOW() to processingEndTime
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
-- If update message is not NULL then write update message to processingMessage.
processingMessage = IFNULL(p_updateMessage, processingMessage),
processingMessage = IFNULL(p_updateMessage, processingMessage),
processingJobId = IFNULL(p_processingJobId, processingJobId),
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
processingPrograms = IFNULL(p_programs, processingPrograms),
processingEnvironment = IFNULL(p_environment, processingEnvironment)
WHERE autoProcProgramId = p_id;
END IF;
COMMIT;
END IF;

COMMIT;
END IF;
END;;
DELIMITER ;
84 changes: 84 additions & 0 deletions schemas/ispyb/stored_programs/sp_upsert_processing_program_v2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
-- Requirements for this SP described in http://jira.diamond.ac.uk/browse/SCI-6048
-- Test:
-- set @id = NULL;
-- call upsert_processing_program_v2(@id, 'hello --dry-run --debug', 'hello', NULL, 'in progress', now(), now(), NULL, 5, 8, now());
-- select @id;
-- call upsert_processing_program_v2(@id, NULL, NULL, 1, 'complete', NULL, NULL, NULL, NULL, NULL, NULL);
-- select * from AutoProcProgram where autoProcProgramId = @id;

DELIMITER ;;
CREATE OR REPLACE DEFINER=`ispyb_root`@`%` PROCEDURE `upsert_processing_program_v2`(
INOUT p_id int(11) unsigned,
p_commandLine varchar(255),
p_programs varchar(255),
p_status int(11),
p_updateMessage varchar(80),
p_startTimestamp datetime,
p_updateTimestamp datetime,
p_environment varchar(255),
p_processingJobId int(11) unsigned,
p_processingPipelineId int(11) unsigned,
p_recordTimestamp datetime
)
MODIFIES SQL DATA
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates existing row if uts processingStatus is NULL + other conditions.'
BEGIN
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
DECLARE row_processingEndTime datetime DEFAULT NULL;

-- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;

IF p_id IS NULL THEN
-- creates a new row in AutoProcProgram with processingJobId set, and all the other values populated with the given values,
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
processingPipelineId, processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
VALUES (
p_status,
p_startTimestamp,
p_updateTimestamp,
p_updateMessage,
p_processingJobId,
p_processingPipelineId,
p_commandLine,
p_programs,
p_environment,
-- apart from recordTimeStamp, which, if given as NULL, is populated with NOW()
IFNULL(p_recordTimestamp, NOW())
);
SET p_id = LAST_INSERT_ID();
ELSE
START TRANSACTION;
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
FROM AutoProcProgram
WHERE autoProcProgramId = p_id;

-- If the existing value in processingStatus is not NULL then the row must not be updated. Stop reading here.
-- If the existing value in processingEndTime is not NULL and update time is not NULL and
-- processingEndTime is greater (>) than update time and the new status value is NULL then the row must not be
-- updated. Stop reading here.
IF row_processingStatus IS NULL AND (
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN

UPDATE AutoProcProgram
SET
-- Write status to processingStatus
processingStatus = p_status,
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
-- then write NOW() instead
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
-- Write update time to processingEndTime. If update time is NULL then write NOW() to processingEndTime
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
-- If update message is not NULL then write update message to processingMessage.
processingMessage = IFNULL(p_updateMessage, processingMessage),
processingJobId = IFNULL(p_processingJobId, processingJobId),
processingPipelineId = IFNULL(p_processingPipelineId, processingPipelineId),
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
processingPrograms = IFNULL(p_programs, processingPrograms),
processingEnvironment = IFNULL(p_environment, processingEnvironment)
WHERE autoProcProgramId = p_id;
END IF;
COMMIT;
END IF;
END;;
DELIMITER ;