diff 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
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/src/mysql/ngx_mysql.c
@@ -0,0 +1,136 @@
+
+/*
+ * Copyright (C) Igor Sysoev
+ */
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+#include <ngx_mysql.h>
+
+
+/* the library supports the subset of the MySQL 4.1+ protocol (version 10) */
+
+
+ngx_int_t
+ngx_mysql_connect(ngx_mysql_t *m)
+{
+    ngx_int_t  rc;
+
+#if 0
+    if (cached) {
+        return NGX_OK;
+    }
+#endif
+
+    m->peer.log->action = "connecting to mysql server";
+
+    rc = ngx_event_connect_peer(&m->peer);
+
+    if (rc == NGX_ERROR || rc == NGX_BUSY || rc == NGX_DECLINED) {
+        return rc;
+    }
+
+    m->peer.connection->read->handler = ngx_mysql_read_server_greeting;
+    m->peer.connection->write->handler = ngx_mysql_emtpy_handler;
+
+    ngx_add_timer(m->peer.connection->read, /* STUB */ 5000);
+    ngx_add_timer(m->peer.connection->write, /* STUB */ 5000);
+
+    return NGX_OK;
+}
+
+
+static void
+ngx_mysql_read_server_greeting(ngx_event_t *rev)
+{
+    size_t             len;
+    u_char            *p, *t;
+    ngx_mysql_t       *m;
+    ngx_connection_t  *c;
+
+    c = rev->data;
+    m = c->data;
+
+    if (rev->timedout) {
+        ngx_log_error(NGX_LOG_ERR, rev->log, NGX_ETIMEDOUT,
+                      "mysql server %V timed out",
+                      &ctx->peer.peers->peer[0].name);
+
+        ngx_mysql_close(m, NGX_ERROR);
+        return;
+    }
+
+    if (m->buf == NULL) {
+        m->peer.log->action = "reading to mysql server greeting";
+
+        m->buf = ngx_create_temp(m->pool, /* STUB */ 1024);
+        if (m->buf == NULL) {
+            ngx_mysql_close(m, NGX_ERROR);
+            return;
+        }
+    }
+
+    n = ngx_recv(m->peer.connection, m->buf->pos, /* STUB */ 1024);
+
+    if (n == NGX_AGAIN) {
+        return;
+    }
+
+    if (n < 5) {
+        ngx_mysql_close(m, NGX_ERROR);
+        return;
+    }
+
+    p = m->buf->pos;
+
+    if (ngx_m24toh(p) > n - 4) {
+        ngx_log_error(NGX_LOG_ERR, rev->log, 0,
+                      "mysql server %V sent incomplete greeting packet",
+                      &ctx->peer.peers->peer[0].name);
+
+        ngx_mysql_close(m, NGX_ERROR);
+        return;
+    }
+
+    if (p[4]) < 10) {
+        ngx_log_error(NGX_LOG_ERR, rev->log, 0,
+                      "mysql server %V sent unsupported protocol version %ud",
+                      &ctx->peer.peers->peer[0].name, p[4]);
+
+        ngx_mysql_close(m, NGX_ERROR);
+        return;
+    }
+
+    len = ngx_strlen(&p[5]);
+    t = p + 5 + len + 1;
+
+    capacity = ngx_m16toh((&t[4 + 9]));
+
+    ngx_log_debug8(NGX_LOG_DEBUG_MYSQL, rev->log, 0,
+                   "mysql version: %ud, \"%s\", thread: %ud, salt: \"%s\", ",
+                   "capacity: %Xd, charset: %ud, status: %ud, salt rest \"%s\"",
+                   p[4], &p[5], ngx_m32toh(t), &t[4],
+                   capacity, t[4 + 9 + 2],
+                   ngx_m16toh((&t[4 + 9 + 2 + 1])),
+                   t[4 + 9 + 2 + 1 + 2 + 13]);
+
+    capacity &= NGX_MYSQL_LONG_PASSWORD
+                | NGX_MYSQL_CONNECT_WITH_DB
+                | NGX_MYSQL_PROTOCOL_41;
+
+}
+
+
+static void
+ngx_mysql_close(ngx_mysql_t *m, ngx_int_t rc)
+{
+    if (rc == NGX_ERROR) {
+        ngx_close_connection(m->peer.connection);
+    }
+
+    m->state = rc;
+
+    m->handler(m);
+}