/** * Mad-Advertisement * Copyright (C) 2011 Thorsten Marx <thmarx@gmx.net> * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see <http://www.gnu.org/licenses/>. */ package net.mad.ads.base.api.track.impl.local.bdb.db; import com.sleepycat.bind.serial.ClassCatalog; import com.sleepycat.bind.serial.SerialSerialKeyCreator; import com.sleepycat.bind.serial.StoredClassCatalog; import com.sleepycat.je.Database; import com.sleepycat.je.DatabaseConfig; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.Environment; import com.sleepycat.je.EnvironmentConfig; import com.sleepycat.je.SecondaryConfig; import com.sleepycat.je.SecondaryDatabase; import net.mad.ads.base.api.track.events.TrackEvent; import net.mad.ads.base.api.track.impl.local.helper.TrackKey; import java.io.File; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * @author tmarx */ public class TrackDB { private static final Logger logger = LoggerFactory.getLogger(TrackDB.class); private static final String CLASS_CATALOG = "java_class_catalog"; private static final String TRACKEVENT_STORE = "trackevent_store"; private static final String TYPE_INDEX = "eventtype_index"; private static final String BANNERID_INDEX = "bannerid_index"; private static final String USER_BANNER_INDEX = "user_banner_index"; private StoredClassCatalog javaCatalog; private Environment env; private Database trackDb; private SecondaryDatabase typeDb; private SecondaryDatabase banneridDb; private SecondaryDatabase user_banner_Db; private String homeDirectory; public TrackDB(String dir) { this.homeDirectory = dir; } public void open() throws DatabaseException { System.out.println("Opening environment in: " + homeDirectory); EnvironmentConfig envConfig = new EnvironmentConfig(); envConfig.setTransactional(true); envConfig.setAllowCreate(true); env = new Environment(new File(homeDirectory), envConfig); DatabaseConfig dbConfig = new DatabaseConfig(); dbConfig.setTransactional(true); dbConfig.setAllowCreate(true); Database catalogDb = env.openDatabase(null, CLASS_CATALOG, dbConfig); javaCatalog = new StoredClassCatalog(catalogDb); trackDb = env.openDatabase(null, TRACKEVENT_STORE, dbConfig); SecondaryConfig secConfig = new SecondaryConfig(); secConfig.setTransactional(true); secConfig.setAllowCreate(true); secConfig.setSortedDuplicates(true); secConfig.setKeyCreator(new TrackEventByTypeKeyCreator(javaCatalog, TrackKey.class, TrackEvent.class, String.class)); typeDb = env .openSecondaryDatabase(null, TYPE_INDEX, trackDb, secConfig); secConfig.setKeyCreator(new TrackEventByBanneridKeyCreator(javaCatalog, TrackKey.class, TrackEvent.class, String.class)); banneridDb = env.openSecondaryDatabase(null, BANNERID_INDEX, trackDb, secConfig); secConfig.setKeyCreator(new TrackEventByUserBannerKeyCreator(javaCatalog, TrackKey.class, TrackEvent.class, String.class)); user_banner_Db = env.openSecondaryDatabase(null, USER_BANNER_INDEX, trackDb, secConfig); } public void close() throws DatabaseException { // Close secondary databases, then primary databases. typeDb.close(); banneridDb.close(); user_banner_Db.close(); trackDb.close(); // And don't forget to close the catalog and the environment. javaCatalog.close(); env.close(); } public final StoredClassCatalog getClassCatalog() { return javaCatalog; } /** * Return the shipment storage container. */ public final Database getTrackEventDatabase() { return trackDb; } /** * Return the shipment-by-part index. */ public final SecondaryDatabase getTrackEventsByTypeDatabase() { return typeDb; } public final SecondaryDatabase getTrackEventsByBanneridDatabase() { return banneridDb; } public final SecondaryDatabase getUserBannerDatabase () { return user_banner_Db; } /** * The SecondaryKeyCreator for the SupplierByCity index. This is an * extension of the abstract class SerialSerialKeyCreator, which implements * SecondaryKeyCreator for the case where the data keys and value are all of * the serial format. */ private static class TrackEventByTypeKeyCreator extends SerialSerialKeyCreator<TrackKey, TrackEvent, String> { /** * Construct the city key extractor. * * @param catalog * is the class catalog. * @param primaryKeyClass * is the supplier key class. * @param valueClass * is the supplier value class. * @param indexKeyClass * is the city key class. */ private TrackEventByTypeKeyCreator(ClassCatalog catalog, Class primaryKeyClass, Class valueClass, Class indexKeyClass) { super(catalog, primaryKeyClass, valueClass, indexKeyClass); } @Override public String createSecondaryKey(TrackKey pk, TrackEvent d) { return d.getType().getName() + "_" + pk.getTime(); } } private static class TrackEventByBanneridKeyCreator extends SerialSerialKeyCreator<TrackKey, TrackEvent, String> { private TrackEventByBanneridKeyCreator(ClassCatalog catalog, Class primaryKeyClass, Class valueClass, Class indexKeyClass) { super(catalog, primaryKeyClass, valueClass, indexKeyClass); } @Override public String createSecondaryKey(TrackKey pk, TrackEvent d) { String key = d.getBannerId() + "_" + d.getType().getName() + "_" + pk.getTime(); // System.out.println(key); return key; } } private static class TrackEventByUserBannerKeyCreator extends SerialSerialKeyCreator<TrackKey, TrackEvent, String> { private TrackEventByUserBannerKeyCreator(ClassCatalog catalog, Class primaryKeyClass, Class valueClass, Class indexKeyClass) { super(catalog, primaryKeyClass, valueClass, indexKeyClass); } @Override public String createSecondaryKey(TrackKey pk, TrackEvent d) { String key = d.getUser() + "_" + d.getBannerId() + "_" + d.getType().getName() + "_" + pk.getTime(); // System.out.println(key); return key; } } }