|
22 | 22 | import java.io.OutputStream;
|
23 | 23 | import java.util.function.Supplier;
|
24 | 24 |
|
| 25 | +import org.jetbrains.annotations.NotNull; |
| 26 | + |
25 | 27 | import com.moilioncircle.redis.rdb.cli.cmd.Args;
|
26 | 28 | import com.moilioncircle.redis.rdb.cli.conf.Configure;
|
27 | 29 | import com.moilioncircle.redis.rdb.cli.glossary.Guard;
|
@@ -125,29 +127,39 @@ public DB applySelectDB(RedisInputStream in, int version) throws IOException {
|
125 | 127 | }
|
126 | 128 | } else {
|
127 | 129 | // skip
|
| 130 | + DB prev; |
128 | 131 | listener.setGuard(Guard.PASS);
|
129 | 132 | try {
|
130 |
| - super.applySelectDB(in, version); |
| 133 | + prev = super.applySelectDB(in, version); |
131 | 134 | } finally {
|
132 | 135 | listener.setGuard(Guard.SAVE);
|
133 | 136 | }
|
134 |
| - |
135 |
| - // convert |
136 |
| - listener.setGuard(Guard.DRAIN); |
137 |
| - try { |
138 |
| - BaseRdbEncoder encoder = new BaseRdbEncoder(); |
139 |
| - byte[] db = encoder.rdbSaveLen(goal); |
140 |
| - // type |
141 |
| - listener.handle((byte) RDB_OPCODE_SELECTDB); |
142 |
| - // db |
143 |
| - listener.handle(db); |
144 |
| - return new DB(goal); |
145 |
| - } finally { |
146 |
| - listener.setGuard(Guard.SAVE); |
| 137 | + // save |
| 138 | + if (filter.contains(prev.getDbNumber())) { |
| 139 | + return generateDB(prev.getDbNumber(), goal); |
| 140 | + } else { |
| 141 | + return generateDB(prev.getDbNumber(), prev.getDbNumber()); |
147 | 142 | }
|
148 | 143 | }
|
149 | 144 | }
|
150 |
| - |
| 145 | + |
| 146 | + private DB generateDB(long prev, long next) throws IOException { |
| 147 | + listener.setGuard(Guard.DRAIN); |
| 148 | + try { |
| 149 | + BaseRdbEncoder encoder = new BaseRdbEncoder(); |
| 150 | + byte[] db = encoder.rdbSaveLen(next); |
| 151 | + // type |
| 152 | + listener.handle((byte) RDB_OPCODE_SELECTDB); |
| 153 | + // db |
| 154 | + listener.handle(db); |
| 155 | + |
| 156 | + // set prev db number to avoid filter wrong data. |
| 157 | + return new DB(prev); |
| 158 | + } finally { |
| 159 | + listener.setGuard(Guard.SAVE); |
| 160 | + } |
| 161 | + } |
| 162 | + |
151 | 163 | @Override
|
152 | 164 | public DB applyResizeDB(RedisInputStream in, int version, ContextKeyValuePair context) throws IOException {
|
153 | 165 | listener.setGuard(Guard.DRAIN);
|
|
0 commit comments