usr0sess.h
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:10k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Sessions
  3. (c) 1996 Innobase Oy
  4. Created 6/25/1996 Heikki Tuuri
  5. *******************************************************/
  6. #ifndef usr0sess_h
  7. #define usr0sess_h
  8. #include "univ.i"
  9. #include "ut0byte.h"
  10. #include "hash0hash.h"
  11. #include "trx0types.h"
  12. #include "srv0srv.h"
  13. #include "trx0types.h"
  14. #include "usr0types.h"
  15. #include "que0types.h"
  16. #include "data0data.h"
  17. #include "rem0rec.h"
  18. #include "com0com.h"
  19. /* The session system global data structure */
  20. extern sess_sys_t* sess_sys;
  21. /*************************************************************************
  22. Sets the session id in a client message. */
  23. void
  24. sess_cli_msg_set_sess(
  25. /*==================*/
  26. byte* str, /* in/out: message string */
  27. dulint sess_id);/* in: session id */
  28. /***************************************************************************
  29. Sets the message type of a message from the client. */
  30. UNIV_INLINE
  31. void
  32. sess_cli_msg_set_type(
  33. /*==================*/
  34. byte* str, /* in: message string */
  35. ulint type); /* in: message type */
  36. /***************************************************************************
  37. Gets the message type of a message from the server. */
  38. UNIV_INLINE
  39. ulint
  40. sess_srv_msg_get_type(
  41. /*==================*/
  42. /* out: message type */
  43. byte* str); /* in: message string */
  44. /***************************************************************************
  45. Creates a session sytem at database start. */
  46. void
  47. sess_sys_init_at_db_start(void);
  48. /*===========================*/
  49. /*************************************************************************
  50. Opens a session. */
  51. sess_t*
  52. sess_open(
  53. /*======*/
  54. /* out, own: session object */
  55. com_endpoint_t* endpoint, /* in: communication endpoint used
  56. for communicating with the client */
  57. byte* addr_buf, /* in: client address */
  58. ulint addr_len); /* in: client address length */
  59. /*************************************************************************
  60. Closes a session, freeing the memory occupied by it. */
  61. void
  62. sess_close(
  63. /*=======*/
  64. sess_t* sess); /* in, own: session object */
  65. /*************************************************************************
  66. Raises an SQL error. */
  67. void
  68. sess_raise_error_low(
  69. /*=================*/
  70. trx_t* trx, /* in: transaction */
  71. ulint err_no, /* in: error number */
  72. ulint type, /* in: more info of the error, or 0 */
  73. dict_table_t* table, /* in: dictionary table or NULL */
  74. dict_index_t* index, /* in: table index or NULL */
  75. dtuple_t* tuple, /* in: tuple to insert or NULL */
  76. rec_t* rec, /* in: record or NULL */
  77. char* err_str);/* in: arbitrary null-terminated error string,
  78. or NULL */
  79. /*************************************************************************
  80. Closes a session, freeing the memory occupied by it, if it is in a state
  81. where it should be closed. */
  82. ibool
  83. sess_try_close(
  84. /*===========*/
  85. /* out: TRUE if closed */
  86. sess_t* sess); /* in, own: session object */
  87. /*************************************************************************
  88. Initializes the first fields of a message to client. */
  89. void
  90. sess_srv_msg_init(
  91. /*==============*/
  92. sess_t* sess, /* in: session object */
  93. byte* buf, /* in: message buffer, must be at least of size
  94. SESS_SRV_MSG_DATA */
  95. ulint type); /* in: message type */
  96. /*************************************************************************
  97. Sends a simple message to client. */
  98. void
  99. sess_srv_msg_send_simple(
  100. /*=====================*/
  101. sess_t* sess, /* in: session object */
  102. ulint type, /* in: message type */
  103. ulint rel_kernel); /* in: SESS_RELEASE_KERNEL or
  104. SESS_NOT_RELEASE_KERNEL */
  105. /***************************************************************************
  106. Processes a message from a client. NOTE: May release the kernel mutex
  107. temporarily. */
  108. void
  109. sess_receive_msg_rel_kernel(
  110. /*========================*/
  111. sess_t* sess, /* in: session */
  112. byte* str, /* in: message string */
  113. ulint len); /* in: message length */
  114. /***************************************************************************
  115. When a command has been completed, this function sends the message about it
  116. to the client. */
  117. void
  118. sess_command_completed_message(
  119. /*===========================*/
  120. sess_t* sess, /* in: session */
  121. byte* msg, /* in: message buffer */
  122. ulint len); /* in: message data length */
  123. /***********************************************************************
  124. Starts a new connection and a session, or starts a query based on a client
  125. message. This is called by a SRV_COM thread. */
  126. void
  127. sess_process_cli_msg(
  128. /*=================*/
  129. byte* str, /* in: message string */
  130. ulint len, /* in: string length */
  131. byte* addr, /* in: address string */
  132. ulint alen); /* in: address length */
  133. /* The session handle. All fields are protected by the kernel mutex */
  134. struct sess_struct{
  135. dulint id; /* session id */
  136. dulint usr_id; /* user id */
  137. hash_node_t hash; /* hash chain node */
  138. ulint refer_count; /* reference count to the session
  139. object: when this drops to zero
  140. and the session has no query graphs
  141. left, discarding the session object
  142. is allowed */
  143. dulint error_count; /* if this counter has increased while
  144. a thread is parsing an SQL command,
  145. its graph should be discarded */
  146. ibool disconnecting; /* TRUE if the session is to be
  147. disconnected when its reference
  148. count drops to 0 */
  149. ulint state; /* state of the session */
  150. dulint msgs_sent; /* count of messages sent to the
  151. client */
  152. dulint msgs_recv; /* count of messages received from the
  153. client */
  154. ibool client_waits; /* when the session receives a message
  155. from the client, this set to TRUE, and
  156. when the session sends a message to
  157. the client this is set to FALSE */
  158. trx_t* trx; /* transaction object permanently
  159. assigned for the session: the
  160. transaction instance designated by the
  161. trx id changes, but the memory
  162. structure is preserved */
  163. ulint next_graph_id; /* next query graph id to assign */
  164. UT_LIST_BASE_NODE_T(que_t)
  165. graphs; /* query graphs belonging to this
  166. session */
  167. /*------------------------------*/
  168. ulint err_no; /* latest error number, 0 if none */
  169. char* err_str; /* latest error string */
  170. ulint err_len; /* error string length */
  171. /*------------------------------*/
  172. com_endpoint_t* endpoint; /* server communications endpoint used
  173. to communicate with the client */
  174. char* addr_buf; /* client address string */
  175. ulint addr_len; /* client address string length */
  176. /*------------------------------*/
  177. byte* big_msg; /* if the client sends a message which
  178. does not fit in a single packet,
  179. it is assembled in this buffer; if
  180. this field is not NULL, it is assumed
  181. that the message should be catenated
  182. here */
  183. ulint big_msg_size; /* size of the big message buffer */
  184. ulint big_msg_len; /* length of data in the big message
  185. buffer */
  186. };
  187. /* The session system; this is protected by the kernel mutex */
  188. struct sess_sys_struct{
  189. ulint state; /* state of the system:
  190. SESS_SYS_RUNNING or
  191. SESS_SYS_SHUTTING_DOWN */
  192. sess_t* shutdown_req; /* if shutdown was requested by some
  193. session, confirmation of shutdown
  194. completion should be sent to this
  195. session */
  196. dulint free_sess_id; /* first unused session id */
  197. hash_table_t* hash; /* hash table of the sessions */
  198. };
  199. /*---------------------------------------------------*/
  200. /* The format of an incoming message from a client */
  201. #define SESS_CLI_MSG_CHECKSUM 0 /* the checksum should be the first
  202. field in the message */
  203. #define SESS_CLI_MSG_SESS_ID 4 /* this is set to 0 if the client
  204. wants to connect and establish
  205. a new session */
  206. #define SESS_CLI_MSG_SESS_ID_CHECK 12 /* checksum of the sess id field */
  207. #define SESS_CLI_MSG_TYPE 16
  208. #define SESS_CLI_MSG_NO 20
  209. #define SESS_CLI_MSG_CONTINUE 28 /* 0, or SESS_MSG_FIRST_PART
  210. SESS_MSG_MIDDLE_PART, or
  211. SESS_MSG_LAST_PART */
  212. #define SESS_CLI_MSG_CONT_SIZE 32 /* size of a multipart message in
  213. kilobytes (rounded upwards) */
  214. #define SESS_CLI_MSG_DATA 36
  215. /*---------------------------------------------------*/
  216. /* Client-to-session message types */
  217. #define SESS_CLI_CONNECT 1
  218. #define SESS_CLI_PREPARE 2
  219. #define SESS_CLI_EXECUTE 3
  220. #define SESS_CLI_BREAK_EXECUTION 4
  221. /* Client-to-session statement command types */
  222. #define SESS_COMM_FETCH_NEXT 1
  223. #define SESS_COMM_FETCH_PREV 2
  224. #define SESS_COMM_FETCH_FIRST 3
  225. #define SESS_COMM_FETCH_LAST 4
  226. #define SESS_COMM_FETCH_NTH 5
  227. #define SESS_COMM_FETCH_NTH_LAST 6
  228. #define SESS_COMM_EXECUTE 7
  229. #define SESS_COMM_NO_COMMAND 8
  230. /*---------------------------------------------------*/
  231. /* The format of an outgoing message from a session to the client */
  232. #define SESS_SRV_MSG_CHECKSUM 0 /* the checksum should be the first
  233. field in the message */
  234. #define SESS_SRV_MSG_SESS_ID 4
  235. #define SESS_SRV_MSG_TYPE 12
  236. #define SESS_SRV_MSG_NO 16
  237. #define SESS_SRV_MSG_CONTINUE 24 /* 0, or SESS_MSG_FIRST_PART
  238. SESS_MSG_MIDDLE_PART, or
  239. SESS_MSG_LAST_PART */
  240. #define SESS_SRV_MSG_CONT_SIZE 28 /* size of a multipart message
  241. in kilobytes (rounded upward) */
  242. #define SESS_SRV_MSG_DATA 32
  243. /*---------------------------------------------------*/
  244. /* Session-to-client message types */
  245. #define SESS_SRV_ACCEPT_CONNECT 1
  246. #define SESS_SRV_SUCCESS 2
  247. #define SESS_SRV_ERROR 3
  248. /* Multipart messages */
  249. #define SESS_MSG_SINGLE_PART 0
  250. #define SESS_MSG_FIRST_PART 1
  251. #define SESS_MSG_MIDDLE_PART 2
  252. #define SESS_MSG_LAST_PART 3
  253. /* Error numbers */
  254. #define SESS_ERR_NONE 0
  255. #define SESS_ERR_TRX_COMMITTED 1
  256. #define SESS_ERR_TRX_ROLLED_BACK 2
  257. #define SESS_ERR_SESSION_DISCONNECTED 3
  258. #define SESS_ERR_REPLY_FAILED 4
  259. #define SESS_ERR_CANNOT_BREAK_OP 5
  260. #define SESS_ERR_MSG_LOST 6
  261. #define SESS_ERR_MSG_CORRUPTED 7
  262. #define SESS_ERR_EXTRANEOUS_MSG 8
  263. #define SESS_ERR_OUT_OF_MEMORY 9
  264. #define SESS_ERR_SQL_ERROR 10
  265. #define SESS_ERR_STMT_NOT_FOUND 11
  266. #define SESS_ERR_STMT_NOT_READY 12
  267. #define SESS_ERR_EXTRANEOUS_SRV_MSG 13
  268. #define SESS_ERR_BREAK_BY_CLIENT 14
  269. /* Session states */
  270. #define SESS_ACTIVE 1
  271. #define SESS_ERROR 2 /* session contains an error message
  272. which has not yet been communicated
  273. to the client */
  274. /* Session system states */
  275. #define SESS_SYS_RUNNING 1
  276. #define SESS_SYS_SHUTTING_DOWN 2
  277. /* Session hash table size */
  278. #define SESS_HASH_SIZE 1024
  279. /* Flags used in sess_srv_msg_send */
  280. #define SESS_RELEASE_KERNEL 1
  281. #define SESS_NOT_RELEASE_KERNEL 2
  282. #ifndef UNIV_NONINL
  283. #include "usr0sess.ic"
  284. #endif
  285. #endif