mirror of
https://github.com/phpredis/phpredis.git
synced 2026-06-19 07:35:31 +00:00
Auto-select db in redis_sock_server_open
This commit is contained in:
@@ -37,6 +37,7 @@ typedef enum {
|
||||
REDIS_SOCK_STATUS_FAILED = -1,
|
||||
REDIS_SOCK_STATUS_DISCONNECTED,
|
||||
REDIS_SOCK_STATUS_CONNECTED,
|
||||
REDIS_SOCK_STATUS_AUTHENTICATED,
|
||||
REDIS_SOCK_STATUS_READY
|
||||
} redis_sock_status;
|
||||
|
||||
|
||||
@@ -375,13 +375,14 @@ redis_check_eof(RedisSock *redis_sock, zend_bool no_retry, zend_bool no_throw)
|
||||
errmsg = "AUTH failed while reconnecting";
|
||||
break;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED;
|
||||
|
||||
redis_sock->status = REDIS_SOCK_STATUS_READY;
|
||||
/* If we're using a non-zero db, reselect it */
|
||||
if (redis_sock->dbNumber && reselect_db(redis_sock) != 0) {
|
||||
errmsg = "SELECT failed while reconnecting";
|
||||
break;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_READY;
|
||||
/* Success */
|
||||
return 0;
|
||||
}
|
||||
@@ -3015,7 +3016,7 @@ redis_sock_check_liveness(RedisSock *redis_sock)
|
||||
} else {
|
||||
goto failure;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_READY;
|
||||
redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED;
|
||||
} else {
|
||||
if (strncmp(inbuf, "-NOAUTH", 7) == 0) {
|
||||
/* connection is fine but authentication required */
|
||||
@@ -3179,13 +3180,19 @@ redis_sock_server_open(RedisSock *redis_sock)
|
||||
case REDIS_SOCK_STATUS_DISCONNECTED:
|
||||
if (redis_sock_connect(redis_sock) != SUCCESS) {
|
||||
break;
|
||||
} else if (redis_sock->status == REDIS_SOCK_STATUS_READY) {
|
||||
return SUCCESS;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_CONNECTED;
|
||||
// fall through
|
||||
case REDIS_SOCK_STATUS_CONNECTED:
|
||||
if (redis_sock_auth(redis_sock) != SUCCESS)
|
||||
if (redis_sock_auth(redis_sock) != SUCCESS) {
|
||||
break;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_AUTHENTICATED;
|
||||
// fall through
|
||||
case REDIS_SOCK_STATUS_AUTHENTICATED:
|
||||
if (redis_sock->dbNumber && reselect_db(redis_sock) != SUCCESS) {
|
||||
break;
|
||||
}
|
||||
redis_sock->status = REDIS_SOCK_STATUS_READY;
|
||||
// fall through
|
||||
case REDIS_SOCK_STATUS_READY:
|
||||
|
||||
+7
-24
@@ -74,7 +74,6 @@ typedef struct redis_pool_member_ {
|
||||
|
||||
RedisSock *redis_sock;
|
||||
int weight;
|
||||
int database;
|
||||
struct redis_pool_member_ *next;
|
||||
|
||||
} redis_pool_member;
|
||||
@@ -93,12 +92,11 @@ typedef struct {
|
||||
// }
|
||||
|
||||
PHP_REDIS_API void
|
||||
redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight, int database)
|
||||
redis_pool_add(redis_pool *pool, RedisSock *redis_sock, int weight)
|
||||
{
|
||||
redis_pool_member *rpm = ecalloc(1, sizeof(redis_pool_member));
|
||||
rpm->redis_sock = redis_sock;
|
||||
rpm->weight = weight;
|
||||
rpm->database = database;
|
||||
|
||||
rpm->next = pool->head;
|
||||
pool->head = rpm;
|
||||
@@ -156,21 +154,6 @@ static int redis_simple_cmd(RedisSock *redis_sock, char *cmd, int cmdlen,
|
||||
return len_written;
|
||||
}
|
||||
|
||||
static void
|
||||
redis_pool_member_select(redis_pool_member *rpm) {
|
||||
RedisSock *redis_sock = rpm->redis_sock;
|
||||
char *response, *cmd;
|
||||
int response_len, cmd_len;
|
||||
|
||||
cmd_len = REDIS_SPPRINTF(&cmd, "SELECT", "d", rpm->database);
|
||||
if (redis_sock_write(redis_sock, cmd, cmd_len) >= 0) {
|
||||
if ((response = redis_sock_read(redis_sock, &response_len))) {
|
||||
efree(response);
|
||||
}
|
||||
}
|
||||
efree(cmd);
|
||||
}
|
||||
|
||||
PHP_REDIS_API redis_pool_member *
|
||||
redis_pool_get_sock(redis_pool *pool, const char *key) {
|
||||
|
||||
@@ -183,10 +166,6 @@ redis_pool_get_sock(redis_pool *pool, const char *key) {
|
||||
for(i = 0; i < pool->totalWeight;) {
|
||||
if (pos >= i && pos < i + rpm->weight) {
|
||||
if (redis_sock_server_open(rpm->redis_sock) == 0) {
|
||||
if (rpm->database >= 0) { /* default is -1 which leaves the choice to redis. */
|
||||
redis_pool_member_select(rpm);
|
||||
}
|
||||
|
||||
return rpm;
|
||||
}
|
||||
}
|
||||
@@ -495,11 +474,15 @@ PS_OPEN_FUNC(redis)
|
||||
persistent, persistent_id ? ZSTR_VAL(persistent_id) : NULL,
|
||||
retry_interval);
|
||||
|
||||
if (db >= 0) { /* default is -1 which leaves the choice to redis. */
|
||||
redis_sock->dbNumber = db;
|
||||
}
|
||||
|
||||
if (Z_TYPE(context) == IS_ARRAY) {
|
||||
redis_sock_set_stream_context(redis_sock, &context);
|
||||
}
|
||||
|
||||
redis_pool_add(pool, redis_sock, weight, db);
|
||||
redis_pool_add(pool, redis_sock, weight);
|
||||
redis_sock->prefix = prefix;
|
||||
redis_sock_set_auth(redis_sock, user, pass);
|
||||
|
||||
@@ -1294,4 +1277,4 @@ PS_GC_FUNC(rediscluster) {
|
||||
|
||||
#endif
|
||||
|
||||
/* vim: set tabstop=4 expandtab: */
|
||||
/* vim: set tabstop=4 expandtab: */
|
||||
|
||||
Reference in New Issue
Block a user