Some more cleanup of the redis code
This commit is contained in:
parent
4cb3bf2c4a
commit
a5a41a51a2
@ -19,6 +19,11 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* {@link Reply} which will be returned if an error was detected
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class ErrorReply extends Reply {
|
||||
public static final char MARKER = '-';
|
||||
private static final byte[] ERR = "ERR ".getBytes();
|
||||
|
@ -19,6 +19,10 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* {@link Reply} which will get returned if a {@link Integer} was requested via <code>GET</code>
|
||||
*
|
||||
*/
|
||||
public class IntegerReply extends Reply {
|
||||
public static final char MARKER = ':';
|
||||
public final long integer;
|
||||
|
@ -19,6 +19,11 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* {@link Reply} which contains a bulk of {@link Reply}'s
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class MultiBulkReply extends Reply {
|
||||
public static final char MARKER = '*';
|
||||
|
||||
@ -55,7 +60,7 @@ public class MultiBulkReply extends Reply {
|
||||
for (int i = num; i < size; i++) {
|
||||
int read = is.readByte();
|
||||
if (read == BulkReply.MARKER) {
|
||||
byteArrays[i] = rd.readBytes(is);
|
||||
byteArrays[i] = RedisDecoder.readBytes(is);
|
||||
} else if (read == IntegerReply.MARKER) {
|
||||
byteArrays[i] = RedisDecoder.readInteger(is);
|
||||
} else {
|
||||
|
@ -27,6 +27,6 @@ public class PUnsubscribeReply extends UnsubscribeReply {
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer os) throws IOException {
|
||||
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
@ -22,30 +22,36 @@ import org.jboss.netty.channel.ChannelHandlerContext;
|
||||
import org.jboss.netty.handler.codec.replay.ReplayingDecoder;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
|
||||
/**
|
||||
* {@link ReplayingDecoder} which handles Redis protocol
|
||||
*
|
||||
*
|
||||
*/
|
||||
public class RedisDecoder extends ReplayingDecoder<State> {
|
||||
|
||||
private static final char CR = '\r';
|
||||
private static final char LF = '\n';
|
||||
private static final char ZERO = '0';
|
||||
public static final Charset UTF_8 = Charset.forName("UTF-8");
|
||||
|
||||
|
||||
// We track the current multibulk reply in the case
|
||||
// where we do not get a complete reply in a single
|
||||
// decode invocation.
|
||||
private MultiBulkReply reply;
|
||||
|
||||
public byte[] readBytes(ChannelBuffer is) throws IOException {
|
||||
/**
|
||||
* Return a byte array which contains only the content of the request. The size of the content is read from the given {@link ChannelBuffer}
|
||||
* via the {@link #readInteger(ChannelBuffer)} method
|
||||
*
|
||||
* @param is the {@link ChannelBuffer} to read from
|
||||
* @return content
|
||||
* @throws IOException is thrown if the line-ending is not CRLF
|
||||
*/
|
||||
public static byte[] readBytes(ChannelBuffer is) throws IOException {
|
||||
int size = readInteger(is);
|
||||
if (size == -1) {
|
||||
return null;
|
||||
}
|
||||
if (super.actualReadableBytes() < size + 2) {
|
||||
// Trigger error
|
||||
is.skipBytes(size + 2);
|
||||
throw new AssertionError("Trustin says this isn't possible");
|
||||
}
|
||||
byte[] bytes = new byte[size];
|
||||
is.readBytes(bytes, 0, size);
|
||||
int cr = is.readByte();
|
||||
@ -56,6 +62,13 @@ public class RedisDecoder extends ReplayingDecoder<State> {
|
||||
return bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read an {@link Integer} from the {@link ChannelBuffer}
|
||||
*
|
||||
* @param is
|
||||
* @return integer
|
||||
* @throws IOException
|
||||
*/
|
||||
public static int readInteger(ChannelBuffer is) throws IOException {
|
||||
int size = 0;
|
||||
int sign = 1;
|
||||
|
@ -21,8 +21,15 @@ import org.jboss.netty.util.CharsetUtil;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* {@link Reply} which was sent as a Response to the written {@link Command}
|
||||
* *
|
||||
*/
|
||||
public abstract class Reply {
|
||||
|
||||
/**
|
||||
* Write the content of the {@link Reply} to the given {@link ChannelBuffer}
|
||||
*/
|
||||
public abstract void write(ChannelBuffer os) throws IOException;
|
||||
|
||||
@Override
|
||||
|
@ -19,6 +19,10 @@ import org.jboss.netty.buffer.ChannelBuffer;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* {@link Reply} which contains the status
|
||||
*
|
||||
*/
|
||||
public class StatusReply extends Reply {
|
||||
public static final char MARKER = '+';
|
||||
public final ChannelBuffer status;
|
||||
|
@ -33,5 +33,6 @@ public class SubscribeReply extends Reply {
|
||||
|
||||
@Override
|
||||
public void write(ChannelBuffer os) throws IOException {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user