Вставьте большой двоичный объект (BLOB) в PostgreSQL, используя libpq с удаленного компьютера - PullRequest
5 голосов
/ 25 января 2012

Можете ли вы привести пример вставки двоичных данных в базу данных PostgreSQL с удаленного компьютера с использованием libpq. Мой второй вопрос: есть ли другой API, более эффективный, чем libpq с C ++. Спасибо

Ответы [ 2 ]

11 голосов
/ 25 января 2012

В PostgreSQL есть 2 типа больших двоичных объектов & mdash; BYTEA и Large Objects. Я бы рекомендовал не использовать большие объекты, так как вы не можете присоединить их к таблицам.

Для BYTEA вы должны использовать что-то подобное в 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;
}
3 голосов
/ 21 апреля 2013

Использование libpqxx - это способ C ++, а libpq - это API-интерфейс C.

Вот полный пример того, как это сделать с помощью pqxx: Как вставить двоичные данные в PostgreSQLСтолбец BYTEA с использованием C ++ libpqxx API?

Короче говоря, соответствующие строки C ++ с использованием libpqxx выглядят так:

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