[Libpqxx-general] PQexecParams
Michael Akinde
michael.akinde at met.no
Mon May 4 08:52:13 UTC 2009
Hi,
Thanks for the reply, Jeroen. The unit test looks OK, and works for us.
This may actually have solved our problems with the binary transfer of data; at least the first series of tests seem very promising. I'll try and get back with any further performance information we may collect.
Regards,
Michael A.
----- "Jeroen Vermeulen" <jtv at xs4all.nl> wrote:
> Michael Akinde wrote:
> > Question:
> >
> > How would you go about using prepared statements to load binary
> data
> > into the database, without escaping the data and converting it to
> a
> > string. There are no tests/examples showing how to do this, and
> the
> > couple of attempts I have tried now don't work (0 bytes gets
> inserted
> > into the db). If there is some obvious way of doing this, I am
> > totally missing it.
>
> Hmm... this could be a bit more explicit in the reference docs. Store
>
> your binary data in a std::string, and pass it to your prepared
> statement with the pqxx::prepare::treat_binary treatment specifier.
>
> I'm documenting the issue now, and adding this example to the unit
> tests
> (expanded a bit here for shorter, email-compatible lines):
>
> // Test prepared statement with a binary parameter.
> C.prepare("GimmeBinary", "SELECT $1::bytea")
> ("bytea", pqxx::prepare::treat_binary);
>
> const string bin_data("x \0 \x01 \x02 \xff y", 11);
> assert(bin_data.size() == 11);
> assert(bin_data[2] == '\0');
> assert(bin_data[bin_data.size()-1] != '\0');
>
> const result resultset =
> T.prepared("GimmeBinary")(bin_data).exec();
> const output = binarystring(resultset[0][0]);
>
> PQXX_CHECK_EQUAL(
> output.str(),
> bin_data,
> "Binary parameter was mangled somewhere along the way.");
>
> This prepares a statement GimmeBinary that takes a binary (bytea)
> argument and simply returns that value. It then executes that
> statement, passing it a binary string that can't possibly come through
>
> correctly unless binary data is properly supported. It captures that
>
> data in a binarystring object, which in turn can produce a std::string
>
> holding the same data. It verifies that that string holds the
> original,
> binary data.
>
>
> Jeroen
More information about the Libpqxx-general
mailing list