diff --git a/src/org/redkale/source/DataJdbcSource.java b/src/org/redkale/source/DataJdbcSource.java index 72b43c84b..699fc3a14 100644 --- a/src/org/redkale/source/DataJdbcSource.java +++ b/src/org/redkale/source/DataJdbcSource.java @@ -218,6 +218,46 @@ public class DataJdbcSource extends DataSqlSource { } } + @Override + protected CompletableFuture clearDB(EntityInfo 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 CompletableFuture dropDB(EntityInfo 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 CompletableFuture updateDB(EntityInfo info, T... values) { Connection conn = null; diff --git a/src/org/redkale/source/DataMemorySource.java b/src/org/redkale/source/DataMemorySource.java index b7fb414d5..da6da9dfa 100644 --- a/src/org/redkale/source/DataMemorySource.java +++ b/src/org/redkale/source/DataMemorySource.java @@ -93,6 +93,16 @@ public class DataMemorySource extends DataSqlSource { return CompletableFuture.completedFuture(0); } + @Override + protected CompletableFuture clearDB(EntityInfo info, String sql) { + return CompletableFuture.completedFuture(0); + } + + @Override + protected CompletableFuture dropDB(EntityInfo info, String sql) { + return CompletableFuture.completedFuture(0); + } + @Override protected CompletableFuture updateDB(EntityInfo info, T... values) { return CompletableFuture.completedFuture(0); diff --git a/src/org/redkale/source/DataSource.java b/src/org/redkale/source/DataSource.java index 94c0f0af3..7a98aead6 100644 --- a/src/org/redkale/source/DataSource.java +++ b/src/org/redkale/source/DataSource.java @@ -37,7 +37,7 @@ public interface DataSource { * * @param 泛型 * @param values Entity对象 - * + * * @return 影响的记录条数 */ public int insert(final T... values); @@ -151,6 +151,100 @@ public interface DataSource { */ public CompletableFuture deleteAsync(final Class clazz, final Flipper flipper, final FilterNode node); + //------------------------clearAsync--------------------------- + /** + * 清空表
+ * 等价SQL: TRUNCATE TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * + * @return 影响的记录条数 + */ + public int clear(final Class clazz); + + /** + * 清空表
+ * 等价SQL: TRUNCATE TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * + * @return 影响的记录条数CompletableFuture + */ + public CompletableFuture clearAsync(final Class clazz); + + /** + * 清空表
+ * 等价SQL: TRUNCATE TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * @param node 过滤条件 + * + * @return 影响的记录条数 + */ + public int clear(final Class clazz, final FilterNode node); + + /** + * 清空表
+ * 等价SQL: TRUNCATE TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * @param node 过滤条件 + * + * @return 影响的记录条数CompletableFuture + */ + public CompletableFuture clearAsync(final Class clazz, final FilterNode node); + + //------------------------dropAsync--------------------------- + /** + * 删除表
+ * 等价SQL: DROP TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * + * @return 影响的记录条数 + */ + public int drop(final Class clazz); + + /** + * 删除表
+ * 等价SQL: DROP TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * + * @return 影响的记录条数CompletableFuture + */ + public CompletableFuture dropAsync(final Class clazz); + + /** + * 删除表
+ * 等价SQL: DROP TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * @param node 过滤条件 + * + * @return 影响的记录条数 + */ + public int drop(final Class clazz, final FilterNode node); + + /** + * 删除表
+ * 等价SQL: DROP TABLE {table}
+ * + * @param Entity泛型 + * @param clazz Entity类 + * @param node 过滤条件 + * + * @return 影响的记录条数CompletableFuture + */ + public CompletableFuture dropAsync(final Class clazz, final FilterNode node); + //------------------------updateAsync--------------------------- /** * 更新记录, 多对象必须是同一个Entity类且必须在同一张表中
diff --git a/src/org/redkale/source/DataSqlSource.java b/src/org/redkale/source/DataSqlSource.java index 53129346a..c397ecabe 100644 --- a/src/org/redkale/source/DataSqlSource.java +++ b/src/org/redkale/source/DataSqlSource.java @@ -133,6 +133,12 @@ public abstract class DataSqlSource extends AbstractService implement //删除记录 protected abstract CompletableFuture deleteDB(final EntityInfo info, Flipper flipper, final String sql); + //清空表 + protected abstract CompletableFuture clearDB(final EntityInfo info, final String sql); + + //删除表 + protected abstract CompletableFuture dropDB(final EntityInfo info, final String sql); + //更新纪录 protected abstract CompletableFuture updateDB(final EntityInfo info, T... values); @@ -510,6 +516,122 @@ public abstract class DataSqlSource extends AbstractService implement return deleteDB(info, flipper, sql); } + //----------------------------- clearCompose ----------------------------- + @Override + public int clear(Class clazz) { + return clear(clazz, (FilterNode) null); + } + + @Override + public int clear(Class clazz, FilterNode node) { + final EntityInfo 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 CompletableFuture clearAsync(final Class clazz) { + return clearAsync(clazz, (FilterNode) null); + } + + @Override + public CompletableFuture clearAsync(final Class clazz, FilterNode node) { + final EntityInfo 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 CompletableFuture clearCompose(final EntityInfo 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 int drop(Class clazz) { + return drop(clazz, (FilterNode) null); + } + + @Override + public int drop(Class clazz, FilterNode node) { + final EntityInfo 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 CompletableFuture dropAsync(final Class clazz) { + return dropAsync(clazz, (FilterNode) null); + } + + @Override + public CompletableFuture dropAsync(final Class clazz, FilterNode node) { + final EntityInfo 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 CompletableFuture dropCompose(final EntityInfo 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 int clearCache(final EntityInfo info, FilterNode node) { + final EntityCache cache = info.getCache(); + if (cache == null) return -1; + return cache.clear(); + } + + protected int dropCache(final EntityInfo info, FilterNode node) { + final EntityCache cache = info.getCache(); + if (cache == null) return -1; + return cache.drop(); + } + protected int deleteCache(final EntityInfo info, int count, Flipper flipper, FilterNode node) { final EntityCache cache = info.getCache(); if (cache == null) return -1; diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index ba425e4e9..b20ba35d2 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -144,7 +144,7 @@ public final class EntityCache { 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 { this.scheduler.shutdownNow(); this.scheduler = null; } + return 1; } public boolean isFullLoaded() { @@ -479,6 +480,10 @@ public final class EntityCache { 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));