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