/*
* Copyright 2012 NGDATA nv
*
* Licensed 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.lilyproject.repository.cli;
import java.io.IOException;
import java.util.List;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.lilyproject.repository.api.TableCreateDescriptor;
import org.lilyproject.repository.api.TableManager;
import org.lilyproject.util.hbase.TableConfig;
/**
* Command-line utility for creating new record tables in Lily.
*/
public class CreateTableCli extends BaseTableCliTool {
private Option regionCountOpt;
private Option splitKeyPrefixOpt;
private Option splitKeysOpt;
private TableCreateDescriptor createDescriptor;
@SuppressWarnings("static-access")
public CreateTableCli() {
regionCountOpt = OptionBuilder.withArgName("regions").hasArg().withDescription(
"Number of initial regions to create").withLongOpt("regions").create("c");
splitKeyPrefixOpt = OptionBuilder.withArgName("prefix").hasArg().withDescription(
"Key prefix to append to each region split").withLongOpt("prefix").create("p");
splitKeysOpt = OptionBuilder.withArgName("keys").hasArg().withDescription(
"Comma-separated list of split keys to be used for pre-creating region splits").withLongOpt("keys").create(
"k");
}
@Override
protected String getCmdName() {
return "lily-create-table";
}
@Override
public List<Option> getOptions() {
List<Option> options = super.getOptions();
options.add(regionCountOpt);
options.add(splitKeyPrefixOpt);
options.add(splitKeysOpt);
return options;
}
@Override
protected int processOptions(CommandLine cmd) throws Exception {
int result = super.processOptions(cmd);
if (result != 0) {
return result;
}
if (cmd.getArgList().size() < 1) {
System.err.println("Table name is mandatory");
return 1;
}
String tableName = (String)cmd.getArgList().get(0);
int regionCount = -1;
if (cmd.hasOption(regionCountOpt.getOpt())) {
try {
regionCount = Integer.parseInt(cmd.getOptionValue(regionCountOpt.getOpt()));
} catch (NumberFormatException e) {
System.err.println("Region count must be an integer greater than 0");
return 1;
}
}
String splitKeyPrefix = null;
if (cmd.hasOption(splitKeyPrefixOpt.getOpt())) {
splitKeyPrefix = cmd.getOptionValue(splitKeyPrefixOpt.getOpt());
}
String splitKeys = null;
if (cmd.hasOption(splitKeysOpt.getOpt())) {
splitKeys = cmd.getOptionValue(splitKeysOpt.getOpt());
}
if (regionCount != -1 && splitKeys != null) {
System.err.println("Region count and split keys cannot be combined, region count will be ignored");
}
if (splitKeys != null) {
byte[][] parsedSplitKeys = TableConfig.parseSplitKeys(null, splitKeys, splitKeyPrefix);
createDescriptor = new TableCreateDescriptor(tableName, parsedSplitKeys);
} else if (regionCount != -1) {
byte[][] parsedSplitKeys = TableConfig.parseSplitKeys(regionCount, null, splitKeyPrefix);
createDescriptor = new TableCreateDescriptor(tableName, parsedSplitKeys);
} else {
createDescriptor = new TableCreateDescriptor(tableName);
}
return 0;
}
@Override
protected int execute(TableManager tableManager) throws InterruptedException, IOException {
byte[][] splitKeys = createDescriptor.getSplitKeys();
int numRegions = splitKeys != null ? splitKeys.length + 1 : 1;
System.out.printf("Creating table '%s' with %d region%s...\n", createDescriptor.getName(), numRegions,
numRegions == 1 ? "" : "s");
tableManager.createTable(createDescriptor);
System.out.printf("Table '%s' in repository '%s' created\n", createDescriptor.getName(), repositoryName);
return 0;
}
public static void main(String[] args) {
new CreateTableCli().start(args);
}
}