From: | David Helgason <david(at)uti(dot)is> |
---|---|
To: | Bastian Voigt <bastian(at)voigt(dot)in-berlin(dot)de> |
Cc: | pgsql-general(at)postgresql(dot)org |
Subject: | Re: PQSQL - binary data question |
Date: | 2004-11-01 07:16:40 |
Message-ID: | FA0F4160-2BD5-11D9-9775-000A9566DA8A@uti.is |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
On 29. okt 2004, at 14:09, Bastian Voigt wrote:
> I just found this old posting on google. Now my question is how can I
> read an
> integer value from the PGresult using the binary format? Can someone
> plz
> gimme a code example? (please mail to me, because I have not
> subscribed to
> the list)
Easy peasy:
/* (in C++, actually would give simpler code in C) */
// To submit the query
bool PgConn::SendPrepared(const string& name, const vector<const
char*>& values, const vector<int>& lengths, const vector<int>&
isBinary) {
if (values.size() != lengths.size() || values.size() !=
isBinary.size())
return Error("PgConn::SendPrepared: All parameter arrays must have
same size");
// for (int i = 0; i != values.size(); i++)
// printf ("Query parameter %d, length %d, binary %d: '%s'\n", i,
lengths[i], (int)isBinary[i], values[i]);
if (! PQsendQueryPrepared(m_Conn, name.c_str(), values.size(),
&values.front(), &lengths.front(), &isBinary.front(), 1 /* want binary
result */))
return Error();
return Success();
}
/* ... then after reading the PGresult */
static int NetworkIntFromBuffer(const char* buff) {
// Make a network-byte-ordered integer from the fetched data
const int *network = reinterpret_cast<const int*>(buff);
// Convert to host (local) byte order and return
int host = ntohl(*network);
return host;
}
int PgColumn::GetInt(int row) {
if (IsNull(row) || row > Rows() || GetLength(row) != 4)
return 0;
return NetworkIntFromBuffer(PQgetvalue(m_Res, row, m_Col));
}
> Thanks a bunch! Now here's the old posting:
>
> On Monday 27 October 2003 09:15, Tomasz Myrta wrote:
>> Dnia 2003-10-27 00:08, UÅytkownik creid napisaÅ:
>>> Problem: Assigning a COUNT(*) result into an integer variable in my
>>> C
>>> program consistently fails except when I assign the same result to a
>>> char
>>> variable. I can only assume that the internal data type the COUNT
>>> function uses is integer.
>>>
>>> Can anyone help put me in the proper mindset so I may deal with this,
>>> seemingly simple issue, to resolution.
>>>
>>> I need the integer result to to help me satisfy a dynamic memory
>>> requirement... COUNT(*) result will tell me how many rows of data I
>>> need
>>> to malloc and I cannot perform a math operation on a char variable.
>>
>> All libpq results are strings.
>> some_int_value=atoi(PQgetvalue(...))
>
> Not true anymore with protocol v3, which added the binary format. Text
> format
> is still the default.
>
>> Anyway why do you need count(*) ? When you retrieve your rows, you can
>> always check how many are them using PQntuples(...) and then malloc
>> your
>> memory tables.
>>
>> Regards,
>> Tomasz Myrta
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to majordomo(at)postgresql(dot)org so that your
> message can get through to the mailing list cleanly
>
--
David Helgason,
Business Development et al.,
Over the Edge I/S (http://otee.dk)
Direct line +45 2620 0663
Main line +45 3264 5049
From | Date | Subject | |
---|---|---|---|
Next Message | Marcel Gsteiger | 2004-11-01 07:33:38 | trouble with rpmbuild on WBEL3.0/x86_64 |
Previous Message | stig erikson | 2004-11-01 07:11:56 | dumping on 7.4.6 importing on 7.4.1 |