Support backup and recovery of db vars
This commit is contained in:
parent
6f0247232f
commit
aa3448544e
@ -0,0 +1,45 @@
|
|||||||
|
package org.telegram.abilitybots.api.db;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonCreator;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import com.google.common.base.MoreObjects;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class BackupVar<T> {
|
||||||
|
@JsonProperty("var")
|
||||||
|
private final T var;
|
||||||
|
|
||||||
|
private BackupVar(T var) {
|
||||||
|
this.var = var;
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonCreator
|
||||||
|
public static <R> BackupVar<R> createVar(@JsonProperty("var") R var) {
|
||||||
|
return new BackupVar<>(var);
|
||||||
|
}
|
||||||
|
|
||||||
|
public T var() {
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object o) {
|
||||||
|
if (this == o) return true;
|
||||||
|
if (o == null || getClass() != o.getClass()) return false;
|
||||||
|
BackupVar<?> backupVar = (BackupVar<?>) o;
|
||||||
|
return Objects.equals(var, backupVar.var);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
return Objects.hash(var);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return MoreObjects.toStringHelper(this)
|
||||||
|
.add("var", var)
|
||||||
|
.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -12,12 +12,7 @@ import org.mapdb.Serializer;
|
|||||||
import org.telegram.abilitybots.api.util.Pair;
|
import org.telegram.abilitybots.api.util.Pair;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
|
||||||
import java.util.StringJoiner;
|
|
||||||
|
|
||||||
import static com.google.common.collect.Lists.newArrayList;
|
import static com.google.common.collect.Lists.newArrayList;
|
||||||
import static com.google.common.collect.Sets.newHashSet;
|
import static com.google.common.collect.Sets.newHashSet;
|
||||||
@ -188,15 +183,15 @@ public class MapDBContext implements DBContext {
|
|||||||
return Pair.of(entry.getKey(), newArrayList((List) struct));
|
return Pair.of(entry.getKey(), newArrayList((List) struct));
|
||||||
else if (struct instanceof Map)
|
else if (struct instanceof Map)
|
||||||
return Pair.of(entry.getKey(), new BackupMap((Map) struct));
|
return Pair.of(entry.getKey(), new BackupMap((Map) struct));
|
||||||
else
|
else if (struct instanceof Atomic.Var)
|
||||||
return Pair.of(entry.getKey(), struct);
|
return Pair.of(entry.getKey(), BackupVar.createVar(((Atomic.Var) struct).get()));
|
||||||
|
return Pair.of(entry.getKey(), struct);
|
||||||
}).collect(toMap(pair -> (String) pair.a(), Pair::b));
|
}).collect(toMap(pair -> (String) pair.a(), Pair::b));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doRecover(Map<String, Object> backupData) {
|
private void doRecover(Map<String, Object> backupData) {
|
||||||
clear();
|
clear();
|
||||||
backupData.forEach((name, value) -> {
|
backupData.forEach((name, value) -> {
|
||||||
|
|
||||||
if (value instanceof Set) {
|
if (value instanceof Set) {
|
||||||
Set entrySet = (Set) value;
|
Set entrySet = (Set) value;
|
||||||
getSet(name).addAll(entrySet);
|
getSet(name).addAll(entrySet);
|
||||||
@ -206,6 +201,8 @@ public class MapDBContext implements DBContext {
|
|||||||
} else if (value instanceof List) {
|
} else if (value instanceof List) {
|
||||||
List entryList = (List) value;
|
List entryList = (List) value;
|
||||||
getList(name).addAll(entryList);
|
getList(name).addAll(entryList);
|
||||||
|
} else if (value instanceof BackupVar) {
|
||||||
|
getVar(name).set(((BackupVar) value).var());
|
||||||
} else {
|
} else {
|
||||||
log.error(format("Unable to identify object type during DB recovery, entry name: %s", name));
|
log.error(format("Unable to identify object type during DB recovery, entry name: %s", name));
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
import static com.google.common.collect.Maps.newHashMap;
|
import static com.google.common.collect.Maps.newHashMap;
|
||||||
import static com.google.common.collect.Sets.newHashSet;
|
import static com.google.common.collect.Sets.newHashSet;
|
||||||
|
import static com.google.common.collect.Sets.toImmutableEnumSet;
|
||||||
import static java.lang.String.format;
|
import static java.lang.String.format;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
@ -38,6 +39,24 @@ class MapDBContextTest {
|
|||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void canRecoverVar() {
|
||||||
|
Var<String> test = db.getVar(TEST);
|
||||||
|
String val = "abilitybot";
|
||||||
|
test.set(val);
|
||||||
|
|
||||||
|
Object backup = db.backup();
|
||||||
|
db.clear();
|
||||||
|
// db.clear does not clear atomic variables
|
||||||
|
// TODO: get clear to remove all non-collection variables in DB
|
||||||
|
test.set("somevalue");
|
||||||
|
boolean recovered = db.recover(backup);
|
||||||
|
String recoveredVal = db.<String>getVar(TEST).get();
|
||||||
|
|
||||||
|
assertTrue(recovered, "Could not recover JSON backup file");
|
||||||
|
assertEquals(val, recoveredVal, "Could not properly recover val from Var in DB");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void canRecoverDB() {
|
void canRecoverDB() {
|
||||||
Map<Integer, User> users = db.getMap(USERS);
|
Map<Integer, User> users = db.getMap(USERS);
|
||||||
|
Loading…
Reference in New Issue
Block a user