public static void main(String[] args)
      throws IOException, ConfigParser.NoSectionException, ConfigParser.NoOptionException,
          ConfigParser.InterpolationException {
    if (args.length != 1) {
      System.out.println("usage: java -jar CreateOtsTable.jar config.ini");
    }
    ConfigParser configParser = new ConfigParser();
    configParser.read(new File(args[0]));

    OTS ots =
        new OTSClient(
            configParser.get("ots", "endpoint"),
            configParser.get("ots", "accessid"),
            configParser.get("ots", "accesskey"),
            configParser.get("ots", "instance_name"));

    String otsTableName = configParser.get("ots", "table_name");

    TableMeta tableMeta = new TableMeta(otsTableName);
    tableMeta.addPrimaryKeyColumn("PK", PrimaryKeyType.STRING);
    CreateTableRequest createTableRequest = new CreateTableRequest(tableMeta);
    createTableRequest.setReservedThroughput(
        new CapacityUnit(
            configParser.getInt("ots", "read_cu"), configParser.getInt("ots", "write_cu")));
    ots.createTable(createTableRequest);
    ots.shutdown();
  }
  @Override
  public RowPrimaryKey call() throws Exception {
    RowPrimaryKey ret = new RowPrimaryKey();
    GetRangeRequest request = new GetRangeRequest();
    request.setRangeRowQueryCriteria(criteria);
    GetRangeResult result = ots.getRange(request);
    List<Row> rows = result.getRows();
    if (rows.isEmpty()) {
      return null; // no data
    }
    Row row = rows.get(0);

    Map<String, PrimaryKeyType> pk = meta.getPrimaryKey();
    for (String key : pk.keySet()) {
      ColumnValue v = row.getColumns().get(key);
      if (v.getType() == ColumnType.INTEGER) {
        ret.addPrimaryKeyColumn(key, PrimaryKeyValue.fromLong(v.asLong()));
      } else {
        ret.addPrimaryKeyColumn(key, PrimaryKeyValue.fromString(v.asString()));
      }
    }
    return ret;
  }