Re: question

Поиск
Список
Период
Сортировка
От Sandeep Joshi
Тема Re: question
Дата
Msg-id 3A3A9CC9.58644C3C@zambeel.com
обсуждение исходный текст
Ответ на question  (Sandeep Joshi <sjoshi@Zambeel.com>)
Список pgsql-general
I have attached my program which I am trying to load as a trigger function.
I was unsuccessful.

I cannot link due to "elog" and "SPI_*" functions.  which library are they
defined in?

I am linking "-lpq" on the command line.


Sandeep




> * Sandeep Joshi <sjoshi@Zambeel.com> [001215 12:43] wrote:
> >
> > I need to update a second  database through a trigger function written
> > 'C'.
> >
> > Is that possible ? how?
> >
> > Do I need to go to commercial product for this?
>
> No, just reading the documentation should help. :)
>
> I imagine you should be able to link to libpq and do the updates
> using that.
>
> --
> -Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
> "I have the heart of a child; I keep it in a jar on my desk."

#include <stdio.h>
#include "libpq-fe.h"

#include "executor/spi.h"   /* this is what you need to work with spi */
#include "commands/trigger.h" /* -"- and triggers */

HeapTuple insert_into_db2(void);

HeapTuple
insert_into_db2(void)
{
  Trigger    *trigger;    /* to get trigger name */
  int     nargs,i,j;      /* # of arguments */
  Datum   newval;     /* new value of column */
  char    **args;     /* arguments */
  char     *relname;    /* triggered relation name */
  Relation  rel;      /* triggered relation */
  HeapTuple rettuple = NULL;
  TupleDesc tupdesc;    /* tuple description */
  int     attnum,natts;
  Datum    *cvals;      /* column values */
  char     *cnulls;     /* column nulls */
  bool     isnull;
  char *fieldval, *fieldtype;

  char     *pghost, *pgport, *pgoptions, *pgtty,   *dbName;
  PGconn     *conn;
  PGresult   *res;

  /* sanity checks from autoinc.c */
  if (!CurrentTriggerData)
    elog(ERROR, "insert_username: triggers are not initialized");
  if (TRIGGER_FIRED_FOR_STATEMENT(CurrentTriggerData->tg_event))
    elog(ERROR, "insert_username: can't process STATEMENT events");
  if (TRIGGER_FIRED_AFTER(CurrentTriggerData->tg_event))
    elog(ERROR, "insert_username: must be fired before event");

  if (TRIGGER_FIRED_BY_INSERT(CurrentTriggerData->tg_event))
    rettuple = CurrentTriggerData->tg_trigtuple;
  else if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event))
    rettuple = CurrentTriggerData->tg_newtuple;
  else
    elog(ERROR, "insert_username: can't process DELETE events");

  rel = CurrentTriggerData->tg_relation;
  relname = SPI_getrelname(rel);

  trigger = CurrentTriggerData->tg_trigger;

  nargs = trigger->tgnargs;
  if (nargs != 3)
    elog(ERROR, "insert_username (%s): one argument was expected", relname);

  args = trigger->tgargs;
  tupdesc = rel->rd_att;
  natts = tupdesc->natts;

  CurrentTriggerData = NULL;

  attnum = SPI_fnumber(tupdesc, args[0]);

   /* Fetch tuple values and nulls
  cvals = (Datum *) palloc(natts * sizeof(Datum));
  cnulls = (char *) palloc(natts * sizeof(char));
  for (i = 0; i < natts; i++)
  {
    cvals[i] = SPI_getbinval(rettuple,tupdesc, i + 1, &isnull);
    cnulls[i] = (isnull) ? 'n' : ' ';
  } */

  elog(NOTICE,"values %s. %s\n",  SPI_fname(tupdesc, 1), SPI_getvalue(rettuple, tupdesc, 1));
  elog(NOTICE,"values %s. %s\n",  SPI_fname(tupdesc, 2), SPI_getvalue(rettuple, tupdesc, 2));
  elog(NOTICE,"values %s. %s\n",  SPI_fname(tupdesc, 3), SPI_getvalue(rettuple, tupdesc, 3));

  pghost = NULL;        /* host name of the backend server */
  pgport = NULL;        /* port of the backend server */
  pgoptions = NULL;     /* special options to start up the backend
                 * server */
  pgtty = NULL;       /* debugging tty for the backend server */
  dbName = "db2";

  /* make a connection to the database */
  conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

  /* check to see that the backend connection was successfully made */
  if (PQstatus(conn) == CONNECTION_BAD)
  {
    elog(ERROR,"conneciton bad.\n");
  }
  res = PQexec(conn, "BEGIN");
  if (PQresultStatus(res) != PGRES_COMMAND_OK)
  {
    elog(ERROR,"conneciton bad.\n");
    PQclear(res);
  }
  PQclear(res);
  res = PQexec(conn, "insert into  db2user values (3,'test123','n05aWAjCn2cqo'); ");
  if (PQresultStatus(res) != PGRES_COMMAND_OK)
  {
    elog(ERROR,"PQexec bad.\n");
  }
  PQclear(res);
  res = PQexec(conn, "END");
  PQclear(res);

  /* close the connection to the database and cleanup */
  PQfinish(conn);

  pfree(relname);
  return (rettuple);

}

В списке pgsql-general по дате отправления:

Предыдущее
От: "Oliver Elphick"
Дата:
Сообщение: Re: [ADMIN] simple questions
Следующее
От: Sandeep Joshi
Дата:
Сообщение: Re: question