Updated Branches: refs/heads/cassandra-1.0 333e7ace0 -> 2216a3dce
make CLI `show schema` to use output stream directly instead of StringBuilder patch by Pavel Yaskevich; reviewed by Brandon Williams for CASSANDRA-3842 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/2216a3dc Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/2216a3dc Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/2216a3dc Branch: refs/heads/cassandra-1.0 Commit: 2216a3dce05e5b91c99b0aa98d2c1ce588f665df Parents: 333e7ac Author: Pavel Yaskevich <xe...@apache.org> Authored: Tue Feb 7 23:01:19 2012 +0300 Committer: Pavel Yaskevich <xe...@apache.org> Committed: Tue Feb 7 23:45:24 2012 +0300 ---------------------------------------------------------------------- CHANGES.txt | 2 + src/java/org/apache/cassandra/cli/CliClient.java | 171 +++++++++-------- 2 files changed, 92 insertions(+), 81 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/2216a3dc/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 27831ba..a8b87f1 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -13,6 +13,8 @@ * add optional socket timeout for streaming (CASSANDRA-3838) * fix truncate not to leave behind non-CFS backed secondary indexes (CASSANDRA-3844) + * make CLI `show schema` to use output stream directly instead + of StringBuilder (CASSANDRA-3842) Merged from 0.8: * (Pig) fix CassandraStorage to use correct comparator in Super ColumnFamily case (CASSANDRA-3251) http://git-wip-us.apache.org/repos/asf/cassandra/blob/2216a3dc/src/java/org/apache/cassandra/cli/CliClient.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cli/CliClient.java b/src/java/org/apache/cassandra/cli/CliClient.java index 6b1e637..ab48b51 100644 --- a/src/java/org/apache/cassandra/cli/CliClient.java +++ b/src/java/org/apache/cassandra/cli/CliClient.java @@ -19,8 +19,7 @@ package org.apache.cassandra.cli; import java.io.IOException; import java.io.InputStream; -import java.net.InetAddress; -import java.net.UnknownHostException; +import java.io.PrintStream; import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.util.*; @@ -1574,24 +1573,23 @@ public class CliClient else ksIter = keyspaces.iterator(); - - final StringBuilder sb = new StringBuilder(); while (ksIter.hasNext()) - showKeyspace(sb, ksIter.next()); + showKeyspace(sessionState.out, ksIter.next()); - sessionState.out.printf(sb.toString()); + sessionState.out.flush(); } /** * Creates a CLI script to create the Keyspace it's Column Families - * @param sb StringBuilder to write to. + * + * @param output StringBuilder to write to. * @param ksDef KsDef to create the cli script for. */ - private void showKeyspace(StringBuilder sb, KsDef ksDef) + private void showKeyspace(PrintStream output, KsDef ksDef) { - sb.append("create keyspace " + ksDef.name); + output.append("create keyspace ").append(ksDef.name); - writeAttr(sb, true, "placement_strategy", normaliseType(ksDef.strategy_class, "org.apache.cassandra.locator")); + writeAttr(output, true, "placement_strategy", normaliseType(ksDef.strategy_class, "org.apache.cassandra.locator")); if (ksDef.strategy_options != null && !ksDef.strategy_options.isEmpty()) { @@ -1604,57 +1602,58 @@ public class CliClient prefix = ", "; } opts.append("}"); - writeAttrRaw(sb, false, "strategy_options", opts.toString()); + writeAttrRaw(output, false, "strategy_options", opts.toString()); } - writeAttr(sb, false, "durable_writes", ksDef.durable_writes); + writeAttr(output, false, "durable_writes", ksDef.durable_writes); - sb.append(";" + NEWLINE); - sb.append(NEWLINE); + output.append(";").append(NEWLINE); + output.append(NEWLINE); - sb.append("use " + ksDef.name + ";"); - sb.append(NEWLINE); - sb.append(NEWLINE); + output.append("use " + ksDef.name + ";"); + output.append(NEWLINE); + output.append(NEWLINE); Collections.sort(ksDef.cf_defs, new CfDefNamesComparator()); for (CfDef cfDef : ksDef.cf_defs) - showColumnFamily(sb, cfDef); - sb.append(NEWLINE); - sb.append(NEWLINE); + showColumnFamily(output, cfDef); + output.append(NEWLINE); + output.append(NEWLINE); } /** * Creates a CLI script for the CfDef including meta data to the supplied StringBuilder. - * @param sb - * @param cfDef + * + * @param output File to write to. + * @param cfDef CfDef to export attributes from. */ - private void showColumnFamily(StringBuilder sb, CfDef cfDef) + private void showColumnFamily(PrintStream output, CfDef cfDef) { - sb.append("create column family " + CliUtils.escapeSQLString(cfDef.name)); + output.append("create column family ").append(CliUtils.escapeSQLString(cfDef.name)); - writeAttr(sb, true, "column_type", cfDef.column_type); - writeAttr(sb, false, "comparator", normaliseType(cfDef.comparator_type, "org.apache.cassandra.db.marshal")); + writeAttr(output, true, "column_type", cfDef.column_type); + writeAttr(output, false, "comparator", normaliseType(cfDef.comparator_type, "org.apache.cassandra.db.marshal")); if (cfDef.column_type.equals("Super")) - writeAttr(sb, false, "subcomparator", normaliseType(cfDef.subcomparator_type, "org.apache.cassandra.db.marshal")); + writeAttr(output, false, "subcomparator", normaliseType(cfDef.subcomparator_type, "org.apache.cassandra.db.marshal")); if (!StringUtils.isEmpty(cfDef.default_validation_class)) - writeAttr(sb, false, "default_validation_class", + writeAttr(output, false, "default_validation_class", normaliseType(cfDef.default_validation_class, "org.apache.cassandra.db.marshal")); - writeAttr(sb, false, "key_validation_class", + writeAttr(output, false, "key_validation_class", normaliseType(cfDef.key_validation_class, "org.apache.cassandra.db.marshal")); - writeAttr(sb, false, "rows_cached", cfDef.row_cache_size); - writeAttr(sb, false, "row_cache_save_period", cfDef.row_cache_save_period_in_seconds); - writeAttr(sb, false, "row_cache_keys_to_save", cfDef.row_cache_keys_to_save); - writeAttr(sb, false, "keys_cached", cfDef.key_cache_size); - writeAttr(sb, false, "key_cache_save_period", cfDef.key_cache_save_period_in_seconds); - writeAttr(sb, false, "read_repair_chance", cfDef.read_repair_chance); - writeAttr(sb, false, "gc_grace", cfDef.gc_grace_seconds); - writeAttr(sb, false, "min_compaction_threshold", cfDef.min_compaction_threshold); - writeAttr(sb, false, "max_compaction_threshold", cfDef.max_compaction_threshold); - writeAttr(sb, false, "replicate_on_write", cfDef.replicate_on_write); - writeAttr(sb, false, "row_cache_provider", normaliseType(cfDef.row_cache_provider, "org.apache.cassandra.cache")); - writeAttr(sb, false, "compaction_strategy", cfDef.compaction_strategy); + writeAttr(output, false, "rows_cached", cfDef.row_cache_size); + writeAttr(output, false, "row_cache_save_period", cfDef.row_cache_save_period_in_seconds); + writeAttr(output, false, "row_cache_keys_to_save", cfDef.row_cache_keys_to_save); + writeAttr(output, false, "keys_cached", cfDef.key_cache_size); + writeAttr(output, false, "key_cache_save_period", cfDef.key_cache_save_period_in_seconds); + writeAttr(output, false, "read_repair_chance", cfDef.read_repair_chance); + writeAttr(output, false, "gc_grace", cfDef.gc_grace_seconds); + writeAttr(output, false, "min_compaction_threshold", cfDef.min_compaction_threshold); + writeAttr(output, false, "max_compaction_threshold", cfDef.max_compaction_threshold); + writeAttr(output, false, "replicate_on_write", cfDef.replicate_on_write); + writeAttr(output, false, "row_cache_provider", normaliseType(cfDef.row_cache_provider, "org.apache.cassandra.cache")); + writeAttr(output, false, "compaction_strategy", cfDef.compaction_strategy); if (cfDef.isSetBloom_filter_fp_chance()) - writeAttr(sb, false, "bloom_filter_fp_chance", cfDef.bloom_filter_fp_chance); + writeAttr(output, false, "bloom_filter_fp_chance", cfDef.bloom_filter_fp_chance); if (!cfDef.compaction_strategy_options.isEmpty()) { @@ -1678,26 +1677,28 @@ public class CliClient cOptions.append("}"); - writeAttrRaw(sb, false, "compaction_strategy_options", cOptions.toString()); + writeAttrRaw(output, false, "compaction_strategy_options", cOptions.toString()); } if (!StringUtils.isEmpty(cfDef.comment)) - writeAttr(sb, false, "comment", cfDef.comment); + writeAttr(output, false, "comment", cfDef.comment); if (!cfDef.column_metadata.isEmpty()) { - StringBuilder colSb = new StringBuilder(); - colSb.append("["); + output.append(NEWLINE) + .append(TAB) + .append("and column_metadata = ["); + boolean first = true; for (ColumnDef colDef : cfDef.column_metadata) { if (!first) - colSb.append(","); + output.append(","); first = false; - showColumnMeta(colSb, cfDef, colDef); + showColumnMeta(output, cfDef, colDef); } - colSb.append("]"); - writeAttrRaw(sb, false, "column_metadata", colSb.toString()); + + output.append("]"); } if (cfDef.compression_options != null && !cfDef.compression_options.isEmpty()) @@ -1720,51 +1721,59 @@ public class CliClient compOptions.append("}"); - writeAttrRaw(sb, false, "compression_options", compOptions.toString()); + writeAttrRaw(output, false, "compression_options", compOptions.toString()); } - sb.append(";"); - sb.append(NEWLINE); - sb.append(NEWLINE); + output.append(";"); + output.append(NEWLINE); + output.append(NEWLINE); } /** * Writes the supplied ColumnDef to the StringBuilder as a cli script. - * @param sb - * @param cfDef - * @param colDef + * + * @param output The File to write to. + * @param cfDef The CfDef as a source for comparator/validator + * @param colDef The Column Definition to export */ - private void showColumnMeta(StringBuilder sb, CfDef cfDef, ColumnDef colDef) + private void showColumnMeta(PrintStream output, CfDef cfDef, ColumnDef colDef) { - sb.append(NEWLINE + TAB + TAB + "{"); + output.append(NEWLINE + TAB + TAB + "{"); final AbstractType comparator = getFormatType(cfDef.column_type.equals("Super") ? cfDef.subcomparator_type : cfDef.comparator_type); - sb.append("column_name : '" + CliUtils.escapeSQLString(comparator.getString(colDef.name)) + "'," + NEWLINE); + output.append("column_name : '" + CliUtils.escapeSQLString(comparator.getString(colDef.name)) + "'," + NEWLINE); String validationClass = normaliseType(colDef.validation_class, "org.apache.cassandra.db.marshal"); - sb.append(TAB + TAB + "validation_class : " + CliUtils.escapeSQLString(validationClass)); + output.append(TAB + TAB + "validation_class : " + CliUtils.escapeSQLString(validationClass)); if (colDef.isSetIndex_name()) { - sb.append("," + NEWLINE); - sb.append(TAB + TAB + "index_name : '" + CliUtils.escapeSQLString(colDef.index_name) + "'," + NEWLINE); - sb.append(TAB + TAB + "index_type : " + CliUtils.escapeSQLString(Integer.toString(colDef.index_type.getValue()))); + output.append(",").append(NEWLINE) + .append(TAB + TAB + "index_name : '" + CliUtils.escapeSQLString(colDef.index_name) + "'," + NEWLINE) + .append(TAB + TAB + "index_type : " + CliUtils.escapeSQLString(Integer.toString(colDef.index_type.getValue()))); if (colDef.index_options != null) { - sb.append("," + NEWLINE); - sb.append(TAB + TAB + "index_options : {" + NEWLINE); + output.append(",").append(NEWLINE); + output.append(TAB + TAB + "index_options : {" + NEWLINE); int numOpts = colDef.index_options.size(); for (Map.Entry<String, String> entry : colDef.index_options.entrySet()) { - sb.append(TAB + TAB + TAB + CliUtils.escapeSQLString(entry.getKey()) + ": '" + CliUtils.escapeSQLString(entry.getValue()) + "'"); + String option = CliUtils.escapeSQLString(entry.getKey()); + String optionValue = CliUtils.escapeSQLString(entry.getValue()); + + output.append(TAB + TAB + TAB) + .append("'" + option + "' : '") + .append(optionValue) + .append("'"); + if (--numOpts > 0) - sb.append("," + NEWLINE); + output.append(",").append(NEWLINE); } - sb.append("}"); + output.append("}"); } } - sb.append("}"); + output.append("}"); } private String normaliseType(String path, String expectedPackage) @@ -1775,26 +1784,26 @@ public class CliClient return path; } - private void writeAttr(StringBuilder sb, boolean first, String name, Boolean value) + private void writeAttr(PrintStream output, boolean first, String name, Boolean value) { - writeAttrRaw(sb, first, name, value.toString()); + writeAttrRaw(output, first, name, value.toString()); } - private void writeAttr(StringBuilder sb, boolean first, String name, Number value) + private void writeAttr(PrintStream output, boolean first, String name, Number value) { - writeAttrRaw(sb, first, name, value.toString()); + writeAttrRaw(output, first, name, value.toString()); } - private void writeAttr(StringBuilder sb, boolean first, String name, String value) + private void writeAttr(PrintStream output, boolean first, String name, String value) { - writeAttrRaw(sb, first, name, "'" + CliUtils.escapeSQLString(value) + "'"); + writeAttrRaw(output, first, name, "'" + CliUtils.escapeSQLString(value) + "'"); } - private void writeAttrRaw(StringBuilder sb, boolean first, String name, String value) + private void writeAttrRaw(PrintStream output, boolean first, String name, String value) { - sb.append(NEWLINE + TAB); - sb.append(first ? "with " : "and "); - sb.append(name + " = "); - sb.append(value); + output.append(NEWLINE).append(TAB); + output.append(first ? "with " : "and "); + output.append(name).append(" = "); + output.append(value); } /** * Returns true if this.keySpace is set, false otherwise