de.bwaldvogel.mongo.backend.h2.H2Backend Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of mongo-java-server-h2-backend Show documentation
Show all versions of mongo-java-server-h2-backend Show documentation
Fake implementation of MongoDB in Java that speaks the wire protocol
The newest version!
package de.bwaldvogel.mongo.backend.h2;
import java.time.Clock;
import org.h2.mvstore.MVStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import de.bwaldvogel.mongo.MongoDatabase;
import de.bwaldvogel.mongo.backend.AbstractMongoBackend;
import de.bwaldvogel.mongo.backend.Utils;
import de.bwaldvogel.mongo.exception.MongoServerException;
public class H2Backend extends AbstractMongoBackend {
private static final Logger log = LoggerFactory.getLogger(H2Backend.class);
private final MVStore mvStore;
public static H2Backend inMemory() {
return inMemory(defaultClock());
}
public static H2Backend inMemory(Clock clock) {
MVStore mvStore = MVStore.open(null);
return new H2Backend(mvStore, clock);
}
public void commit() {
long oldVersion = mvStore.getCurrentVersion();
long newVersion = mvStore.commit();
log.debug("Committed MVStore (v: {} → {})", oldVersion, newVersion);
}
public H2Backend(MVStore mvStore) {
this(mvStore, defaultClock());
}
public H2Backend(MVStore mvStore, Clock clock) {
super(clock);
this.mvStore = mvStore;
mvStore.getMapNames().stream()
.filter(mapName -> mapName.startsWith(H2Database.DATABASES_PREFIX))
.map(mapName -> {
String fullName = mapName.substring(H2Database.DATABASES_PREFIX.length());
return Utils.firstFragment(fullName);
})
.distinct()
.forEach(databaseName -> {
log.info("opening database '{}'", databaseName);
try {
resolveDatabase(databaseName);
} catch (MongoServerException e) {
log.error("Failed to open '{}'", databaseName, e);
}
});
}
public H2Backend(String fileName) {
this(openMvStore(fileName));
}
public H2Backend(String fileName, Clock clock) {
this(openMvStore(fileName), clock);
}
private static MVStore openMvStore(String fileName) {
if (fileName == null) {
log.info("opening in-memory MVStore");
} else {
log.info("opening MVStore in '{}'", fileName);
}
return MVStore.open(fileName);
}
@Override
protected MongoDatabase openOrCreateDatabase(String databaseName) {
return new H2Database(databaseName, mvStore, getCursorRegistry());
}
public MVStore getMvStore() {
return mvStore;
}
@Override
public void close() {
super.close();
mvStore.close();
}
public boolean isInMemory() {
return mvStore.getFileStore() == null;
}
@Override
public String toString() {
if (isInMemory()) {
return getClass().getSimpleName() + "[inMemory]";
} else {
return getClass().getSimpleName() + "[" + mvStore.getFileStore().getFileName() + "]";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy