QResultClass *res;
RETCODE ret = SQL_SUCCESS_WITH_INFO;
+ if (NULL == conn->pqconn)
+ {
+ SC_set_error(stmt, STMT_COMMUNICATION_ERROR, "The connection has been lost", __FUNCTION__);
+ return SQL_ERROR;
+ }
if (CC_is_in_error_trans(conn))
return ret;
#include "qresult.h"
#include "loadlib.h"
+BOOL SC_connection_lost_check(StatementClass *stmt, const char *funcname)
+{
+ ConnectionClass *conn = SC_get_conn(stmt);
+ char message[64];
+
+ if (NULL != conn->pqconn)
+ return FALSE;
+ SC_clear_error(stmt);
+ snprintf(message, sizeof(message), "%s unable due to the connection lost", funcname);
+ SC_set_error(stmt, STMT_COMMUNICATION_ERROR, message, funcname);
+ return TRUE;
+}
+
RETCODE SQL_API
SQLBindCol(HSTMT StatementHandle,
SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType,
mylog("[SQLCancel]");
/* Not that neither ENTER_STMT_CS nor StartRollbackState is called */
/* SC_clear_error((StatementClass *) StatementHandle); maybe this neither */
+ if (SC_connection_lost_check((StatementClass *) StatementHandle, __FUNCTION__))
+ return SQL_ERROR;
return PGAPI_Cancel(StatementHandle);
}
UWORD flag = PODBC_SEARCH_PUBLIC_SCHEMA;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLDescribeCol]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
flag |= PODBC_WITH_HOLD;
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
flag |= PODBC_WITH_HOLD;
SQLUSMALLINT *rowStatusArray = irdopts->rowStatusArray;
SQLULEN *pcRow = irdopts->rowsFetched;
+ mylog("[[%s]]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
- mylog("[[%s]]", func);
ret = PGAPI_ExtendedFetch(StatementHandle, SQL_FETCH_NEXT, 0,
pcRow, rowStatusArray, 0, ardopts->size_of_rowset);
stmt->transition_status = STMT_TRANSITION_FETCH_SCROLL;
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLGetData]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[%s]", func);
+ if (SC_connection_lost_check((StatementClass *) StatementHandle, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
if (SC_opencheck(stmt, func))
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLNumResultCols]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLParamData]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
ret = PGAPI_ParamData(StatementHandle, Value);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLPrepare]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
if (SC_opencheck(stmt, func))
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLPutData]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
ret = PGAPI_PutData(StatementHandle, Data, StrLen_or_Ind);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[SQLRowCount]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
SQLCHAR *ctName = CatalogName, *scName = SchemaName, *tbName = TableName;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
SQLCHAR *ctName = CatalogName, *scName = SchemaName, *tbName = TableName;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) hstmt;
mylog("[SQLDescribeParam]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) hstmt;
mylog("[SQLExtendedFetch]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
*fkscName = szFkSchemaName, *fktbName = szFkTableName;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) hstmt;
mylog("[SQLMoreResults]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) hstmt;
mylog("[SQLNumParams]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
*tbName = szTableName;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) hstmt;
mylog("[SQLSetPos]");
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
RETCODE ret;
mylog("[[%s]]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
StatementClass *stmt = (StatementClass *) StatementHandle;
mylog("[[%s]]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
SQLLEN bkmarkoff = 0;
mylog("[[%s]] %d,%d\n", func, FetchOrientation, FetchOffset);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
CSTR func = "SQLBulkOperations";
StatementClass *stmt = (StatementClass *) hstmt;
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
mylog("[[%s]] Handle=%p %d\n", func, hstmt, operation);
SC_clear_error(stmt);
char *rgbD = NULL, *rgbDt;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
UWORD flag = PODBC_SEARCH_PUBLIC_SCHEMA;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(CatalogName, NameLength1, &nmlen1, lower_id);
char *clName = NULL, *clNamet = NULL;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
buflen = 0;
if (BufferLength > 0)
buflen = BufferLength * 3;
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
stxt = ucs2_to_utf8(StatementText, TextLength, &slen, FALSE);
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
SQLLEN slen;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
stxt = ucs2_to_utf8(StatementText, TextLength, &slen, FALSE);
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
BOOL lower_id;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(CatalogName, NameLength1, &nmlen1, lower_id);
BOOL lower_id;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(CatalogName, NameLength1, &nmlen1, lower_id);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(CatalogName, NameLength1, &nmlen1, lower_id);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(szCatalogName, cbCatalogName, &nmlen1, lower_id);
BOOL lower_id;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(szPkCatalogName, cbPkCatalogName, &nmlen1, lower_id);
BOOL lower_id;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(szCatalogName, cbCatalogName, &nmlen1, lower_id);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(szCatalogName, cbCatalogName, &nmlen1, lower_id);
UWORD flag = 0;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
conn = SC_get_conn(stmt);
lower_id = SC_is_lower_case(stmt, conn);
ctName = ucs2_to_utf8(szCatalogName, cbCatalogName, &nmlen1, lower_id);
StatementClass * stmt = (StatementClass *) StatementHandle;
mylog("[%s]", func);
+ if (SC_connection_lost_check(stmt, __FUNCTION__))
+ return SQL_ERROR;
+
ENTER_STMT_CS(stmt);
SC_clear_error(stmt);
StartRollbackState(stmt);
#include "pgapifunc.h"
-#define STMT_LOST_GEXIT(stmt) \
-do { \
- ConnectionClass *conn = SC_get_conn(stmt); \
- if (NULL == conn->pqconn) \
- { \
- SC_set_error((stmt), STMT_COMMUNICATION_ERROR, "The connection has been lost", __FUNCTION__); \
- goto cleanup; \
- } \
- break; \
-} while (1)
/* Map sql commands to statement types */
static const struct
return TRUE;
}
}
- if (CC_not_connected((ConnectionClass *) SC_get_conn(self)))
- {
- SC_set_error(self, STMT_SEQUENCE_ERROR, "The connection has been lost", func);
- return TRUE;
- }
return FALSE;
}
if (conn->asdum)
CALL_IsolateDtcConn(conn, TRUE);
#endif /* _HANDLE_ENLIST_IN_DTC_ */
+ if (NULL == conn->pqconn)
+ {
+ SC_set_error(stmt, STMT_COMMUNICATION_ERROR, "The connection has been lost", __FUNCTION__);
+ return SQL_ERROR;
+ }
if (SC_accessed_db(stmt))
return TRUE;
if (SQL_ERROR == SetStatementSvp(stmt))
char emsg[128];
snprintf(emsg, sizeof(emsg), "internal savepoint error in %s", func);
- SC_set_error(stmt, STMT_INTERNAL_ERROR, emsg, func);
+ SC_set_error_if_not_set(stmt, STMT_INTERNAL_ERROR, emsg, func);
return FALSE;
}
{
if (SQL_ERROR == SetStatementSvp(stmt))
{
- SC_set_error(stmt, STMT_INTERNAL_ERROR, "internal savepoint error in build_libpq_bind_params", func);
+ SC_set_error_if_not_set(stmt, STMT_INTERNAL_ERROR, "internal savepoint error in build_libpq_bind_params", func);
return NULL;
}
}
}
pstmt = stmt->processed_statements;
- STMT_LOST_GEXIT(stmt);
pgres = PQexecParams(conn->pqconn,
pstmt->query,
nParams,
plan_name = stmt->plan_name ? stmt->plan_name : "";
/* already prepared */
- STMT_LOST_GEXIT(stmt);
pgres = PQexecPrepared(conn->pqconn,
plan_name, /* portal name == plan name */
nParams,
conn->unnamed_prepared_stmt = NULL;
/* Prepare */
- STMT_LOST_GEXIT(stmt);
pgres = PQprepare(conn->pqconn, plan_name, query, num_params, paramTypes);
if (PQresultStatus(pgres) != PGRES_COMMAND_OK)
{
/* Describe */
mylog("%s: describing plan_name=%s\n", func, plan_name);
- STMT_LOST_GEXIT(stmt);
pgres = PQdescribePrepared(conn->pqconn, plan_name);
switch (PQresultStatus(pgres))
{
BOOL SC_SetCancelRequest(StatementClass *self);
BOOL SC_AcceptedCancelRequest(const StatementClass *self);
+BOOL SC_connection_lost_check(StatementClass *stmt, const char *funcname);
+
int enqueueNeedDataCallback(StatementClass *self, NeedDataCallfunc, void *);
RETCODE dequeueNeedDataCallback(RETCODE, StatementClass *self);
void cancelNeedDataState(StatementClass *self);