package com.tesora.dve.worker; /* * #%L * Tesora Inc. * Database Virtualization Engine * %% * Copyright (C) 2011 - 2014 Tesora Inc. * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * #L% */ import com.tesora.dve.concurrent.CompletionHandle; import com.tesora.dve.db.CommandChannel; import com.tesora.dve.db.mysql.FieldMetadataAdapter; import com.tesora.dve.db.mysql.MysqlMessage; import com.tesora.dve.db.mysql.libmy.*; import com.tesora.dve.db.mysql.portal.protocol.MSPComQueryRequestMessage; import com.tesora.dve.exceptions.PECodingException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import com.tesora.dve.db.mysql.MysqlExecuteCommand; import com.tesora.dve.exceptions.PEException; import com.tesora.dve.resultset.ColumnInfo; import com.tesora.dve.resultset.ColumnMetadata; import com.tesora.dve.resultset.ColumnSet; import com.tesora.dve.resultset.ResultColumn; import com.tesora.dve.resultset.ResultRow; import com.tesora.dve.server.messaging.SQLCommand; public class MysqlTextResultCollector extends MysqlParallelResultConsumer { boolean needsMetadata = false; private int fieldCount; protected ColumnSet columnSet = null; List<ArrayList<String>> rowData = null; private boolean moreData = true; protected byte sequenceId = 0; private long resultsLimit = Long.MAX_VALUE; public MysqlTextResultCollector() { super.setSenderCount(1); } public MysqlTextResultCollector(boolean needsMetadata) { this(); this.needsMetadata = needsMetadata; } // public MysqlResultCollector(WorkerGroup wg) { // super.setSenderCount(wg.size()); // } @Override public void consumeEmptyResultSet(MyOKResponse ok) { moreData = false; } @Override public void consumeError(MyErrorResponse errorResp) throws PEException { throw errorResp.asException(); } @Override public void consumeFieldCount(MyColumnCount colCount) { this.fieldCount = colCount.getColumnCount(); if (needsMetadata) { columnSet = new ColumnSet(); } } @Override public void consumeField(int field_, MyFieldPktResponse columnDef, ColumnInfo columnInfo) { if (needsMetadata) { ColumnMetadata columnMeta = FieldMetadataAdapter.buildMetadata(columnDef); if (columnInfo != null) { columnMeta.setName(columnInfo.getName()); columnMeta.setAliasName(columnInfo.getAlias()); } columnSet.addColumn(columnMeta); } } @Override public void consumeFieldEOF(MyMessage unknown) { // no nothing ? } public void consumeRowText(MyTextResultRow textRow) { if (getRowDataList().size() >= resultsLimit) return; ArrayList<String> row = new ArrayList<String>(fieldCount); for (int i=0;i< textRow.size();i++){ row.add(textRow.getString(i)); } getRowDataList().add(row); } @Override public void consumeRowBinary(MyBinaryResultRow binRow) throws PEException { throw new PECodingException("Didn't expect binary results in " + this.getClass().getSimpleName()); } @Override public void consumeRowEOF() { setNumRowsAffected(getRowData().size()); moreData = false; } protected List<ArrayList<String>> getRowDataList() { if (rowData == null) rowData = new LinkedList<ArrayList<String>>(); return rowData; } public int getFieldCount() { return fieldCount; } public List<ArrayList<String>> getRowData() { return getRowDataList(); } public boolean isMoreData() { return moreData; } public byte getSequenceId() { return sequenceId; } @Override public void setResultsLimit(long resultsLimit) { this.resultsLimit = resultsLimit; } @Override public void inject(ColumnSet metadata, List<ResultRow> rows) throws PEException { for (ResultRow row : rows) { List<ResultColumn> colData = row.getRow(); ArrayList<String> newRowData = new ArrayList<String>(colData.size()); for (ResultColumn col : colData) { newRowData.add(col.toString()); } getRowData().add(newRowData); if (rows.size() >= resultsLimit) break; } setNumRowsAffected(rows.size()); setHasResults(); } public void printRows() { // for(ArrayList<String> row : rowData) { // for (String val : row) { // System.out.print(val + '\t'); // } // System.out.println(); // } } @Override public Bundle getDispatchBundle(CommandChannel channel, SQLCommand sql, CompletionHandle<Boolean> promise) { MysqlMessage message = MSPComQueryRequestMessage.newMessage(sql.getBytes()); return new Bundle(message, new MysqlExecuteCommand(sql, channel.getMonitor(), this, promise) ); } public ColumnSet getColumnSet() { return columnSet; } public long getResultsLimit() { return resultsLimit; } @Override public void setNumRowsAffected(long numRowsAffected) { super.setNumRowsAffected(numRowsAffected); } }