statement.h
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:6k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* File:            statement.h
  2.  *
  3.  * Description:     See "statement.c"
  4.  *
  5.  * Comments:        See "notice.txt" for copyright and license information.
  6.  *
  7.  */
  8. #ifndef __STATEMENT_H__
  9. #define __STATEMENT_H__
  10. #ifdef HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif
  13. #include "psqlodbc.h"
  14. #include "bind.h"
  15. #ifndef WIN32
  16. #include "iodbc.h"
  17. #include "isql.h"
  18. #else
  19. #include <windows.h>
  20. #include <sql.h>
  21. #endif
  22. #ifndef FALSE
  23. #define FALSE (BOOL)0
  24. #endif
  25. #ifndef TRUE
  26. #define TRUE (BOOL)1
  27. #endif
  28. typedef enum {
  29.     STMT_ALLOCATED,     /* The statement handle is allocated, but not used so far */
  30.     STMT_READY,         /* the statement is waiting to be executed */
  31.     STMT_PREMATURE,     /* ODBC states that it is legal to call e.g. SQLDescribeCol before
  32.                            a call to SQLExecute, but after SQLPrepare. To get all the necessary
  33.                            information in such a case, we simply execute the query _before_ the
  34.                            actual call to SQLExecute, so that statement is considered to be "premature".
  35.                         */   
  36.     STMT_FINISHED,      /* statement execution has finished */
  37.     STMT_EXECUTING      /* statement execution is still going on */
  38. } STMT_Status;
  39. #define STMT_TRUNCATED -2
  40. #define STMT_INFO_ONLY -1 /* not an error message, just a notification to be returned by SQLError */
  41. #define STMT_OK 0 /* will be interpreted as "no error pending" */
  42. #define STMT_EXEC_ERROR 1
  43. #define STMT_STATUS_ERROR 2
  44. #define STMT_SEQUENCE_ERROR 3
  45. #define STMT_NO_MEMORY_ERROR 4
  46. #define STMT_COLNUM_ERROR 5
  47. #define STMT_NO_STMTSTRING 6
  48. #define STMT_ERROR_TAKEN_FROM_BACKEND 7
  49. #define STMT_INTERNAL_ERROR 8
  50. #define STMT_STILL_EXECUTING 9
  51. #define STMT_NOT_IMPLEMENTED_ERROR 10
  52. #define STMT_BAD_PARAMETER_NUMBER_ERROR 11
  53. #define STMT_OPTION_OUT_OF_RANGE_ERROR 12
  54. #define STMT_INVALID_COLUMN_NUMBER_ERROR 13
  55. #define STMT_RESTRICTED_DATA_TYPE_ERROR 14
  56. #define STMT_INVALID_CURSOR_STATE_ERROR 15
  57. #define STMT_OPTION_VALUE_CHANGED 16
  58. #define STMT_CREATE_TABLE_ERROR 17
  59. #define STMT_NO_CURSOR_NAME 18
  60. #define STMT_INVALID_CURSOR_NAME 19
  61. #define STMT_INVALID_ARGUMENT_NO 20
  62. #define STMT_ROW_OUT_OF_RANGE 21
  63. #define STMT_OPERATION_CANCELLED 22
  64. #define STMT_INVALID_CURSOR_POSITION 23
  65. #define STMT_VALUE_OUT_OF_RANGE 24
  66. #define STMT_OPERATION_INVALID 25
  67. #define STMT_PROGRAM_TYPE_OUT_OF_RANGE 26
  68. /* statement types */
  69. enum {
  70. STMT_TYPE_UNKNOWN = -2,
  71. STMT_TYPE_OTHER = -1,
  72. STMT_TYPE_SELECT = 0,
  73. STMT_TYPE_INSERT,
  74. STMT_TYPE_UPDATE,
  75. STMT_TYPE_DELETE,
  76. STMT_TYPE_CREATE,
  77. STMT_TYPE_ALTER,
  78. STMT_TYPE_DROP,
  79. STMT_TYPE_GRANT,
  80. STMT_TYPE_REVOKE,
  81. };
  82. #define STMT_UPDATE(stmt) (stmt->statement_type > STMT_TYPE_SELECT)
  83. /* Parsing status */
  84. enum {
  85. STMT_PARSE_NONE = 0,
  86. STMT_PARSE_COMPLETE,
  87. STMT_PARSE_INCOMPLETE,
  88. STMT_PARSE_FATAL,
  89. };
  90. /* Result style */
  91. enum {
  92. STMT_FETCH_NONE = 0,
  93. STMT_FETCH_NORMAL,
  94. STMT_FETCH_EXTENDED,
  95. };
  96. typedef struct {
  97. COL_INFO *col_info; /* cached SQLColumns info for this table */
  98. char  name[MAX_TABLE_LEN+1];
  99. char alias[MAX_TABLE_LEN+1];
  100. } TABLE_INFO;
  101. typedef struct {
  102. TABLE_INFO   *ti; /* resolve to explicit table names */
  103. int precision;
  104. int display_size;
  105. int length;
  106. int type;
  107. char nullable;
  108. char func;
  109. char expr;
  110. char quote;
  111. char dquote;
  112. char numeric;
  113. char dot[MAX_TABLE_LEN+1];
  114. char name[MAX_COLUMN_LEN+1];
  115. char alias[MAX_COLUMN_LEN+1];
  116. } FIELD_INFO;
  117. /******** Statement Handle ***********/
  118. struct StatementClass_ {
  119.     ConnectionClass *hdbc; /* pointer to ConnectionClass this statement belongs to */
  120.     QResultClass *result; /* result of the current statement */
  121. HSTMT FAR *phstmt;
  122. StatementOptions options;
  123.     STMT_Status status;
  124.     char *errormsg;
  125.     int errornumber;
  126.     /* information on bindings */
  127.     BindInfoClass *bindings; /* array to store the binding information */
  128. BindInfoClass bookmark;
  129.     int bindings_allocated;
  130.     /* information on statement parameters */
  131.     int parameters_allocated;
  132.     ParameterInfoClass *parameters;
  133. Int4 currTuple; /* current absolute row number (GetData, SetPos, SQLFetch) */
  134. int  save_rowset_size; /* saved rowset size in case of change/FETCH_NEXT */
  135. int  rowset_start; /* start of rowset (an absolute row number) */
  136. int  bind_row; /* current offset for Multiple row/column binding */
  137. int  last_fetch_count;      /* number of rows retrieved in last fetch/extended fetch */
  138. int  current_col; /* current column for GetData -- used to handle multiple calls */
  139. int  lobj_fd; /* fd of the current large object */
  140.     char *statement; /* if non--null pointer to the SQL statement that has been executed */
  141. TABLE_INFO **ti;
  142. FIELD_INFO **fi;
  143. int nfld;
  144. int ntab;
  145. int parse_status;
  146.     int statement_type; /* According to the defines above */
  147. int data_at_exec; /* Number of params needing SQLPutData */
  148. int current_exec_param; /* The current parameter for SQLPutData */
  149. char put_data; /* Has SQLPutData been called yet? */
  150. char errormsg_created; /* has an informative error msg been created?  */
  151. char manual_result; /* Is the statement result manually built? */
  152. char prepare; /* is this statement a prepared statement or direct */
  153. char internal; /* Is this statement being called internally? */
  154. char cursor_name[MAX_CURSOR_LEN+1];
  155. char stmt_with_params[65536 /* MAX_STATEMENT_LEN */]; /* statement after parameter substitution */
  156. };
  157. #define SC_get_conn(a)    (a->hdbc)
  158. #define SC_get_Result(a)  (a->result);
  159. /* options for SC_free_params() */
  160. #define STMT_FREE_PARAMS_ALL 0
  161. #define STMT_FREE_PARAMS_DATA_AT_EXEC_ONLY 1
  162. /* Statement prototypes */
  163. StatementClass *SC_Constructor(void);
  164. void InitializeStatementOptions(StatementOptions *opt);
  165. char SC_Destructor(StatementClass *self);
  166. int statement_type(char *statement);
  167. char parse_statement(StatementClass *stmt);
  168. void SC_pre_execute(StatementClass *self);
  169. char SC_unbind_cols(StatementClass *self);
  170. char SC_recycle_statement(StatementClass *self);
  171. void SC_clear_error(StatementClass *self);
  172. char SC_get_error(StatementClass *self, int *number, char **message);
  173. char *SC_create_errormsg(StatementClass *self);
  174. RETCODE SC_execute(StatementClass *self);
  175. RETCODE SC_fetch(StatementClass *self);
  176. void SC_free_params(StatementClass *self, char option);
  177. void SC_log_error(char *func, char *desc, StatementClass *self);
  178. unsigned long SC_get_bookmark(StatementClass *self);
  179. #endif