/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.tajo.client;
import com.google.common.collect.Lists;
import com.google.protobuf.ServiceException;
import org.apache.commons.cli.*;
import org.apache.tajo.catalog.DDLBuilder;
import org.apache.tajo.catalog.TableDesc;
import org.apache.tajo.conf.TajoConf;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
public class TajoDump {
private static final org.apache.commons.cli.Options options;
static {
options = new Options();
options.addOption("h", "host", true, "Tajo server host");
options.addOption("p", "port", true, "Tajo server port");
options.addOption("a", "all", false, "dump all table DDLs");
}
private static void printUsage() {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "tajo_dump [options] [table_name]", options );
}
public static void main(String [] args) throws ParseException, IOException, ServiceException, SQLException {
TajoConf conf = new TajoConf();
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
String hostName = null;
Integer port = null;
if (cmd.hasOption("h")) {
hostName = cmd.getOptionValue("h");
}
if (cmd.hasOption("p")) {
port = Integer.parseInt(cmd.getOptionValue("p"));
}
// if there is no "-h" option,
if(hostName == null) {
if (conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) {
// it checks if the client service address is given in configuration and distributed mode.
// if so, it sets entryAddr.
hostName = conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0];
}
}
if (port == null) {
if (conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) {
// it checks if the client service address is given in configuration and distributed mode.
// if so, it sets entryAddr.
port = Integer.parseInt(conf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]);
}
}
TajoClient client = null;
if ((hostName == null) ^ (port == null)) {
System.err.println("ERROR: cannot find valid Tajo server address");
System.exit(-1);
} else if (hostName != null && port != null) {
conf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName+":"+port);
client = new TajoClient(conf);
} else if (hostName == null && port == null) {
client = new TajoClient(conf);
}
List<TableDesc> tableDescList = Lists.newArrayList();
if (cmd.hasOption("a")) {
for (String tableName : client.getTableList()) {
tableDescList.add(client.getTableDesc(tableName));
}
} else if (cmd.getArgs().length > 0) {
for (String tableName : cmd.getArgs()) {
tableDescList.add(client.getTableDesc(tableName));
}
} else {
printUsage();
}
Writer writer = new PrintWriter(System.out);
writer.write("--\n");
writer.write("-- Tajo database dump\n");
writer.write("-- Dump date: " + toDateString() + "\n");
writer.write("--\n");
writer.write("\n");
for (TableDesc tableDesc : tableDescList) {
writer.write(DDLBuilder.buildDDL(tableDesc));
writer.write("\n\n");
}
writer.flush();
writer.close();
System.exit(0);
}
private static String toDateString() {
DateFormat df = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
java.util.Date today = Calendar.getInstance().getTime();
return df.format(today);
}
}