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