-- Records of RunCommand executions -- -- The intended flow is: -- -- 1. Create a RunCommandLogs entry when the task is "queued" to run -- 2. Update the start_time when it begins -- 3. Update the end_time and exit_code when it completes create table RunCommandLogs ( id serial primary key not null, job_matcher text not null, build_id integer not null, -- TODO: evaluation_id integer not null, -- can we do this in a principled way? a build can be part of many evaluations -- but a "bug" of RunCommand, imho, is that it should probably run per evaluation? command text not null, start_time integer, end_time integer, error_number integer, exit_code integer, signal integer, core_dumped boolean, foreign key (build_id) references Builds(id) on delete cascade, -- foreign key (evaluation_id) references Builds(id) on delete cascade, constraint RunCommandLogs_not_started_no_exit_time_no_code check ( -- If start time is null, then end_time, exit_code, signal, and core_dumped should be null. -- A logical implication operator would be nice :). (start_time is not null) or ( end_time is null and error_number is null and exit_code is null and signal is null and core_dumped is null ) ), constraint RunCommandLogs_end_time_has_start_time check ( -- If end time is not null, then end_time, exit_code, and core_dumped should not be null (end_time is null) or (start_time is not null) ) -- Note: if exit_code is not null then signal and core_dumped must be null. -- Similarly, if signal is not null then exit_code must be null and -- core_dumped must not be null. However, these semantics are tricky -- to encode as constraints and probably provide limited actual value. );