Mercurial > hg > nginx
diff src/mysql/ngx_http_mysql_test.c @ 653:7cbef16c71a1 release-0.3.48
nginx-0.3.48-RELEASE import
*) Change: now the ngx_http_charset_module works for subrequests, if
the response has no "Content-Type" header line.
*) Bugfix: if the "proxy_pass" directive has no URI part, then the
"proxy_redirect default" directive add the unnecessary slash in
start of the rewritten redirect.
*) Bugfix: the internal redirect always transform client's HTTP method
to GET, now the transformation is made for the "X-Accel-Redirect"
redirects only and if the method is not HEAD; the bug had appeared
in 0.3.42.
*) Bugfix: the ngx_http_perl_module could not be built, if the perl was
built with the threads support; the bug had appeared in 0.3.46.
author | Igor Sysoev <igor@sysoev.ru> |
---|---|
date | Mon, 29 May 2006 17:28:12 +0000 |
parents | |
children | 63a820b0bc6c |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/mysql/ngx_http_mysql_test.c @@ -0,0 +1,196 @@ + +/* + * Copyright (C) Igor Sysoev + */ + +#include <ngx_config.h> +#include <ngx_core.h> +#include <ngx_mysql.h> +#include <ngx_http.h> + + +typedef struct { + ngx_peers_t *peers; +} ngx_http_mysql_test_conf_t; + + +static void ngx_http_mysql_auth(ngx_mysql_t *m); +static void ngx_http_mysql_done(ngx_mysql_t *m); +static void *ngx_http_mysql_test_create_loc_conf(ngx_conf_t *cf); +static char *ngx_http_mysql_test(ngx_conf_t *cf, ngx_command_t *cmd, + void *conf); + +static ngx_command_t ngx_http_mysql_test_commands[] = { + + { ngx_string("mysql_test"), + NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, + ngx_http_mysql_test, + NGX_HTTP_LOC_CONF_OFFSET, + 0, + NULL }, + + ngx_null_command +}; + + +ngx_http_module_t ngx_http_mysql_test_module_ctx = { + NULL, /* preconfiguration */ + NULL, /* postconfiguration */ + + NULL, /* create main configuration */ + NULL, /* init main configuration */ + + NULL, /* create server configuration */ + NULL, /* merge server configuration */ + + ngx_http_mysql_test_create_loc_conf, /* create location configuration */ + NULL /* merge location configuration */ +}; + + +ngx_module_t ngx_http_mysql_test_module = { + NGX_MODULE_V1, + &ngx_http_mysql_test_module_ctx, /* module context */ + ngx_http_mysql_test_commands, /* module directives */ + NGX_HTTP_MODULE, /* module type */ + NULL, /* init master */ + NULL, /* init module */ + NULL, /* init process */ + NULL, /* init thread */ + NULL, /* exit thread */ + NULL, /* exit process */ + NULL, /* exit master */ + NGX_MODULE_V1_PADDING +}; + + +static ngx_str_t ngx_mysql_login = ngx_string("root"); +static ngx_str_t ngx_mysql_passwd = ngx_string("tp"); +static ngx_str_t ngx_mysql_database = ngx_string("mysql"); +static ngx_str_t ngx_mysql_command_query = + ngx_string("select * from user"); + + +static ngx_int_t +ngx_http_mysql_test_handler(ngx_http_request_t *r) +{ + ngx_int_t rc; + ngx_mysql_t *m; + ngx_http_mysql_test_conf_t *mtcf; + + mtcf = ngx_http_get_module_loc_conf(r, ngx_http_mysql_test_module); + + m = ngx_pcalloc(r->pool, sizeof(ngx_mysql_t)); + + if (m == NULL) { + return NGX_HTTP_INTERNAL_SERVER_ERROR; + } + + m->pool = r->pool; + m->handler = ngx_http_mysql_auth; + m->data = r; + + m->login = &ngx_mysql_login; + m->passwd = &ngx_mysql_passwd; + m->database = &ngx_mysql_database; + + m->peer.log = r->connection->log; + m->peer.log_error = NGX_ERROR_ERR; + m->peer.peers = mtcf->peers; + m->peer.tries = mtcf->peers->number; + + rc = ngx_mysql_connect(m); + + if (rc == NGX_OK || rc == NGX_AGAIN) { + return NGX_DONE; + } + + return NGX_HTTP_INTERNAL_SERVER_ERROR; +} + + +static void +ngx_http_mysql_auth(ngx_mysql_t *m) +{ + ngx_http_request_t *r; + + r = m->data; + + if (m->state != NGX_OK) { + ngx_http_finalize_request(r, NGX_HTTP_NO_CONTENT); + return; + } + + m->query.len = NGX_MYSQL_CMDPKT_LEN + ngx_mysql_command_query.len; + + m->query.data = ngx_palloc(r->pool, m->query.len); + if (m->query.data == NULL) { + ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR); + return; + } + + ngx_memcpy(m->query.data + NGX_MYSQL_CMDPKT_LEN, + ngx_mysql_command_query.data, ngx_mysql_command_query.len); + + m->handler = ngx_http_mysql_done; + + ngx_mysql_query(m); +} + + +static void +ngx_http_mysql_done(ngx_mysql_t *m) +{ + ngx_http_request_t *r; + + r = m->data; + + ngx_http_finalize_request(r, NGX_HTTP_NO_CONTENT); +} + + +static void * +ngx_http_mysql_test_create_loc_conf(ngx_conf_t *cf) +{ + ngx_http_mysql_test_conf_t *conf; + + conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_mysql_test_conf_t)); + if (conf == NULL) { + return NGX_CONF_ERROR; + } + + return conf; +} + +static char * +ngx_http_mysql_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) +{ + ngx_http_mysql_test_conf_t *mtcf = conf; + + ngx_str_t *value; + ngx_url_t u; + ngx_http_core_loc_conf_t *clcf; + + clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module); + clcf->handler = ngx_http_mysql_test_handler; + + value = cf->args->elts; + + ngx_memzero(&u, sizeof(ngx_url_t)); + + u.url = value[1]; + u.default_portn = 3306; + + if (ngx_parse_url(cf, &u) != NGX_OK) { + if (u.err) { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "%s in upstream \"%V\"", u.err, &u.url); + } + + return NGX_CONF_ERROR; + } + + mtcf->peers = u.peers; + + return NGX_CONF_OK; +}