package com.tesora.dve.sql.statement.session;
/*
* #%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 org.apache.commons.lang.BooleanUtils;
import com.tesora.dve.exceptions.PEException;
import com.tesora.dve.sql.SchemaException;
import com.tesora.dve.sql.ParserException.Pass;
import com.tesora.dve.sql.schema.PEStorageGroup;
import com.tesora.dve.sql.schema.SchemaContext;
import com.tesora.dve.sql.statement.StatementType;
import com.tesora.dve.sql.transform.behaviors.BehaviorConfiguration;
import com.tesora.dve.sql.transform.execution.ExecutionSequence;
import com.tesora.dve.sql.transform.execution.SessionExecutionStep;
public class ShowPassthroughStatement extends SessionStatement {
public enum PassThroughCommandType {
UNKNOWN("UNKNOWN", null),
PLUGINS("PLUGINS", false),
MASTERLOGS("MASTER LOGS", null),
MASTERSTATUS("MASTER STATUS", null),
SLAVESTATUS("SLAVE STATUS", null),
GRANTS("GRANTS", false) // requires no privilege for any user
;
private final String sqlCommand;
private final Boolean overridePrivilege;
private PassThroughCommandType(String command, Boolean overridePrivilege) {
this.sqlCommand = command;
this.overridePrivilege = overridePrivilege;
}
public String getSqlCommand() {
return sqlCommand;
}
public Boolean getOverridePrivilege() {
return overridePrivilege;
}
}
private boolean allSites = true;
private Boolean full = null;
private PassThroughCommandType command = PassThroughCommandType.UNKNOWN;
public ShowPassthroughStatement(PassThroughCommandType command, boolean allSites, Boolean full) {
super();
this.command = command;
this.allSites = allSites;
this.full = full;
}
public boolean hasFullSpec() {
return full != null;
}
public boolean isFull() {
return BooleanUtils.isTrue(full);
}
@Override
public void plan(SchemaContext pc, ExecutionSequence es, BehaviorConfiguration config) throws PEException {
// definitely not a passthrough - instead we want to send this down to all persistent sites
// or maybe all sites
PEStorageGroup sg = (allSites ? buildAllSitesGroup(pc,command.getOverridePrivilege()) : buildOneSiteGroup(pc,command.getOverridePrivilege()));
// schedule as a qso:selectall - this won't work right, but in the future we're going to fix this
// to also include the host
es.append(new SessionExecutionStep(null, sg, getSQL(pc)));
}
public PassThroughCommandType getCommand() {
return command;
}
public String emitShowSql() {
StringBuffer buf = new StringBuffer();
switch(command) {
case GRANTS:
case MASTERLOGS:
case MASTERSTATUS:
case SLAVESTATUS:
case PLUGINS:
buf.append("SHOW ").append(command.getSqlCommand());
break;
default:
throw new SchemaException(Pass.PLANNER, "No support for SHOW command: " + command.getSqlCommand());
}
return buf.toString();
}
@Override
public StatementType getStatementType() {
StatementType st = super.getStatementType();
switch(command) {
case GRANTS:
st = StatementType.SHOW_GRANTS;
break;
case MASTERLOGS:
case MASTERSTATUS:
st = StatementType.SHOW_MASTER_STATUS;
break;
case SLAVESTATUS:
st = StatementType.SHOW_SLAVE_STATUS;
break;
case PLUGINS:
st = StatementType.SHOW_PLUGINS;
break;
default:
break;
}
return st;
}
}