Hi Chuck,

On 15 Aug 2017, at 16:44, Chuck Hill <ch...@gevityinc.com> wrote:

> For cases like this, the database is the right, and only, place to guarantee 
> this.

Thanks. For what it’s worth, I agree. I think I just hesitated thinking it 
might be painful to set up the stored procedure and trigger using migrations, 
and wondered if there was a feasible EOF-level approach. Turns out it wasn’t 
hard, though involved some trial and error with syntax for the stored procedure.

For the archives, here’s the PostgreSQL solution. This is 
src/main/resources/job_workers_constraint.sql:

CREATE OR REPLACE FUNCTION job_max_worker_constraint() RETURNS trigger AS
'
BEGIN
        IF (SELECT count(*) FROM jobworker jw WHERE jw.jobid = NEW.jobid)
        >= (SELECT max_workers FROM job j WHERE j.id = NEW.jobid) THEN
           RAISE EXCEPTION ''Job.workers.count exceeds Job.maxWorkers.'';
        END IF;
        RETURN NEW;
END
' LANGUAGE plpgsql;

Note carefully that this doesn’t use PostgreSQL’s ‘$$’ delimiters for the 
function body—doing that causes ERXJDBCUtilities to split the function body on 
its semi-colons, which is not what we want. (That was the trial and error 
part.) Instead, you need to single-quote-delimit the function body, as above, 
and escape any single quotes in the function body (the exception message above) 
by double-single-quoting.

Then, this is src/main/resources/job_workers_trigger.sql:

CREATE TRIGGER job_workers_count_check
BEFORE INSERT ON jobworker
FOR EACH ROW EXECUTE PROCEDURE job_max_worker_constraint();

Execute these in a migration:

ERXJDBCUtilities.executeUpdateScriptFromResourceNamed(database.adaptorChannel(),
 "job_workers_constraint.sql", null);
ERXJDBCUtilities.executeUpdateScriptFromResourceNamed(database.adaptorChannel(),
 "job_workers_trigger.sql", null);

Handling the exception generated requires catching EOGeneralAdaptorException at 
relevant calls to saveChanges(). I can’t see a more elegant approach than 
seeing if getMessage().contains("Job.workers.count exceeds Job.maxWorkers.”), 
but if anyone can think of one, I’m all ears.


-- 
Paul Hoadley
https://logicsquad.net/
https://www.linkedin.com/company/logic-squad/


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to