I've come up with a flexible solution using binary data inside std::string
.
I propose this new solution because current answers are old (2013) and I was looking for a multi insert query using pqxx 5.0.1.
With the solution bellow you have the flexibility to use a for loop
to append multiple binary data in a single insert query.
CustomStruct data = .... ; // have some binary data
// initialise connection and declare worker
pqxx::connection conn = new pqxx::connection(...);
pqxx::work w(conn);
// prepare query
string query += "INSERT INTO table (bytea_field) VALUES ("
// convert your data in a binary string.
pqxx::binarystring blob((void *)&(data), data.size());
// avoid null character to bug your query string.
query += "'"+w.esc_raw(blob.str())+"');";
//execute query
pqxx::result rows = w.exec(query);
When we want to retrieve data from the database you should have the scope of your datatype (CustomStruct
for instance) and you should be able to cast it back in the binary format of your choice.
// assuming worker and connection are declared and initialized.
string query = "SELECT bytea_field FROM table;";
pqxx::result rows = w.exec(query);
for(pqxx::result::iterator col = rows.begin(); col != rows.end(); ++col)
{
pqxx::binarystring blob(col[0]);
CustomStruct *data = (CustomStruct*) blob.data();
...
}
This was tested with pqxx 5.0.1
, c++11
and postgresSQL 9.5.8