📄 apr_memcache.c
字号:
} 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 + -