package io.mycat.sqlengine; import io.mycat.server.packet.FieldPacket; import io.mycat.server.packet.RowDataPacket; import java.util.HashMap; import java.util.List; import java.util.Map; public class OneRawSQLQueryResultHandler implements SQLJobHandler { private Map<String, Integer> fetchColPosMap; private final SQLQueryResultListener<SQLQueryResult<Map<String, String>>> callback; private final String[] fetchCols; private int fieldCount = 0; private Map<String, String> result ; public OneRawSQLQueryResultHandler(String[] fetchCols, SQLQueryResultListener<SQLQueryResult<Map<String, String>>> callBack) { this.fetchCols = fetchCols; this.callback = callBack; } public void onHeader(String dataNode, byte[] header, List<byte[]> fields) { fieldCount = fields.size(); fetchColPosMap = new HashMap<String, Integer>(); for (String watchFd : fetchCols) { for (int i = 0; i < fieldCount; i++) { byte[] field = fields.get(i); FieldPacket fieldPkg = new FieldPacket(); fieldPkg.read(field); String fieldName = new String(fieldPkg.name); if (watchFd.equalsIgnoreCase(fieldName)) { fetchColPosMap.put(fieldName, i); } } } } @Override public boolean onRowData(String dataNode, byte[] rowData) { RowDataPacket rowDataPkg = new RowDataPacket(fieldCount); rowDataPkg.read(rowData); result = new HashMap<String, String>(); for (String fetchCol : fetchCols) { Integer ind = fetchColPosMap.get(fetchCol); if (ind != null) { byte[] columnData = rowDataPkg.fieldValues.get(ind); String columnVal = columnData!=null?new String(columnData):null; result.put(fetchCol, columnVal); } else { LOGGER.warn("cant't find column in sql query result " + fetchCol); } } // 返回false,表示还有数据要处理,数据处理没有结束; // 如果返回true,连接会被SQLJob关闭:conn.close("not needed by user proc") // 对应的各种资源:socketchannel,read buffer,write buffer等都会被回收,连接会被从连接池中删除 return false; } @Override public void finished(String dataNode, boolean failed) { SQLQueryResult<Map<String, String>> queryResult= new SQLQueryResult<Map<String, String>>(this.result, !failed, dataNode); this.callback.onResult(queryResult); } // 子类 MultiRowSQLQueryResultHandler 需要使用 protected Map<String, String> getResult() { return result; } }