view src/mysql/ngx_mysql.h @ 4385:70ba81827472

Cache locks initial implementation. New directives: proxy_cache_lock on/off, proxy_cache_lock_timeout. With proxy_cache_lock set to on, only one request will be allowed to go to upstream for a particular cache item. Others will wait for a response to appear in cache (or cache lock released) up to proxy_cache_lock_timeout. Waiting requests will recheck if they have cached response ready (or are allowed to run) every 500ms. Note: we intentionally don't intercept NGX_DECLINED possibly returned by ngx_http_file_cache_read(). This needs more work (possibly safe, but needs further investigation). Anyway, it's exceptional situation. Note: probably there should be a way to disable caching of responses if there is already one request fetching resource to cache (without waiting at all). Two possible ways include another cache lock option ("no_cache") or using proxy_no_cache with some supplied variable. Note: probably there should be a way to lock updating requests as well. For now "proxy_cache_use_stale updating" is available.
author Maxim Dounin <mdounin@mdounin.ru>
date Mon, 26 Dec 2011 11:15:23 +0000
parents 7cbef16c71a1
children d620f497c50f
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 */


#ifndef _NGX_MYSQL_H_INCLUDED_
#define _NGX_MYSQL_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_event_connect.h>


typedef struct ngx_mysql_s  ngx_mysql_t;

typedef void (*ngx_mysql_handler_pt)(ngx_mysql_t *m);


struct ngx_mysql_s {
    ngx_peer_connection_t   peer;

    ngx_buf_t              *buf;
    ngx_pool_t             *pool;

    ngx_str_t              *login;
    ngx_str_t              *passwd;
    ngx_str_t              *database;

    ngx_str_t               query;

    ngx_uint_t              pktn;

    ngx_mysql_handler_pt    handler;
    void                   *data;
    ngx_int_t               state;

};


#define NGX_MYSQL_CMDPKT_LEN  5


#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED && 0)

#define ngx_m16toh(n)      (*(uint32_t *) n & 0x0000ffff)
#define ngx_m24toh(n)      (*(uint32_t *) n & 0x00ffffff)
#define ngx_m32toh(n)      *(uint32_t *) n

#define ngx_htom16(n, m)   *(uint16_t *) n = (uint16_t) ((m) & 0xffff)

#define ngx_htom24(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff)

#define ngx_htom32(n, m)   *(uint32_t *) (n) = (m)

#else

#define ngx_m16toh(n)      (n[0] | n[1] << 8)
#define ngx_m24toh(n)      (n[0] | n[1] << 8 | n[2] << 16)
#define ngx_m32toh(n)      (n[0] | n[1] << 8 | n[2] << 16 | n[3] << 24)

#define ngx_htom16(n, m)   (n)[0] = (u_char) (m); (n)[1] = (u_char) ((m) >> 8)

#define ngx_htom24(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff)

#define ngx_htom32(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff);           \
                           (n)[3] = (u_char) (((m) >> 24) & 0xff)

#endif


ngx_int_t ngx_mysql_connect(ngx_mysql_t *m);
ngx_int_t ngx_mysql_query(ngx_mysql_t *m);


#endif /* _NGX_MYSQL_H_INCLUDED_ */