Tom Lane wrote:
Where
exactly does the hook hand off the storage pointer to libpq?  What
are you going to do if the hook fails to create the storage
(ie, out of memory during PGresult creation)?


The current submitted patch has 3 of its function callbacks returning a void*, initHookData after the creation of a conn, resultCreate, and resultCopy. We have recently changed this design so all hooks, now called events, go through a single callback ... PGEventProc. The old function callbacks are just eventIds now.

/////////////////////////////////
// The libpq side (looping registered event procs)
PGEventResultCreate info;
info.stateData = NULL; /* our event data ptr */
info.conn = conn;
info.result = result;

if(!result->evtState[i].proc(PGEVT_RESULTCREATE,
  (void *)&info, result->evtState[i].passThrough)
{
  PQclear(result); // destroy result? ... not sure
  return error;    // previously, we ignored it
}

// assign event data created by event proc.
result->evtState[i].data = info.stateData;


///////////////////////////////////////
// example of what the event proc does
int my_evtproc(PGEventId evtId, void *evtInfo, void *passThrough)
{
  switch(eventId)
  {
    case PGEVT_RESULTCREATE:
    {
      void *data = makeresultdata(....)
      if(!data)
        return FALSE;
      ((PGEventResultCreate *)evtInfo)->stateData = data;
      break;
    }
  }

  return TRUE;
}


--
Andrew Chernow
eSilo, LLC
every bit counts
http://www.esilo.com/

--
Andrew Chernow
eSilo, LLC
every bit counts
http://www.esilo.com/

--
Sent via pgsql-patches mailing list (pgsql-patches@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-patches

Reply via email to