package io.mycat.server.packet.util; import io.mycat.MycatServer; import io.mycat.backend.nio.MySQLBackendConnection; import io.mycat.net.BufferArray; import io.mycat.net.NetSystem; import io.mycat.route.RouteResultsetNode; import io.mycat.server.packet.BinaryPacket; import io.mycat.sqlengine.mpp.LoadData; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * Created by nange on 2015/3/31. */ public class LoadDataUtil { public static void requestFileDataResponse(byte[] data, MySQLBackendConnection conn) { byte packId = data[3]; MySQLBackendConnection backendAIOConnection = (MySQLBackendConnection) conn; RouteResultsetNode rrn = (RouteResultsetNode) conn.getAttachment(); LoadData loadData = rrn.getLoadData(); List<String> loadDataData = loadData.getData(); try { if (loadDataData != null && loadDataData.size() > 0) { ByteArrayOutputStream bos = new ByteArrayOutputStream(); for (int i = 0, loadDataDataSize = loadDataData.size(); i < loadDataDataSize; i++) { String line = loadDataData.get(i); String s = (i == loadDataDataSize - 1) ? line : line + loadData.getLineTerminatedBy(); byte[] bytes = s.getBytes(loadData.getCharset()); bos.write(bytes); } packId = writeToBackConnection(packId, new ByteArrayInputStream(bos.toByteArray()), backendAIOConnection); } else { // 从文件读取 packId = writeToBackConnection(packId, new BufferedInputStream( new FileInputStream(loadData.getFileName())), backendAIOConnection); } } catch (IOException e) { throw new RuntimeException(e); } finally { // 结束必须发空包 byte[] empty = new byte[] { 0, 0, 0, 3 }; empty[3] = ++packId; backendAIOConnection.write(empty); } } public static byte writeToBackConnection(byte packID, InputStream inputStream, MySQLBackendConnection backendAIOConnection) throws IOException { try { int packSize = MycatServer.getInstance().getConfig().getSystem() .getProcessorBufferChunk() - 5; // int packSize = backendAIOConnection.getMaxPacketSize() / 32; // int packSize=65530; byte[] buffer = new byte[packSize]; int len = -1; BufferArray bufferArray = NetSystem.getInstance().getBufferPool() .allocateArray(); while ((len = inputStream.read(buffer)) != -1) { byte[] temp = null; if (len == packSize) { temp = buffer; } else { temp = new byte[len]; System.arraycopy(buffer, 0, temp, 0, len); } BinaryPacket packet = new BinaryPacket(); packet.packetId = ++packID; packet.data = temp; packet.write(bufferArray); if (bufferArray.getBlockCount() == 5) { backendAIOConnection.write(bufferArray); bufferArray = NetSystem.getInstance().getBufferPool() .allocateArray(); } } //write last backendAIOConnection.write(bufferArray); } finally { inputStream.close(); } return packID; } }