static char *func="SQLCancel";
StatementClass *stmt = (StatementClass *) hstmt;
RETCODE result;
+#ifdef WIN32
HMODULE hmodule;
FARPROC addr;
+#endif
mylog( "%s: entering...\n", func);
portion of the registry. You may have to manually add this key.
This logfile is intended for development use, not for an end user!
*/
-// #define MY_LOG
+#define MY_LOG
/* Uncomment Q_LOG to compile in the qlog() statements (Communications log, i.e. CommLog).
extern GLOBAL_VALUES globals;
+RETCODE set_statement_option(ConnectionClass *conn,
+ StatementClass *stmt,
+ UWORD fOption,
+ UDWORD vParam);
+
+
RETCODE set_statement_option(ConnectionClass *conn,
StatementClass *stmt,
/************************************/
QResultClass *
-QR_Constructor()
+QR_Constructor(void)
{
QResultClass *rv;
#define QR_get_status(self) (self->status)
// Core Functions
-QResultClass *QR_Constructor();
+QResultClass *QR_Constructor(void);
void QR_Destructor(QResultClass *self);
char QR_read_tuple(QResultClass *self, char binary);
int QR_next_tuple(QResultClass *self);
}
}
-RETCODE
-SC_fetch(StatementClass *stmt)
-{
-static char *func = "SC_fetch";
-QResultClass *res = stmt->result;
-int retval, result;
-Int2 num_cols, lf;
-Oid type;
-char *value;
-ColumnInfoClass *ci;
-// TupleField *tupleField;
-
- stmt->last_fetch_count = 0;
- ci = QR_get_fields(res); /* the column info */
-
- mylog("manual_result = %d, use_declarefetch = %d\n", stmt->manual_result, globals.use_declarefetch);
-
- if ( stmt->manual_result || ! globals.use_declarefetch) {
-
- if (stmt->currTuple >= QR_get_num_tuples(res) -1 ||
- (stmt->options.maxRows > 0 && stmt->currTuple == stmt->options.maxRows - 1)) {
-
- /* if at the end of the tuples, return "no data found"
- and set the cursor past the end of the result set
- */
- stmt->currTuple = QR_get_num_tuples(res);
- return SQL_NO_DATA_FOUND;
- }
-
- mylog("**** SQLFetch: manual_result\n");
- (stmt->currTuple)++;
- }
- else {
-
- // read from the cache or the physical next tuple
- retval = QR_next_tuple(res);
- if (retval < 0) {
- mylog("**** SQLFetch: end_tuples\n");
- return SQL_NO_DATA_FOUND;
- }
- else if (retval > 0)
- (stmt->currTuple)++; // all is well
-
- else {
- mylog("SQLFetch: error\n");
- stmt->errornumber = STMT_EXEC_ERROR;
- stmt->errormsg = "Error fetching next row";
- SC_log_error(func, "", stmt);
- return SQL_ERROR;
- }
- }
-
- num_cols = QR_NumResultCols(res);
-
- result = SQL_SUCCESS;
- stmt->last_fetch_count = 1;
-
- for (lf=0; lf < num_cols; lf++) {
-
- mylog("fetch: cols=%d, lf=%d, stmt = %u, stmt->bindings = %u, buffer[] = %u\n", num_cols, lf, stmt, stmt->bindings, stmt->bindings[lf].buffer);
-
- /* reset for SQLGetData */
- stmt->bindings[lf].data_left = -1;
-
- if (stmt->bindings[lf].buffer != NULL) {
- // this column has a binding
-
- // type = QR_get_field_type(res, lf);
- type = CI_get_oid(ci, lf); /* speed things up */
-
- mylog("type = %d\n", type);
-
- if (stmt->manual_result) {
- value = QR_get_value_manual(res, stmt->currTuple, lf);
- mylog("manual_result\n");
- }
- else if (globals.use_declarefetch)
- value = QR_get_value_backend(res, lf);
- else {
- value = QR_get_value_backend_row(res, stmt->currTuple, lf);
- }
-
- mylog("value = '%s'\n", (value==NULL)?"":value);
-
- retval = copy_and_convert_field_bindinfo(stmt, type, value, lf);
-
- mylog("copy_and_convert: retval = %d\n", retval);
-
- switch(retval) {
- case COPY_OK:
- break; /* OK, do next bound column */
-
- case COPY_UNSUPPORTED_TYPE:
- stmt->errormsg = "Received an unsupported type from Postgres.";
- stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR;
- SC_log_error(func, "", stmt);
- result = SQL_ERROR;
- break;
-
- case COPY_UNSUPPORTED_CONVERSION:
- stmt->errormsg = "Couldn't handle the necessary data type conversion.";
- stmt->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR;
- SC_log_error(func, "", stmt);
- result = SQL_ERROR;
- break;
-
- case COPY_RESULT_TRUNCATED:
- stmt->errornumber = STMT_TRUNCATED;
- stmt->errormsg = "The buffer was too small for the result.";
- result = SQL_SUCCESS_WITH_INFO;
- break;
-
- case COPY_GENERAL_ERROR: /* error msg already filled in */
- SC_log_error(func, "", stmt);
- result = SQL_ERROR;
- break;
-
- /* This would not be meaningful in SQLFetch. */
- case COPY_NO_DATA_FOUND:
- break;
-
- default:
- stmt->errormsg = "Unrecognized return value from copy_and_convert_field.";
- stmt->errornumber = STMT_INTERNAL_ERROR;
- SC_log_error(func, "", stmt);
- result = SQL_ERROR;
- break;
- }
- }
- }
-
- return result;
-}
// Returns data for bound columns in the current row ("hstmt->iCursor"),
return rv;
}
+
+RETCODE
+SC_fetch(StatementClass *self)
+{
+static char *func = "SC_fetch";
+QResultClass *res = self->result;
+int retval, result;
+Int2 num_cols, lf;
+Oid type;
+char *value;
+ColumnInfoClass *ci;
+// TupleField *tupleField;
+
+ self->last_fetch_count = 0;
+ ci = QR_get_fields(res); /* the column info */
+
+ mylog("manual_result = %d, use_declarefetch = %d\n", self->manual_result, globals.use_declarefetch);
+
+ if ( self->manual_result || ! globals.use_declarefetch) {
+
+ if (self->currTuple >= QR_get_num_tuples(res) -1 ||
+ (self->options.maxRows > 0 && self->currTuple == self->options.maxRows - 1)) {
+
+ /* if at the end of the tuples, return "no data found"
+ and set the cursor past the end of the result set
+ */
+ self->currTuple = QR_get_num_tuples(res);
+ return SQL_NO_DATA_FOUND;
+ }
+
+ mylog("**** SQLFetch: manual_result\n");
+ (self->currTuple)++;
+ }
+ else {
+
+ // read from the cache or the physical next tuple
+ retval = QR_next_tuple(res);
+ if (retval < 0) {
+ mylog("**** SQLFetch: end_tuples\n");
+ return SQL_NO_DATA_FOUND;
+ }
+ else if (retval > 0)
+ (self->currTuple)++; // all is well
+
+ else {
+ mylog("SQLFetch: error\n");
+ self->errornumber = STMT_EXEC_ERROR;
+ self->errormsg = "Error fetching next row";
+ SC_log_error(func, "", self);
+ return SQL_ERROR;
+ }
+ }
+
+ num_cols = QR_NumResultCols(res);
+
+ result = SQL_SUCCESS;
+ self->last_fetch_count = 1;
+
+ for (lf=0; lf < num_cols; lf++) {
+
+ mylog("fetch: cols=%d, lf=%d, self = %u, self->bindings = %u, buffer[] = %u\n", num_cols, lf, self, self->bindings, self->bindings[lf].buffer);
+
+ /* reset for SQLGetData */
+ self->bindings[lf].data_left = -1;
+
+ if (self->bindings[lf].buffer != NULL) {
+ // this column has a binding
+
+ // type = QR_get_field_type(res, lf);
+ type = CI_get_oid(ci, lf); /* speed things up */
+
+ mylog("type = %d\n", type);
+
+ if (self->manual_result) {
+ value = QR_get_value_manual(res, self->currTuple, lf);
+ mylog("manual_result\n");
+ }
+ else if (globals.use_declarefetch)
+ value = QR_get_value_backend(res, lf);
+ else {
+ value = QR_get_value_backend_row(res, self->currTuple, lf);
+ }
+
+ mylog("value = '%s'\n", (value==NULL)?"":value);
+
+ retval = copy_and_convert_field_bindinfo(self, type, value, lf);
+
+ mylog("copy_and_convert: retval = %d\n", retval);
+
+ switch(retval) {
+ case COPY_OK:
+ break; /* OK, do next bound column */
+
+ case COPY_UNSUPPORTED_TYPE:
+ self->errormsg = "Received an unsupported type from Postgres.";
+ self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR;
+ SC_log_error(func, "", self);
+ result = SQL_ERROR;
+ break;
+
+ case COPY_UNSUPPORTED_CONVERSION:
+ self->errormsg = "Couldn't handle the necessary data type conversion.";
+ self->errornumber = STMT_RESTRICTED_DATA_TYPE_ERROR;
+ SC_log_error(func, "", self);
+ result = SQL_ERROR;
+ break;
+
+ case COPY_RESULT_TRUNCATED:
+ self->errornumber = STMT_TRUNCATED;
+ self->errormsg = "The buffer was too small for the result.";
+ result = SQL_SUCCESS_WITH_INFO;
+ break;
+
+ case COPY_GENERAL_ERROR: /* error msg already filled in */
+ SC_log_error(func, "", self);
+ result = SQL_ERROR;
+ break;
+
+ /* This would not be meaningful in SQLFetch. */
+ case COPY_NO_DATA_FOUND:
+ break;
+
+ default:
+ self->errormsg = "Unrecognized return value from copy_and_convert_field.";
+ self->errornumber = STMT_INTERNAL_ERROR;
+ SC_log_error(func, "", self);
+ result = SQL_ERROR;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+
RETCODE SC_execute(StatementClass *self)
{
static char *func="SC_execute";
void SC_clear_error(StatementClass *self);
char SC_get_error(StatementClass *self, int *number, char **message);
char *SC_create_errormsg(StatementClass *self);
-RETCODE SC_execute(StatementClass *stmt);
+RETCODE SC_execute(StatementClass *self);
+RETCODE SC_fetch(StatementClass *self);
void SC_free_params(StatementClass *self, char option);
void SC_log_error(char *func, char *desc, StatementClass *self);