Thread: Why doesn't this pgsql function compile?

Why doesn't this pgsql function compile?

From
Larry Rosenman
Date:
When this PLpgsql function gets called on the trigger
it fails compilation on the last line. 

What am I doing wrong? 


DROP TRIGGER netblock_bgp ON networks;
DROP FUNCTION networks_trigger_router();
CREATE FUNCTION networks_trigger_router()
RETURNS opaque
AS 'BEGIN   IF TG_OP = ''DELETE'' AND OLD.router ISNULL    THEN return OLD;   END IF;   IF TG_OP = ''INSERT'' AND
NEW.routerISNULL   THEN return NEW;   END IF;   IF TG_OP = ''INSERT'' AND get_router_nexthop(NEW.router) ISNULL   THEN
returnNEW;   END IF;   IF TG_OP = ''DELETE'' AND get_router_nexthop(OLD.router) ISNULL   THEN return OLD;   END IF;
IFTG_OP = ''INSERT''    THEN add_ip_route(host(network(NEW.netblock)),                     host(netmask(NEW.netblock)),
                   get_router_ethernet(NEW.router),                     get_router_nexthop(NEW.router),
   get_router_nexthop_user(NEW.router),                     get_router_nexthop_password(NEW.router),
get_router_nexthop_enpass(NEW,router));        return NEW;   END IF;   IF TG_OP = ''DELETE''   THEN
del_ip_route(host(network(OLD.netblock)),                    host(netmask(OLD.netblock)),
get_router_ethernet(OLD.router),                    get_router_nexthop(OLD.router),
get_router_nexthop_user(OLD.router),                    get_router_nexthop_password(OLD.router),
get_router_nexthop_enpass(OLD,router));       return OLD;   -- TG_OP must be UPDATE to get here....   IF OLD.router
NOTNULLand get_router_nexthop(OLD.router) NOTNULL      AND NEW.router NOTNULL and OLD.router != NEW.router    THEN
del_ip_route(host(network(OLD.netblock)),                    host(netmask(OLD.netblock)),
get_router_ethernet(OLD.router),                    get_router_nexthop(OLD.router),
get_router_nexthop_user(OLD.router),                    get_router_nexthop_password(OLD.router),
get_router_nexthop_enpass(OLD,router));   END IF;     IF NEW.router NOTNULL and get_router_nexthop(NEW.router) NOTNULL
 THEN add_ip_route(host(network(NEW.netblock)),                     host(netmask(NEW.netblock)),
get_router_ethernet(NEW.router),                    get_router_nexthop(NEW.router),
get_router_nexthop_user(NEW.router),                    get_router_nexthop_password(NEW.router),
get_router_nexthop_enpass(NEW,router));   END IF;    return NEW;   END;'
 
LANGUAGE 'plpgsql';
CREATE TRIGGER netblock_bgp
BEFORE UPDATE OR INSERT OR DELETE
ON networks
FOR EACH ROW
EXECUTE PROCEDURE networks_trigger_router();

-- 
Larry Rosenman                     http://www.lerctr.org/~ler
Phone: +1 972-414-9812                 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749


Re: Why doesn't this pgsql function compile?

From
Alex Pilosov
Date:
On Fri, 15 Jun 2001, Larry Rosenman wrote:

<snip>
you are missing an endif:
> DROP TRIGGER netblock_bgp ON networks;
> DROP FUNCTION networks_trigger_router();
> CREATE FUNCTION networks_trigger_router()
> RETURNS opaque
> AS 'BEGIN
>     IF TG_OP = ''DELETE'' AND OLD.router ISNULL 
>     THEN return OLD;
>     END IF;
>     IF TG_OP = ''INSERT'' AND NEW.router ISNULL
>     THEN return NEW;
>     END IF;
>     IF TG_OP = ''INSERT'' AND get_router_nexthop(NEW.router) ISNULL
>     THEN return NEW;
>     END IF;
>     IF TG_OP = ''DELETE'' AND get_router_nexthop(OLD.router) ISNULL
>     THEN return OLD;
>     END IF;
>     IF TG_OP = ''INSERT'' 
>     THEN add_ip_route(host(network(NEW.netblock)),
>                       host(netmask(NEW.netblock)),
>                       get_router_ethernet(NEW.router),
>                       get_router_nexthop(NEW.router),
>                       get_router_nexthop_user(NEW.router),
>                       get_router_nexthop_password(NEW.router),
>                       get_router_nexthop_enpass(NEW,router));
>          return NEW;
>     END IF;
>     IF TG_OP = ''DELETE''
>     THEN del_ip_route(host(network(OLD.netblock)),
>                       host(netmask(OLD.netblock)),
>                       get_router_ethernet(OLD.router),
>                       get_router_nexthop(OLD.router),
>                       get_router_nexthop_user(OLD.router),
>                       get_router_nexthop_password(OLD.router),
>                       get_router_nexthop_enpass(OLD,router));
>          return OLD;
^^^^^^^^^^^^^^^^     END IF;
>     -- TG_OP must be UPDATE to get here....
>     IF OLD.router NOTNULL and get_router_nexthop(OLD.router) NOTNULL
>        AND NEW.router NOTNULL and OLD.router != NEW.router 
>     THEN del_ip_route(host(network(OLD.netblock)),
>                       host(netmask(OLD.netblock)),
>                       get_router_ethernet(OLD.router),
>                       get_router_nexthop(OLD.router),
>                       get_router_nexthop_user(OLD.router),
>                       get_router_nexthop_password(OLD.router),
>                       get_router_nexthop_enpass(OLD,router));
>      END IF; 
>      IF NEW.router NOTNULL and get_router_nexthop(NEW.router) NOTNULL
>      THEN add_ip_route(host(network(NEW.netblock)),
>                       host(netmask(NEW.netblock)),
>                       get_router_ethernet(NEW.router),
>                       get_router_nexthop(NEW.router),
>                       get_router_nexthop_user(NEW.router),
>                       get_router_nexthop_password(NEW.router),
>                       get_router_nexthop_enpass(NEW,router));
>      END IF;
>      return NEW;
>     END;'
> LANGUAGE 'plpgsql';
> CREATE TRIGGER netblock_bgp
> BEFORE UPDATE OR INSERT OR DELETE
> ON networks
> FOR EACH ROW
> EXECUTE PROCEDURE networks_trigger_router();
> 
> 



Re: Why doesn't this pgsql function compile?

From
Larry Rosenman
Date:
Yes, I found that out, as well as needing to save off 
the new. and old. var's...

:-) 

LER

* Joe Conway <joseph.conway@home.com> [010615 17:43]:
> 
> > When this PLpgsql function gets called on the trigger
> > it fails compilation on the last line.
> >
> > What am I doing wrong?
> >
> >
> 
> <snip>
> 
> >     IF TG_OP = ''INSERT''
> >     THEN add_ip_route(host(network(NEW.netblock)),
> >                       host(netmask(NEW.netblock)),
> >                       get_router_ethernet(NEW.router),
> >                       get_router_nexthop(NEW.router),
> >                       get_router_nexthop_user(NEW.router),
> >                       get_router_nexthop_password(NEW.router),
> >                       get_router_nexthop_enpass(NEW,router));
> >          return NEW;
> >     END IF;
> 
> Don't you need a "PERFORM" between the "THEN" and "add_ip_route(. . ." above
> (and similar places below)?
> 
> -- Joe
> 
> >    IF TG_OP = ''DELETE''
> >    THEN del_ip_route(host(network(OLD.netblock)),
> >                      host(netmask(OLD.netblock)),
> >                      get_router_ethernet(OLD.router),
> >                      get_router_nexthop(OLD.router),
> >                      get_router_nexthop_user(OLD.router),
> >                      get_router_nexthop_password(OLD.router),
> >                      get_router_nexthop_enpass(OLD,router));
> >         return OLD;
> >    -- TG_OP must be UPDATE to get here....
> >    IF OLD.router NOTNULL and get_router_nexthop(OLD.router) NOTNULL
> >       AND NEW.router NOTNULL and OLD.router != NEW.router
> >    THEN del_ip_route(host(network(OLD.netblock)),
> >                      host(netmask(OLD.netblock)),
> >                      get_router_ethernet(OLD.router),
> >                      get_router_nexthop(OLD.router),
> >                      get_router_nexthop_user(OLD.router),
> >                      get_router_nexthop_password(OLD.router),
> >                      get_router_nexthop_enpass(OLD,router));
> >     END IF;
> >     IF NEW.router NOTNULL and get_router_nexthop(NEW.router) NOTNULL
> >     THEN add_ip_route(host(network(NEW.netblock)),
> >                      host(netmask(NEW.netblock)),
> >                      get_router_ethernet(NEW.router),
> >                      get_router_nexthop(NEW.router),
> >                      get_router_nexthop_user(NEW.router),
> >                      get_router_nexthop_password(NEW.router),
> >                      get_router_nexthop_enpass(NEW,router));
> >     END IF;
> >     return NEW;
> >    END;'
> > LANGUAGE 'plpgsql';
> 
> 


Re: Why doesn't this pgsql function compile?

From
"Joe Conway"
Date:
> When this PLpgsql function gets called on the trigger
> it fails compilation on the last line.
>
> What am I doing wrong?
>
>

<snip>

>     IF TG_OP = ''INSERT''
>     THEN add_ip_route(host(network(NEW.netblock)),
>                       host(netmask(NEW.netblock)),
>                       get_router_ethernet(NEW.router),
>                       get_router_nexthop(NEW.router),
>                       get_router_nexthop_user(NEW.router),
>                       get_router_nexthop_password(NEW.router),
>                       get_router_nexthop_enpass(NEW,router));
>          return NEW;
>     END IF;

Don't you need a "PERFORM" between the "THEN" and "add_ip_route(. . ." above
(and similar places below)?

-- Joe

>    IF TG_OP = ''DELETE''
>    THEN del_ip_route(host(network(OLD.netblock)),
>                      host(netmask(OLD.netblock)),
>                      get_router_ethernet(OLD.router),
>                      get_router_nexthop(OLD.router),
>                      get_router_nexthop_user(OLD.router),
>                      get_router_nexthop_password(OLD.router),
>                      get_router_nexthop_enpass(OLD,router));
>         return OLD;
>    -- TG_OP must be UPDATE to get here....
>    IF OLD.router NOTNULL and get_router_nexthop(OLD.router) NOTNULL
>       AND NEW.router NOTNULL and OLD.router != NEW.router
>    THEN del_ip_route(host(network(OLD.netblock)),
>                      host(netmask(OLD.netblock)),
>                      get_router_ethernet(OLD.router),
>                      get_router_nexthop(OLD.router),
>                      get_router_nexthop_user(OLD.router),
>                      get_router_nexthop_password(OLD.router),
>                      get_router_nexthop_enpass(OLD,router));
>     END IF;
>     IF NEW.router NOTNULL and get_router_nexthop(NEW.router) NOTNULL
>     THEN add_ip_route(host(network(NEW.netblock)),
>                      host(netmask(NEW.netblock)),
>                      get_router_ethernet(NEW.router),
>                      get_router_nexthop(NEW.router),
>                      get_router_nexthop_user(NEW.router),
>                      get_router_nexthop_password(NEW.router),
>                      get_router_nexthop_enpass(NEW,router));
>     END IF;
>     return NEW;
>    END;'
> LANGUAGE 'plpgsql';





Re: Why doesn't this pgsql function compile?

From
Larry Rosenman
Date:
* Larry Rosenman <ler@lerctr.org> [010615 17:47]:
> 
> Yes, I found that out, as well as needing to save off 
> the new. and old. var's...
> 
> :-) 
BTW, thanks, guys..... Too much staring at code...

I *REALLY* appreciate the good eyes...  

It's now working!

:-) 

(my first set of triggers), and it even talks to the routers...

PeterE: Thanks for PL/sh, I'm using it to launch a couple of python
scripts to actually do the router talking and mail us.

LER

> 
> LER
> 
> * Joe Conway <joseph.conway@home.com> [010615 17:43]:
> > 
> > > When this PLpgsql function gets called on the trigger
> > > it fails compilation on the last line.
> > >
> > > What am I doing wrong?
> > >
> > >
> > 
> > <snip>
> > 
> > >     IF TG_OP = ''INSERT''
> > >     THEN add_ip_route(host(network(NEW.netblock)),
> > >                       host(netmask(NEW.netblock)),
> > >                       get_router_ethernet(NEW.router),
> > >                       get_router_nexthop(NEW.router),
> > >                       get_router_nexthop_user(NEW.router),
> > >                       get_router_nexthop_password(NEW.router),
> > >                       get_router_nexthop_enpass(NEW,router));
> > >          return NEW;
> > >     END IF;
> > 
> > Don't you need a "PERFORM" between the "THEN" and "add_ip_route(. . ." above
> > (and similar places below)?
> > 
> > -- Joe
> > 
> > >    IF TG_OP = ''DELETE''
> > >    THEN del_ip_route(host(network(OLD.netblock)),
> > >                      host(netmask(OLD.netblock)),
> > >                      get_router_ethernet(OLD.router),
> > >                      get_router_nexthop(OLD.router),
> > >                      get_router_nexthop_user(OLD.router),
> > >                      get_router_nexthop_password(OLD.router),
> > >                      get_router_nexthop_enpass(OLD,router));
> > >         return OLD;
> > >    -- TG_OP must be UPDATE to get here....
> > >    IF OLD.router NOTNULL and get_router_nexthop(OLD.router) NOTNULL
> > >       AND NEW.router NOTNULL and OLD.router != NEW.router
> > >    THEN del_ip_route(host(network(OLD.netblock)),
> > >                      host(netmask(OLD.netblock)),
> > >                      get_router_ethernet(OLD.router),
> > >                      get_router_nexthop(OLD.router),
> > >                      get_router_nexthop_user(OLD.router),
> > >                      get_router_nexthop_password(OLD.router),
> > >                      get_router_nexthop_enpass(OLD,router));
> > >     END IF;
> > >     IF NEW.router NOTNULL and get_router_nexthop(NEW.router) NOTNULL
> > >     THEN add_ip_route(host(network(NEW.netblock)),
> > >                      host(netmask(NEW.netblock)),
> > >                      get_router_ethernet(NEW.router),
> > >                      get_router_nexthop(NEW.router),
> > >                      get_router_nexthop_user(NEW.router),
> > >                      get_router_nexthop_password(NEW.router),
> > >                      get_router_nexthop_enpass(NEW,router));
> > >     END IF;
> > >     return NEW;
> > >    END;'
> > > LANGUAGE 'plpgsql';
> > 
> > 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
> 
> http://www.postgresql.org/search.mpl
> 

-- 
Larry Rosenman                     http://www.lerctr.org/~ler
Phone: +1 972-414-9812                 E-Mail: ler@lerctr.org
US Mail: 1905 Steamboat Springs Drive, Garland, TX 75044-6749