Using libpq, floats and binary data

Поиск
Список
Период
Сортировка
От Michael Hull
Тема Using libpq, floats and binary data
Дата
Msg-id AANLkTimmPVc7TWkRVQhTU_gyfLTM8VbsbKhHt-kiUspM@mail.gmail.com
обсуждение исходный текст
Ответы Re: Using libpq, floats and binary data  (Merlin Moncure <mmoncure@gmail.com>)
Re: Using libpq, floats and binary data  (Arjen Nienhuis <a.g.nienhuis@gmail.com>)
Список pgsql-general
Hi Guys,
I have jsut started to use the libpq interface to postgre, and was
wondering if someone with some experience could explain the 'best
practices' :)

I am preparing a query, then submitting it with binary data. 6 values
are ints, and one is a float.

For the ints, I understand that since I need network byte ordering, I
have to pump them through htonl()
The same is also true for the floats I assume, so I have dones some
dirty,dirty casting, but this feels like a source for problems later
on.
It does the correct thing, but is there a better way of doing it??


Mike


char qString[] = "INSERT INTO raw_results (ca,kf,ks,lk,na,iinj,
AP1height) VALUES( $1::int4, $2::int4, $3::int4, $4::int4, $5::int4,
$6::int4, $7::float4)";

PGresult* pPreparedQuery = PQprepare(pDB, "InsertQ",qString, nParams, NULL);




float AP1Height = 3.141;
/* TROUBLE AHEAD! */
if( sizeof( float) != sizeof(int32_t) ) throw MyException();
int32_t AP_int = * ( (int32_t*) &AP1Height );
int32_t AP_intSwapped = htonl(AP_int);
float AP1HeightSwapped = *( (float*) &AP_intSwapped);
/* TROUBLE OVER */


int32_t ca= htonl(100);
int32_t kf= htonl(200);
int32_t ks= htonl(300);
int32_t lk= htonl(400);
int32_t na= htonl(500);
int32_t iinj= htonl(600);

const char* values[nParams] = {
                (char*)&ca,
                (char*)&kf,
                (char*)&ks,
                (char*)&lk,
                (char*)&lk,
                (char*)&iinj,
                (char*)&AP1HeightSwapped,
            };
int lengths[nParams] = {
        sizeof(ca),
        sizeof(kf),
        sizeof(ks),
            sizeof(lk),
        sizeof(na),
        sizeof(iinj),
        sizeof(AP1Height),
        };

int binary[nParams]={1,1,1,1,1, 1,1};

PGresult* res = PQexecPrepared( pDB, "InsertQ", nParams, values,
lengths,binary,0);

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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: help with error "unexpected pageaddr"
Следующее
От: Carlos Mennens
Дата:
Сообщение: Re: Post Install / Secure PostgreSQL