package org.openslx.satellitedaemon.db; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import java.util.Properties; import org.apache.log4j.Logger; import org.openslx.satellitedaemon.util.Util; import com.mysql.jdbc.jdbc2.optional.MysqlDataSource; import fi.evident.dalesbred.Database; /** * Class for talking to the DB via the dalesbred jdbc wrapper. Package private, * so only the Db* classes can actually communicate with the database. * */ class MySQL { private static final Logger log = Logger.getLogger( MySQL.class ); private static Database db = null; /** * Static initializer for setting up the database connection. * This gets called implicitly as soon as the class loader loads * the class. In most cases that happens when the class is being * accessed for the first time during run time. */ static { // Load connection info from class (TODO: Make pretty) Properties properties = new Properties(); String propertiesPath = "config/mysql.properties"; try { final BufferedInputStream stream = new BufferedInputStream( new FileInputStream( propertiesPath ) ); properties.load( stream ); stream.close(); } catch ( FileNotFoundException e ) { log.fatal( propertiesPath + " not found!" ); System.exit( 1 ); } catch ( IOException e ) { log.fatal( "Error reading from " + propertiesPath + ": " + e.getMessage() ); System.exit( 1 ); } catch ( Exception e ) { log.fatal( "Generic error loading mysql properties file." ); e.printStackTrace(); System.exit( 1 ); } final String host = properties.getProperty( "host" ); final String dbname = properties.getProperty( "db" ); final String user = properties.getProperty( "user" ); final String password = properties.getProperty( "password" ); Util.notNullFatal( host, "host not set in mysql properties" ); Util.notNullFatal( dbname, "db not set in mysql properties" ); Util.notNullFatal( user, "user not set in mysql properties" ); Util.notNullFatal( password, "password not set in mysql properties" ); // Setup db connection try { MysqlDataSource ds = new MysqlDataSource(); ds.setServerName( host ); ds.setDatabaseName( dbname ); ds.setUser( user ); ds.setPassword( password ); db = Database.forDataSource( ds ); } catch ( Exception e ) { log.fatal( "Error initializing mysql data source!" ); e.printStackTrace(); System.exit( 1 ); } } /** * Get a list of objects of the given class from the database. * The class needs a matching constructor for the query you pass in, i.e. number of * arguments has to be equal to number of columns returned by query. * * @param clazz The class to instanciate for the result(s) * @param sql The sql query to run * @param args Any number of arguments to the query (using the '?' placeholder) * @return A list containing the rows returned by the query, represented by the given class */ protected static List findAll( final Class clazz, final String sql, final Object... args ) { return db.findAll( clazz, sql, args ); } /** * Run a query on the database that will return at most one result. * If the query returns a row, it will be used to instanciate the given class. If * it doesn't return a row, null will be returned. * * @param clazz The class to instanciate for the result (if any) * @param sql The sql query to run * @param args Any number of arguments to the query (using the '?' placeholder) * @return Instance of clazz or null */ protected static T findUniqueOrNull( final Class clazz, final String sql, final Object... args ) { return db.findUniqueOrNull( clazz, sql, args ); } /** * Run an update on the database, return number of rows affected. * * @param sql The update/insert query to run * @param args Any number of arguments to the query (using the '?' placeholder) * @return Number of rows affected by query */ protected static int update( String sql, Object... args ) { return db.update( sql, args ); } }