#1782 - ENH: Add truncate(Class<?>... types) and truncate(String... tables)

This commit is contained in:
rob bygrave
2019-08-10 21:40:23 +12:00
parent cb6f0335b1
commit bb7df71391
17 changed files with 167 additions and 56 deletions
+14
View File
@@ -1237,4 +1237,18 @@ public class DB {
return getDefault().json();
}
/**
* Truncate the base tables for the given bean types.
*/
public static void truncate(Class<?>... types) {
getDefault().truncate(types);
}
/**
* Truncate the given tables.
*/
public static void truncate(String... tables) {
getDefault().truncate(tables);
}
}
+11
View File
@@ -1580,4 +1580,15 @@ public interface Database {
* </p>
*/
<T> Set<String> validateQuery(Query<T> query);
/**
* Truncate all the given tables.
*/
void truncate(String... tables);
/**
* Truncate the base tables for the given bean types.
*/
void truncate(Class<?>... tables);
}
@@ -139,6 +139,10 @@ public class DatabasePlatform {
*/
protected Platform platform = Platform.GENERIC;
protected String truncateTable = "truncate table %s";
protected String truncateTableBefore;
protected String truncateTableAfter;
protected String columnAliasPrefix = "c";
protected String tableAliasPlaceHolder = "${ta}";
@@ -708,6 +712,27 @@ public class DatabasePlatform {
return persistBatchOnCascade;
}
/**
* Return a statement to truncate a table.
*/
public String truncateStatement(String table) {
return String.format(truncateTable, table);
}
/**
* Return a statement to execute prior to truncate (like disable foreign keys for mysql).
*/
public String truncateStatementBefore() {
return truncateTableBefore;
}
/**
* Return a statement to execute after truncate (like enable foreign keys for mysql).
*/
public String truncateStatementAfter() {
return truncateTableAfter;
}
/**
* Create the DB schema if it does not exist.
*/
@@ -22,6 +22,7 @@ public class DB2Platform extends DatabasePlatform {
this.platform = Platform.DB2;
this.maxTableNameLength = 18;
this.maxConstraintNameLength = 18;
this.truncateTable = "truncate table %s reuse storage ignore delete triggers immediate";
this.sqlLimiter = new Db2SqlLimiter();
this.dbIdentity.setSupportsGetGeneratedKeys(true);
@@ -26,7 +26,8 @@ public class H2Platform extends DatabasePlatform {
this.supportsDeleteTableAlias = true;
this.dbDefaultValue.setNow("now()");
this.columnAliasPrefix = null;
//this.truncateTableBefore = "set referential_integrity false";
//this.truncateTableAfter = "set referential_integrity true";
this.exceptionTranslator =
new SqlErrorCodes()
.addAcquireLock("50200","HYT00")
@@ -18,7 +18,6 @@ public class HanaPlatform extends DatabasePlatform {
this.persistBatchOnCascade = PersistBatch.NONE;
this.supportsResultSetConcurrencyModeUpdatable = false;
this.columnAliasPrefix = null;
this.historySupport = new HanaHistorySupport();
this.basicSqlLimiter = new HanaBasicSqlLimiter();
@@ -21,7 +21,7 @@ public class HsqldbPlatform extends DatabasePlatform {
super();
this.platform = Platform.HSQLDB;
this.dbEncrypt = new H2DbEncrypt();
this.truncateTable = "delete from %s";
this.dbIdentity.setIdType(IdType.IDENTITY);
this.dbIdentity.setSupportsGetGeneratedKeys(true);
this.dbIdentity.setSupportsSequence(true);
@@ -31,7 +31,8 @@ public class MySqlPlatform extends DatabasePlatform {
this.dbEncrypt = new MySqlDbEncrypt();
this.historySupport = new MySqlHistorySupport();
this.columnAliasPrefix = null;
//this.truncateTableBefore = "set foreign_key_checks = 0";
//this.truncateTableAfter = "set foreign_key_checks = 1";
this.dbIdentity.setIdType(IdType.IDENTITY);
this.dbIdentity.setSupportsGetGeneratedKeys(true);
this.dbIdentity.setSupportsIdentity(true);
@@ -30,7 +30,7 @@ public class OraclePlatform extends DatabasePlatform {
this.sqlLimiter = new RownumSqlLimiter();
this.basicSqlLimiter = new BasicSqlAnsiLimiter();
this.historySupport = new OracleDbHistorySupport();
this.truncateTable = "truncate table %s cascade";
dbIdentity.setIdType(IdType.SEQUENCE);
dbIdentity.setSupportsSequence(true);
dbIdentity.setSupportsIdentity(true);
@@ -36,7 +36,7 @@ public class PostgresPlatform extends DatabasePlatform {
this.clobDbType = Types.VARCHAR;
this.nativeUuidType = true;
this.columnAliasPrefix = null;
this.truncateTable = "truncate table %s cascade";
this.dbEncrypt = new PostgresDbEncrypt();
this.historySupport = new PostgresHistorySupport();
@@ -17,7 +17,7 @@ public class SQLitePlatform extends DatabasePlatform {
this.dbIdentity.setSupportsGetGeneratedKeys(false);
this.dbIdentity.setSupportsSequence(false);
this.dbIdentity.setSelectLastInsertedIdTemplate("select last_insert_rowid()");
this.truncateTable = "delete from %s";
this.booleanDbType = Types.INTEGER;
this.likeClauseRaw = "like ?";
this.likeClauseEscaped = "like ?";
@@ -124,8 +124,10 @@ import javax.persistence.OptimisticLockException;
import javax.persistence.PersistenceException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.Clock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
@@ -639,6 +641,38 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
externalModification(evt);
}
@Override
public void truncate(Class<?>... types) {
List<String> tableNames = new ArrayList<>();
for (Class<?> type : types) {
tableNames.add(getBeanDescriptor(type).getBaseTable());
}
truncate(tableNames.toArray(new String[0]));
}
@Override
public void truncate(String... tables) {
try (Connection connection = getDataSource().getConnection()) {
executeSql(connection, databasePlatform.truncateStatementBefore());
for (String table : tables) {
executeSql(connection, databasePlatform.truncateStatement(table));
}
executeSql(connection, databasePlatform.truncateStatementAfter());
connection.commit();
} catch(SQLException e) {
throw new PersistenceException("Error executing truncate", e);
}
}
private void executeSql(Connection connection, String sql) throws SQLException {
if (sql != null) {
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
transactionManager.log().sql().debug(sql);
stmt.execute();
}
}
}
/**
* Clear the query execution statistics.
*/