Skip to content
Snippets Groups Projects
Commit 4efc7c47 authored by Cam Saül's avatar Cam Saül
Browse files

Prevent Liquibase migrations from leaving unreleased locks by running

inside a transaction.
parent ab657241
No related branches found
No related tags found
No related merge requests found
package com.metabase.corvus.migrations;
import java.io.FileWriter;
import java.io.StringWriter;
import java.sql.SQLException;
import liquibase.Liquibase;
import liquibase.database.DatabaseFactory;
import liquibase.database.Database;
import liquibase.database.jvm.JdbcConnection;
import liquibase.exception.DatabaseException;
import liquibase.resource.ClassLoaderResourceAccessor;
public class LiquibaseMigrations {
private static final String LIQUIBASE_CHANGELOG = "migrations/liquibase.json";
public static final void setupDatabase(java.sql.Connection dbConnection) throws Exception {
try {
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(dbConnection));
Liquibase liquibase = new Liquibase(LIQUIBASE_CHANGELOG, new ClassLoaderResourceAccessor(), database);
liquibase.update("");
} catch (Exception e) {
throw new DatabaseException(e);
} finally {
if (dbConnection != null) {
try {
dbConnection.rollback();
dbConnection.close();
} catch (SQLException e){
//nothing to do
}
}
}
}
public static final void teardownDatabase(java.sql.Connection dbConnection) throws Exception {
try {
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(dbConnection));
Liquibase liquibase = new Liquibase(LIQUIBASE_CHANGELOG, new ClassLoaderResourceAccessor(), database);
liquibase.rollback(10000, "");
} catch (Exception e) {
throw new DatabaseException(e);
} finally {
if (dbConnection != null) {
try {
dbConnection.rollback();
dbConnection.close();
} catch (SQLException e){
//nothing to do
}
}
}
}
public static final String genSqlDatabase(java.sql.Connection dbConnection) throws Exception {
try {
StringWriter strw = new StringWriter();
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(dbConnection));
Liquibase liquibase = new Liquibase(LIQUIBASE_CHANGELOG, new ClassLoaderResourceAccessor(), database);
liquibase.update("", strw);
return strw.toString();
} catch (Exception e) {
throw new DatabaseException(e);
} finally {
if (dbConnection != null) {
try {
dbConnection.rollback();
dbConnection.close();
} catch (SQLException e){
//nothing to do
}
}
}
}
}
......@@ -12,7 +12,13 @@
[metabase.db.internal :as i]
[metabase.models.interface :as models]
[metabase.util :as u])
(:import com.metabase.corvus.migrations.LiquibaseMigrations))
(:import java.io.StringWriter
java.sql.Connection
liquibase.Liquibase
(liquibase.database DatabaseFactory Database)
liquibase.database.jvm.JdbcConnection
liquibase.exception.DatabaseException
liquibase.resource.ClassLoaderResourceAccessor))
;; ## DB FILE, JDBC/KORMA DEFINITONS
......@@ -54,14 +60,25 @@
;; ## MIGRATE
(def ^:private ^:const changelog-file
"migrations/liquibase.json")
(defn migrate
"Migrate the database `:up`, `:down`, or `:print`."
[jdbc-connection-details direction]
(let [conn (jdbc/get-connection jdbc-connection-details)]
(case direction
:up (LiquibaseMigrations/setupDatabase conn)
:down (LiquibaseMigrations/teardownDatabase conn)
:print (LiquibaseMigrations/genSqlDatabase conn))))
(try
(jdbc/with-db-transaction [conn jdbc-connection-details]
(let [^Database database (-> (DatabaseFactory/getInstance)
(.findCorrectDatabaseImplementation (JdbcConnection. (jdbc/get-connection conn))))
^Liquibase liquibase (Liquibase. changelog-file (ClassLoaderResourceAccessor.) database)]
(case direction
:up (.update liquibase "")
:down (.rollback liquibase 10000 "")
:print (let [writer (StringWriter.)]
(.update liquibase "" writer)
(.toString writer)))))
(catch Throwable e
(throw (DatabaseException. e)))))
;; ## SETUP-DB
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment