package me.xcoding.opencdc.net.connector.intern;
import java.io.IOException;
import java.net.Socket;
import javax.net.SocketFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import me.xcoding.opencdc.binlog.EventContext;
import me.xcoding.opencdc.binlog.EventMaker;
import me.xcoding.opencdc.binlog.event.Event;
import me.xcoding.opencdc.binlog.event.EventHeader;
import me.xcoding.opencdc.binlog.parser.EventHeaderParser;
import me.xcoding.opencdc.mysql.protocol.BasicReader;
import me.xcoding.opencdc.mysql.protocol.CapabilityFlags;
import me.xcoding.opencdc.mysql.protocol.DumpBinLog;
import me.xcoding.opencdc.mysql.protocol.HandshakeResponse;
import me.xcoding.opencdc.mysql.protocol.HandshakeV10;
import me.xcoding.opencdc.mysql.protocol.ReadablePacket;
import me.xcoding.opencdc.mysql.protocol.WritablePcaket;
import me.xcoding.opencdc.net.ConnectorContext;
import me.xcoding.opencdc.net.connector.ConnectionException;
import me.xcoding.opencdc.net.connector.IDumpConnector;
import me.xcoding.opencdc.net.connector.SocketReader;
import me.xcoding.opencdc.net.connector.SocketWriter;
import me.xcoding.opencdc.net.packet.generic.GenericPacket;
import me.xcoding.opencdc.net.packet.generic.OKPacket;
import me.xcoding.opencdc.utils.MySQLUtils;
public class DumpConnector implements IDumpConnector {
private static final Logger logger = LoggerFactory.getLogger(DumpConnector.class);
private static final SocketFactory socketFactory = null;
private static final int FF = 0x000000FF;
private final ConnectorContext context;
private HandshakeV10 v10 = null;
public DumpConnector(ConnectorContext context) {
this.context = context;
}
SocketReader reader = null;
SocketWriter writer = null;
@Override
public void connection(String host, int port) throws ConnectionException {
try {
Socket socket = new Socket("localhost", 3306);// host, port);//socketFactory.createSocket(host, port);
reader = new SocketReader(socket.getInputStream());
writer = new SocketWriter(socket.getOutputStream());
ReadablePacket p = reader.buildPacket();
v10 = new HandshakeV10(p);
} catch (IOException e) { // FIXME
logger.error("", e);
}
}
public static void main(String[] args) throws ConnectionException {
DumpConnector connector = new DumpConnector(null);
connector.connection("localhost", 3306);
connector.login("root", "root");
connector.dumpBinlog();
try {
connector.run();
} catch (IOException e) {
logger.error("", e);
}
}
@Override
public void login(String username, String password) throws ConnectionException {
HandshakeResponse response = new HandshakeResponse(writer);
try {
// FIXME
byte[] pwd = MySQLUtils.password41OrLater(password.getBytes(), v10.auth_plugin_data_part);
response.setUsername(username.getBytes())
.setAuth_response(pwd)
.setCapabilityFlags((v10.getCapabilities() & CapabilityFlags.CLIENT_SECURE_CONNECTION | CapabilityFlags.CLIENT_PROTOCOL_41 ))
.setMax_packet_size(0)
.setCharacter_size(v10.getCharacter_set())
.flush();
GenericPacket packet = reader.getResponsePacket();
} catch (IOException e) {
logger.error("", e);
}
}
@Override
public void dumpBinlog() throws ConnectionException {
DumpBinLog binlog = new DumpBinLog(writer);
try {
binlog.setServerId(3456)
.setBinLogPos(4)
.setFilename("mysql-bin.000021")
.flush();
GenericPacket p = reader.getResponsePacket();
System.out.println(p instanceof OKPacket);
} catch (IOException e) {
logger.error("", e);
}
}
public void run() throws IOException {
EventContext context = new EventContext();
while(reader.hasNext()) {
BasicReader packet = reader.buildPacket();
packet.readFixedIntS1();
EventHeader h = new EventHeaderParser().parser(context, reader);
Event e = EventMaker.parser(context, h.typeCode, reader);
System.out.println(e);
}
}
public final DumpBinLog readPacket() {
return null;
}
@Override
public void write(ReadablePacket packet) throws ConnectionException {
}
@Override
public ReadablePacket read() throws ConnectionException {
return null;
}
@Override
public void write(WritablePcaket packet) throws ConnectionException {
// TODO Auto-generated method stub
}
}