Andrew Chernow wrote:

Any thoughts on the hooking suggested by Tom? It sounds like it should be generic enough so more than just libpqtypes can make use of it. I think something of this nature should have input before I do anything.

Possible Hook points: (at least ones needed by libpqtypes)
conn_create
conn_reset
conn_destroy
result_create
result_destroy

I guess libpqtypes would have to maintain a map of conns and results? Right now it can associate type info because we added members to conn and result. When conn_create(conn) is called, libpqtypes would need to map this by pointer address (as it is all it has as an identifier). Still feels like maybe there should be a void* in a conn and result used for per-connection/result based info (libpqtypes or not).


Well, I can get it working with a very small patch. We actually don't need very much in libpq. Although, making it somehow generic enough to be useful to other extensions is a bit tricky. Please, suggestions would be helpful.

Below is a raw shell of an idea that will work for libpqtypes. Start by removing our entire patch and then add the below:

// libpqtypes only needs the below.  could add op_reset,
// op_linkerror, etc...
enum
{
  HOOK_OP_CREATE,
  HOOK_OP_DESTROY
};

struct pg_conn
{
  // everything currently in a pg_conn
  // ...

  // libpqtypes needs HOOK_OP_DESTROY, a ptr to hookData
  // is always used in case the hooklib needs to allocate
  // or reallocate the hookData.
  void *hookData;
  int (*connHook)(PGconn *conn, int op, void **hookData);
}

struct pg_result
{
  // everything currently in a pg_result
  .....

  // libpqtypes needs create & destroy
  // conn is NULL for destroy
  void *hookData;
  int (*resultHook)(PGconn *conn, PGresult *result,
    int op, void **hookData);
}

freePGconn(PGconn *conn)
{
  // ...
  if(conn->connHook)
    conn->connHook(conn, HOOK_OP_DESTROY, &conn->hookdata);
  // ...
}

PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status)
{
  // ... (result allocated here)
  if(result->resultHook)
    result->resultHook(conn, result,
      HOOK_OP_CREATE, &result->hookData);
  // ...
}

PQclear(PGresult *result)
{
  // ...
  if(result->resultHook)
    result->resultHook(NULL, result,
      HOOK_OP_DESTROY, &result->hookdata);
  // ...
}

// library wide
int PQregisterHooks(connHook, resultHook);

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

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

Reply via email to