aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/execute.c')
-rw-r--r--src/interfaces/odbc/execute.c98
1 files changed, 58 insertions, 40 deletions
diff --git a/src/interfaces/odbc/execute.c b/src/interfaces/odbc/execute.c
index 8f05024f454..11893321f84 100644
--- a/src/interfaces/odbc/execute.c
+++ b/src/interfaces/odbc/execute.c
@@ -206,9 +206,12 @@ PGAPI_Execute(
{
static char *func = "PGAPI_Execute";
StatementClass *stmt = (StatementClass *) hstmt;
+ APDFields *opts;
+ IPDFields *ipdopts;
ConnectionClass *conn;
int i,
retval, start_row, end_row;
+ int cursor_type, scroll_concurrency;
mylog("%s: entering...\n", func);
@@ -219,6 +222,9 @@ PGAPI_Execute(
return SQL_INVALID_HANDLE;
}
+ opts = SC_get_APD(stmt);
+ cursor_type = stmt->options.cursor_type;
+ scroll_concurrency = stmt->options.scroll_concurrency;
/*
* If the statement is premature, it means we already executed it from
* an SQLPrepare/SQLDescribeCol type of scenario. So just return
@@ -297,24 +303,25 @@ PGAPI_Execute(
if (start_row = stmt->exec_start_row, start_row < 0)
start_row = 0;
if (end_row = stmt->exec_end_row, end_row < 0)
- end_row = stmt->options.paramset_size - 1;
+ end_row = opts->paramset_size - 1;
if (stmt->exec_current_row < 0)
stmt->exec_current_row = start_row;
+ ipdopts = SC_get_IPD(stmt);
if (stmt->exec_current_row == start_row)
{
- if (stmt->options.param_processed_ptr)
- *stmt->options.param_processed_ptr = 0;
+ if (ipdopts->param_processed_ptr)
+ *ipdopts->param_processed_ptr = 0;
SC_recycle_statement(stmt);
}
next_param_row:
#if (ODBCVER >= 0x0300)
- if (stmt->options.param_operation_ptr)
+ if (opts->param_operation_ptr)
{
- while (stmt->options.param_operation_ptr[stmt->exec_current_row] == SQL_PARAM_IGNORE)
+ while (opts->param_operation_ptr[stmt->exec_current_row] == SQL_PARAM_IGNORE)
{
- if (stmt->options.param_status_ptr)
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_UNUSED;
+ if (ipdopts->param_status_ptr)
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_UNUSED;
if (stmt->exec_current_row >= end_row)
{
stmt->exec_current_row = -1;
@@ -335,16 +342,16 @@ next_param_row:
* execute of this statement? Therefore check for params and
* re-copy.
*/
- UInt4 offset = stmt->options.param_offset_ptr ? *stmt->options.param_offset_ptr : 0;
- Int4 bind_size = stmt->options.param_bind_type;
+ UInt4 offset = opts->param_offset_ptr ? *opts->param_offset_ptr : 0;
+ Int4 bind_size = opts->param_bind_type;
Int4 current_row = stmt->exec_current_row < 0 ? 0 : stmt->exec_current_row;
stmt->data_at_exec = -1;
- for (i = 0; i < stmt->parameters_allocated; i++)
+ for (i = 0; i < opts->allocated; i++)
{
- Int4 *pcVal = stmt->parameters[i].used;
+ Int4 *pcVal = opts->parameters[i].used;
- stmt->parameters[i].data_at_exec = FALSE;
+ opts->parameters[i].data_at_exec = FALSE;
if (pcVal)
{
if (bind_size > 0)
@@ -352,10 +359,10 @@ next_param_row:
else
pcVal = (Int4 *)((char *)pcVal + offset + sizeof(SDWORD) * current_row);
if (*pcVal == SQL_DATA_AT_EXEC || *pcVal <= SQL_LEN_DATA_AT_EXEC_OFFSET)
- stmt->parameters[i].data_at_exec = TRUE;
+ opts->parameters[i].data_at_exec = TRUE;
}
/* Check for data at execution parameters */
- if (stmt->parameters[i].data_at_exec)
+ if (opts->parameters[i].data_at_exec)
{
if (stmt->data_at_exec < 0)
stmt->data_at_exec = 1;
@@ -394,22 +401,22 @@ next_param_row:
retval = SC_execute(stmt);
if (retval != SQL_ERROR)
{
- if (stmt->options.param_processed_ptr)
- (*stmt->options.param_processed_ptr)++;
+ if (ipdopts->param_processed_ptr)
+ (*ipdopts->param_processed_ptr)++;
}
#if (ODBCVER >= 0x0300)
- if (stmt->options.param_status_ptr)
+ if (ipdopts->param_status_ptr)
{
switch (retval)
{
case SQL_SUCCESS:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS;
break;
case SQL_SUCCESS_WITH_INFO:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS_WITH_INFO;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS_WITH_INFO;
break;
default:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_ERROR;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_ERROR;
break;
}
}
@@ -447,7 +454,6 @@ next_param_row:
}
}
/* we are now in a transaction */
- CC_set_in_trans(conn);
res = CC_send_query(conn, stmt->stmt_with_params, NULL, CLEAR_RESULT_ON_ABORT);
if (!res)
{
@@ -464,13 +470,18 @@ next_param_row:
{
if (issued_begin)
CC_commit(conn);
- else if (!in_trans && begin_included)
- CC_set_no_trans(conn);
}
stmt->status = STMT_FINISHED;
return SQL_SUCCESS;
}
- else
+ else if (stmt->options.cursor_type != cursor_type ||
+ stmt->options.scroll_concurrency != scroll_concurrency)
+ {
+ stmt->errornumber = STMT_OPTION_VALUE_CHANGED;
+ stmt->errormsg = "cursor updatability changed";
+ return SQL_SUCCESS_WITH_INFO;
+ }
+ else
return SQL_SUCCESS;
}
@@ -534,11 +545,10 @@ PGAPI_Transact(
mylog("PGAPI_Transact: sending on conn %d '%s'\n", conn, stmt_string);
res = CC_send_query(conn, stmt_string, NULL, CLEAR_RESULT_ON_ABORT);
- CC_set_no_trans(conn);
-
if (!res)
{
/* error msg will be in the connection */
+ CC_on_abort(conn, TRUE);
CC_log_error(func, "", conn);
return SQL_ERROR;
}
@@ -548,6 +558,7 @@ PGAPI_Transact(
if (!ok)
{
+ CC_on_abort(conn, TRUE);
CC_log_error(func, "", conn);
return SQL_ERROR;
}
@@ -697,6 +708,8 @@ PGAPI_ParamData(
{
static char *func = "PGAPI_ParamData";
StatementClass *stmt = (StatementClass *) hstmt;
+ APDFields *opts;
+ IPDFields *ipdopts;
int i,
retval;
ConnInfo *ci;
@@ -709,8 +722,9 @@ PGAPI_ParamData(
return SQL_INVALID_HANDLE;
}
ci = &(SC_get_conn(stmt)->connInfo);
+ opts = SC_get_APD(stmt);
- mylog("%s: data_at_exec=%d, params_alloc=%d\n", func, stmt->data_at_exec, stmt->parameters_allocated);
+ mylog("%s: data_at_exec=%d, params_alloc=%d\n", func, stmt->data_at_exec, opts->allocated);
if (stmt->data_at_exec < 0)
{
@@ -720,7 +734,7 @@ PGAPI_ParamData(
return SQL_ERROR;
}
- if (stmt->data_at_exec > stmt->parameters_allocated)
+ if (stmt->data_at_exec > opts->allocated)
{
stmt->errornumber = STMT_SEQUENCE_ERROR;
stmt->errormsg = "Too many execution-time parameters were present";
@@ -748,6 +762,7 @@ PGAPI_ParamData(
}
/* Done, now copy the params and then execute the statement */
+ ipdopts = SC_get_IPD(stmt);
if (stmt->data_at_exec == 0)
{
int end_row;
@@ -761,28 +776,29 @@ PGAPI_ParamData(
retval = SC_execute(stmt);
if (retval != SQL_ERROR)
{
- if (stmt->options.param_processed_ptr)
- (*stmt->options.param_processed_ptr)++;
+ if (ipdopts->param_processed_ptr)
+ (*ipdopts->param_processed_ptr)++;
}
#if (ODBCVER >= 0x0300)
- if (stmt->options.param_status_ptr)
+ if (ipdopts->param_status_ptr)
{
switch (retval)
{
case SQL_SUCCESS:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS;
break;
case SQL_SUCCESS_WITH_INFO:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS_WITH_INFO;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_SUCCESS_WITH_INFO;
break;
default:
- stmt->options.param_status_ptr[stmt->exec_current_row] = SQL_PARAM_ERROR;
+ ipdopts->param_status_ptr[stmt->exec_current_row] = SQL_PARAM_ERROR;
break;
}
}
#endif /* ODBCVER */
- if (stmt->exec_end_row < 0)
- end_row = stmt->options.paramset_size - 1;
+ end_row = stmt->exec_end_row;
+ if (end_row < 0)
+ end_row = opts->paramset_size - 1;
if (retval == SQL_ERROR ||
stmt->exec_current_row >= end_row)
{
@@ -800,14 +816,14 @@ PGAPI_ParamData(
i = stmt->current_exec_param >= 0 ? stmt->current_exec_param + 1 : 0;
/* At least 1 data at execution parameter, so Fill in the token value */
- for (; i < stmt->parameters_allocated; i++)
+ for (; i < opts->allocated; i++)
{
- if (stmt->parameters[i].data_at_exec)
+ if (opts->parameters[i].data_at_exec)
{
stmt->data_at_exec--;
stmt->current_exec_param = i;
stmt->put_data = FALSE;
- *prgbValue = stmt->parameters[i].buffer; /* token */
+ *prgbValue = opts->parameters[i].buffer; /* token */
break;
}
}
@@ -828,6 +844,7 @@ PGAPI_PutData(
{
static char *func = "PGAPI_PutData";
StatementClass *stmt = (StatementClass *) hstmt;
+ APDFields *opts;
int old_pos,
retval;
ParameterInfoClass *current_param;
@@ -841,6 +858,7 @@ PGAPI_PutData(
return SQL_INVALID_HANDLE;
}
+ opts = SC_get_APD(stmt);
if (stmt->current_exec_param < 0)
{
stmt->errornumber = STMT_SEQUENCE_ERROR;
@@ -849,7 +867,7 @@ PGAPI_PutData(
return SQL_ERROR;
}
- current_param = &(stmt->parameters[stmt->current_exec_param]);
+ current_param = &(opts->parameters[stmt->current_exec_param]);
if (!stmt->put_data)
{ /* first call */