diff --git a/docs/src/reference/docbook/appendix/appendix-command-reference.xml b/docs/src/reference/docbook/appendix/appendix-command-reference.xml index f00bd788e3..2242301640 100644 --- a/docs/src/reference/docbook/appendix/appendix-command-reference.xml +++ b/docs/src/reference/docbook/appendix/appendix-command-reference.xml @@ -26,7 +26,7 @@ CLIENT GETNAME- CLIENT KILLX CLIENT LIST- - CLIENT SETNAME- + CLIENT SETNAMEX CONFIG GETX CONFIG RESETSTATX CONFIG REWRITE- diff --git a/gradle.properties b/gradle.properties index f09fb8eb53..485944ba72 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ jredisVersion=06052013 jedisVersion=2.4.1 springVersion=3.2.8.RELEASE log4jVersion=1.2.17 -version=1.3.0.BUILD-SNAPSHOT +version=1.3.0.DATAREDIS-269-SNAPSHOT srpVersion=0.7 jacksonVersion=1.8.8 fasterXmlJacksonVersion=2.2.0 diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index b4f0addc2b..beeac1aa9a 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -2239,4 +2239,22 @@ private List convertResults(List results, Queue conve return convertedResults; } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + this.delegate.setClientName(name); + } + + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.StringRedisConnection#setClientName(java.lang.String) + */ + @Override + public void setClientName(String name) { + setClientName(this.serializer.serialize(name)); + } + } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java index 3e34dffba0..3219df9f4a 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisServerCommands.java @@ -171,4 +171,10 @@ public enum ShutdownOption { */ void killClient(String host, int port); + /** + * Assign given name to current connection. + * + * @since 1.3 + */ + void setClientName(byte[] name); } diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index 20657682e1..ae3d9684e7 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -292,4 +292,13 @@ public interface StringTuple extends Tuple { T eval(String script, ReturnType returnType, int numKeys, String... keysAndArgs); T evalSha(String scriptSha1, ReturnType returnType, int numKeys, String... keysAndArgs); + + /** + * Assign given {@code name} to connection using registered {@link RedisSerializer} for name conversion. + * + * @param name + * @see #setClientName(byte[]) + * @sice 1.3 + */ + void setClientName(String name); } diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index 3af0cd6fad..56a4df4822 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -2828,6 +2828,19 @@ public void killClient(String host, int port) { } } + /* + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(java.lang.String) + */ + @Override + public void setClientName(byte[] name) { + + if (isPipelined() || isQueueing()) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not suppored in transacton / pipeline mode."); + } + + jedis.clientSetname(name); + } + /** * Specifies if pipelined results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Jedis driver diff --git a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java index 26bfb5d8e6..2e4656c331 100644 --- a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java @@ -1190,4 +1190,9 @@ public Long time() { public void killClient(String host, int port) { throw new UnsupportedOperationException("The 'CLIENT KILL' command is not supported by the JRedis driver."); } + + @Override + public void setClientName(byte[] name) { + throw new UnsupportedOperationException("'CLIENT SETNAME' is not supported by the JRedis driver."); + } } diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 4b1ac6a655..96836323d5 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -2920,6 +2920,21 @@ public void killClient(String host, int port) { } } + @Override + public void setClientName(byte[] name) { + + if (isQueueing()) { + pipeline(new LettuceStatusResult(getAsyncConnection().clientSetname(name))); + return; + } + if (isQueueing()) { + transaction(new LettuceTxResult(getConnection().clientSetname(name))); + return; + } + + getAsyncConnection().clientSetname(name); + } + /** * Specifies if pipelined and transaction results should be converted to the expected data type. If false, results of * {@link #closePipeline()} and {@link #exec()} will be of the type returned by the Lettuce driver diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 2849bbf991..bda3701ee9 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -2240,6 +2240,26 @@ public void killClient(String host, int port) { } } + /* + * (non-Javadoc) + * @see org.springframework.data.redis.connection.RedisServerCommands#setClientName(byte[]) + */ + @Override + public void setClientName(byte[] name) { + + try { + + if (isPipelined()) { + pipeline(new SrpStatusResult(pipeline.client_setname(name))); + return; + } + + this.client.client_setname(name); + } catch (Exception ex) { + throw convertSrpAccessException(ex); + } + } + private List closeTransaction() { List results = Collections.emptyList(); if (txTracker != null) { diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 6fd8135e53..9929e223a1 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1884,6 +1884,14 @@ public void testGetTimeShouldRequestServerTime() { assertThat(time > 0, equalTo(true)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void clientSetNameWorksCorrectly() { + connection.setClientName("foo".getBytes()); + } + protected void verifyResults(List expected) { assertEquals(expected, getResults()); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java index 532a4dcb33..474de96ee4 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1710,6 +1710,16 @@ public void testShutdownInDelegatedCorrectlyToNativeConnection() { verify(nativeConnection, times(1)).shutdown(eq(ShutdownOption.NOSAVE)); } + /** + * @see DATAREDIS-269 + */ + @Test + public void settingClientNameShouldDelegateToNativeConnection() { + + connection.setClientName("foo"); + verify(nativeConnection, times(1)).setClientName(eq("foo".getBytes())); + } + protected List getResults() { return actual; } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index e18a18fe97..f6994aad1d 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -246,4 +246,12 @@ public void testInfoBySection() throws Exception { public void testZAddMultiple() { super.testZAddMultiple(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java index fbbf8fe8e6..a3435b7de3 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java @@ -191,4 +191,13 @@ public void testRestoreBadData() { public void testRestoreExistingKey() { super.testRestoreExistingKey(); } + + /** + * @see DATAREDIS-269 + */ + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } + } diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 9725cfcda7..ab30964d30 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -809,4 +809,13 @@ public void testExecuteShouldConvertArrayReplyCorrectly() { public void testPsetEx() throws Exception { super.testPsetEx(); } + + /** + * @see DATAREDIS-269 + */ + @Override + @Test(expected = UnsupportedOperationException.class) + public void clientSetNameWorksCorrectly() { + super.clientSetNameWorksCorrectly(); + } }