Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2010-2013 Ning, Inc.
   *
   * Ning licenses this file to you 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 com.ning.billing.commons.embeddeddb.mysql;
 
 import java.io.File;
 import java.util.Map;
 import java.util.UUID;
 
 
 
 
 public class MySQLEmbeddedDB extends EmbeddedDB {
 
     private final AtomicBoolean started = new AtomicBoolean(false);
 
     private MysqlDataSource dataSource;
     private File dbDir;
     private File dataDir;
     private MysqldResource mysqldResource;
     private int port;
 
     public MySQLEmbeddedDB() {
         // Avoid dashes - MySQL doesn't like them
         this("database" + UUID.randomUUID().toString().substring(0, 8),
              "user" + UUID.randomUUID().toString().substring(0, 8),
              "pass" + UUID.randomUUID().toString().substring(0, 8));
     }
 
     public MySQLEmbeddedDB(final String databaseNamefinal String usernamefinal String password) {
         super(databaseNameusernamepasswordnull);
 
         setPort();
         this. = "jdbc:mysql://localhost:" +  + "/" + databaseName + "?createDatabaseIfNotExist=true&allowMultiQueries=true";
     }
 
     public MySQLEmbeddedDB(final String databaseNamefinal String usernamefinal String passwordfinal String jdbcConnectionString) {
         super(databaseNameusernamepasswordjdbcConnectionString);
     }
 
     @Override
     public DBEngine getDBEngine() {
         return .;
     }
 
     @Override
     public void initialize() throws IOException {
          = new MysqlDataSource();
         .setUser();
         .setPassword();
         .setPort();
         // See http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html
     }
 
     @Override
     public void start() throws IOException {
         if (.get()) {
             throw new IOException("MySQL is already running: " + );
         }
         startMysql();
 
         final String query = String.format("select table_name from information_schema.tables where table_schema = '%s' and table_type = 'BASE TABLE';");
         try {
             executeQuery(querynew ResultSetJob() {
                 @Override
                 public void work(final ResultSet resultSetthrows SQLException {
                     .clear();
                     while (resultSet.next()) {
                         .add(resultSet.getString(1));
                     }
                 }
            });
        } catch (SQLException e) {
            throw new IOException(e);
        }
    }
    @Override
    public DataSource getDataSource() throws IOException {
        if (!.get()) {
            throw new IOException("MySQL is not running");
        }
        return ;
    }
    @Override
    public void stop() throws IOException {
        if (!.get()) {
            throw new IOException("MySQL is not running");
        }
        stopMysql();
    }
    @Override
        return String.format("mysql -u%s -p%s -P%s -S%s/mysql.sock %s");
    }
    private void startMysql() throws IOException {
         = File.createTempFile("mysqldb""");
        if (!.delete()) {
            .warn("Unable to delete " + .getAbsolutePath());
        }
        if (!.mkdir()) {
            throw new IOException("Unable to create " + .getAbsolutePath());
        }
         = File.createTempFile("mysqldata""");
        if (!.delete()) {
            .warn("Unable to delete " + .getAbsolutePath());
        }
        if (!.mkdir()) {
            throw new IOException("Unable to create " + .getAbsolutePath());
        }
        final PrintStream out = new PrintStream(new LoggingOutputStream(), true);
         = new MysqldResource(nulloutout);
        final Map<StringStringdbOpts = new HashMap<StringString>();
        dbOpts.put(., Integer.toString());
        dbOpts.put(."true");
        dbOpts.put("default-time-zone""+00:00");
        .start("test-mysqld-thread"dbOpts);
        if (!.isRunning()) {
            throw new IllegalStateException("MySQL did not start.");
        } else {
            .set(true);
            .info("MySQL started: " + getCmdLineConnectionString());
        }
    }
    private void stopMysql() throws IOException {
        if ( != null) {
            try {
                .shutdown();
            } catch (NullPointerException npe) {
                .warn("Failed to shutdown mysql properly "npe);
            }
            try {
                deleteRecursive();
                deleteRecursive();
            } catch (FileNotFoundException e) {
                throw new IOException(e);
            }
            .info("MySQL stopped: " + getCmdLineConnectionString());
        }
    }
    private static boolean deleteRecursive(final File paththrows FileNotFoundException {
        if (!path.exists()) {
            throw new FileNotFoundException(path.getAbsolutePath());
        }
        boolean ret = true;
        if (path.isDirectory()) {
            final File[] files = path.listFiles();
            if (files != null) {
                for (final File f : files) {
                    ret = ret && deleteRecursive(f);
                }
            }
        }
        return ret && path.delete();
    }
    private void setPort() {
        // New socket on any free port
        ServerSocket socket = null;
        try {
            socket = new ServerSocket(0);
             = socket.getLocalPort();
        } catch (final IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException ignored) {
                }
            }
        }
    }
New to GrepCode? Check out our FAQ X