Re: have you feel anything when you read this ? - Mailing list pgsql-sql
From | Stephan Szabo |
---|---|
Subject | Re: have you feel anything when you read this ? |
Date | |
Msg-id | 20060404071118.C19036@megazone.bigpanda.com Whole thread Raw |
In response to | Re: have you feel anything when you read this ? ("Eugene E." <sad@bankir.ru>) |
Responses |
Re: have you feel anything when you read this ?
|
List | pgsql-sql |
On Tue, 4 Apr 2006, Eugene E. wrote: > Stephan Szabo wrote: > > On Fri, 31 Mar 2006, Eugene E. wrote: > > > > > >>Peter Eisentraut wrote: > >> > >>>Eugene E. wrote: > >>> > >>> > >>>>the problem is: you'll get this four byte sequence '\000' _instead_ > >>>>of NUL-byte anyway. > >>> > >>> > >>>What you seem to be missing is that PostgreSQL data can be represented > >>>in textual and in binary form. What you in psql is the textual form. > >>>If you want the binary form you need to select it. Then you can pass > >>>the exact bytes back and forth. > >> > >>your sentence is not true. > >>I can not select exact bytes even if i use BYTEA type > > > > > > No, that is still using the textual form. If you use PQexecParams and set > > the last argument to show you want binary data, you should get binary > > data. > > Documentation says: > === > PQexecParams > > Submits a command to the server and waits for the result, with the > ability to pass parameters separately from the SQL command text. > === > > How should i use this func to change so-called "textual form" of a > select-result to so-called "binary form" ? From the 8.1 docs (although I believe this applies back to 7.4): PQexecParams Submits a command to the server and waits for the result, with the ability to pass parameters separately from the SQL command text. PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, intresultFormat); PQexecParams is like PQexec, but offers additional functionality: parameter values can be specified separately from the command string proper, and query results can be requested in either text or binary format. PQexecParams is supported only in protocol 3.0 and later connections; it will fail when using protocol 2.0. If parameters are used, they are referred to in the command string as $1, $2, etc. nParams is the number of parameters supplied; it is the length of the arrays paramTypes[], paramValues[], paramLengths[], and paramFormats[]. (The array pointers may be NULL when nParams is zero.) paramTypes[] specifies, by OID, the data types to be assigned to the parameter symbols. If paramTypes is NULL, or any particular element in the array is zero, the server assigns a data type to the parameter symbol in the same way it would do for an untyped literal string. paramValues[] specifies the actual values of the parameters. A null pointer in this array means the corresponding parameter is null; otherwise the pointer points to a zero-terminated text string (for text format) or binary data in the format expected by the server (for binary format). paramLengths[] specifies the actual data lengths of binary-format parameters. It is ignored for null parameters and text-format parameters. The array pointer may be null when there are no binary parameters. paramFormats[] specifies whether parameters are text (put a zero in the array) or binary (put a one in the array). If the array pointer is null then all parameters are presumed to be text. resultFormat is zero to obtain results in text format, or one to obtain results in binary format. (There is not currently a provision to obtain different result columns in different formats, although that is possible in the underlying protocol.) --- Note the last argument to the function, and the last couple of sentences in the above describe how to use resultFormat. It'd be nice if we could get an interface which allowed mixing, but that's secondary to can we get binary data or not. Here's a similar app to the one you sent which for me seemingly gives the binary data: #include <stdlib.h> #include <stdio.h> #include "libpq-fe.h" int main (void) { PGconn * conn; PGresult * res; char * val; int i; int len; conn = PQconnectdb("user=sszabo password=a dbname=sszabo"); PQexec(conn, "CREATE TABLE t (a BYTEA)"); PQexec(conn, "INSERT INTO t VALUES ('ab\\\\000cd')"); res = PQexecParams(conn, "SELECT a FROM t", 0, NULL, NULL, NULL, NULL, 1); val = PQgetvalue(res,0,0); len = PQgetlength(res,0,0); printf("what_we_retrive='%s' its_value_length=%i\n",val,len); for (i=0; i < len; ++i) { printf("Position %d is %d (%c)\n", i, val[i], val[i]); } PQclear(res); PQfinish(conn); return 0; }