Skip to content

Commit a082d14

Browse files
authored
Add new proc upsert_processing_program_v2
- New procedure upsert_processing_program_v2 - grant to execute new procedure - updated routines.sql - Remove superfluous commit in procedure upsert_processing_program
1 parent 3480217 commit a082d14

File tree

4 files changed

+210
-38
lines changed

4 files changed

+210
-38
lines changed

grants/ispyb_processing.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ GRANT EXECUTE ON PROCEDURE `retrieve_reprocessing_by_dc` TO 'ispyb_processing';
8888
GRANT EXECUTE ON PROCEDURE `update_reprocessing_status` TO 'ispyb_processing';
8989

9090
GRANT EXECUTE ON PROCEDURE `upsert_processing_program` TO 'ispyb_processing';
91+
GRANT EXECUTE ON PROCEDURE `upsert_processing_program_v2` TO 'ispyb_processing';
9192
GRANT EXECUTE ON PROCEDURE `upsert_processing_program_attachment` TO 'ispyb_processing';
9293
GRANT EXECUTE ON PROCEDURE upsert_processing_program_attachment_v2 TO 'ispyb_processing';
9394
GRANT EXECUTE ON PROCEDURE upsert_processing_program_message TO 'ispyb_processing';

schemas/ispyb/routines.sql

Lines changed: 107 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/*M!999999\- enable the sandbox mode */
12

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

11134-
11135+
1113511136

1113611137
IF p_id IS NULL THEN
11137-
11138+
1113811139
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
1113911140
processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
1114011141
VALUES (
@@ -11146,45 +11147,43 @@ BEGIN
1114611147
p_commandLine,
1114711148
p_programs,
1114811149
p_environment,
11149-
11150+
1115011151
IFNULL(p_recordTimestamp, NOW())
1115111152
);
1115211153
SET p_id = LAST_INSERT_ID();
1115311154
ELSE
1115411155
START TRANSACTION;
11155-
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
11156+
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
1115611157
FROM AutoProcProgram
11157-
WHERE autoProcProgramId = p_id;
11158-
11159-
11160-
11161-
11158+
WHERE autoProcProgramId = p_id;
1116211159

11160+
11161+
11162+
11163+
1116311164
IF row_processingStatus IS NULL AND (
1116411165
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
1116511166
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN
1116611167

1116711168
UPDATE AutoProcProgram
1116811169
SET
11169-
11170+
1117011171
processingStatus = p_status,
11171-
11172-
11172+
11173+
1117311174
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
11174-
11175+
1117511176
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
11176-
11177+
1117711178
processingMessage = IFNULL(p_updateMessage, processingMessage),
1117811179
processingJobId = IFNULL(p_processingJobId, processingJobId),
1117911180
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
1118011181
processingPrograms = IFNULL(p_programs, processingPrograms),
1118111182
processingEnvironment = IFNULL(p_environment, processingEnvironment)
1118211183
WHERE autoProcProgramId = p_id;
11183-
END IF;
11184-
COMMIT;
1118511184
END IF;
11186-
1118711185
COMMIT;
11186+
END IF;
1118811187
END ;;
1118911188
DELIMITER ;
1119011189
/*!50003 SET sql_mode = @saved_sql_mode */ ;
@@ -11319,6 +11318,95 @@ DELIMITER ;
1131911318
/*!50003 SET collation_connection = @saved_col_connection */ ;
1132011319
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
1132111320
/*!50003 SET sql_mode = '' */ ;
11321+
/*!50003 DROP PROCEDURE IF EXISTS `upsert_processing_program_v2` */;
11322+
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
11323+
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
11324+
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
11325+
/*!50003 SET character_set_client = utf8mb3 */ ;
11326+
/*!50003 SET character_set_results = utf8mb3 */ ;
11327+
/*!50003 SET collation_connection = utf8mb3_general_ci */ ;
11328+
DELIMITER ;;
11329+
CREATE PROCEDURE `upsert_processing_program_v2`(
11330+
INOUT p_id int(11) unsigned,
11331+
p_commandLine varchar(255),
11332+
p_programs varchar(255),
11333+
p_status int(11),
11334+
p_updateMessage varchar(80),
11335+
p_startTimestamp datetime,
11336+
p_updateTimestamp datetime,
11337+
p_environment varchar(255),
11338+
p_processingJobId int(11) unsigned,
11339+
p_processingPipelineId int(11) unsigned,
11340+
p_recordTimestamp datetime
11341+
)
11342+
MODIFIES SQL DATA
11343+
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates existing row if uts processingStatus is NULL + other conditions.'
11344+
BEGIN
11345+
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
11346+
DECLARE row_processingEndTime datetime DEFAULT NULL;
11347+
11348+
11349+
11350+
IF p_id IS NULL THEN
11351+
11352+
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
11353+
processingPipelineId, processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
11354+
VALUES (
11355+
p_status,
11356+
p_startTimestamp,
11357+
p_updateTimestamp,
11358+
p_updateMessage,
11359+
p_processingJobId,
11360+
p_processingPipelineId,
11361+
p_commandLine,
11362+
p_programs,
11363+
p_environment,
11364+
11365+
IFNULL(p_recordTimestamp, NOW())
11366+
);
11367+
SET p_id = LAST_INSERT_ID();
11368+
ELSE
11369+
START TRANSACTION;
11370+
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
11371+
FROM AutoProcProgram
11372+
WHERE autoProcProgramId = p_id;
11373+
11374+
11375+
11376+
11377+
11378+
IF row_processingStatus IS NULL AND (
11379+
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
11380+
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN
11381+
11382+
UPDATE AutoProcProgram
11383+
SET
11384+
11385+
processingStatus = p_status,
11386+
11387+
11388+
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
11389+
11390+
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
11391+
11392+
processingMessage = IFNULL(p_updateMessage, processingMessage),
11393+
processingJobId = IFNULL(p_processingJobId, processingJobId),
11394+
processingPipelineId = IFNULL(p_processingPipelineId, processingPipelineId),
11395+
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
11396+
processingPrograms = IFNULL(p_programs, processingPrograms),
11397+
processingEnvironment = IFNULL(p_environment, processingEnvironment)
11398+
WHERE autoProcProgramId = p_id;
11399+
END IF;
11400+
COMMIT;
11401+
END IF;
11402+
END ;;
11403+
DELIMITER ;
11404+
/*!50003 SET sql_mode = @saved_sql_mode */ ;
11405+
/*!50003 SET character_set_client = @saved_cs_client */ ;
11406+
/*!50003 SET character_set_results = @saved_cs_results */ ;
11407+
/*!50003 SET collation_connection = @saved_col_connection */ ;
11408+
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
11409+
/*!50003 SET sql_mode = '' */ ;
1132211410
/*!50003 DROP PROCEDURE IF EXISTS `upsert_proposal` */;
1132311411
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
1132411412
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
@@ -12115,6 +12203,7 @@ DELIMITER ;
1211512203
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
1211612204
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
1211712205

12206+
/*M!999999\- enable the sandbox mode */
1211812207

1211912208
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
1212012209
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;

schemas/ispyb/stored_programs/sp_upsert_processing_program.sql

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ CREATE OR REPLACE DEFINER=`ispyb_root`@`%` PROCEDURE `upsert_processing_program`
1717
BEGIN
1818
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
1919
DECLARE row_processingEndTime datetime DEFAULT NULL;
20-
20+
2121
-- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
22-
22+
2323
IF p_id IS NULL THEN
2424
-- creates a new row in AutoProcProgram with processingJobId set, and all the other values populated with the given values,
2525
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
2626
processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
2727
VALUES (
28-
p_status,
28+
p_status,
2929
p_startTimestamp,
3030
p_updateTimestamp,
31-
p_updateMessage,
32-
p_processingJobId,
31+
p_updateMessage,
32+
p_processingJobId,
3333
p_commandLine,
3434
p_programs,
3535
p_environment,
@@ -39,38 +39,36 @@ BEGIN
3939
SET p_id = LAST_INSERT_ID();
4040
ELSE
4141
START TRANSACTION;
42-
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
43-
FROM AutoProcProgram
44-
WHERE autoProcProgramId = p_id;
42+
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
43+
FROM AutoProcProgram
44+
WHERE autoProcProgramId = p_id;
4545

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

54-
UPDATE AutoProcProgram
55-
SET
54+
UPDATE AutoProcProgram
55+
SET
5656
-- Write status to processingStatus
5757
processingStatus = p_status,
58-
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
58+
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
5959
-- then write NOW() instead
6060
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
6161
-- Write update time to processingEndTime. If update time is NULL then write NOW() to processingEndTime
62-
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
62+
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
6363
-- If update message is not NULL then write update message to processingMessage.
64-
processingMessage = IFNULL(p_updateMessage, processingMessage),
64+
processingMessage = IFNULL(p_updateMessage, processingMessage),
6565
processingJobId = IFNULL(p_processingJobId, processingJobId),
6666
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
6767
processingPrograms = IFNULL(p_programs, processingPrograms),
6868
processingEnvironment = IFNULL(p_environment, processingEnvironment)
6969
WHERE autoProcProgramId = p_id;
70-
END IF;
71-
COMMIT;
7270
END IF;
73-
7471
COMMIT;
72+
END IF;
7573
END;;
7674
DELIMITER ;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
-- Requirements for this SP described in http://jira.diamond.ac.uk/browse/SCI-6048
2+
-- Test:
3+
-- set @id = NULL;
4+
-- call upsert_processing_program_v2(@id, 'hello --dry-run --debug', 'hello', NULL, 'in progress', now(), now(), NULL, 5, 8, now());
5+
-- select @id;
6+
-- call upsert_processing_program_v2(@id, NULL, NULL, 1, 'complete', NULL, NULL, NULL, NULL, NULL, NULL);
7+
-- select * from AutoProcProgram where autoProcProgramId = @id;
8+
9+
DELIMITER ;;
10+
CREATE OR REPLACE DEFINER=`ispyb_root`@`%` PROCEDURE `upsert_processing_program_v2`(
11+
INOUT p_id int(11) unsigned,
12+
p_commandLine varchar(255),
13+
p_programs varchar(255),
14+
p_status int(11),
15+
p_updateMessage varchar(80),
16+
p_startTimestamp datetime,
17+
p_updateTimestamp datetime,
18+
p_environment varchar(255),
19+
p_processingJobId int(11) unsigned,
20+
p_processingPipelineId int(11) unsigned,
21+
p_recordTimestamp datetime
22+
)
23+
MODIFIES SQL DATA
24+
COMMENT 'If p_id is not provided, inserts new row. Otherwise updates existing row if uts processingStatus is NULL + other conditions.'
25+
BEGIN
26+
DECLARE row_processingStatus tinyint(1) DEFAULT NULL;
27+
DECLARE row_processingEndTime datetime DEFAULT NULL;
28+
29+
-- DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
30+
31+
IF p_id IS NULL THEN
32+
-- creates a new row in AutoProcProgram with processingJobId set, and all the other values populated with the given values,
33+
INSERT INTO AutoProcProgram (processingStatus, processingStartTime, processingEndTime, processingMessage, processingJobId,
34+
processingPipelineId, processingCommandLine, processingPrograms, processingEnvironment, recordTimestamp)
35+
VALUES (
36+
p_status,
37+
p_startTimestamp,
38+
p_updateTimestamp,
39+
p_updateMessage,
40+
p_processingJobId,
41+
p_processingPipelineId,
42+
p_commandLine,
43+
p_programs,
44+
p_environment,
45+
-- apart from recordTimeStamp, which, if given as NULL, is populated with NOW()
46+
IFNULL(p_recordTimestamp, NOW())
47+
);
48+
SET p_id = LAST_INSERT_ID();
49+
ELSE
50+
START TRANSACTION;
51+
SELECT processingStatus, processingEndTime INTO row_processingStatus, row_processingEndTime
52+
FROM AutoProcProgram
53+
WHERE autoProcProgramId = p_id;
54+
55+
-- If the existing value in processingStatus is not NULL then the row must not be updated. Stop reading here.
56+
-- If the existing value in processingEndTime is not NULL and update time is not NULL and
57+
-- processingEndTime is greater (>) than update time and the new status value is NULL then the row must not be
58+
-- updated. Stop reading here.
59+
IF row_processingStatus IS NULL AND (
60+
row_processingEndTime IS NULL OR p_updateTimestamp IS NULL OR
61+
row_processingEndTime <= p_updateTimestamp OR p_status IS NOT NULL) THEN
62+
63+
UPDATE AutoProcProgram
64+
SET
65+
-- Write status to processingStatus
66+
processingStatus = p_status,
67+
-- If processingStartTime is NULL then write start time to processingStartTime. If start time is also NULL,
68+
-- then write NOW() instead
69+
processingStartTime = COALESCE(processingStartTime, p_startTimestamp, NOW()),
70+
-- Write update time to processingEndTime. If update time is NULL then write NOW() to processingEndTime
71+
processingEndTime = IFNULL(p_updateTimestamp, NOW()),
72+
-- If update message is not NULL then write update message to processingMessage.
73+
processingMessage = IFNULL(p_updateMessage, processingMessage),
74+
processingJobId = IFNULL(p_processingJobId, processingJobId),
75+
processingPipelineId = IFNULL(p_processingPipelineId, processingPipelineId),
76+
processingCommandLine = IFNULL(p_commandLine, processingCommandLine),
77+
processingPrograms = IFNULL(p_programs, processingPrograms),
78+
processingEnvironment = IFNULL(p_environment, processingEnvironment)
79+
WHERE autoProcProgramId = p_id;
80+
END IF;
81+
COMMIT;
82+
END IF;
83+
END;;
84+
DELIMITER ;

0 commit comments

Comments
 (0)