Commit c638623b authored by terrymanu's avatar terrymanu
Browse files

remove metadata when drop table for JDBC

parent 80ca9f9c
Loading
Loading
Loading
Loading
+9 −16
Original line number Diff line number Diff line
@@ -19,17 +19,15 @@ package io.shardingsphere.shardingjdbc.jdbc.adapter;

import com.google.common.base.Optional;
import io.shardingsphere.core.constant.SQLType;
import io.shardingsphere.core.constant.properties.ShardingPropertiesConstant;
import io.shardingsphere.core.metadata.table.TableMetaData;
import io.shardingsphere.core.metadata.table.TableMetaDataFactory;
import io.shardingsphere.core.metadata.table.executor.TableMetaDataLoader;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.AlterTableStatement;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.CreateTableStatement;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.DropTableStatement;
import io.shardingsphere.core.routing.SQLRouteResult;
import io.shardingsphere.shardingjdbc.jdbc.adapter.executor.ForceExecuteCallback;
import io.shardingsphere.shardingjdbc.jdbc.adapter.executor.ForceExecuteTemplate;
import io.shardingsphere.shardingjdbc.jdbc.core.connection.ShardingConnection;
import io.shardingsphere.shardingjdbc.jdbc.metadata.JDBCTableMetaDataConnectionManager;
import io.shardingsphere.shardingjdbc.jdbc.unsupported.AbstractUnsupportedOperationStatement;
import lombok.RequiredArgsConstructor;

@@ -240,12 +238,13 @@ public abstract class AbstractStatementAdapter extends AbstractUnsupportedOperat
    
    protected abstract Collection<? extends Statement> getRoutedStatements();
    
    protected final void refreshTableMetaData(final ShardingConnection connection, final SQLRouteResult routeResult) throws SQLException {
    protected final void refreshTableMetaData(final ShardingConnection connection, final SQLRouteResult routeResult) {
        if (null != routeResult && null != connection && SQLType.DDL == routeResult.getSqlStatement().getType() && !routeResult.getSqlStatement().getTables().isEmpty()) {
            String logicTableName = routeResult.getSqlStatement().getTables().getSingleTableName();
            if (routeResult.getSqlStatement() instanceof CreateTableStatement) {
                connection.getShardingContext().getMetaData().getTable().put(logicTableName, TableMetaDataFactory.newInstance((CreateTableStatement) routeResult.getSqlStatement()));
                connection.getShardingContext().getMetaData().getTable().put(
                        routeResult.getSqlStatement().getTables().getSingleTableName(), TableMetaDataFactory.newInstance((CreateTableStatement) routeResult.getSqlStatement()));
            } else if (routeResult.getSqlStatement() instanceof AlterTableStatement) {
                String logicTableName = routeResult.getSqlStatement().getTables().getSingleTableName();
                TableMetaData newTableMetaData = TableMetaDataFactory.newInstance((AlterTableStatement) routeResult.getSqlStatement(), 
                        connection.getShardingContext().getMetaData().getTable().get(logicTableName));
                Optional<String> newTableName = ((AlterTableStatement) routeResult.getSqlStatement()).getNewTableName();
@@ -255,17 +254,11 @@ public abstract class AbstractStatementAdapter extends AbstractUnsupportedOperat
                } else {
                    connection.getShardingContext().getMetaData().getTable().put(logicTableName, newTableMetaData);
                }
            } else {
                doOther(logicTableName, connection);
            } else if (routeResult.getSqlStatement() instanceof DropTableStatement) {
                for (String each : routeResult.getSqlStatement().getTables().getTableNames()) {
                    connection.getShardingContext().getMetaData().getTable().remove(each);
                }
            }
        }
    
    private void doOther(final String logicTableName, final ShardingConnection connection) throws SQLException {
        TableMetaDataLoader tableMetaDataLoader = new TableMetaDataLoader(connection.getShardingContext().getMetaData().getDataSource(),
                connection.getShardingContext().getExecuteEngine(), new JDBCTableMetaDataConnectionManager(connection.getDataSourceMap()),
                connection.getShardingContext().getShardingProperties().<Integer>getValue(ShardingPropertiesConstant.MAX_CONNECTIONS_SIZE_PER_QUERY), 
                connection.getShardingContext().getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.CHECK_TABLE_METADATA_ENABLED));
        connection.getShardingContext().getMetaData().getTable().put(logicTableName, tableMetaDataLoader.load(logicTableName, connection.getShardingContext().getShardingRule()));
    }
}