Search in sources :

Example 1 with ConnectionUrlParser

use of com.mysql.cj.conf.ConnectionUrlParser in project Mycat2 by MyCATApache.

the class DatasourceConfig method setUrl.

public void setUrl(String url) {
    if ("mysql".equalsIgnoreCase(getDbType()) && url != null) {
        ConnectionUrlParser connectionUrlParser = ConnectionUrlParser.parseConnectionString(url);
        Map<String, String> properties = new HashMap<>(connectionUrlParser.getProperties());
        if (!properties.containsKey("useUnicode")) {
            properties.put("useUnicode", "true");
        }
        if (!properties.containsKey("characterEncoding")) {
            properties.put("characterEncoding", "UTF-8");
        }
        if (!properties.containsKey("serverTimezone")) {
            TimeZone timeZone = TimeZone.getDefault();
            timeZone.getID();
            properties.put("serverTimezone", "Asia/Shanghai");
        }
        // }
        if (!properties.containsKey("autoReconnect")) {
            properties.put("autoReconnect", "true");
        }
        // if (!properties.containsKey("AllowPublicKeyRetrieval")) {
        // properties.put("AllowPublicKeyRetrieval", "true");
        // }
        int i = url.indexOf('?');
        if (i == -1) {
            url += "?";
        } else {
            url = url.substring(0, i + 1);
        }
        url += properties.entrySet().stream().map(j -> j.getKey() + "=" + j.getValue()).collect(Collectors.joining("&"));
    }
    this.url = url;
}
Also used : ConnectionUrlParser(com.mysql.cj.conf.ConnectionUrlParser)

Example 2 with ConnectionUrlParser

use of com.mysql.cj.conf.ConnectionUrlParser in project Mycat2 by MyCATApache.

the class BinlogUtil method observe.

public static Flowable<ParamSQL> observe(String targetName, List<Partition> partitions) {
    JdbcConnectionManager jdbcConnectionManager = MetaClusterCurrent.wrapper(JdbcConnectionManager.class);
    DatasourceConfig datasourceConfig = jdbcConnectionManager.getConfigAsMap().get(targetName);
    ConnectionUrlParser connectionUrlParser = ConnectionUrlParser.parseConnectionString(datasourceConfig.getUrl());
    HostInfo hostInfo = connectionUrlParser.getHosts().get(0);
    int port = hostInfo.getPort();
    String host = hostInfo.getHost();
    String username = datasourceConfig.getUser();
    String password = datasourceConfig.getPassword();
    BinaryLogClient client = new BinaryLogClient(datasourceConfig.getUrl(), port, username, password);
    NameMap<NameMap<Boolean>> filterMap = new NameMap<>();
    for (Partition partition : partitions) {
        String schema = partition.getSchema();
        String table = partition.getTable();
        NameMap<Boolean> map = filterMap.computeIfAbsent(SQLUtils.normalize(schema), s -> new NameMap<>());
        map.put(table, Boolean.TRUE);
    }
    return Flowable.create(new FlowableOnSubscribe<ParamSQL>() {

        @Override
        public void subscribe(@NonNull FlowableEmitter<ParamSQL> emitter) throws Throwable {
            client.registerEventListener(new BinaryLogClient.EventListener() {

                private final Map<Long, TableMapEventData> tablesById = new HashMap<Long, TableMapEventData>();

                private final Map<String, Map<Integer, Map<String, Object>>> tablesColumnMap = new HashMap<>();

                private String binlogFilename;

                private Charset charset = StandardCharsets.UTF_8;

                private Map<Integer, Map<String, Object>> loadColumn(String database, String table) {
                    Map<Integer, Map<String, Object>> res = new HashMap<>();
                    try (DefaultConnection defaultConnection = jdbcConnectionManager.getConnection(targetName)) {
                        List<Map<String, Object>> list = JdbcUtils.executeQuery(defaultConnection.getRawConnection(), "select  COLUMN_NAME, ORDINAL_POSITION, DATA_TYPE, CHARACTER_SET_NAME from INFORMATION_SCHEMA.COLUMNS where table_name='" + table + "' and TABLE_SCHEMA='" + database + "'", Collections.emptyList());
                        for (Map<String, Object> stringObjectMap : list) {
                            Number pos = (Number) stringObjectMap.get("ORDINAL_POSITION");
                            res.put(pos.intValue(), stringObjectMap);
                        }
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    return res;
                }

                @Override
                public void onEvent(Event event) {
                    try {
                        EventHeader header = event.getHeader();
                        switch(header.getEventType()) {
                            case UNKNOWN:
                                break;
                            case START_V3:
                                break;
                            case QUERY:
                                QueryEventData queryEventData = event.getData();
                                String query = queryEventData.getSql();
                                if (!query.startsWith("S")) {
                                    handleDDL(queryEventData);
                                }
                                break;
                            case STOP:
                                emitter.onComplete();
                                break;
                            case ROTATE:
                                {
                                    RotateEventData data = event.getData();
                                    this.binlogFilename = data.getBinlogFilename();
                                    break;
                                }
                            case INTVAR:
                                break;
                            case LOAD:
                                break;
                            case SLAVE:
                                break;
                            case CREATE_FILE:
                                break;
                            case APPEND_BLOCK:
                                break;
                            case EXEC_LOAD:
                                break;
                            case DELETE_FILE:
                                break;
                            case NEW_LOAD:
                                break;
                            case RAND:
                                break;
                            case USER_VAR:
                                break;
                            case FORMAT_DESCRIPTION:
                                break;
                            case XID:
                                break;
                            case BEGIN_LOAD_QUERY:
                                break;
                            case EXECUTE_LOAD_QUERY:
                                break;
                            case TABLE_MAP:
                                {
                                    handleTableMap(event);
                                    break;
                                }
                            case PRE_GA_WRITE_ROWS:
                            case WRITE_ROWS:
                            case EXT_WRITE_ROWS:
                                handleWriteRowsEvent(event);
                                break;
                            case EXT_UPDATE_ROWS:
                            case PRE_GA_UPDATE_ROWS:
                            case UPDATE_ROWS:
                                handleUpdateRowsEvent(event);
                                break;
                            case PRE_GA_DELETE_ROWS:
                            case EXT_DELETE_ROWS:
                            case DELETE_ROWS:
                                handleDeleteRowsEvent(event);
                                break;
                            case INCIDENT:
                                break;
                            case HEARTBEAT:
                                break;
                            case IGNORABLE:
                                break;
                            case ROWS_QUERY:
                                break;
                            case GTID:
                                break;
                            case ANONYMOUS_GTID:
                                break;
                            case PREVIOUS_GTIDS:
                                break;
                            case TRANSACTION_CONTEXT:
                                break;
                            case VIEW_CHANGE:
                                break;
                            case XA_PREPARE:
                                break;
                        }
                    } catch (Exception e) {
                        emitter.tryOnError(e);
                    }
                }

                private void handleDDL(QueryEventData event) {
                    String sql = event.getSql();
                    String database = event.getDatabase();
                    SQLStatement sqlStatement = SQLUtils.parseSingleMysqlStatement(sql);
                    if (sqlStatement instanceof SQLDDLStatement) {
                        SQLDDLStatement sqlDdlStatement = (SQLDDLStatement) sqlStatement;
                        MySqlSchemaStatVisitor mySqlSchemaStatVisitor = new MySqlSchemaStatVisitor();
                        sqlDdlStatement.accept(mySqlSchemaStatVisitor);
                        Map<TableStat.Name, TableStat> tables = mySqlSchemaStatVisitor.getTables();
                        boolean meet = tables.keySet().stream().allMatch(i -> filter(database, i.getName()));
                    }
                }

                private void handleUpdateRowsEvent(Event event) {
                    UpdateRowsEventData eventData = event.getData();
                    BitSet includedColumnsBeforeUpdate = eventData.getIncludedColumnsBeforeUpdate();
                    BitSet includedColumns = eventData.getIncludedColumns();
                    List<Map.Entry<Serializable[], Serializable[]>> rows = eventData.getRows();
                    TableMapEventData tableMapEvent = tablesById.get(eventData.getTableId());
                    if (!filter(tableMapEvent.getDatabase(), tableMapEvent.getTable()))
                        return;
                    MySqlUpdateStatement mySqlUpdateStatement = new MySqlUpdateStatement();
                    SQLExprTableSource sqlTableSource = new SQLExprTableSource();
                    sqlTableSource.setExpr("`" + tableMapEvent.getTable() + "`");
                    sqlTableSource.setSchema("`" + tableMapEvent.getDatabase() + "`");
                    mySqlUpdateStatement.setTableSource(sqlTableSource);
                    Map<Integer, Map<String, Object>> xxx = tablesColumnMap.get(tableMapEvent.getDatabase() + "." + tableMapEvent.getTable());
                    SQLBinaryOpExprGroup sqlBinaryOpExprGroup = getCondition(includedColumnsBeforeUpdate, xxx);
                    for (int i = 0; i < includedColumns.length(); i++) {
                        int column = includedColumns.nextSetBit(i);
                        Map<String, Object> coumnMap = xxx.get(column + 1);
                        Object column_name = coumnMap.get("COLUMN_NAME");
                        SQLUpdateSetItem sqlUpdateSetItem = new SQLUpdateSetItem();
                        sqlUpdateSetItem.setColumn(new SQLIdentifierExpr("`" + column_name + "`"));
                        sqlUpdateSetItem.setValue(new SQLVariantRefExpr("?"));
                        mySqlUpdateStatement.getItems().add(sqlUpdateSetItem);
                    }
                    mySqlUpdateStatement.setWhere(sqlBinaryOpExprGroup);
                    mySqlUpdateStatement.setLimit(new SQLLimit(1));
                    sqlUpdate(mySqlUpdateStatement.toString(), rows);
                }

                private SQLBinaryOpExprGroup getCondition(BitSet includedColumnsBeforeUpdate, Map<Integer, Map<String, Object>> xxx) {
                    SQLBinaryOpExprGroup sqlBinaryOpExprGroup = new SQLBinaryOpExprGroup(SQLBinaryOperator.BooleanAnd);
                    for (int i = 0; i < includedColumnsBeforeUpdate.length(); i++) {
                        int column = includedColumnsBeforeUpdate.nextSetBit(i);
                        Map<String, Object> coumnMap = xxx.get(column + 1);
                        Object column_name = coumnMap.get("COLUMN_NAME");
                        SQLExpr sqlExpr = SQLUtils.toSQLExpr("`" + column_name + "` <=> ?");
                        sqlBinaryOpExprGroup.add(sqlExpr);
                    }
                    return sqlBinaryOpExprGroup;
                }

                private void sqlUpdate(String toString, List<Map.Entry<Serializable[], Serializable[]>> rows) {
                    for (Map.Entry<Serializable[], Serializable[]> row : rows) {
                        Serializable[] key = row.getKey();
                        Serializable[] value = row.getValue();
                        Object[] objects = new Object[key.length + value.length];
                        System.arraycopy(key, 0, objects, 0, key.length);
                        System.arraycopy(value, 0, objects, key.length, key.length + value.length);
                        emitter.onNext(ParamSQL.of(toString, objects));
                    }
                }

                private boolean filter(String database, String table) {
                    if (Strings.isNullOrEmpty(database)) {
                        return false;
                    }
                    if (Strings.isNullOrEmpty(table)) {
                        return false;
                    }
                    NameMap<Boolean> tableMap = filterMap.get(SQLUtils.normalize(database), false);
                    if (tableMap != null && !tableMap.map().isEmpty()) {
                        return Boolean.TRUE.equals(tableMap.get(SQLUtils.normalize(table)));
                    }
                    return false;
                }

                private void handleTableMap(Event event) {
                    TableMapEventData tableMapEventData = event.getData();
                    tablesById.put(tableMapEventData.getTableId(), tableMapEventData);
                    String tableName = tableMapEventData.getDatabase() + "." + tableMapEventData.getTable();
                    if (!tablesColumnMap.containsKey(tableName)) {
                        tablesColumnMap.put(tableName, loadColumn(tableMapEventData.getDatabase(), tableMapEventData.getTable()));
                    }
                }

                private void handleWriteRowsEvent(Event event) {
                    WriteRowsEventData eventData = event.getData();
                    TableMapEventData tableMapEvent = tablesById.get(eventData.getTableId());
                    if (!filter(tableMapEvent.getDatabase(), tableMapEvent.getTable()))
                        return;
                    Map<Integer, Map<String, Object>> xxx = tablesColumnMap.get(tableMapEvent.getDatabase() + "." + tableMapEvent.getTable());
                    BitSet inculudeColumn = eventData.getIncludedColumns();
                    MySqlInsertStatement mySqlInsertStatement = new MySqlInsertStatement();
                    mySqlInsertStatement.setTableName(new SQLIdentifierExpr("`" + tableMapEvent.getTable() + "`"));
                    mySqlInsertStatement.getTableSource().setSchema("`" + tableMapEvent.getDatabase() + "`");
                    SQLInsertStatement.ValuesClause values = new SQLInsertStatement.ValuesClause();
                    mySqlInsertStatement.setValues(values);
                    int size = inculudeColumn.length();
                    List<Serializable[]> rows = eventData.getRows();
                    for (int i = 0; i < size; i++) {
                        int column = inculudeColumn.nextSetBit(i);
                        Map<String, Object> coumnMap = xxx.get(column + 1);
                        Object column_name = coumnMap.get("COLUMN_NAME");
                        mySqlInsertStatement.addColumn(new SQLIdentifierExpr("`" + column_name + "`"));
                        values.addValue(new SQLVariantRefExpr("?"));
                    }
                    sqlInsert(mySqlInsertStatement.toString(), rows);
                }

                private void sqlInsert(String sql, List<Serializable[]> rows) {
                    for (Serializable[] row : rows) {
                        Object[] objects = new Object[row.length];
                        System.arraycopy(row, 0, objects, 0, row.length);
                        emitter.onNext(ParamSQL.of(sql, objects));
                    }
                }

                private void handleDeleteRowsEvent(Event event) {
                    DeleteRowsEventData eventData = event.getData();
                    EventHeader header = event.getHeader();
                    TableMapEventData tableMapEvent = tablesById.get(eventData.getTableId());
                    if (!filter(tableMapEvent.getDatabase(), tableMapEvent.getTable()))
                        return;
                    Map<Integer, Map<String, Object>> xxx = tablesColumnMap.get(tableMapEvent.getDatabase() + "." + tableMapEvent.getTable());
                    BitSet inculudeColumn = eventData.getIncludedColumns();
                    SQLBinaryOpExprGroup condition = getCondition(inculudeColumn, xxx);
                    int size = inculudeColumn.length();
                    List<Serializable[]> rows = eventData.getRows();
                    MySqlDeleteStatement mySqlDeleteStatement = new MySqlDeleteStatement();
                    mySqlDeleteStatement.setLimit(new SQLLimit(1));
                    SQLExprTableSource sqlExprTableSource = new SQLExprTableSource();
                    sqlExprTableSource.setExpr("`" + tableMapEvent.getTable() + "`");
                    sqlExprTableSource.setSchema("`" + tableMapEvent.getDatabase() + "`");
                    mySqlDeleteStatement.setTableSource(sqlExprTableSource);
                    mySqlDeleteStatement.addWhere(condition);
                    sqlDelete(mySqlDeleteStatement.toString(), rows);
                }

                private void sqlDelete(String mySqlDeleteStatement, List<Serializable[]> rows) {
                    for (Serializable[] row : rows) {
                        Object[] objects = new Object[row.length];
                        System.arraycopy(row, 0, objects, 0, row.length);
                        emitter.onNext(ParamSQL.of(mySqlDeleteStatement, objects));
                    }
                }
            });
            client.connect();
        }
    }, BackpressureStrategy.BUFFER);
}
Also used : Serializable(java.io.Serializable) ToString(groovy.transform.ToString) SQLStatement(com.alibaba.druid.sql.ast.SQLStatement) DatasourceConfig(io.mycat.config.DatasourceConfig) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) SQLDDLStatement(com.alibaba.druid.sql.ast.statement.SQLDDLStatement) SQLUpdateSetItem(com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem) MySqlSchemaStatVisitor(com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor) MySqlDeleteStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement) SQLVariantRefExpr(com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr) NameMap(io.mycat.util.NameMap) SQLException(java.sql.SQLException) SQLLimit(com.alibaba.druid.sql.ast.SQLLimit) TableStat(com.alibaba.druid.stat.TableStat) BinaryLogClient(com.github.shyiko.mysql.binlog.BinaryLogClient) MySqlUpdateStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement) SQLInsertStatement(com.alibaba.druid.sql.ast.statement.SQLInsertStatement) SQLBinaryOpExprGroup(com.alibaba.druid.sql.ast.expr.SQLBinaryOpExprGroup) Partition(io.mycat.Partition) Charset(java.nio.charset.Charset) SQLIdentifierExpr(com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr) NameMap(io.mycat.util.NameMap) MySqlInsertStatement(com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement) ConnectionUrlParser(com.mysql.cj.conf.ConnectionUrlParser) SQLException(java.sql.SQLException) SQLExpr(com.alibaba.druid.sql.ast.SQLExpr) DefaultConnection(io.mycat.datasource.jdbc.datasource.DefaultConnection) SQLExprTableSource(com.alibaba.druid.sql.ast.statement.SQLExprTableSource) JdbcConnectionManager(io.mycat.datasource.jdbc.datasource.JdbcConnectionManager) HostInfo(com.mysql.cj.conf.HostInfo)

Example 3 with ConnectionUrlParser

use of com.mysql.cj.conf.ConnectionUrlParser in project Mycat2 by MyCATApache.

the class AbstractSQLHandler method executeOnDataNodes.

public void executeOnDataNodes(SQLStatement sqlStatement, JdbcConnectionManager connectionManager, Collection<Partition> partitions, SQLExprTableSource tableSource) {
    HashSet<String> set = new HashSet<>();
    for (Partition partition : partitions) {
        MycatSQLExprTableSourceUtil.setSqlExprTableSource(partition.getSchema(), partition.getTable(), tableSource);
        String sql = sqlStatement.toString();
        try (DefaultConnection connection = connectionManager.getConnection(partition.getTargetName())) {
            DatasourceConfig config = connection.getDataSource().getConfig();
            ConnectionUrlParser connectionUrlParser = ConnectionUrlParser.parseConnectionString(config.getUrl());
            HostInfo hostInfo = connectionUrlParser.getHosts().get(0);
            String ip = hostInfo.getHost();
            String port = hostInfo.getPort() + "";
            if (set.add(ip + ":" + port + ":" + sql)) {
                connection.executeUpdate(sql, false);
            }
        }
    }
}
Also used : DatasourceConfig(io.mycat.config.DatasourceConfig) DefaultConnection(io.mycat.datasource.jdbc.datasource.DefaultConnection) ConnectionUrlParser(com.mysql.cj.conf.ConnectionUrlParser) HostInfo(com.mysql.cj.conf.HostInfo)

Example 4 with ConnectionUrlParser

use of com.mysql.cj.conf.ConnectionUrlParser in project Mycat2 by MyCATApache.

the class MycatMySQLManagerImpl method createNativeDatasourcePool.

@NotNull
public static MycatDatasourcePool createNativeDatasourcePool(DatasourceConfig datasource, String targetName) {
    ConnectionUrlParser connectionUrlParser = ConnectionUrlParser.parseConnectionString(datasource.getUrl());
    HostInfo hostInfo = connectionUrlParser.getHosts().get(0);
    int port = hostInfo.getPort();
    String host = hostInfo.getHost();
    String username = datasource.getUser();
    String password = datasource.getPassword();
    VertxPoolConnectionImpl.Config config = new VertxPoolConnectionImpl.Config();
    config.setHost(host);
    config.setPassword(password);
    config.setUsername(username);
    config.setPort(port);
    config.setDatabase(connectionUrlParser.getPath());
    config.setRetry(datasource.getMaxRetryCount());
    config.setTimer(datasource.getIdleTimeout());
    config.setClientDeprecateEof(NewMycatConnectionConfig.CLIENT_DEPRECATE_EOF);
    Vertx vertx = MetaClusterCurrent.wrapper(Vertx.class);
    VertxPoolConnectionImpl vertxConnectionPool = new VertxPoolConnectionImpl(config, vertx);
    return new MycatNativeDatasourcePool(vertxConnectionPool, targetName);
}
Also used : VertxPoolConnectionImpl(io.mycat.mysqlclient.VertxPoolConnectionImpl) MycatNativeDatasourcePool(io.mycat.mysqlclient.MycatNativeDatasourcePool) NewMycatConnectionConfig(io.mycat.newquery.NewMycatConnectionConfig) DatasourceConfig(io.mycat.config.DatasourceConfig) Vertx(io.vertx.core.Vertx) ConnectionUrlParser(com.mysql.cj.conf.ConnectionUrlParser) HostInfo(com.mysql.cj.conf.HostInfo) NotNull(org.jetbrains.annotations.NotNull)

Example 5 with ConnectionUrlParser

use of com.mysql.cj.conf.ConnectionUrlParser in project skywalking-java by apache.

the class ConnectionImplCreateInterceptorTest method testResultIsEnhanceInstance.

@Test
public void testResultIsEnhanceInstance() throws Throwable {
    final ConnectionUrlParser connectionUrlParser = ConnectionUrlParser.parseConnectionString("jdbc:mysql:replication://localhost:3360,localhost:3360,localhost:3360/test?useUnicode=true&characterEncoding=utf8&useSSL=false&roundRobinLoadBalance=true");
    interceptor.afterMethod(null, null, connectionUrlParser.getHosts().toArray(), null, objectInstance);
    verify(objectInstance).setSkyWalkingDynamicField(Matchers.any());
}
Also used : ConnectionUrlParser(com.mysql.cj.conf.ConnectionUrlParser) Test(org.junit.Test)

Aggregations

ConnectionUrlParser (com.mysql.cj.conf.ConnectionUrlParser)5 HostInfo (com.mysql.cj.conf.HostInfo)3 DatasourceConfig (io.mycat.config.DatasourceConfig)3 DefaultConnection (io.mycat.datasource.jdbc.datasource.DefaultConnection)2 SQLExpr (com.alibaba.druid.sql.ast.SQLExpr)1 SQLLimit (com.alibaba.druid.sql.ast.SQLLimit)1 SQLStatement (com.alibaba.druid.sql.ast.SQLStatement)1 SQLBinaryOpExprGroup (com.alibaba.druid.sql.ast.expr.SQLBinaryOpExprGroup)1 SQLIdentifierExpr (com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr)1 SQLVariantRefExpr (com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr)1 SQLDDLStatement (com.alibaba.druid.sql.ast.statement.SQLDDLStatement)1 SQLExprTableSource (com.alibaba.druid.sql.ast.statement.SQLExprTableSource)1 SQLInsertStatement (com.alibaba.druid.sql.ast.statement.SQLInsertStatement)1 SQLUpdateSetItem (com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem)1 MySqlDeleteStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlDeleteStatement)1 MySqlInsertStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement)1 MySqlUpdateStatement (com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement)1 MySqlSchemaStatVisitor (com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor)1 TableStat (com.alibaba.druid.stat.TableStat)1 BinaryLogClient (com.github.shyiko.mysql.binlog.BinaryLogClient)1