--
-- /packages/acs-kernel/sql/rel-constraints-create.sql
--
-- Add support for relational constraints based on relational segmentation.
--
-- @author Oumi Mehrotra (oumi@arsdigita.com)
-- @creation-date 2000-11-22
-- @cvs-id $Id: rel-constraints-body-create.sql,v 1.14 2024/09/11 06:15:48 gustafn Exp $
-- Copyright (C) 1999-2000 ArsDigita Corporation
-- This is free software distributed under the terms of the GNU Public
-- License. Full text of the license is available from the GNU Project:
-- http://www.fsf.org/copyleft/gpl.html
-- create or replace package body rel_constraint
-- added
--
-- procedure rel_constraint__new/4
--
CREATE OR REPLACE FUNCTION rel_constraint__new(
name varchar,
sid1 integer,
side varchar,
sid2 integer
) RETURNS integer AS $$
DECLARE
BEGIN
return rel_constraint__new(null,
'rel_constraint',
name,
sid1,
side,
sid2,
null,
null,
null
);
END;
$$ LANGUAGE plpgsql;
-- function new
-- added
select define_function_args('rel_constraint__new','constraint_id;null,constraint_type;rel_constraint,constraint_name,rel_segment,rel_side;two,required_rel_segment,context_id;null,creation_user;null,creation_ip;null');
--
-- procedure rel_constraint__new/9
--
CREATE OR REPLACE FUNCTION rel_constraint__new(
new__constraint_id integer, -- default null
new__constraint_type varchar, -- default 'rel_constraint'
new__constraint_name varchar,
new__rel_segment integer,
new__rel_side char, -- default 'two'
new__required_rel_segment integer,
new__context_id integer, -- default null
new__creation_user integer, -- default null
new__creation_ip varchar -- default null
) RETURNS integer AS $$
DECLARE
v_constraint_id rel_constraints.constraint_id%TYPE;
BEGIN
v_constraint_id := acs_object__new (
new__constraint_id,
new__constraint_type,
now(),
new__creation_user,
new__creation_ip,
new__context_id,
't',
new__constraint_name,
null
);
insert into rel_constraints
(constraint_id, constraint_name,
rel_segment, rel_side, required_rel_segment)
values
(v_constraint_id, new__constraint_name,
new__rel_segment, new__rel_side, new__required_rel_segment);
return v_constraint_id;
END;
$$ LANGUAGE plpgsql;
-- procedure delete
-- added
select define_function_args('rel_constraint__delete','constraint_id');
--
-- procedure rel_constraint__delete/1
--
CREATE OR REPLACE FUNCTION rel_constraint__delete(
constraint_id integer
) RETURNS integer AS $$
DECLARE
BEGIN
PERFORM acs_object__delete(constraint_id);
return 0;
END;
$$ LANGUAGE plpgsql;
-- function get_constraint_id
-- added
select define_function_args('rel_constraint__get_constraint_id','rel_segment,rel_side,required_rel_segment');
--
-- procedure rel_constraint__get_constraint_id/3
--
CREATE OR REPLACE FUNCTION rel_constraint__get_constraint_id(
get_constraint_id__rel_segment integer,
get_constraint_id__rel_side char,
get_constraint_id__required_rel_segment integer
) RETURNS integer AS $$
DECLARE
v_constraint_id rel_constraints.constraint_id%TYPE;
BEGIN
return constraint_id
from rel_constraints
where rel_segment = get_constraint_id__rel_segment
and rel_side = get_constraint_id__rel_side
and required_rel_segment = get_constraint_id__required_rel_segment;
END;
$$ LANGUAGE plpgsql stable strict;
-- function violation
-- added
select define_function_args('rel_constraint__violation','rel_id');
--
-- procedure rel_constraint__violation/1
--
CREATE OR REPLACE FUNCTION rel_constraint__violation(
violation__rel_id integer
) RETURNS varchar AS $$
DECLARE
v_error text;
constraint_violated record;
BEGIN
v_error := null;
for constraint_violated in
select constraint_id, constraint_name
from rel_constraints_violated_one
where rel_id = violation__rel_id
LIMIT 1
LOOP
v_error := coalesce(v_error,'') ||
'Relational Constraint Violation: ' ||
constraint_violated.constraint_name ||
' (constraint_id=' ||
constraint_violated.constraint_id || '). ';
return v_error;
end loop;
for constraint_violated in
select constraint_id, constraint_name
from rel_constraints_violated_two
where rel_id = violation__rel_id
LIMIT 1
LOOP
v_error := coalesce(v_error,'') ||
'Relational Constraint Violation: ' ||
constraint_violated.constraint_name ||
' (constraint_id=' ||
constraint_violated.constraint_id || '). ';
return v_error;
end loop;
return v_error;
END;
$$ LANGUAGE plpgsql stable strict;
-- function violation_if_removed
-- added
select define_function_args('rel_constraint__violation_if_removed','rel_id');
--
-- procedure rel_constraint__violation_if_removed/1
--
CREATE OR REPLACE FUNCTION rel_constraint__violation_if_removed(
violation_if_removed__rel_id integer
) RETURNS varchar AS $$
DECLARE
v_count integer;
v_error text;
constraint_violated record;
BEGIN
v_error := null;
select count(*) into v_count
from dual
where exists (select 1
from rc_violations_by_removing_rel r
where r.rel_id = violation_if_removed__rel_id);
if v_count > 0 then
-- some other relation depends on this one. Lets build up a string
-- of the constraints we are violating
for constraint_violated in select constraint_id, constraint_name
from rc_violations_by_removing_rel r
where r.rel_id = violation_if_removed__rel_id
LOOP
v_error := v_error || 'Relational Constraint Violation: ' ||
constraint_violated.constraint_name ||
' (constraint_id=' ||
constraint_violated.constraint_id || '). ';
end loop;
end if;
return v_error;
END;
$$ LANGUAGE plpgsql stable strict;
-- show errors