Search Postgresql Archives

Re: Compilate problems

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, Oct 04, 2009 at 01:07:54PM -0400, Yadisnel Galvez Velazquez wrote:
> The problem is identical if I run this example:

Please attach files instead of posting them in-line :)  I've attached
your example as a file.

Please also to group-reply instead of just replying to the poster.

Cheers,
David
-- 
David Fetter <david@xxxxxxxxxx> http://fetter.org/
Phone: +1 415 235 3778  AIM: dfetter666  Yahoo!: dfetter
Skype: davidfetter      XMPP: david.fetter@xxxxxxxxx

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
#include <postgresql/8.3/server/postgres.h>
#include <postgresql/8.3/server/executor/spi.h>
#include <postgresql/8.3/server/commands/trigger.h>

extern Datum trigf(PG_FUNCTION_ARGS);

PG_FUNCTION_INFO_V1(trigf);

Datum
trigf(PG_FUNCTION_ARGS)
{
	TriggerData *trigdata = (TriggerData *) fcinfo->context;
	TupleDesc   tupdesc;
	HeapTuple   rettuple;
	char	    *when;
	bool		checknull = false;
	bool		isnull;
	int		 	ret, i;

	/* make sure it's called as a trigger at all */
	if (!CALLED_AS_TRIGGER(fcinfo))
		elog(ERROR, "trigf: not called by trigger manager");

	/* tuple to return to executor */
	if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
		rettuple = trigdata->tg_newtuple;
	else
		rettuple = trigdata->tg_trigtuple;

	/* check for null values */
	if (!TRIGGER_FIRED_BY_DELETE(trigdata->tg_event)
		&& TRIGGER_FIRED_BEFORE(trigdata->tg_event))
		checknull = true;

	if (TRIGGER_FIRED_BEFORE(trigdata->tg_event))
		when = "before";
	else
		when = "after ";

	tupdesc = trigdata->tg_relation->rd_att;

	/* connect to SPI manager */
	if ((ret = SPI_connect()) < 0)
		elog(INFO, "trigf (fired %s): SPI_connect returned %d", when, ret);

	/* get number of rows in table */
	ret = SPI_exec("SELECT count(*) FROM ttest", 0);

	if (ret < 0)
		elog(NOTICE, "trigf (fired %s): SPI_exec returned %d", when, ret);

	/* count(*) returns int8, so be careful to convert */
	i = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[0],
									SPI_tuptable->tupdesc,
									1,
									&isnull));

	elog (INFO, "trigf (fired %s): there are %d rows in ttest", when, i);

	SPI_finish();

	if (checknull)
	{
		SPI_getbinval(rettuple, tupdesc, 1, &isnull);
		if (isnull)
			rettuple = NULL;
	}

	return PointerGetDatum(rettuple);
}
-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux