diff options
author | Hiroshi Inoue <inoue@tpf.co.jp> | 2002-01-11 02:50:01 +0000 |
---|---|---|
committer | Hiroshi Inoue <inoue@tpf.co.jp> | 2002-01-11 02:50:01 +0000 |
commit | f43b5de649cdf8a36f7d90a96932800cb0e34162 (patch) | |
tree | 6fb1ec57cff266680ab2adaf8c0976a643627b7c /src/interfaces/odbc/windev/statement.h | |
parent | 5370cd6b03610bdb6c6dee0fbf87ad9cdf524395 (diff) |
Add a directory to save the changes until 7.3-tree is branched.
Diffstat (limited to 'src/interfaces/odbc/windev/statement.h')
-rw-r--r-- | src/interfaces/odbc/windev/statement.h | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/src/interfaces/odbc/windev/statement.h b/src/interfaces/odbc/windev/statement.h new file mode 100644 index 00000000000..9b52f25694a --- /dev/null +++ b/src/interfaces/odbc/windev/statement.h @@ -0,0 +1,254 @@ +/* File: statement.h + * + * Description: See "statement.c" + * + * Comments: See "notice.txt" for copyright and license information. + * + */ + +#ifndef __STATEMENT_H__ +#define __STATEMENT_H__ + +#include "psqlodbc.h" + +#include "bind.h" + + +#ifndef FALSE +#define FALSE (BOOL)0 +#endif +#ifndef TRUE +#define TRUE (BOOL)1 +#endif + +typedef enum +{ + STMT_ALLOCATED, /* The statement handle is allocated, but + * not used so far */ + STMT_READY, /* the statement is waiting to be executed */ + STMT_PREMATURE, /* ODBC states that it is legal to call + * e.g. SQLDescribeCol before a call to + * SQLExecute, but after SQLPrepare. To + * get all the necessary information in + * such a case, we simply execute the + * query _before_ the actual call to + * SQLExecute, so that statement is + * considered to be "premature". */ + STMT_FINISHED, /* statement execution has finished */ + STMT_EXECUTING /* statement execution is still going on */ +} STMT_Status; + +#define STMT_ROW_VERSION_CHANGED (-4) +#define STMT_POS_BEFORE_RECORDSET (-3) +#define STMT_TRUNCATED (-2) +#define STMT_INFO_ONLY (-1) /* not an error message, + * just a notification + * to be returned by + * SQLError */ +#define STMT_OK 0 /* will be interpreted + * as "no error pending" */ +#define STMT_EXEC_ERROR 1 +#define STMT_STATUS_ERROR 2 +#define STMT_SEQUENCE_ERROR 3 +#define STMT_NO_MEMORY_ERROR 4 +#define STMT_COLNUM_ERROR 5 +#define STMT_NO_STMTSTRING 6 +#define STMT_ERROR_TAKEN_FROM_BACKEND 7 +#define STMT_INTERNAL_ERROR 8 +#define STMT_STILL_EXECUTING 9 +#define STMT_NOT_IMPLEMENTED_ERROR 10 +#define STMT_BAD_PARAMETER_NUMBER_ERROR 11 +#define STMT_OPTION_OUT_OF_RANGE_ERROR 12 +#define STMT_INVALID_COLUMN_NUMBER_ERROR 13 +#define STMT_RESTRICTED_DATA_TYPE_ERROR 14 +#define STMT_INVALID_CURSOR_STATE_ERROR 15 +#define STMT_OPTION_VALUE_CHANGED 16 +#define STMT_CREATE_TABLE_ERROR 17 +#define STMT_NO_CURSOR_NAME 18 +#define STMT_INVALID_CURSOR_NAME 19 +#define STMT_INVALID_ARGUMENT_NO 20 +#define STMT_ROW_OUT_OF_RANGE 21 +#define STMT_OPERATION_CANCELLED 22 +#define STMT_INVALID_CURSOR_POSITION 23 +#define STMT_VALUE_OUT_OF_RANGE 24 +#define STMT_OPERATION_INVALID 25 +#define STMT_PROGRAM_TYPE_OUT_OF_RANGE 26 +#define STMT_BAD_ERROR 27 +#define STMT_INVALID_OPTION_IDENTIFIER 28 + +/* statement types */ +enum +{ + STMT_TYPE_UNKNOWN = -2, + STMT_TYPE_OTHER = -1, + STMT_TYPE_SELECT = 0, + STMT_TYPE_INSERT, + STMT_TYPE_UPDATE, + STMT_TYPE_DELETE, + STMT_TYPE_CREATE, + STMT_TYPE_ALTER, + STMT_TYPE_DROP, + STMT_TYPE_GRANT, + STMT_TYPE_REVOKE, + STMT_TYPE_PROCCALL +}; + +#define STMT_UPDATE(stmt) (stmt->statement_type > STMT_TYPE_SELECT) + + +/* Parsing status */ +enum +{ + STMT_PARSE_NONE = 0, + STMT_PARSE_COMPLETE, + STMT_PARSE_INCOMPLETE, + STMT_PARSE_FATAL, +}; + +/* Result style */ +enum +{ + STMT_FETCH_NONE = 0, + STMT_FETCH_NORMAL, + STMT_FETCH_EXTENDED, +}; + +typedef struct +{ + COL_INFO *col_info; /* cached SQLColumns info for this table */ + char name[MAX_TABLE_LEN + 1]; + char alias[MAX_TABLE_LEN + 1]; +} TABLE_INFO; + +typedef struct +{ + TABLE_INFO *ti; /* resolve to explicit table names */ + int precision; + int scale; + int display_size; + int length; + int type; + char nullable; + char func; + char expr; + char quote; + char dquote; + char numeric; + char dot[MAX_TABLE_LEN + 1]; + char name[MAX_COLUMN_LEN + 1]; + char alias[MAX_COLUMN_LEN + 1]; +} FIELD_INFO; + + +/******** Statement Handle ***********/ +struct StatementClass_ +{ + ConnectionClass *hdbc; /* pointer to ConnectionClass this + * statement belongs to */ + QResultClass *result; /* result of the current statement */ + HSTMT FAR *phstmt; + StatementOptions options; + + STMT_Status status; + char *errormsg; + int errornumber; + + /* information on bindings */ + BindInfoClass *bindings; /* array to store the binding information */ + BindInfoClass bookmark; + int bindings_allocated; + + /* information on statement parameters */ + int parameters_allocated; + ParameterInfoClass *parameters; + + Int4 currTuple; /* current absolute row number (GetData, + * SetPos, SQLFetch) */ + int save_rowset_size; /* saved rowset size in case of + * change/FETCH_NEXT */ + int rowset_start; /* start of rowset (an absolute row + * number) */ + int bind_row; /* current offset for Multiple row/column + * binding */ + int last_fetch_count; /* number of rows retrieved in + * last fetch/extended fetch */ + int current_col; /* current column for GetData -- used to + * handle multiple calls */ + int lobj_fd; /* fd of the current large object */ + + char *statement; /* if non--null pointer to the SQL + * statement that has been executed */ + + TABLE_INFO **ti; + FIELD_INFO **fi; + int nfld; + int ntab; + + int parse_status; + + int statement_type; /* According to the defines above */ + int data_at_exec; /* Number of params needing SQLPutData */ + int current_exec_param; /* The current parameter for + * SQLPutData */ + + char put_data; /* Has SQLPutData been called yet? */ + + char errormsg_created; /* has an informative error msg + * been created? */ + char manual_result; /* Is the statement result manually built? */ + char prepare; /* is this statement a prepared statement + * or direct */ + + char internal; /* Is this statement being called + * internally? */ + + char cursor_name[MAX_CURSOR_LEN + 1]; + + char *stmt_with_params; /* statement after parameter + * substitution */ + int stmt_size_limit; + + char pre_executing; /* This statement is prematurely executing */ + char inaccurate_result; /* Current status is PREMATURE but + * result is inaccurate */ + char errormsg_malloced; /* Current error message is + * malloed (not in a static + * variable) ? */ + char miscinfo; +}; + +#define SC_get_conn(a) (a->hdbc) +#define SC_get_Result(a) (a->result); + +/* options for SC_free_params() */ +#define STMT_FREE_PARAMS_ALL 0 +#define STMT_FREE_PARAMS_DATA_AT_EXEC_ONLY 1 + +/* misc info */ +#define SC_set_pre_executable(a) (a->miscinfo |= 1L) +#define SC_no_pre_executable(a) (a->miscinfo &= ~1L) +#define SC_is_pre_executable(a) ((a->miscinfo & 1L) != 0) +#define SC_set_fetchcursor(a) (a->miscinfo |= 2L) +#define SC_no_fetchcursor(a) (a->miscinfo &= ~2L) +#define SC_is_fetchcursor(a) ((a->miscinfo & 2L) != 0) + +/* Statement prototypes */ +StatementClass *SC_Constructor(void); +void InitializeStatementOptions(StatementOptions *opt); +char SC_Destructor(StatementClass *self); +int statement_type(char *statement); +char parse_statement(StatementClass *stmt); +void SC_pre_execute(StatementClass *self); +char SC_unbind_cols(StatementClass *self); +char SC_recycle_statement(StatementClass *self); + +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 *self); +RETCODE SC_fetch(StatementClass *self); +void SC_free_params(StatementClass *self, char option); +void SC_log_error(char *func, char *desc, StatementClass *self); +unsigned long SC_get_bookmark(StatementClass *self); + +#endif |