You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apr.apache.org by ji...@apache.org on 2016/11/02 19:14:29 UTC
svn commit: r1767766 - in /apr/apr-util/branches/1.6.x: include/apr_redis.h
redis/apr_redis.c
Author: jim
Date: Wed Nov 2 19:14:29 2016
New Revision: 1767766
URL: http://svn.apache.org/viewvc?rev=1767766&view=rev
Log:
Add in SET as well... we may not need to explicitly set an expire time
ala memcache
Modified:
apr/apr-util/branches/1.6.x/include/apr_redis.h
apr/apr-util/branches/1.6.x/redis/apr_redis.c
Modified: apr/apr-util/branches/1.6.x/include/apr_redis.h
URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.6.x/include/apr_redis.h?rev=1767766&r1=1767765&r2=1767766&view=diff
==============================================================================
--- apr/apr-util/branches/1.6.x/include/apr_redis.h (original)
+++ apr/apr-util/branches/1.6.x/include/apr_redis.h Wed Nov 2 19:14:29 2016
@@ -271,6 +271,20 @@ APU_DECLARE(apr_status_t) apr_redis_getp
* @param key null terminated string containing the key
* @param baton data to store on the server
* @param data_size length of data at baton
+ * @param flags any flags set by the client for this key
+ */
+APU_DECLARE(apr_status_t) apr_redis_set(apr_redis_t *rc,
+ const char *key,
+ char *baton,
+ const apr_size_t data_size,
+ apr_uint16_t flags);
+
+/**
+ * Sets a value by key on the server
+ * @param rc client to use
+ * @param key null terminated string containing the key
+ * @param baton data to store on the server
+ * @param data_size length of data at baton
* @param timeout time in seconds for the data to live on the server
* @param flags any flags set by the client for this key
*/
Modified: apr/apr-util/branches/1.6.x/redis/apr_redis.c
URL: http://svn.apache.org/viewvc/apr/apr-util/branches/1.6.x/redis/apr_redis.c?rev=1767766&r1=1767765&r2=1767766&view=diff
==============================================================================
--- apr/apr-util/branches/1.6.x/redis/apr_redis.c (original)
+++ apr/apr-util/branches/1.6.x/redis/apr_redis.c Wed Nov 2 19:14:29 2016
@@ -48,6 +48,9 @@ struct apr_redis_conn_t
#define RC_RESP_2 "*2\r\n"
#define RC_RESP_2_LEN (sizeof(RC_RESP_2)-1)
+#define RC_RESP_3 "*3\r\n"
+#define RC_RESP_3_LEN (sizeof(RC_RESP_3)-1)
+
#define RC_RESP_4 "*4\r\n"
#define RC_RESP_4_LEN (sizeof(RC_RESP_4)-1)
@@ -57,6 +60,12 @@ struct apr_redis_conn_t
#define RC_GET_SIZE "$3\r\n"
#define RC_GET_SIZE_LEN (sizeof(RC_GET_SIZE)-1)
+#define RC_SET "SET\r\n"
+#define RC_SET_LEN (sizeof(RC_SET)-1)
+
+#define RC_SET_SIZE "$3\r\n"
+#define RC_SET_SIZE_LEN (sizeof(RC_SET_SIZE)-1)
+
#define RC_SETEX "SETEX\r\n"
#define RC_SETEX_LEN (sizeof(RC_SETEX)-1)
@@ -625,6 +634,116 @@ static apr_status_t get_server_line(apr_
return apr_brigade_cleanup(conn->tb);
}
+APU_DECLARE(apr_status_t) apr_redis_set(apr_redis_t *rc,
+ const char *key,
+ char *data,
+ const apr_size_t data_size,
+ apr_uint16_t flags)
+{
+ apr_uint32_t hash;
+ apr_redis_server_t *rs;
+ apr_redis_conn_t *conn;
+ apr_status_t rv;
+ apr_size_t written;
+ struct iovec vec[9];
+ int index = 0;
+ char keysize_str[INT_64_LEN];
+ char expire_str[INT_64_LEN];
+ char expiresize_str[INT_64_LEN];
+ char datasize_str[BUFFER_SIZE];
+ apr_size_t len, klen, expire_len;
+
+
+ if (data_size >= BUFFER_SIZE) {
+ return APR_NOTFOUND;
+ }
+
+
+ hash = apr_redis_hash(rc, key, klen);
+
+ rs = apr_redis_find_server_hash(rc, hash);
+
+ if (rs == NULL)
+ return APR_NOTFOUND;
+
+ rv = rs_find_conn(rs, &conn);
+
+ if (rv != APR_SUCCESS) {
+ apr_redis_disable_server(rc, rs);
+ return rv;
+ }
+
+ klen = strlen(key);
+ /*
+ * RESP Command:
+ * *3
+ * $3
+ * SET
+ * $<keylen>
+ * key
+ * $<datalen>
+ * data
+ */
+
+ vec[0].iov_base = RC_RESP_3;
+ vec[0].iov_len = RC_RESP_3_LEN;
+
+ vec[1].iov_base = RC_SET_SIZE;
+ vec[1].iov_len = RC_SET_SIZE_LEN;
+
+ vec[2].iov_base = RC_SET;
+ vec[2].iov_len = RC_SET_LEN;
+
+ len = apr_snprintf(keysize_str, INT_64_LEN, "$%" APR_SIZE_T_FMT "", klen);
+ vec[3].iov_base = keysize_str;
+ vec[3].iov_len = len;
+
+ vec[4].iov_base = (void *) key;
+ vec[4].iov_len = klen;
+
+ vec[5].iov_base = RC_EOL;
+ vec[5].iov_len = RC_EOL_LEN;
+
+ len = apr_snprintf(datasize_str, INT_64_LEN, "$%" APR_SIZE_T_FMT "",
+ data_size);
+ vec[6].iov_base = datasize_str;
+ vec[6].iov_len = len;
+
+ vec[7].iov_base = data;
+ vec[7].iov_len = data_size;
+
+ vec[8].iov_base = RC_EOL;
+ vec[8].iov_len = RC_EOL_LEN;
+
+ rv = apr_socket_sendv(conn->sock, vec, 9, &written);
+
+ if (rv != APR_SUCCESS) {
+ rs_bad_conn(rs, conn);
+ apr_redis_disable_server(rc, rs);
+ return rv;
+ }
+
+ rv = get_server_line(conn);
+ if (rv != APR_SUCCESS) {
+ rs_bad_conn(rs, conn);
+ apr_redis_disable_server(rc, rs);
+ return rv;
+ }
+
+ if (strcmp(conn->buffer, RS_STORED RC_EOL) == 0) {
+ rv = APR_SUCCESS;
+ }
+ else if (strcmp(conn->buffer, RS_NOT_STORED RC_EOL) == 0) {
+ rv = APR_EEXIST;
+ }
+ else {
+ rv = APR_EGENERAL;
+ }
+
+ rs_release_conn(rs, conn);
+ return rv;
+}
+
APU_DECLARE(apr_status_t) apr_redis_setex(apr_redis_t *rc,
const char *key,
char *data,
@@ -668,7 +787,7 @@ APU_DECLARE(apr_status_t) apr_redis_sete
klen = strlen(key);
/*
* RESP Command:
- * *1
+ * *4
* $5
* SETEX
* $<keylen>
@@ -747,7 +866,6 @@ APU_DECLARE(apr_status_t) apr_redis_sete
return rv;
}
-
APU_DECLARE(apr_status_t) apr_redis_getp(apr_redis_t *rc,
apr_pool_t *p,
const char *key,