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

数据库系统

开发平台:

Unix_Linux

  1. /* File:            connection.h
  2.  *
  3.  * Description:     See "connection.c"
  4.  *
  5.  * Comments:        See "notice.txt" for copyright and license information.
  6.  *
  7.  */
  8. #ifndef __CONNECTION_H__
  9. #define __CONNECTION_H__
  10. #ifdef HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif
  13. #include "psqlodbc.h"
  14. #ifndef WIN32
  15. #include "iodbc.h"
  16. #include "isql.h"
  17. #include "isqlext.h"
  18. #else
  19. #include <windows.h>
  20. #include <sql.h>
  21. #include <sqlext.h>
  22. #endif
  23. typedef enum {
  24.     CONN_NOT_CONNECTED,      /* Connection has not been established */
  25.     CONN_CONNECTED,      /* Connection is up and has been established */
  26.     CONN_DOWN,            /* Connection is broken */
  27.     CONN_EXECUTING     /* the connection is currently executing a statement */
  28. } CONN_Status;
  29. /* These errors have general sql error state */
  30. #define CONNECTION_SERVER_NOT_REACHED 101
  31. #define CONNECTION_MSG_TOO_LONG 103
  32. #define CONNECTION_COULD_NOT_SEND 104
  33. #define CONNECTION_NO_SUCH_DATABASE 105
  34. #define CONNECTION_BACKEND_CRAZY 106
  35. #define CONNECTION_NO_RESPONSE 107
  36. #define CONNECTION_SERVER_REPORTED_ERROR 108
  37. #define CONNECTION_COULD_NOT_RECEIVE 109
  38. #define CONNECTION_SERVER_REPORTED_WARNING 110
  39. #define CONNECTION_NEED_PASSWORD 112
  40. /* These errors correspond to specific SQL states */
  41. #define CONN_INIREAD_ERROR 201
  42. #define CONN_OPENDB_ERROR 202
  43. #define CONN_STMT_ALLOC_ERROR 203
  44. #define CONN_IN_USE 204 
  45. #define CONN_UNSUPPORTED_OPTION 205
  46. /* Used by SetConnectoption to indicate unsupported options */
  47. #define CONN_INVALID_ARGUMENT_NO 206
  48. /* SetConnectOption: corresponds to ODBC--"S1009" */
  49. #define CONN_TRANSACT_IN_PROGRES 207
  50. #define CONN_NO_MEMORY_ERROR 208
  51. #define CONN_NOT_IMPLEMENTED_ERROR 209
  52. #define CONN_INVALID_AUTHENTICATION 210
  53. #define CONN_AUTH_TYPE_UNSUPPORTED 211
  54. #define CONN_UNABLE_TO_LOAD_DLL 212
  55. #define CONN_OPTION_VALUE_CHANGED 213
  56. #define CONN_VALUE_OUT_OF_RANGE 214
  57. #define CONN_TRUNCATED 215
  58. /* Conn_status defines */
  59. #define CONN_IN_AUTOCOMMIT 0x01
  60. #define CONN_IN_TRANSACTION 0x02
  61. /* AutoCommit functions */
  62. #define CC_set_autocommit_off(x) (x->transact_status &= ~CONN_IN_AUTOCOMMIT)
  63. #define CC_set_autocommit_on(x) (x->transact_status |= CONN_IN_AUTOCOMMIT)
  64. #define CC_is_in_autocommit(x) (x->transact_status & CONN_IN_AUTOCOMMIT)
  65. /* Transaction in/not functions */
  66. #define CC_set_in_trans(x) (x->transact_status |= CONN_IN_TRANSACTION)
  67. #define CC_set_no_trans(x) (x->transact_status &= ~CONN_IN_TRANSACTION)
  68. #define CC_is_in_trans(x) (x->transact_status & CONN_IN_TRANSACTION)
  69. /* Authentication types */
  70. #define AUTH_REQ_OK 0
  71. #define AUTH_REQ_KRB4 1
  72. #define AUTH_REQ_KRB5 2
  73. #define AUTH_REQ_PASSWORD 3
  74. #define AUTH_REQ_CRYPT 4
  75. /* Startup Packet sizes */
  76. #define SM_DATABASE 64
  77. #define SM_USER 32
  78. #define SM_OPTIONS 64
  79. #define SM_UNUSED 64
  80. #define SM_TTY 64
  81. /* Old 6.2 protocol defines */
  82. #define NO_AUTHENTICATION 7
  83. #define PATH_SIZE 64
  84. #define ARGV_SIZE 64
  85. #define NAMEDATALEN 16
  86. typedef unsigned int ProtocolVersion;
  87. #define PG_PROTOCOL(major, minor) (((major) << 16) | (minor))
  88. #define PG_PROTOCOL_LATEST PG_PROTOCOL(2, 0)
  89. #define PG_PROTOCOL_63 PG_PROTOCOL(1, 0)
  90. #define PG_PROTOCOL_62 PG_PROTOCOL(0, 0)
  91. /* This startup packet is to support latest Postgres protocol (6.4, 6.3) */
  92. typedef struct _StartupPacket
  93. {
  94. ProtocolVersion protoVersion;
  95. char database[SM_DATABASE];
  96. char user[SM_USER];
  97. char options[SM_OPTIONS];
  98. char unused[SM_UNUSED];
  99. char tty[SM_TTY];
  100. } StartupPacket;
  101. /* This startup packet is to support pre-Postgres 6.3 protocol */
  102. typedef struct _StartupPacket6_2
  103. {
  104. unsigned int authtype;
  105. char database[PATH_SIZE];
  106. char user[NAMEDATALEN];
  107. char options[ARGV_SIZE];
  108. char execfile[ARGV_SIZE];
  109. char tty[PATH_SIZE];
  110. } StartupPacket6_2;
  111. /* Structure to hold all the connection attributes for a specific
  112. connection (used for both registry and file, DSN and DRIVER)
  113. */
  114. typedef struct {
  115. char dsn[MEDIUM_REGISTRY_LEN];
  116. char desc[MEDIUM_REGISTRY_LEN];
  117. char driver[MEDIUM_REGISTRY_LEN];
  118. char server[MEDIUM_REGISTRY_LEN];
  119. char database[MEDIUM_REGISTRY_LEN];
  120. char username[MEDIUM_REGISTRY_LEN];
  121. char password[MEDIUM_REGISTRY_LEN];
  122. char conn_settings[LARGE_REGISTRY_LEN];
  123. char protocol[SMALL_REGISTRY_LEN];
  124. char port[SMALL_REGISTRY_LEN];
  125. char readonly[SMALL_REGISTRY_LEN];
  126. char fake_oid_index[SMALL_REGISTRY_LEN];
  127. char show_oid_column[SMALL_REGISTRY_LEN];
  128. char row_versioning[SMALL_REGISTRY_LEN];
  129. char show_system_tables[SMALL_REGISTRY_LEN];
  130. char    translation_dll[MEDIUM_REGISTRY_LEN];
  131. char    translation_option[SMALL_REGISTRY_LEN];
  132. char focus_password;
  133. } ConnInfo;
  134. /* Macro to determine is the connection using 6.2 protocol? */
  135. #define PROTOCOL_62(conninfo_) (strncmp((conninfo_)->protocol, PG62, strlen(PG62)) == 0)
  136. /* Macro to determine is the connection using 6.3 protocol? */
  137. #define PROTOCOL_63(conninfo_) (strncmp((conninfo_)->protocol, PG63, strlen(PG63)) == 0)
  138. /* This is used to store cached table information in the connection */
  139. struct col_info {
  140. QResultClass *result;
  141. char name[MAX_TABLE_LEN+1];
  142. };
  143.  /* Translation DLL entry points */
  144. #ifdef WIN32
  145. #define DLLHANDLE HINSTANCE
  146. #else
  147. #define WINAPI CALLBACK
  148. #define DLLHANDLE void *
  149. #define HINSTANCE void *
  150. #endif
  151. typedef BOOL (FAR WINAPI *DataSourceToDriverProc) (UDWORD,
  152. SWORD,
  153. PTR,
  154. SDWORD,
  155. PTR,
  156. SDWORD,
  157. SDWORD FAR *,
  158. UCHAR FAR *,
  159. SWORD,
  160. SWORD FAR *);
  161. typedef BOOL (FAR WINAPI *DriverToDataSourceProc) (UDWORD,
  162. SWORD,
  163. PTR,
  164. SDWORD,
  165. PTR,
  166. SDWORD,
  167. SDWORD FAR *,
  168. UCHAR FAR *,
  169. SWORD,
  170. SWORD FAR *);
  171. /******* The Connection handle ************/
  172. struct ConnectionClass_ {
  173. HENV henv; /* environment this connection was created on */
  174. StatementOptions stmtOptions;
  175. char *errormsg;
  176. int errornumber;
  177. CONN_Status status;
  178. ConnInfo connInfo;
  179. StatementClass **stmts;
  180. int num_stmts;
  181. SocketClass *sock;
  182. int lobj_type;
  183. int ntables;
  184. COL_INFO **col_info;
  185. long            translation_option;
  186. HINSTANCE       translation_handle;
  187. DataSourceToDriverProc  DataSourceToDriver;
  188. DriverToDataSourceProc  DriverToDataSource;
  189. char transact_status; /* Is a transaction is currently in progress */
  190. char errormsg_created; /* has an informative error msg been created?  */
  191. };
  192. /* Accessor functions */
  193. #define CC_get_socket(x) (x->sock)
  194. #define CC_get_database(x) (x->connInfo.database)
  195. #define CC_get_server(x) (x->connInfo.server)
  196. #define CC_get_DSN(x) (x->connInfo.dsn)
  197. #define CC_get_username(x) (x->connInfo.username)
  198. #define CC_is_readonly(x) (x->connInfo.readonly[0] == '1')
  199. /*  for CC_DSN_info */
  200. #define CONN_DONT_OVERWRITE 0
  201. #define CONN_OVERWRITE 1 
  202. /* prototypes */
  203. ConnectionClass *CC_Constructor(void);
  204. char CC_Destructor(ConnectionClass *self);
  205. int CC_cursor_count(ConnectionClass *self);
  206. char CC_cleanup(ConnectionClass *self);
  207. char CC_abort(ConnectionClass *self);
  208. int CC_set_translation (ConnectionClass *self);
  209. char CC_connect(ConnectionClass *self, char do_password);
  210. char CC_add_statement(ConnectionClass *self, StatementClass *stmt);
  211. char CC_remove_statement(ConnectionClass *self, StatementClass *stmt);
  212. char CC_get_error(ConnectionClass *self, int *number, char **message);
  213. QResultClass *CC_send_query(ConnectionClass *self, char *query, QueryInfo *qi);
  214. void CC_clear_error(ConnectionClass *self);
  215. char *CC_create_errormsg(ConnectionClass *self);
  216. int CC_send_function(ConnectionClass *conn, int fnid, void *result_buf, int *actual_result_len, int result_is_int, LO_ARG *argv, int nargs);
  217. char CC_send_settings(ConnectionClass *self);
  218. void CC_lookup_lo(ConnectionClass *conn);
  219. void CC_log_error(char *func, char *desc, ConnectionClass *self);
  220. #endif