All pastes #247329 Raw Edit

Sans nom

public text v1 · immutable
#247329 ·published 2006-11-13 10:09 UTC
rendered paste body
\set ECHO none

--------------------------------------------------------------------------------
-- Fonction trigger sur les insertions
--------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION set_path () RETURNS trigger AS $$
DECLARE 
	parent_path varchar;
	_table      RECORD;
	_element_id RECORD;
BEGIN

	-- We are dealing with a row update.
  
    IF (TG_OP = 'UPDATE') THEN
	
		IF (((OLD.parent_id != NEW.parent_id) AND
			 (NEW.parent_id IS NOT NULL))) THEN
		
		  -- Trying to get the parent path
		 
		  SELECT INTO parent_path path
			FROM  _element
			WHERE id = NEW.parent_id;
		  
		  NEW.path := parent_path || '.' || NEW.id;
		  
		END IF;

		-- Mise a jour recursive des path 
		
		IF (OLD.path != NEW.path) THEN
		
			PERFORM disable_elements_triggers ();
		
			UPDATE   _element
			  SET    path =
			  	(
					NEW.path
					||
					subpath (_element.path, nlevel(OLD.path))
				)
			  WHERE  _element.path <@ OLD.path
			  AND    nlevel(_element.path) > nlevel(OLD.path);
			  
			PERFORM enable_elements_triggers ();
			
		END IF;
		
	-- We are dealing with different cases about inserts		
		
	ELSEIF (TG_OP = 'INSERT') THEN

		IF (NEW.parent_id IS NOT NULL) THEN
	
		  -- Trying to get the parent path
		
		  SELECT INTO parent_path path
			FROM  _element
			WHERE id = NEW.parent_id;
		  
		  NEW.path := parent_path || '.' || NEW.id;
		  
		  -- Updating counters

 		  PERFORM disable_elements_triggers ();
		  
		  FOR _element_id IN 
		  	SELECT id 
			FROM _element WHERE _element.path @> NEW.path LOOP
			
			  UPDATE _element 
			  SET 	 counters = 
				COALESCE 
				(
					counters || 
					(
						TG_RELNAME::text => 
						(
							SELECT (COALESCE ((counters->(TG_RELNAME::text))::int, 0) + 1)::text 
							FROM   _element
							WHERE  _element.id = _element_id.id
						)
					), 
					(
						TG_RELNAME::text => 
						(
							SELECT (COALESCE ((counters->(TG_RELNAME::text))::int, 0) + 1)::text 
							FROM   _element
							WHERE  _element.id = _element_id.id
						)
					)
				)		  
			  WHERE  _element.id  = _element_id.id;
			
		  END LOOP;

		  PERFORM enable_elements_triggers ();
		
		ELSEIF (NEW.parent_id IS NULL) THEN
		
		  NEW.path := NEW.id;
	
		  UPDATE _counter
			  SET table_count = table_count + 1
			  WHERE table_name = TG_RELNAME;
			  
		END IF;
	
	ELSEIF (TG_OP = 'DELETE') THEN

		-- Updating counters

 		  PERFORM disable_elements_triggers ();

		  FOR _element_id IN 
		  	SELECT id 
			FROM _element 
			WHERE _element.path @> OLD.path 
			AND    nlevel(_element.path) < nlevel(OLD.path) LOOP
			
			  UPDATE _element 
			  SET 	 counters = 
				COALESCE 
				(
					counters || 
					(
						TG_RELNAME::text => 
						(
							SELECT (COALESCE ((counters->(TG_RELNAME::text))::int, 0) - 1)::text 
							FROM   _element
							WHERE  _element.id = _element_id.id
						)
					), 
					(
						TG_RELNAME::text => 
						(
							SELECT (COALESCE ((counters->(TG_RELNAME::text))::int, 0) - 1)::text 
							FROM   _element
							WHERE  _element.id = _element_id.id
						)
					)
				)		  
			  WHERE  _element.id  = _element_id.id;
			
		END LOOP;

		PERFORM enable_elements_triggers ();
		
		RETURN OLD;
		
	END IF;
		
	RETURN NEW;
	
  END;
$$ LANGUAGE plpgsql;

--------------------------------------------------------------------------------
-- Fonction trigger sur les delete
--------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION recursive_delete () RETURNS trigger AS $$
DECLARE 
BEGIN

	DELETE 
	FROM   _element
	WHERE  _element.path <@ OLD.path;
  
	RETURN NULL;
END;
$$ LANGUAGE plpgsql;

--------------------------------------------------------------------------------
-- Functions to disable or enable the elements triggers
--------------------------------------------------------------------------------

CREATE OR REPLACE FUNCTION disable_elements_triggers () RETURNS INTEGER AS $$
DECLARE 
BEGIN
	
	ALTER TABLE _site DISABLE TRIGGER ALL;
	ALTER TABLE _site_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _community DISABLE TRIGGER ALL;
	ALTER TABLE _community_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _group DISABLE TRIGGER ALL;
	ALTER TABLE _blog DISABLE TRIGGER ALL;
	ALTER TABLE _blog_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _topic DISABLE TRIGGER ALL;
	ALTER TABLE _topic_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _article DISABLE TRIGGER ALL;
	ALTER TABLE _article_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _comment DISABLE TRIGGER ALL;
	ALTER TABLE _comment_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _trackback DISABLE TRIGGER ALL;
	ALTER TABLE _trackback_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _link DISABLE TRIGGER ALL;
	ALTER TABLE _link_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _album DISABLE TRIGGER ALL;
	ALTER TABLE _album_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _text DISABLE TRIGGER ALL;
	ALTER TABLE _text_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _relation DISABLE TRIGGER ALL;
	ALTER TABLE _relation_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _log DISABLE TRIGGER ALL;
	ALTER TABLE _log_tmp DISABLE TRIGGER ALL;
	
	ALTER TABLE _product DISABLE TRIGGER ALL;
	ALTER TABLE _product_association  DISABLE TRIGGER ALL;
	ALTER TABLE _product_association_tmp  DISABLE TRIGGER ALL;
	ALTER TABLE _product_billing DISABLE TRIGGER ALL;
	ALTER TABLE _product_billing_tmp DISABLE TRIGGER ALL;
	ALTER TABLE _product_billing_operation DISABLE TRIGGER ALL	;

	RETURN 1;
	
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION enable_elements_triggers () RETURNS INTEGER AS $$
DECLARE 
BEGIN
	
	ALTER TABLE _site ENABLE TRIGGER ALL;
	ALTER TABLE _site_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _community ENABLE TRIGGER ALL;
	ALTER TABLE _community_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _group ENABLE TRIGGER ALL;
	ALTER TABLE _blog ENABLE TRIGGER ALL;
	ALTER TABLE _blog_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _topic ENABLE TRIGGER ALL;
	ALTER TABLE _topic_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _article ENABLE TRIGGER ALL;
	ALTER TABLE _article_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _comment ENABLE TRIGGER ALL;
	ALTER TABLE _comment_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _trackback ENABLE TRIGGER ALL;
	ALTER TABLE _trackback_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _link ENABLE TRIGGER ALL;
	ALTER TABLE _link_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _album ENABLE TRIGGER ALL;
	ALTER TABLE _album_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _text ENABLE TRIGGER ALL;
	ALTER TABLE _text_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _relation ENABLE TRIGGER ALL;
	ALTER TABLE _relation_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _log ENABLE TRIGGER ALL;
	ALTER TABLE _log_tmp ENABLE TRIGGER ALL;
	
	ALTER TABLE _product ENABLE TRIGGER ALL;
	ALTER TABLE _product_association  ENABLE TRIGGER ALL;
	ALTER TABLE _product_association_tmp  ENABLE TRIGGER ALL;
	ALTER TABLE _product_billing ENABLE TRIGGER ALL;
	ALTER TABLE _product_billing_tmp ENABLE TRIGGER ALL;
	ALTER TABLE _product_billing_operation ENABLE TRIGGER ALL;	

	RETURN 1;
	
END;
$$ LANGUAGE plpgsql;