-
Notifications
You must be signed in to change notification settings - Fork 507
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
package com.ctrip.xpipe.redis.core.redis.rdb.parser; | ||
|
||
import com.ctrip.xpipe.redis.core.redis.exception.RdbParseEmptyKeyException; | ||
import com.ctrip.xpipe.redis.core.redis.operation.RedisOpType; | ||
import com.ctrip.xpipe.redis.core.redis.operation.op.RedisOpSingleKey; | ||
import com.ctrip.xpipe.redis.core.redis.rdb.RdbLength; | ||
import com.ctrip.xpipe.redis.core.redis.rdb.RdbParseContext; | ||
import com.ctrip.xpipe.redis.core.redis.rdb.RdbParser; | ||
import io.netty.buffer.ByteBuf; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
/** | ||
* @author hailu | ||
* @date 2024/1/17 19:06 | ||
*/ | ||
public class RdbListParser extends AbstractRdbParser<Integer> implements RdbParser<Integer> { | ||
|
||
private RdbParseContext context; | ||
|
||
private RdbParser<byte[]> rdbStringParser; | ||
|
||
private RdbLength len; | ||
|
||
private int readCnt; | ||
|
||
private STATE state = STATE.READ_INIT; | ||
Check warning on line 27 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
private static final Logger logger = LoggerFactory.getLogger(RdbListParser.class); | ||
Check warning on line 29 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
enum STATE { | ||
READ_INIT, | ||
READ_LEN, | ||
READ_VALUE, | ||
READ_END | ||
Check warning on line 35 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
|
||
public RdbListParser(RdbParseContext parseContext) { | ||
this.context = parseContext; | ||
this.rdbStringParser = (RdbParser<byte[]>) context.getOrCreateParser(RdbParseContext.RdbType.STRING); | ||
} | ||
Check warning on line 41 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
@Override | ||
public Integer read(ByteBuf byteBuf) { | ||
|
||
while (!isFinish() && byteBuf.readableBytes() > 0) { | ||
|
||
switch (state) { | ||
|
||
case READ_INIT: | ||
len = null; | ||
readCnt = 0; | ||
state = STATE.READ_LEN; | ||
break; | ||
Check warning on line 54 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
case READ_LEN: | ||
len = parseRdbLength(byteBuf); | ||
Check warning on line 57 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
if (null != len) { | ||
if (len.getLenValue() > 0) { | ||
state = STATE.READ_VALUE; | ||
Check warning on line 60 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} else { | ||
throw new RdbParseEmptyKeyException("set key " + context.getKey()); | ||
Check warning on line 62 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
} | ||
break; | ||
|
||
case READ_VALUE: | ||
byte[] value = rdbStringParser.read(byteBuf); | ||
Check warning on line 68 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
if (null != value) { | ||
rdbStringParser.reset(); | ||
propagateCmdIfNeed(value); | ||
Check warning on line 71 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
readCnt++; | ||
Check warning on line 73 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
if (readCnt >= len.getLenValue()) { | ||
state = STATE.READ_END; | ||
Check warning on line 75 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} else { | ||
state = STATE.READ_VALUE; | ||
Check warning on line 77 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
} | ||
break; | ||
|
||
case READ_END: | ||
default: | ||
|
||
} | ||
|
||
if (isFinish()) { | ||
propagateExpireAtIfNeed(context.getKey(), context.getExpireMilli()); | ||
Check warning on line 88 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
} | ||
|
||
if (isFinish()) return len.getLenValue(); | ||
else return null; | ||
Check warning on line 93 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
|
||
private void propagateCmdIfNeed(byte[] value) { | ||
if (null == value || null == context.getKey()) { | ||
return; | ||
Check warning on line 98 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
|
||
notifyRedisOp(new RedisOpSingleKey( | ||
Check warning on line 101 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
RedisOpType.RPUSH, | ||
new byte[][] {RedisOpType.RPUSH.name().getBytes(), context.getKey().get(), value}, | ||
context.getKey(), value)); | ||
} | ||
Check warning on line 105 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
@Override | ||
public boolean isFinish() { | ||
return STATE.READ_END.equals(state); | ||
Check warning on line 109 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
|
||
@Override | ||
public void reset() { | ||
super.reset(); | ||
Check warning on line 114 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
if (rdbStringParser != null) { | ||
rdbStringParser.reset(); | ||
Check warning on line 116 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
this.state = STATE.READ_INIT; | ||
} | ||
Check warning on line 119 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
|
||
@Override | ||
protected Logger getLogger() { | ||
return logger; | ||
Check warning on line 123 in redis/redis-core/src/main/java/com/ctrip/xpipe/redis/core/redis/rdb/parser/RdbListParser.java
|
||
} | ||
} |