DataSource增加清空表clear和删除表drop的系列方法

This commit is contained in:
Redkale
2019-01-04 14:26:20 +08:00
parent cfca7adc66
commit 231d41c15f
5 changed files with 273 additions and 2 deletions

View File

@@ -218,6 +218,46 @@ public class DataJdbcSource extends DataSqlSource<Connection> {
}
}
@Override
protected <T> CompletableFuture<Integer> clearDB(EntityInfo<T> info, String sql) {
Connection conn = null;
try {
conn = writePool.poll();
conn.setReadOnly(false);
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
int c = stmt.executeUpdate(sql);
stmt.close();
return CompletableFuture.completedFuture(c);
} catch (SQLException e) {
CompletableFuture future = new CompletableFuture();
future.completeExceptionally(e);
return future;
} finally {
if (conn != null) writePool.offerConnection(conn);
}
}
@Override
protected <T> CompletableFuture<Integer> dropDB(EntityInfo<T> info, String sql) {
Connection conn = null;
try {
conn = writePool.poll();
conn.setReadOnly(false);
conn.setAutoCommit(true);
final Statement stmt = conn.createStatement();
int c = stmt.executeUpdate(sql);
stmt.close();
return CompletableFuture.completedFuture(c);
} catch (SQLException e) {
CompletableFuture future = new CompletableFuture();
future.completeExceptionally(e);
return future;
} finally {
if (conn != null) writePool.offerConnection(conn);
}
}
@Override
protected <T> CompletableFuture<Integer> updateDB(EntityInfo<T> info, T... values) {
Connection conn = null;

View File

@@ -93,6 +93,16 @@ public class DataMemorySource extends DataSqlSource<Void> {
return CompletableFuture.completedFuture(0);
}
@Override
protected <T> CompletableFuture<Integer> clearDB(EntityInfo<T> info, String sql) {
return CompletableFuture.completedFuture(0);
}
@Override
protected <T> CompletableFuture<Integer> dropDB(EntityInfo<T> info, String sql) {
return CompletableFuture.completedFuture(0);
}
@Override
protected <T> CompletableFuture<Integer> updateDB(EntityInfo<T> info, T... values) {
return CompletableFuture.completedFuture(0);

View File

@@ -37,7 +37,7 @@ public interface DataSource {
*
* @param <T> 泛型
* @param values Entity对象
*
*
* @return 影响的记录条数
*/
public <T> int insert(final T... values);
@@ -151,6 +151,100 @@ public interface DataSource {
*/
public <T> CompletableFuture<Integer> deleteAsync(final Class<T> clazz, final Flipper flipper, final FilterNode node);
//------------------------clearAsync---------------------------
/**
* 清空表 <br>
* 等价SQL: TRUNCATE TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
*
* @return 影响的记录条数
*/
public <T> int clear(final Class<T> clazz);
/**
* 清空表 <br>
* 等价SQL: TRUNCATE TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
*
* @return 影响的记录条数CompletableFuture
*/
public <T> CompletableFuture<Integer> clearAsync(final Class<T> clazz);
/**
* 清空表 <br>
* 等价SQL: TRUNCATE TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
* @param node 过滤条件
*
* @return 影响的记录条数
*/
public <T> int clear(final Class<T> clazz, final FilterNode node);
/**
* 清空表 <br>
* 等价SQL: TRUNCATE TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
* @param node 过滤条件
*
* @return 影响的记录条数CompletableFuture
*/
public <T> CompletableFuture<Integer> clearAsync(final Class<T> clazz, final FilterNode node);
//------------------------dropAsync---------------------------
/**
* 删除表 <br>
* 等价SQL: DROP TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
*
* @return 影响的记录条数
*/
public <T> int drop(final Class<T> clazz);
/**
* 删除表 <br>
* 等价SQL: DROP TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
*
* @return 影响的记录条数CompletableFuture
*/
public <T> CompletableFuture<Integer> dropAsync(final Class<T> clazz);
/**
* 删除表 <br>
* 等价SQL: DROP TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
* @param node 过滤条件
*
* @return 影响的记录条数
*/
public <T> int drop(final Class<T> clazz, final FilterNode node);
/**
* 删除表 <br>
* 等价SQL: DROP TABLE {table}<br>
*
* @param <T> Entity泛型
* @param clazz Entity类
* @param node 过滤条件
*
* @return 影响的记录条数CompletableFuture
*/
public <T> CompletableFuture<Integer> dropAsync(final Class<T> clazz, final FilterNode node);
//------------------------updateAsync---------------------------
/**
* 更新记录, 多对象必须是同一个Entity类且必须在同一张表中 <br>

View File

@@ -133,6 +133,12 @@ public abstract class DataSqlSource<DBChannel> extends AbstractService implement
//删除记录
protected abstract <T> CompletableFuture<Integer> deleteDB(final EntityInfo<T> info, Flipper flipper, final String sql);
//清空表
protected abstract <T> CompletableFuture<Integer> clearDB(final EntityInfo<T> info, final String sql);
//删除表
protected abstract <T> CompletableFuture<Integer> dropDB(final EntityInfo<T> info, final String sql);
//更新纪录
protected abstract <T> CompletableFuture<Integer> updateDB(final EntityInfo<T> info, T... values);
@@ -510,6 +516,122 @@ public abstract class DataSqlSource<DBChannel> extends AbstractService implement
return deleteDB(info, flipper, sql);
}
//----------------------------- clearCompose -----------------------------
@Override
public <T> int clear(Class<T> clazz) {
return clear(clazz, (FilterNode) null);
}
@Override
public <T> int clear(Class<T> clazz, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (isOnlyCache(info)) return clearCache(info, node);
return DataSqlSource.this.clearCompose(info, node).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
clearCache(info, node);
}
}).join();
}
@Override
public <T> CompletableFuture<Integer> clearAsync(final Class<T> clazz) {
return clearAsync(clazz, (FilterNode) null);
}
@Override
public <T> CompletableFuture<Integer> clearAsync(final Class<T> clazz, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (isOnlyCache(info)) {
return CompletableFuture.supplyAsync(() -> clearCache(info, node), getExecutor());
}
if (isAsync()) return DataSqlSource.this.clearCompose(info, node).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
clearCache(info, node);
}
});
return CompletableFuture.supplyAsync(() -> DataSqlSource.this.clearCompose(info, node).join(), getExecutor()).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
clearCache(info, node);
}
});
}
protected <T> CompletableFuture<Integer> clearCompose(final EntityInfo<T> info, final FilterNode node) {
String sql = "TRUNCATE TABLE " + info.getTable(node);
if (info.isLoggable(logger, Level.FINEST, sql)) logger.finest(info.getType().getSimpleName() + " clear sql=" + sql);
return clearDB(info, sql);
}
//----------------------------- dropCompose -----------------------------
@Override
public <T> int drop(Class<T> clazz) {
return drop(clazz, (FilterNode) null);
}
@Override
public <T> int drop(Class<T> clazz, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (isOnlyCache(info)) return dropCache(info, node);
return DataSqlSource.this.dropCompose(info, node).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
dropCache(info, node);
}
}).join();
}
@Override
public <T> CompletableFuture<Integer> dropAsync(final Class<T> clazz) {
return dropAsync(clazz, (FilterNode) null);
}
@Override
public <T> CompletableFuture<Integer> dropAsync(final Class<T> clazz, FilterNode node) {
final EntityInfo<T> info = loadEntityInfo(clazz);
if (isOnlyCache(info)) {
return CompletableFuture.supplyAsync(() -> dropCache(info, node), getExecutor());
}
if (isAsync()) return DataSqlSource.this.dropCompose(info, node).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
dropCache(info, node);
}
});
return CompletableFuture.supplyAsync(() -> DataSqlSource.this.dropCompose(info, node).join(), getExecutor()).whenComplete((rs, t) -> {
if (t != null) {
futureCompleteConsumer.accept(rs, t);
} else {
dropCache(info, node);
}
});
}
protected <T> CompletableFuture<Integer> dropCompose(final EntityInfo<T> info, final FilterNode node) {
String sql = "DROP TABLE " + info.getTable(node);
if (info.isLoggable(logger, Level.FINEST, sql)) logger.finest(info.getType().getSimpleName() + " drop sql=" + sql);
return dropDB(info, sql);
}
protected <T> int clearCache(final EntityInfo<T> info, FilterNode node) {
final EntityCache<T> cache = info.getCache();
if (cache == null) return -1;
return cache.clear();
}
protected <T> int dropCache(final EntityInfo<T> info, FilterNode node) {
final EntityCache<T> cache = info.getCache();
if (cache == null) return -1;
return cache.drop();
}
protected <T> int deleteCache(final EntityInfo<T> info, int count, Flipper flipper, FilterNode node) {
final EntityCache<T> cache = info.getCache();
if (cache == null) return -1;

View File

@@ -144,7 +144,7 @@ public final class EntityCache<T> {
return type;
}
public void clear() {
public int clear() {
this.fullloaded = false;
this.list = new ConcurrentLinkedQueue();
this.map = new ConcurrentHashMap();
@@ -152,6 +152,7 @@ public final class EntityCache<T> {
this.scheduler.shutdownNow();
this.scheduler = null;
}
return 1;
}
public boolean isFullLoaded() {
@@ -479,6 +480,10 @@ public final class EntityCache<T> {
return ids;
}
public int drop() {
return clear();
}
public int update(final T value) {
if (value == null) return 0;
T rs = this.map.get(this.primary.get(value));