Search in sources :

Example 1 with ErrorPacket

use of com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket in project canal by alibaba.

the class MysqlConnector method negotiate.

private void negotiate(SocketChannel channel) throws IOException {
    HeaderPacket header = PacketManager.readHeader(channel, 4);
    byte[] body = PacketManager.readBytes(channel, header.getPacketBodyLength());
    if (body[0] < 0) {
        // check field_count
        if (body[0] == -1) {
            ErrorPacket error = new ErrorPacket();
            error.fromBytes(body);
            throw new IOException("handshake exception:\n" + error.toString());
        } else if (body[0] == -2) {
            throw new IOException("Unexpected EOF packet at handshake phase.");
        } else {
            throw new IOException("unpexpected packet with field_count=" + body[0]);
        }
    }
    HandshakeInitializationPacket handshakePacket = new HandshakeInitializationPacket();
    handshakePacket.fromBytes(body);
    // 记录一下connection
    connectionId = handshakePacket.threadId;
    logger.info("handshake initialization packet received, prepare the client authentication packet to send");
    ClientAuthenticationPacket clientAuth = new ClientAuthenticationPacket();
    clientAuth.setCharsetNumber(charsetNumber);
    clientAuth.setUsername(username);
    clientAuth.setPassword(password);
    clientAuth.setServerCapabilities(handshakePacket.serverCapabilities);
    clientAuth.setDatabaseName(defaultSchema);
    clientAuth.setScrumbleBuff(joinAndCreateScrumbleBuff(handshakePacket));
    byte[] clientAuthPkgBody = clientAuth.toBytes();
    HeaderPacket h = new HeaderPacket();
    h.setPacketBodyLength(clientAuthPkgBody.length);
    h.setPacketSequenceNumber((byte) (header.getPacketSequenceNumber() + 1));
    PacketManager.write(channel, new ByteBuffer[] { ByteBuffer.wrap(h.toBytes()), ByteBuffer.wrap(clientAuthPkgBody) });
    logger.info("client authentication packet is sent out.");
    // check auth result
    header = null;
    header = PacketManager.readHeader(channel, 4);
    body = null;
    body = PacketManager.readBytes(channel, header.getPacketBodyLength());
    assert body != null;
    if (body[0] < 0) {
        if (body[0] == -1) {
            ErrorPacket err = new ErrorPacket();
            err.fromBytes(body);
            throw new IOException("Error When doing Client Authentication:" + err.toString());
        } else if (body[0] == -2) {
            auth323(channel, header.getPacketSequenceNumber(), handshakePacket.seed);
        // throw new
        // IOException("Unexpected EOF packet at Client Authentication.");
        } else {
            throw new IOException("unpexpected packet with field_count=" + body[0]);
        }
    }
}
Also used : HeaderPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.HeaderPacket) ErrorPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket) ClientAuthenticationPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.client.ClientAuthenticationPacket) HandshakeInitializationPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.HandshakeInitializationPacket) IOException(java.io.IOException)

Example 2 with ErrorPacket

use of com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket in project canal by alibaba.

the class MysqlQueryExecutor method query.

/**
     * (Result Set Header Packet) the number of columns <br>
     * (Field Packets) column descriptors <br>
     * (EOF Packet) marker: end of Field Packets <br>
     * (Row Data Packets) row contents <br>
     * (EOF Packet) marker: end of Data Packets
     * 
     * @param queryString
     * @return
     * @throws IOException
     */
public ResultSetPacket query(String queryString) throws IOException {
    QueryCommandPacket cmd = new QueryCommandPacket();
    cmd.setQueryString(queryString);
    byte[] bodyBytes = cmd.toBytes();
    PacketManager.write(channel, bodyBytes);
    byte[] body = readNextPacket();
    if (body[0] < 0) {
        ErrorPacket packet = new ErrorPacket();
        packet.fromBytes(body);
        throw new IOException(packet + "\n with command: " + queryString);
    }
    ResultSetHeaderPacket rsHeader = new ResultSetHeaderPacket();
    rsHeader.fromBytes(body);
    List<FieldPacket> fields = new ArrayList<FieldPacket>();
    for (int i = 0; i < rsHeader.getColumnCount(); i++) {
        FieldPacket fp = new FieldPacket();
        fp.fromBytes(readNextPacket());
        fields.add(fp);
    }
    readEofPacket();
    List<RowDataPacket> rowData = new ArrayList<RowDataPacket>();
    while (true) {
        body = readNextPacket();
        if (body[0] == -2) {
            break;
        }
        RowDataPacket rowDataPacket = new RowDataPacket();
        rowDataPacket.fromBytes(body);
        rowData.add(rowDataPacket);
    }
    ResultSetPacket resultSet = new ResultSetPacket();
    resultSet.getFieldDescriptors().addAll(fields);
    for (RowDataPacket r : rowData) {
        resultSet.getFieldValues().addAll(r.getColumns());
    }
    resultSet.setSourceAddress(channel.socket().getRemoteSocketAddress());
    return resultSet;
}
Also used : ResultSetHeaderPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetHeaderPacket) QueryCommandPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.client.QueryCommandPacket) ErrorPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket) RowDataPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.RowDataPacket) ResultSetPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetPacket) ArrayList(java.util.ArrayList) IOException(java.io.IOException) FieldPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.FieldPacket)

Example 3 with ErrorPacket

use of com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket in project canal by alibaba.

the class MysqlConnector method auth323.

private void auth323(SocketChannel channel, byte packetSequenceNumber, byte[] seed) throws IOException {
    // auth 323
    Reply323Packet r323 = new Reply323Packet();
    if (password != null && password.length() > 0) {
        r323.seed = MySQLPasswordEncrypter.scramble323(password, new String(seed)).getBytes();
    }
    byte[] b323Body = r323.toBytes();
    HeaderPacket h323 = new HeaderPacket();
    h323.setPacketBodyLength(b323Body.length);
    h323.setPacketSequenceNumber((byte) (packetSequenceNumber + 1));
    PacketManager.write(channel, new ByteBuffer[] { ByteBuffer.wrap(h323.toBytes()), ByteBuffer.wrap(b323Body) });
    logger.info("client 323 authentication packet is sent out.");
    // check auth result
    HeaderPacket header = PacketManager.readHeader(channel, 4);
    byte[] body = PacketManager.readBytes(channel, header.getPacketBodyLength());
    assert body != null;
    switch(body[0]) {
        case 0:
            break;
        case -1:
            ErrorPacket err = new ErrorPacket();
            err.fromBytes(body);
            throw new IOException("Error When doing Client Authentication:" + err.toString());
        default:
            throw new IOException("unpexpected packet with field_count=" + body[0]);
    }
}
Also used : HeaderPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.HeaderPacket) ErrorPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket) Reply323Packet(com.alibaba.otter.canal.parse.driver.mysql.packets.server.Reply323Packet) IOException(java.io.IOException)

Example 4 with ErrorPacket

use of com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket in project canal by alibaba.

the class MysqlUpdateExecutor method update.

public OKPacket update(String updateString) throws IOException {
    QueryCommandPacket cmd = new QueryCommandPacket();
    cmd.setQueryString(updateString);
    byte[] bodyBytes = cmd.toBytes();
    PacketManager.write(channel, bodyBytes);
    logger.debug("read update result...");
    byte[] body = PacketManager.readBytes(channel, PacketManager.readHeader(channel, 4).getPacketBodyLength());
    if (body[0] < 0) {
        ErrorPacket packet = new ErrorPacket();
        packet.fromBytes(body);
        throw new IOException(packet + "\n with command: " + updateString);
    }
    OKPacket packet = new OKPacket();
    packet.fromBytes(body);
    return packet;
}
Also used : QueryCommandPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.client.QueryCommandPacket) ErrorPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket) IOException(java.io.IOException) OKPacket(com.alibaba.otter.canal.parse.driver.mysql.packets.server.OKPacket)

Aggregations

ErrorPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.ErrorPacket)4 IOException (java.io.IOException)4 HeaderPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.HeaderPacket)2 QueryCommandPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.client.QueryCommandPacket)2 ClientAuthenticationPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.client.ClientAuthenticationPacket)1 FieldPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.FieldPacket)1 HandshakeInitializationPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.HandshakeInitializationPacket)1 OKPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.OKPacket)1 Reply323Packet (com.alibaba.otter.canal.parse.driver.mysql.packets.server.Reply323Packet)1 ResultSetHeaderPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetHeaderPacket)1 ResultSetPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.ResultSetPacket)1 RowDataPacket (com.alibaba.otter.canal.parse.driver.mysql.packets.server.RowDataPacket)1 ArrayList (java.util.ArrayList)1