package org.apache.fullmatix.mysql.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.fullmatix.mysql.ConnectionURLProvider;
import org.apache.fullmatix.mysql.MySQLConstants;
import org.apache.helix.ZNRecord;
import org.apache.helix.model.InstanceConfig;
import org.apache.log4j.Logger;
/**
* Cluster aware mysql client.
* Given a database, table, partition and a sql, runs the sql on the node that is currently the
* MASTER for
* that database partition
*/
public class MySQLClusterClient {
private static final Logger LOG = Logger.getLogger(MySQLClusterClient.class);
/**
* USAGE MySQLClusterClient zkAddress clusterName database partitionId Query
* @param args
* @throws Exception
*/
@SuppressWarnings("static-access")
public static void main(String[] args) throws Exception {
Option zkServerOption =
OptionBuilder.withLongOpt("zkAddress").withDescription("zookeeper address").create();
zkServerOption.setArgs(1);
zkServerOption.setRequired(true);
zkServerOption.setArgName("zookeeperAddress(Required)");
Option clusterNameOption =
OptionBuilder.withLongOpt("cluster").withDescription("Cluster Name").create();
clusterNameOption.setArgs(1);
clusterNameOption.setRequired(true);
clusterNameOption.setArgName("clusterName(Required)");
Option dbNameOption =
OptionBuilder.withLongOpt("database").withDescription("Database Name").create();
dbNameOption.setArgs(1);
dbNameOption.setRequired(true);
dbNameOption.setArgName("databaseName(Required)");
Option partitionOption =
OptionBuilder.withLongOpt("partitionId").withDescription("Partition Id").create();
partitionOption.setArgs(1);
partitionOption.setRequired(true);
partitionOption.setArgName("partitionId(Required)");
Option queryOption = OptionBuilder.withLongOpt("sql").withDescription("sql").create();
queryOption.setArgs(1);
queryOption.setRequired(true);
queryOption.setArgName("sql(Required)");
Options options = new Options();
options.addOption(zkServerOption);
options.addOption(clusterNameOption);
options.addOption(dbNameOption);
options.addOption(partitionOption);
options.addOption(queryOption);
CommandLine cliParser = new GnuParser().parse(options, args);
String zkAddress = cliParser.getOptionValue("zkAddress");
String cluster = cliParser.getOptionValue("cluster");
String database = cliParser.getOptionValue("database");
String table = cliParser.getOptionValue("database");
int partitionId = Integer.parseInt(cliParser.getOptionValue("partitionId"));
String sql = cliParser.getOptionValue("sql");
ConnectionURLProvider connectionURLProvider = new ConnectionURLProvider(zkAddress, cluster);
connectionURLProvider.start();
InstanceConfig instanceConfig = connectionURLProvider.getMaster(database, partitionId);
String host = instanceConfig.getHostName();
ZNRecord record = instanceConfig.getRecord();
String port = record.getSimpleField(MySQLConstants.MYSQL_PORT);
String userName = record.getSimpleField(MySQLConstants.MYSQL_SUPER_USER);
String password = record.getSimpleField(MySQLConstants.MYSQL_SUPER_PASSWORD);
Connection connection =
DriverManager.getConnection("jdbc:mysql://" + host + ":" + port + "", userName, password);
connection.setAutoCommit(true);
connection.setCatalog(database +"_"+ partitionId);
Statement statement = connection.createStatement();
boolean execute = statement.execute(sql);
if (execute) {
ResultSet rs = statement.getResultSet();
ResultSetMetaData rsmd = rs.getMetaData();
int columnsNumber = rsmd.getColumnCount();
StringBuilder sb = new StringBuilder();
while (rs.next()) {
for (int i = 1; i <= columnsNumber; i++) {
if (i > 1)
sb.append(", ");
String columnValue = rs.getString(i);
sb.append(rsmd.getColumnName(i)+ " " + columnValue );
}
sb.append("\n");
}
LOG.info(sb);
} else {
LOG.info("Executed sql:" + sql + " on " + instanceConfig.getInstanceName());
}
connectionURLProvider.stop();
}
}