2013-03-16 5 views
0

Я использую библиотеку libpq базы данных Postgresql, и у меня есть проблема с извлечением данных bytea из db. Я не мог решить свою проблему, поэтому хотел спросить вас. Всякий раз, когда я пытаюсь вставить файл изображения в db и вернуть его обратно, размер возвращаемых данных всегда в 2 раза больше данных, которые я отправил. Фактически, точное уравнение: полученные данные = отправленные данные * 2 + 2. (в байтах). Таким образом, я не мог понять это еще, я, вероятно, что-то отсутствует:/Извлечение файла изображения из базы данных Postgresql возвращает в два раза больше вставленных данных (по библиотеке libpq)

Пример кода я использую, как показано ниже:

PGresult* res; 
const char* paramValues[1] = {plateImageArray.data()}; // data type is const char* 
int   paramLengths[1] = {plateImageArray.size()}; // size of image is 58573 bytes 
int   paramFormats[1] = {1}; // 1 for byte, 0 for text 

res = PQexecParams(conn, 
     "INSERT INTO \"plates\" (plateImage) VALUES ($1::bytea)", 
     1,    /* param number */ 
     NULL,   /* param type */ 
     paramValues,  /* param values*/ 
     paramLengths, /* param lengths */ 
     paramFormats, /* default to all text params */ 
     1);    /* return type, 1 for text. */ 

res = PQexec(conn,"Select * from \"plate_images\" WHERE ...."); /*returns 1 tuple : something/something/image(bytea) */ 

int lengthOfPlateImage=PQgetlength(res,0,2); // indicates 117148 bytes, exactly 2 times of sent data +2 

Я ценю, если вы, ребята, помогите мне. Мне смертельно надоело искать причину этого.

Заранее спасибо.

Редактировать: Я отслеживал данные, хранящиеся на диске, и размер вставленных данных одинаковый (58573 байт). В два раза больше данных становится при получении ...

ответ

2

Хорошо, запрос, сделанный с помощью команды «PQexec», возвращает значение в текстовом формате, и у него нет параметров, чтобы сообщить, что вы хотите получить результат в текстовом формате или байте. Я не уверен, существует ли более подходящая команда для запроса, но я использовал «PQexecParams» и задал тип возвращаемого значения 1 (1 для байта, 0 для текста), и он вернул точные данные с ожидаемым размером. Спасибо, в любом случае.