pggeodb.nancy.inra.fr/db_cefs - db_cefs on pggeodb.nancy.inra.fr
Previous topic Chapter index Next topic

Function: relationtrigger

 

 

Schema

topology

 

Owner

postgres

 

Descriptions

There is no description for function relationtrigger

 

Options

Option

Value

Returns

trigger

Language

plpgsql

Parameters

There are no parameters for function relationtrigger

 

Definition

CREATE OR REPLACE FUNCTION topology.relationtrigger (
)
RETURNS trigger AS
$span$
DECLARE

 toponame varchar;
 topoid integer;
 plyr RECORD; -- parent layer
 rec RECORD;
 ok BOOL;

BEGIN
 IF
TG_NARGS != 2 THEN
   RAISE EXCEPTION
'RelationTrigger called with wrong number of arguments';
 END IF;

 topoid = TG_ARGV[0];
 toponame = TG_ARGV[1];

 --RAISE NOTICE 'RelationTrigger called % % on %.relation for a %', TG_WHEN, TG_OP, toponame, TG_LEVEL;


 IF TG_OP = 'DELETE' THEN
   RAISE EXCEPTION
'RelationTrigger not meant to be called on DELETE';
 END IF;

 -- Get layer info (and verify it exists)
 ok = false;
 FOR plyr IN EXECUTE 'SELECT * FROM topology.layer '
      'WHERE '
      ' topology_id = '
|| topoid
   || ' AND'
      ' layer_id = '
|| NEW.layer_id
 LOOP
   ok = true;
   EXIT;
 END LOOP;
 IF NOT ok THEN
   RAISE EXCEPTION
'Layer % does not exist in topology %',
     NEW.layer_id, topoid;
   RETURN NULL;
 END IF;

 IF plyr.level > 0 THEN -- this is hierarchical layer

   -- ElementType must be the layer child id

   IF NEW.element_type != plyr.child_id THEN
     RAISE EXCEPTION
'Type of elements in layer % must be set to its child layer id %', plyr.layer_id, plyr.child_id;
     RETURN NULL;
   END IF;

   -- ElementId must be an existent TopoGeometry in child layer
   ok = false;
   FOR rec IN EXECUTE 'SELECT topogeo_id FROM '
     || quote_ident(toponame) || '.relation '
        ' WHERE layer_id = '
|| plyr.child_id
     || ' AND topogeo_id = ' || NEW.element_id
   LOOP
     ok = true;
     EXIT;
   END LOOP;
   IF NOT ok THEN
     RAISE EXCEPTION
'TopoGeometry % does not exist in the child layer %', NEW.element_id, plyr.child_id;
     RETURN NULL;
   END IF;

 ELSE -- this is a basic layer

   -- ElementType must be compatible with layer type

   IF plyr.feature_type != 4
     AND plyr.feature_type != NEW.element_type
   THEN
     RAISE EXCEPTION
'Element of type % is not compatible with layer of type %', NEW.element_type, plyr.feature_type;
     RETURN NULL;
   END IF;

   --
   -- Now lets see if the element is consistent, which
   -- is it exists in the topology tables.
   --

   --
   -- Element is a Node
   --

   IF NEW.element_type = 1
   THEN
     ok = false;
     FOR rec IN EXECUTE 'SELECT node_id FROM '
       || quote_ident(toponame) || '.node '
          ' WHERE node_id = '
|| NEW.element_id
     LOOP
       ok = true;
       EXIT;
     END LOOP;
     IF NOT ok THEN
       RAISE EXCEPTION
'Node % does not exist in topology %', NEW.element_id, toponame;
       RETURN NULL;
     END IF;

   --
   -- Element is an Edge
   --

   ELSIF NEW.element_type = 2
   THEN
     ok = false;
     FOR rec IN EXECUTE 'SELECT edge_id FROM '
       || quote_ident(toponame) || '.edge_data '
          ' WHERE edge_id = '
|| abs(NEW.element_id)
     LOOP
       ok = true;
       EXIT;
     END LOOP;
     IF NOT ok THEN
       RAISE EXCEPTION
'Edge % does not exist in topology %', NEW.element_id, toponame;
       RETURN NULL;
     END IF;

   --
   -- Element is a Face
   --

   ELSIF NEW.element_type = 3
   THEN
     IF NEW
.element_id = 0 THEN
       RAISE EXCEPTION
'Face % cannot be associated with any feature', NEW.element_id;
       RETURN NULL;
     END IF;
     ok = false;
     FOR rec IN EXECUTE 'SELECT face_id FROM '
       || quote_ident(toponame) || '.face '
          ' WHERE face_id = '
|| NEW.element_id
     LOOP
       ok = true;
       EXIT;
     END LOOP;
     IF NOT ok THEN
       RAISE EXCEPTION
'Face % does not exist in topology %', NEW.element_id, toponame;
       RETURN NULL;
     END IF;
   END IF;

 END IF;
 
 RETURN NEW;
END;
$span$
LANGUAGE
'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST
100;

This file was generated with SQL Manager for PostgreSQL (www.pgsqlmanager.com) at 13/03/2014 13:23
Previous topic Chapter index Next topic