⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 apr_memcache.c

📁 Apache官方在今天放出产品系列2.2的最新版本2.2.11的源码包 最流行的HTTP服务器软件之一
💻 C
📖 第 1 页 / 共 4 页
字号:
    }    else if (strncmp(MS_END, conn->buffer, MS_END_LEN) == 0) {        rv = APR_NOTFOUND;    }    else {        rv = APR_EGENERAL;    }    ms_release_conn(ms, conn);    return rv;}APU_DECLARE(apr_status_t)apr_memcache_delete(apr_memcache_t *mc,                    const char *key,                    apr_uint32_t timeout){    apr_status_t rv;    apr_memcache_server_t *ms;    apr_memcache_conn_t *conn;    apr_uint32_t hash;    apr_size_t written;    struct iovec vec[3];    apr_size_t klen = strlen(key);    hash = apr_memcache_hash(mc, key, klen);    ms = apr_memcache_find_server_hash(mc, hash);    if (ms == NULL)        return APR_NOTFOUND;        rv = ms_find_conn(ms, &conn);    if (rv != APR_SUCCESS) {        apr_memcache_disable_server(mc, ms);        return rv;    }    /* delete <key> <time>\r\n */    vec[0].iov_base = MC_DELETE;    vec[0].iov_len  = MC_DELETE_LEN;    vec[1].iov_base = (void*)key;    vec[1].iov_len  = klen;    klen = apr_snprintf(conn->buffer, BUFFER_SIZE, " %u" MC_EOL, timeout);    vec[2].iov_base = conn->buffer;    vec[2].iov_len  = klen;    rv = apr_socket_sendv(conn->sock, vec, 3, &written);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        apr_memcache_disable_server(mc, ms);        return rv;    }    rv = get_server_line(conn);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        apr_memcache_disable_server(mc, ms);        return rv;    }    if (strncmp(MS_DELETED, conn->buffer, MS_DELETED_LEN) == 0) {        rv = APR_SUCCESS;    }    else if (strncmp(MS_NOT_FOUND, conn->buffer, MS_NOT_FOUND_LEN) == 0) {        rv = APR_NOTFOUND;    }    else {        rv = APR_EGENERAL;    }    ms_release_conn(ms, conn);    return rv;}static apr_status_t num_cmd_write(apr_memcache_t *mc,                                      char *cmd,                                      const apr_uint32_t cmd_size,                                      const char *key,                                      const apr_int32_t inc,                                      apr_uint32_t *new_value){    apr_status_t rv;    apr_memcache_server_t *ms;    apr_memcache_conn_t *conn;    apr_uint32_t hash;    apr_size_t written;    struct iovec vec[3];    apr_size_t klen = strlen(key);    hash = apr_memcache_hash(mc, key, klen);    ms = apr_memcache_find_server_hash(mc, hash);    if (ms == NULL)        return APR_NOTFOUND;        rv = ms_find_conn(ms, &conn);    if (rv != APR_SUCCESS) {        apr_memcache_disable_server(mc, ms);        return rv;    }    /* <cmd> <key> <value>\r\n */    vec[0].iov_base = cmd;    vec[0].iov_len  = cmd_size;    vec[1].iov_base = (void*)key;    vec[1].iov_len  = klen;    klen = apr_snprintf(conn->buffer, BUFFER_SIZE, " %u" MC_EOL, inc);    vec[2].iov_base = conn->buffer;    vec[2].iov_len  = klen;    rv = apr_socket_sendv(conn->sock, vec, 3, &written);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        apr_memcache_disable_server(mc, ms);        return rv;    }    rv = get_server_line(conn);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        apr_memcache_disable_server(mc, ms);        return rv;    }    if (strncmp(MS_ERROR, conn->buffer, MS_ERROR_LEN) == 0) {        rv = APR_EGENERAL;    }    else if (strncmp(MS_NOT_FOUND, conn->buffer, MS_NOT_FOUND_LEN) == 0) {        rv = APR_NOTFOUND;    }    else {        if (new_value) {            *new_value = atoi(conn->buffer);        }        rv = APR_SUCCESS;    }    ms_release_conn(ms, conn);    return rv;}APU_DECLARE(apr_status_t)apr_memcache_incr(apr_memcache_t *mc,                    const char *key,                    apr_int32_t inc,                    apr_uint32_t *new_value){    return num_cmd_write(mc,                         MC_INCR,                         MC_INCR_LEN,                         key,                         inc,                          new_value);}APU_DECLARE(apr_status_t)apr_memcache_decr(apr_memcache_t *mc,                    const char *key,                    apr_int32_t inc,                    apr_uint32_t *new_value){    return num_cmd_write(mc,                         MC_DECR,                         MC_DECR_LEN,                         key,                         inc,                          new_value);}APU_DECLARE(apr_status_t)apr_memcache_version(apr_memcache_server_t *ms,                  apr_pool_t *p,                  char **baton){    apr_status_t rv;    apr_memcache_conn_t *conn;    apr_size_t written;    struct iovec vec[2];    rv = ms_find_conn(ms, &conn);    if (rv != APR_SUCCESS) {        return rv;    }    /* version\r\n */    vec[0].iov_base = MC_VERSION;    vec[0].iov_len  = MC_VERSION_LEN;    vec[1].iov_base = MC_EOL;    vec[1].iov_len  = MC_EOL_LEN;    rv = apr_socket_sendv(conn->sock, vec, 2, &written);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        return rv;    }    rv = get_server_line(conn);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        return rv;    }    if (strncmp(MS_VERSION, conn->buffer, MS_VERSION_LEN) == 0) {        *baton = apr_pstrmemdup(p, conn->buffer+MS_VERSION_LEN+1,                                 conn->blen - MS_VERSION_LEN - 2);        rv = APR_SUCCESS;    }    else {        rv = APR_EGENERAL;    }    ms_release_conn(ms, conn);    return rv;}apr_status_t mc_version_ping(apr_memcache_server_t *ms){    apr_status_t rv;    apr_size_t written;    struct iovec vec[2];    apr_memcache_conn_t *conn;    rv = ms_find_conn(ms, &conn);    if (rv != APR_SUCCESS) {        return rv;    }    /* version\r\n */    vec[0].iov_base = MC_VERSION;    vec[0].iov_len  = MC_VERSION_LEN;    vec[1].iov_base = MC_EOL;    vec[1].iov_len  = MC_EOL_LEN;    rv = apr_socket_sendv(conn->sock, vec, 2, &written);    if (rv != APR_SUCCESS) {        ms_bad_conn(ms, conn);        return rv;    }    rv = get_server_line(conn);    ms_release_conn(ms, conn);    return rv;}APU_DECLARE(void) apr_memcache_add_multget_key(apr_pool_t *data_pool,                             const char* key,                             apr_hash_t **values){    apr_memcache_value_t* value;    apr_size_t klen = strlen(key);    /* create the value hash if need be */    if (!*values) {        *values = apr_hash_make(data_pool);    }    /* init key and add it to the value hash */    value = apr_pcalloc(data_pool, sizeof(apr_memcache_value_t));    value->status = APR_NOTFOUND;    value->key = apr_pstrdup(data_pool, key);    apr_hash_set(*values, value->key, klen, value);}static void mget_conn_result(int up,                             apr_status_t rv,                             apr_memcache_t *mc,                             apr_memcache_server_t *ms,                             apr_memcache_conn_t *conn,                             struct cache_server_query_t *server_query,                             apr_hash_t *values,                             apr_hash_t *server_queries){    apr_int32_t j;    apr_memcache_value_t* value;        if (!up) {        ms_bad_conn(ms, conn);        apr_memcache_disable_server(mc, ms);    }        for (j = 1; j < server_query->query_vec_count ; j+=2) {        if (server_query->query_vec[j].iov_base) {            value = apr_hash_get(values, server_query->query_vec[j].iov_base,                                 strlen(server_query->query_vec[j].iov_base));                        if (value->status == APR_NOTFOUND) {                value->status = rv;            }        }    }    ms_release_conn(ms, conn);        apr_hash_set(server_queries, &ms, sizeof(ms), NULL);}APU_DECLARE(apr_status_t)apr_memcache_multgetp(apr_memcache_t *mc,                      apr_pool_t *temp_pool,                      apr_pool_t *data_pool,                      apr_hash_t *values){    apr_status_t rv;    apr_memcache_server_t* ms;    apr_memcache_conn_t* conn;    apr_uint32_t hash;    apr_size_t written;    apr_size_t klen;    apr_memcache_value_t* value;    apr_hash_index_t* value_hash_index;    /* this is a little over aggresive, but beats multiple loops     * to figure out how long each vector needs to be per-server.     */    apr_int32_t veclen = 2 + 2 * apr_hash_count(values) - 1; /* get <key>[<space><key>...]\r\n */    apr_int32_t i, j;    apr_int32_t queries_sent;    apr_int32_t queries_recvd;    apr_hash_t * server_queries = apr_hash_make(temp_pool);    struct cache_server_query_t* server_query;    apr_hash_index_t * query_hash_index;    apr_pollset_t* pollset;    const apr_pollfd_t* activefds;    apr_pollfd_t* pollfds;    /* build all the queries */    value_hash_index = apr_hash_first(temp_pool, values);    while (value_hash_index) {        void *v;        apr_hash_this(value_hash_index, NULL, NULL, &v);        value = v;        value_hash_index = apr_hash_next(value_hash_index);        klen = strlen(value->key);        hash = apr_memcache_hash(mc, value->key, klen);        ms = apr_memcache_find_server_hash(mc, hash);        if (ms == NULL) {            continue;        }        server_query = apr_hash_get(server_queries, &ms, sizeof(ms));        if (!server_query) {            rv = ms_find_conn(ms, &conn);            if (rv != APR_SUCCESS) {                apr_memcache_disable_server(mc, ms);                value->status = rv;                continue;            }            server_query = apr_pcalloc(temp_pool,sizeof(struct cache_server_query_t));            apr_hash_set(server_queries, &ms, sizeof(ms), server_query);            server_query->ms = ms;            server_query->conn = conn;            server_query->query_vec = apr_pcalloc(temp_pool, sizeof(struct iovec)*veclen);            /* set up the first key */            server_query->query_vec[0].iov_base = MC_GET;            server_query->query_vec[0].iov_len  = MC_GET_LEN;            server_query->query_vec[1].iov_base = (void*)(value->key);            server_query->query_vec[1].iov_len  = klen;            server_query->query_vec[2].iov_base = MC_EOL;            server_query->query_vec[2].iov_len  = MC_EOL_LEN;            server_query->query_vec_count = 3;        }        else {            j = server_query->query_vec_count - 1;            server_query->query_vec[j].iov_base = MC_WS;            server_query->query_vec[j].iov_len  = MC_WS_LEN;            j++;            server_query->query_vec[j].iov_base = (void*)(value->key);            server_query->query_vec[j].iov_len  = klen;            j++;            server_query->query_vec[j].iov_base = MC_EOL;            server_query->query_vec[j].iov_len  = MC_EOL_LEN;            j++;           server_query->query_vec_count = j;        }    }    /* create polling structures */    pollfds = apr_pcalloc(temp_pool, apr_hash_count(server_queries) * sizeof(apr_pollfd_t));    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -