Error al consultar un "Large object" con unixodbc y c++

From: Manuel Fernández Campos <mfc1981(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Error al consultar un "Large object" con unixodbc y c++
Date: 2006-12-05 19:46:50
Message-ID: 36c5203c0612051146g2501a30qa93b1d0e1acffe60@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Buenas listas.

Tengo un problema con los large object que ya me está loqueando. LLevo
varios dias buscando y buceando por listas y no encuentro el fallo.

El problema está en que no soy capaz de hacer que me devuelva una imagen
almacenada en un campo "lo", directamente no me devuelve nada de esos campos
(de los otros si).

Os pego el código a ver vosotros veis donde está el error:

int PgsqlImageDao::insertImage(Connection* conn, const Image& image,
unsigned char* previewData, unsigned int previewSize,
Date photoDate, Date insDate,
const string& info) throw(DataAccessException) {

char ODBC_ident[IDENT_SIZE];
char ODBC_info[INFO_SIZE];
unsigned char* imageData = NULL;
long ODBC_result; // Result of function
calls.
SQLHDBC ODBC_conHnd; // Handle for a
connection
SQLHSTMT ODBC_stmHnd; // Handle for a
statement
SQLINTEGER ODBC_id;
SQLINTEGER ODBC_size;
SQLINTEGER ODBC_previewSize;
SQLINTEGER ODBC_strlen = 0;
SQLINTEGER ODBC_dataPar;
SQLINTEGER ODBC_previewPar;
SQLPOINTER ODBC_token;
SQLSMALLINT ODBC_shortCols[IMAGE_SHORT_BINDS];
SQL_DATE_STRUCT ODBC_photoDate;
SQL_DATE_STRUCT ODBC_insDate;

ODBC_conHnd = conn->getHnd();
ODBC_result = SQLAllocHandle(SQL_HANDLE_STMT, ODBC_conHnd,
&ODBC_stmHnd);

if ((ODBC_result != SQL_SUCCESS) && (ODBC_result !=
SQL_SUCCESS_WITH_INFO)) {
delete conn;
throw SysDataAccessException(ODBC_result, "Cannot allocate statement
handle");
}

/* Get new image ID. */
SQLBindCol(ODBC_stmHnd, 1, SQL_C_ULONG, &ODBC_id, 1, &ODBC_strlen);
ODBC_result = SQLExecDirect(ODBC_stmHnd, (SQLCHAR*) GET_ID_QUERY,
SQL_NTS);

if ((ODBC_result != SQL_SUCCESS) && (ODBC_result !=
SQL_SUCCESS_WITH_INFO)) {

SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(ODBC_result,
"Cannot execute statement GET_ID_QUERY");
}

ODBC_result = SQLFetch(ODBC_stmHnd);

if (ODBC_result == SQL_NO_DATA) {
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw
UserDataAccessException(UserDataAccessException::DATA_NOT_FOUND,
"Cannot get a new image ID (GET_ID_QUERY)");
}

ODBC_result = SQLFreeStmt(ODBC_stmHnd, SQL_CLOSE);
ODBC_result = SQLFreeStmt(ODBC_stmHnd, SQL_UNBIND);
ODBC_result = SQLFreeStmt(ODBC_stmHnd, SQL_RESET_PARAMS);

/* Set query parameters values with the image properties. */

imageData = (unsigned char *) malloc (image.SizeOfImage());
imageData =(unsigned char *)memcpy(imageData, image.ImageB(),
image.SizeOfImage());

ODBC_shortCols[0] = image.getType();
ODBC_shortCols[1] = image.getNCol();
ODBC_shortCols[2] = image.getNLin();
ODBC_size = image.SizeOfImage();
ODBC_previewSize = previewSize;
ODBC_photoDate.year = photoDate.getYear();
ODBC_photoDate.month = photoDate.getMonth();
ODBC_photoDate.day = photoDate.getDay();
ODBC_insDate.year = insDate.getYear();
ODBC_insDate.month = insDate.getMonth();
ODBC_insDate.day = insDate.getDay();
{
const string& ident = image.getIdent();
ident.copy(ODBC_ident, IDENT_LENGTH);
int i = (ident.length() < IDENT_LENGTH)? ident.length(): IDENT_LENGTH;
ODBC_ident[i] = '\0';
ODBC_ident[IDENT_LENGTH] = '\0';

info.copy(ODBC_info, INFO_LENGTH);
i = (info.length() < INFO_LENGTH)? info.length(): INFO_LENGTH;
ODBC_info[i] = '\0';
ODBC_info[INFO_LENGTH] = '\0';
}
ODBC_strlen = SQL_NTS;

SQLPrepare(ODBC_stmHnd, (SQLCHAR*) INSERT_IMAGE_QUERY, SQL_NTS);
SQLBindParameter(ODBC_stmHnd, 1, SQL_PARAM_INPUT,
SQL_C_SLONG, SQL_INTEGER, 0, 0, &ODBC_id, 0, NULL);
SQLBindParameter(ODBC_stmHnd, 2, SQL_PARAM_INPUT, SQL_C_SSHORT,
SQL_SMALLINT, 0, 0, &ODBC_shortCols[0], 0, NULL);
SQLBindParameter(ODBC_stmHnd, 3, SQL_PARAM_INPUT, SQL_C_SSHORT,
SQL_SMALLINT, 0, 0, &ODBC_shortCols[1], 0, NULL);
SQLBindParameter(ODBC_stmHnd, 4, SQL_PARAM_INPUT, SQL_C_SSHORT,
SQL_SMALLINT, 0, 0, &ODBC_shortCols[2], 0, NULL);
SQLBindParameter(ODBC_stmHnd, 5, SQL_PARAM_INPUT, SQL_C_SLONG,
SQL_INTEGER, 0, 0, &ODBC_size, 0, NULL);
SQLBindParameter(ODBC_stmHnd, 6, SQL_PARAM_INPUT, SQL_C_TYPE_DATE,
SQL_DATE, 0, 0, &ODBC_photoDate, 0, NULL);
SQLBindParameter(ODBC_stmHnd, 7, SQL_PARAM_INPUT, SQL_C_TYPE_DATE,
SQL_DATE, 0, 0, &ODBC_insDate, 0, NULL);
SQLBindParameter(ODBC_stmHnd, 8, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
IDENT_LENGTH, 0, &ODBC_ident, 0, &ODBC_strlen);
SQLBindParameter(ODBC_stmHnd, 9, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR,
INFO_LENGTH, 0, &ODBC_info, 0, &ODBC_strlen);
SQLBindParameter(ODBC_stmHnd, 10, SQL_PARAM_INPUT, SQL_C_BINARY,
SQL_LONGVARBINARY, 0, 0, (SQLPOINTER) DATA_TOKEN, 0, &ODBC_dataPar);
SQLBindParameter(ODBC_stmHnd, 11, SQL_PARAM_INPUT, SQL_C_BINARY,
SQL_LONGVARBINARY, 0, 0, (SQLPOINTER) PREVIEW_TOKEN, 0, &ODBC_previewPar);
ODBC_previewPar = SQL_LEN_DATA_AT_EXEC(0);
ODBC_dataPar = SQL_LEN_DATA_AT_EXEC(0);
ODBC_result = SQLExecute(ODBC_stmHnd);

/* Send DATA_AT_EXEC. */
while (ODBC_result == SQL_NEED_DATA) {
ODBC_result = SQLParamData(ODBC_stmHnd, &ODBC_token);
if (ODBC_result == SQL_NEED_DATA) {
long putResult;

switch ((int) ODBC_token) {

case DATA_TOKEN:
putResult = SQLPutData(ODBC_stmHnd, imageData, ODBC_size);
if ((putResult != SQL_SUCCESS) && (putResult !=
SQL_SUCCESS_WITH_INFO)) {
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(ODBC_result,
"Error(s) sending DATA_AT_EXEC (DATA_TOKEN) in
INSERT_IMAGE_QUERY");
}
break;

case PREVIEW_TOKEN:
putResult = SQLPutData(ODBC_stmHnd, previewData,
ODBC_previewSize);
if ((putResult != SQL_SUCCESS) && (putResult !=
SQL_SUCCESS_WITH_INFO)) {
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(ODBC_result,
"Error(s) sending DATA_AT_EXEC (PREVIEW_TOKEN)
in INSERT_IMAGE_QUERY");
}
break;

default :
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(0,
"Error(s) sending DATA_AT_EXEC (unrecognized
token) in INSERT_IMAGE_QUERY");
}
}
}

if ((ODBC_result != SQL_SUCCESS) && (ODBC_result !=
SQL_SUCCESS_WITH_INFO)) {

SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(ODBC_result,
"Cannot execute statement INSERT_IMAGE_QUERY");
}

SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
return ODBC_id;
}

Image* PgsqlImageDao::getImage(Connection* conn, int id)
throw(DataAccessException) {

char buffer[BUFFER_SIZE];
char ODBC_ident[IDENT_SIZE];
char* imageData = NULL;
int imageSize = 0;
long ODBC_result; // Result of function
calls.
SQLHDBC ODBC_conHnd; // Handle for a
connection
SQLHSTMT ODBC_stmHnd; // Handle for a
statement
SQLINTEGER ODBC_id;
SQLINTEGER ODBC_bytesRead[IMAGE_SHORT_BINDS]; // Bytes read in each
successful fetch
SQLINTEGER ODBC_identRead;
SQLINTEGER ODBC_bufferRead;
SQLINTEGER ODBC_size;
SQLINTEGER ODBC_sizeRead;
SQLSMALLINT ODBC_shortCols[IMAGE_SHORT_BINDS];
Image* im;

ODBC_id = id;
ODBC_conHnd = conn->getHnd();
ODBC_result = SQLAllocHandle(SQL_HANDLE_STMT, ODBC_conHnd,
&ODBC_stmHnd);

if ((ODBC_result != SQL_SUCCESS) && (ODBC_result !=
SQL_SUCCESS_WITH_INFO)) {

delete conn;
throw SysDataAccessException(ODBC_result, "Cannot allocate statement
handle");
}
SQLPrepare(ODBC_stmHnd, (SQLCHAR*) GET_IMAGE_QUERY, SQL_NTS);
SQLBindParameter(ODBC_stmHnd, 1, SQL_PARAM_INPUT, SQL_C_SLONG,
SQL_INTEGER, 0, 0, &ODBC_id, 0, NULL);
SQLBindCol(ODBC_stmHnd, 1, SQL_C_SSHORT, &(ODBC_shortCols[0]), 1,
&(ODBC_bytesRead[0]));
SQLBindCol(ODBC_stmHnd, 2, SQL_C_SSHORT, &(ODBC_shortCols[1]), 1,
&(ODBC_bytesRead[1]));
SQLBindCol(ODBC_stmHnd, 3, SQL_C_SSHORT, &(ODBC_shortCols[2]), 1,
&(ODBC_bytesRead[2]));
SQLBindCol(ODBC_stmHnd, 4, SQL_C_SLONG, &ODBC_size, 1, &ODBC_sizeRead);
SQLBindCol(ODBC_stmHnd, 5, SQL_C_CHAR, &ODBC_ident, IDENT_SIZE,
&ODBC_identRead);
SQLBindCol(ODBC_stmHnd, 6, SQL_C_BINARY, (SQLPOINTER) &buffer,
BUFFER_SIZE, &ODBC_bufferRead);

ODBC_result = SQLExecute(ODBC_stmHnd);

if ((ODBC_result != SQL_SUCCESS) && (ODBC_result !=
SQL_SUCCESS_WITH_INFO)) {

SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw SysDataAccessException(ODBC_result,
"Cannot execute statement GET_IMAGE_QUERY");
}

ODBC_result = SQLFetch(ODBC_stmHnd);

if (ODBC_result == SQL_NO_DATA) {
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;
throw UserDataAccessException(UserDataAccessException::DATA_NOT_FOUND,

"Cannot find requested image (GET_IMAGE_QUERY)");
}

imageData = new char[ODBC_size];

do {
imageData = (char*) memcpy(imageData, buffer, ODBC_bufferRead);
imageSize += ODBC_bufferRead;
ODBC_result = SQLFetch(ODBC_stmHnd);
} while ((ODBC_result != SQL_NO_DATA) && (imageSize < ODBC_size));

im = new Image(ODBC_ident, (byte*) imageData, ODBC_shortCols[0],
ODBC_shortCols[1], ODBC_shortCols[2]);

delete[] imageData;
SQLFreeHandle(SQL_HANDLE_STMT, ODBC_stmHnd);
delete conn;

return im;
}

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Nilberto Caridad Chavez Marquez 2006-12-05 19:55:25 amigos
Previous Message Yacatematrix 2006-12-05 19:39:48 Monitoreo usuarios