[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