Re: [PATCHES] libpq type system 0.9a - Mailing list pgsql-hackers
| From | Andrew Chernow |
|---|---|
| Subject | Re: [PATCHES] libpq type system 0.9a |
| Date | |
| Msg-id | 47FC3A26.5070301@esilo.com Whole thread Raw |
| In response to | Re: [PATCHES] libpq type system 0.9a (Andrew Chernow <ac@esilo.com>) |
| Responses |
Re: [PATCHES] libpq type system 0.9a
|
| List | pgsql-hackers |
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 //
orreallocate 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/
pgsql-hackers by date: