/** * Copyright 2012 Diego Ceccarelli * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package it.cnr.isti.hpc.mapdb; import java.io.File; import java.util.Map; import java.util.Set; import org.mapdb.DB; import org.mapdb.DBMaker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * MapDB abstracts the mapdb framework, allowing to create big maps that are * stored on the disk and to access them with high performance. * * @see <a href="http://www.mapdb.org"> MapDB</a> * * @author Diego Ceccarelli, diego.ceccarelli@isti.cnr.it created on 05/lug/2012 */ public class MapDB { /** * Logger for this class */ private static final Logger logger = LoggerFactory.getLogger(MapDB.class); private static final String DEFAULT_DB_NAME = "mapdb.db"; // wrapped db instance private DB db; private boolean readonly = true; private MapDB(String dbFolder) { File folderPath = new File(dbFolder); // if (dbFolder.endsWith(".zip")) // openZipDb(folderPath); openDb(folderPath, DEFAULT_DB_NAME); } private MapDB(String dbFolder, boolean readonly) { this.readonly = readonly; File folderPath = new File(dbFolder); // if (dbFolder.endsWith(".zip")) // openZipDb(folderPath); openDb(folderPath, DEFAULT_DB_NAME); } public void setReadonly(boolean readonly) { this.readonly = readonly; } // private void openZipDb(File dbPath) { // logger.info("open zip db in {} ", dbPath.getAbsolutePath()); // db = DBMaker.openZip(dbPath.getAbsolutePath()).make(); // // } public MapDB(String path, String dbFolder) { File folderPath = new File(path, dbFolder); // if (dbFolder.endsWith(".zip")) // openZipDb(folderPath); openDb(folderPath, DEFAULT_DB_NAME); } public MapDB(String path, String dbFolder, boolean readonly) { this.readonly = readonly; File folderPath = new File(path, dbFolder); // if (dbFolder.endsWith(".zip")) // openZipDb(folderPath); openDb(folderPath, DEFAULT_DB_NAME); } public MapDB(File dbPath, boolean readonly) { this.readonly = readonly; // NOTE: i don't need transactions, disabling should improve speed if (readonly) { db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().readOnly().make(); } else { db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().make(); } } public MapDB(File dbPath) { logger.info("open db in {} ", dbPath.getAbsolutePath()); // NOTE: i don't need transactions, disabling should improve speed if (readonly) { db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().readOnly().make(); } else { db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().make(); } } private void openDb(File dbFolder, String dbName) { if (!dbFolder.exists()) dbFolder.mkdir(); if (!dbFolder.isDirectory()) throw new MapDBException("file " + dbFolder + " exists but it is not a directory"); File dbPath = new File(dbFolder, dbName); logger.info("open db in {} ", dbPath.getAbsolutePath()); if (readonly) { // NOTE: i don't need transactions, disabling should improve speed db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().readOnly().make(); } else { db = DBMaker.newFileDB(dbPath).transactionDisable() .closeOnJvmShutdown().make(); } } public static MapDB getDb(String dbName) { return new MapDB(dbName); } public static MapDB getDb(String path, String dbName) { return new MapDB(path, dbName); } public static MapDB getDb(String dbName, boolean readonly) { return new MapDB(dbName, readonly); } public static MapDB getDb(String path, String dbName, boolean readonly) { return new MapDB(path, dbName, readonly); } public boolean hasCollection(String collection) { return db.getAll().containsKey(collection); } public void rmCollection(String collection) { db.delete(collection); db.commit(); } public Set<String> getCollections() { return db.getAll().keySet(); } public Map getCollection(String collection) { // if (hasCollection(collection)) { logger.info("get collection {} ", collection); return db.getTreeMap(collection); // } else { // logger.info("create collection {} ", collection); // return db.create(collection); // } } public void commit() { db.commit(); } public void close() { db.close(); } }