Insert Binary Large Object (BLOB) in PostgreSQL using libpq from remote machine Insert Binary Large Object (BLOB) in PostgreSQL using libpq from remote machine postgresql postgresql

Insert Binary Large Object (BLOB) in PostgreSQL using libpq from remote machine


There are 2 types of blobs in PostgreSQL — BYTEA and Large Objects. I'd recommend against using large objects as you can not join them to tables.

For BYTEA you'd use something like this in libpq:

PGresult* put_data_to_tablename(  PGconn* conn,  int32_t id,  int data_size,  const char* const data) {  PGresult* result;  const uint32_t id_big_endian = htonl((uint32_t)id);  const char* const paramValues[] = { &id_big_endian, data };  const int nParams = sizeof(paramValues) / sizeof(paramValues[0]);  const int paramLenghts[] = { sizeof(id_big_endian), data_size };  const int paramFormats[] = { 1, 1 }; /* binary */  const int resultFormat = 0; /* text */  result = PQexecParams(    conn,    "insert into tablename (id, data) values ($1::integer, $2::bytea)",    nParams,    NULL, /* Types of parameters, unused as casts will define types */    paramValues,    paramLenghts,    paramFormats,    resultFormat  );  return result;}


Using libpqxx is the C++ way to do it, while libpq is the C API.

Here is a full example of how to do it using pqxx: How to insert binary data into a PostgreSQL BYTEA column using the C++ libpqxx API?

In short, the relevant C++ lines using libpqxx look like this:

void * bin_data = ...; // obviously do what you need to get the binary data...size_t bin_size = ...; // ...and the size of the binary datapqxx::binarystring bin( bin_data, bin_size );pqxx::result r = work.prepared( "test" )( bin ).exec();work.commit();