Home | History | Annotate | Download | only in util
      1 package com.xtremelabs.robolectric.util;
      2 
      3 import java.sql.Driver;
      4 import java.sql.DriverManager;
      5 import java.sql.ResultSet;
      6 import java.sql.SQLException;
      7 
      8 
      9 public class H2Map implements DatabaseConfig.DatabaseMap {
     10 
     11     @Override
     12     public String getDriverClassName() {
     13         return "org.h2.Driver";
     14     }
     15 
     16     @Override
     17     public String getConnectionString() {
     18         return "jdbc:h2:mem:";
     19     }
     20 
     21     /**
     22      * Maps the SQL to the H2 Implementation
     23      *
     24      * @param sql the original SQL statement
     25      * @return the modified SQL statement.
     26      * @throws SQLException
     27      */
     28     @Override
     29     public String getScrubSQL(String sql) throws SQLException {
     30 
     31         if (sql.contains("PRIMARY KEY AUTOINCREMENT") && !sql.contains("INTEGER PRIMARY KEY AUTOINCREMENT")) {
     32             throw new SQLException("AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY");
     33         }
     34 
     35         // Map 'autoincrement' (sqlite) to 'auto_increment' (h2).
     36         String scrubbedSQL = sql.replaceAll("(?i:autoincrement)", "auto_increment");
     37         // Map 'integer' (sqlite) to 'bigint(19)' (h2).
     38         scrubbedSQL = scrubbedSQL.replaceAll("(?i:integer)", "bigint(19)");
     39         // h2 doesn't understand conflict algorithms
     40         scrubbedSQL = scrubbedSQL.replaceAll("INSERT OR ROLLBACK INTO", "INSERT INTO");
     41         scrubbedSQL = scrubbedSQL.replaceAll("INSERT OR ABORT INTO", "INSERT INTO");
     42         scrubbedSQL = scrubbedSQL.replaceAll("INSERT OR FAIL INTO", "INSERT INTO");
     43         scrubbedSQL = scrubbedSQL.replaceAll("INSERT OR IGNORE INTO", "INSERT INTO");
     44         scrubbedSQL = scrubbedSQL.replaceAll("INSERT OR REPLACE INTO", "INSERT INTO");
     45         return scrubbedSQL;
     46     }
     47 
     48     @Override
     49     public String getSelectLastInsertIdentity() {
     50         return "SELECT IDENTITY();";
     51     }
     52 
     53 
     54     public void DeregisterDriver() {
     55 
     56         try {
     57             Driver d = DriverManager.getDriver(getDriverClassName());
     58             DriverManager.deregisterDriver(d);
     59         } catch (SQLException e) {
     60             throw new RuntimeException(e);
     61         }
     62     }
     63 
     64     @Override
     65     protected void finalize() throws Throwable {
     66         super.finalize();
     67         DeregisterDriver();
     68     }
     69 
     70     @Override
     71     public int getResultSetType() {
     72         return ResultSet.TYPE_SCROLL_INSENSITIVE;
     73     }
     74 
     75 }
     76