Mercurial > hg > nginx-quic
comparison src/mysql/ngx_mysql.c @ 645:4946078f0a79 release-0.3.44
nginx-0.3.44-RELEASE import
*) Feature: the "wait" parameter in the "include" SSI command.
*) Feature: the Ukrainian and Byelorussian characters were added to
koi-win conversion table.
*) Bugfix: in the SSI.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Thu, 04 May 2006 15:32:46 +0000 |
parents | |
children | 7cbef16c71a1 |
comparison
equal
deleted
inserted
replaced
644:610ff734a8cc | 645:4946078f0a79 |
---|---|
1 | |
2 /* | |
3 * Copyright (C) Igor Sysoev | |
4 */ | |
5 | |
6 | |
7 #include <ngx_config.h> | |
8 #include <ngx_core.h> | |
9 #include <ngx_event.h> | |
10 #include <ngx_mysql.h> | |
11 | |
12 | |
13 /* the library supports the subset of the MySQL 4.1+ protocol (version 10) */ | |
14 | |
15 | |
16 ngx_int_t | |
17 ngx_mysql_connect(ngx_mysql_t *m) | |
18 { | |
19 ngx_int_t rc; | |
20 | |
21 #if 0 | |
22 if (cached) { | |
23 return NGX_OK; | |
24 } | |
25 #endif | |
26 | |
27 m->peer.log->action = "connecting to mysql server"; | |
28 | |
29 rc = ngx_event_connect_peer(&m->peer); | |
30 | |
31 if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) { | |
32 return rc; | |
33 } | |
34 | |
35 m->peer.connection->read->handler = ngx_mysql_read_server_greeting; | |
36 m->peer.connection->write->handler = ngx_mysql_emtpy_handler; | |
37 | |
38 ngx_add_timer(m->peer.connection->read, /* STUB */ 5000); | |
39 ngx_add_timer(m->peer.connection->write, /* STUB */ 5000); | |
40 | |
41 return NGX_OK; | |
42 } | |
43 | |
44 | |
45 static void | |
46 ngx_mysql_read_server_greeting(ngx_event_t *rev) | |
47 { | |
48 size_t len; | |
49 u_char *p, *t; | |
50 ngx_mysql_t *m; | |
51 ngx_connection_t *c; | |
52 | |
53 c = rev->data; | |
54 m = c->data; | |
55 | |
56 if (rev->timedout) { | |
57 ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT, | |
58 "mysql server %V timed out", | |
59 &ctx->peer.peers->peer[0].name); | |
60 | |
61 ngx_mysql_close(m, NGX_ERROR); | |
62 return; | |
63 } | |
64 | |
65 if (m->buf == NULL) { | |
66 m->peer.log->action = "reading to mysql server greeting"; | |
67 | |
68 m->buf = ngx_create_temp(m->pool, /* STUB */ 1024); | |
69 if (m->buf == NULL) { | |
70 ngx_mysql_close(m, NGX_ERROR); | |
71 return; | |
72 } | |
73 } | |
74 | |
75 n = ngx_recv(m->peer.connection, m->buf->pos, /* STUB */ 1024); | |
76 | |
77 if (n == NGX_AGAIN) { | |
78 return; | |
79 } | |
80 | |
81 if (n < 5) { | |
82 ngx_mysql_close(m, NGX_ERROR); | |
83 return; | |
84 } | |
85 | |
86 p = m->buf->pos; | |
87 | |
88 if (ngx_m24toh(p) > n - 4) { | |
89 ngx_log_error(NGX_LOG_ERR, rev->log, 0, | |
90 "mysql server %V sent incomplete greeting packet", | |
91 &ctx->peer.peers->peer[0].name); | |
92 | |
93 ngx_mysql_close(m, NGX_ERROR); | |
94 return; | |
95 } | |
96 | |
97 if (p[4]) < 10) { | |
98 ngx_log_error(NGX_LOG_ERR, rev->log, 0, | |
99 "mysql server %V sent unsupported protocol version %ud", | |
100 &ctx->peer.peers->peer[0].name, p[4]); | |
101 | |
102 ngx_mysql_close(m, NGX_ERROR); | |
103 return; | |
104 } | |
105 | |
106 len = ngx_strlen(&p[5]); | |
107 t = p + 5 + len + 1; | |
108 | |
109 capacity = ngx_m16toh((&t[4 + 9])); | |
110 | |
111 ngx_log_debug8(NGX_LOG_DEBUG_MYSQL, rev->log, 0, | |
112 "mysql version: %ud, \"%s\", thread: %ud, salt: \"%s\", ", | |
113 "capacity: %Xd, charset: %ud, status: %ud, salt rest \"%s\"", | |
114 p[4], &p[5], ngx_m32toh(t), &t[4], | |
115 capacity, t[4 + 9 + 2], | |
116 ngx_m16toh((&t[4 + 9 + 2 + 1])), | |
117 t[4 + 9 + 2 + 1 + 2 + 13]); | |
118 | |
119 capacity &= NGX_MYSQL_LONG_PASSWORD | |
120 | NGX_MYSQL_CONNECT_WITH_DB | |
121 | NGX_MYSQL_PROTOCOL_41; | |
122 | |
123 } | |
124 | |
125 | |
126 static void | |
127 ngx_mysql_close(ngx_mysql_t *m, ngx_int_t rc) | |
128 { | |
129 if (rc == NGX_ERROR) { | |
130 ngx_close_connection(m->peer.connection); | |
131 } | |
132 | |
133 m->state = rc; | |
134 | |
135 m->handler(m); | |
136 } |