Re: [PATCHES] libpq type system 0.9a

Поиск
Список
Период
Сортировка
От Andrew Chernow
Тема Re: [PATCHES] libpq type system 0.9a
Дата
Msg-id 47FE0C5E.6030103@esilo.com
обсуждение исходный текст
Ответ на Re: [PATCHES] libpq type system 0.9a  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: [PATCHES] libpq type system 0.9a  (Gregory Stark <stark@enterprisedb.com>)
Re: [PATCHES] libpq type system 0.9a  (Andrew Chernow <ac@esilo.com>)
Список pgsql-hackers
Tom Lane wrote:
> Andrew Chernow <ac@esilo.com> writes:
>>>> What parts of PGconn/PGresult do you need to touch that aren't exposed
>>>> already?
> 
>> Don't need direct access to PGconn at all.
> 
> Oh, good, that makes things much easier.
> 

Shoot!  Feels like you always miss something.

The patch uses PGconn's PQExpBuffer to set errors on a conn.  Currently, 
there is no access to this buffer other than PQerrorMessage.  Is the 
below okay?

extern PQExpBuffer *PQgetErrorBuffer(PGconn *conn);
// OR PQsetErrorMessage(conn, errstr) -- this felt strange to me

The expbuffer API is public, so managing the returned PQExpBuffer would 
not require any additional API calls.

While I am on the subject of things I missed, the patch also uses 
pqSetResultError (mostly during PQgetf).

We no longer need direct access to anything inside pg_result.  However, 
we would need 3 new API calls that would dup a result, set field descs 
and add tuples to a result.  Below are prototypes of what I have so far 
(small footprint for all 3, maybe 100-150 lines).

/* numParameters, paramDescs, errFields, curBlock, * curOffset and spaceLeft are not assigned at all, * initialized to
zero. errMsg is handled by * PQmakeEmptyPGresult.  attDescs and tuples are not * duplicated, only allocated based on
'ntups'and * 'numAttributes'.  The idea is to dup the result * but customize attDescs and tuples. */
 
PGresult *PQresultDup(  PGconn *conn,  PGresult *source,  int ntups,  int numAttributes);

/* Only for results returned by PQresultDup.  This * will set the field descs for 'field_num'.  The * PGresAttDesc
structwas not used to avoid * exposing it. */
 
int PQresultSetFieldDesc(  PGresult *res,  int field_num,  const char *name,  Oid tableid,  int columnid,  int format,
Oidtypid,  int typlen,  int typmod)
 

/* Only for results returned by PQresultDup.  This * will append a new tuple to res.  A PGresAttValue * is allocated
andput at index 'res->ntups'.  This * is similar to pqAddTuple except that the tuples * table has been pre-allocated.
Inour case, ntups * and numAttributes are known when calling resultDup. */
 
int PQresultAddTuple(  PGresult *res,  char *value,  int len);

The above would allow an external app to dup a result and customize its 
rows and columns.  Our patch uses this for arrays and composites.

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


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

Предыдущее
От: Alvaro Herrera
Дата:
Сообщение: Re: Commit fest queue
Следующее
От: Peter Eisentraut
Дата:
Сообщение: Re: Separate psql commands from arguments