pg.ddx.io  pgsql-interfaces@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Joe Halpin <jhalpin100@gmail.com>
To: pgsql-interfaces@postgresql.org
Subject: Problem with trigger function in C
Date: Tue, 28 Oct 2008 14:34:41 -0500
Message-ID: <4dc28b160810281234g1292831awf4b8716d64f7f405@mail.gmail.com> (raw)

I'm new at this and I apologize if I got the wrong list, but I'm
trying to write a trigger function in C which is linked in with
libxqilla and is supposed to run an xquery against some xml we have
stored in a column. I find that when the function is entered fcinfo is
null, which causes a segfault.

I copied the example trigger function from the documentation at
http://www.postgresql.org/docs/8.3/static/trigger-example.html. I
added some debug output to tell that fcinfo is null.

I built the function by copying the makefile in the contrib directory
for the xml2 demo and modifying it a bit. Here's what I wound up with:

--- start ---
MODULE_big = xqueryTrigger
PG_CPPFLAGS = -I$(libpq_srcdir)
OBJS = xqueryTrigger.o
DATA = libxqueryTrigger.so
SHLIB_LINK = -L/usr/local/lib -lxqilla -lxerces-c-3.0 -lcrypto -lssl

ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
include $(PGXS)
else
subdir = contrib/xml2
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
endif
--- stop ---

Here's the trigger function (or at least as far as it gets)

--- start ---
#include "postgres.h"
#include "executor/spi.h"       /* this is what you need to work with SPI */
#include "commands/trigger.h"   /* ... and triggers */
#include <fmgr.h>

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

typedef void*(*memFunc)(unsigned int sz);
extern int runQuery(const char *qry, const char *xml, char **result,
memFunc allocator);

extern Datum xqueryTrigger(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(xqueryTrigger);

void *memAllocator(unsigned int);
Datum xquerytrigger(PG_FUNCTION_ARGS);

void *memAllocator(unsigned int sz)
{
    return palloc(sz);
}

Datum
xquerytrigger(PG_FUNCTION_ARGS)
{
    TriggerData *trigdata;
    TupleDesc   tupdesc;
    HeapTuple   rettuple;
    char       *when;
    bool        checknull;
    bool        isnull;
    int         ret, i;
    char       *status;

    elog(INFO, "Entering xquerytrigger()");
    elog(INFO, "getting TriggerData...");
    elog(INFO, "fcinfo = %p", fcinfo);
    elog(INFO, "fcinfo->context = %p", fcinfo->context);
    trigdata = (TriggerData *) fcinfo->context;
--- stop ---

Any advice would be appreciated.

Thanks

Joe



view thread (4+ messages)  latest in thread

Message-ID: <4dc28b160810281234g1292831awf4b8716d64f7f405@mail.gmail.com>
Permalink:  ../4dc28b160810281234g1292831awf4b8716d64f7f405@mail.gmail.com/
Also on:    postgresql.org/message-id/4dc28b160810281234g1292831awf4b8716d64f7f405@mail.gmail.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-interfaces@postgresql.org
  Cc: jhalpin100@gmail.com
  Subject: Re: Problem with trigger function in C
  In-Reply-To: <4dc28b160810281234g1292831awf4b8716d64f7f405@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox