You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2014/09/25 03:33:50 UTC
[4/5] Remove cassandra-cli
http://git-wip-us.apache.org/repos/asf/cassandra/blob/38027382/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
deleted file mode 100644
index 703d4c1..0000000
--- a/src/java/org/apache/cassandra/cli/CliClient.java
+++ /dev/null
@@ -1,3230 +0,0 @@
-/*
- * 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.cassandra.cli;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.PrintStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.charset.CharacterCodingException;
-import java.nio.charset.StandardCharsets;
-import java.util.*;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-import com.google.common.collect.Iterables;
-
-import org.apache.cassandra.serializers.MarshalException;
-import org.apache.commons.lang3.StringUtils;
-
-import org.antlr.runtime.tree.Tree;
-import org.apache.cassandra.auth.IAuthenticator;
-import org.apache.cassandra.exceptions.RequestValidationException;
-import org.apache.cassandra.db.ColumnFamilyStoreMBean;
-import org.apache.cassandra.db.compaction.CompactionManagerMBean;
-import org.apache.cassandra.db.compaction.OperationType;
-import org.apache.cassandra.db.marshal.*;
-import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.locator.SimpleSnitch;
-import org.apache.cassandra.thrift.*;
-import org.apache.cassandra.tools.NodeProbe;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
-import org.apache.thrift.TBaseHelper;
-import org.apache.thrift.TException;
-import org.codehaus.jackson.*;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-
-// Cli Client Side Library
-public class CliClient
-{
- /**
- * Available value conversion functions
- * Used by convertValueByFunction(Tree functionCall) method
- */
- public enum Function
- {
- BYTES (BytesType.instance),
- INTEGER (IntegerType.instance),
- LONG (LongType.instance),
- INT (Int32Type.instance),
- LEXICALUUID (LexicalUUIDType.instance),
- TIMEUUID (TimeUUIDType.instance),
- UTF8 (UTF8Type.instance),
- ASCII (AsciiType.instance),
- DOUBLE (DoubleType.instance),
- COUNTERCOLUMN (CounterColumnType.instance);
-
- private AbstractType<?> validator;
-
- Function(AbstractType<?> validator)
- {
- this.validator = validator;
- }
-
- public AbstractType<?> getValidator()
- {
- return this.validator;
- }
-
- public static String getFunctionNames()
- {
- Function[] functions = Function.values();
- StringBuilder functionNames = new StringBuilder();
-
- for (int i = 0; i < functions.length; i++)
- {
- StringBuilder currentName = new StringBuilder(functions[i].name().toLowerCase());
- functionNames.append(currentName.append(((i != functions.length-1) ? ", " : ".")));
- }
-
- return functionNames.toString();
- }
- }
-
- /*
- * the <i>add keyspace</i> command requires a list of arguments,
- * this enum defines which arguments are valid
- */
- private enum AddKeyspaceArgument {
- PLACEMENT_STRATEGY,
- STRATEGY_OPTIONS,
- DURABLE_WRITES
- }
-
- /*
- * the <i>add column family</i> command requires a list of arguments,
- * this enum defines which arguments are valid.
- */
- protected enum ColumnFamilyArgument
- {
- COLUMN_TYPE,
- COMPARATOR,
- SUBCOMPARATOR,
- COMMENT,
- READ_REPAIR_CHANCE,
- DCLOCAL_READ_REPAIR_CHANCE,
- GC_GRACE,
- COLUMN_METADATA,
- MEMTABLE_OPERATIONS,
- MEMTABLE_THROUGHPUT,
- DEFAULT_VALIDATION_CLASS,
- MIN_COMPACTION_THRESHOLD,
- MAX_COMPACTION_THRESHOLD,
- REPLICATE_ON_WRITE,
- KEY_VALIDATION_CLASS,
- COMPACTION_STRATEGY,
- COMPACTION_STRATEGY_OPTIONS,
- COMPRESSION_OPTIONS,
- BLOOM_FILTER_FP_CHANCE,
- INDEX_INTERVAL,
- MEMTABLE_FLUSH_PERIOD_IN_MS,
- CACHING,
- CELLS_PER_ROW_TO_CACHE,
- DEFAULT_TIME_TO_LIVE,
- SPECULATIVE_RETRY,
- POPULATE_IO_CACHE_ON_FLUSH,
- }
-
- private static final String DEFAULT_PLACEMENT_STRATEGY = "org.apache.cassandra.locator.NetworkTopologyStrategy";
- private static final String NEWLINE = System.getProperty("line.separator");
- private static final String TAB = " ";
-
- private final Cassandra.Client thriftClient;
- private final CliSessionState sessionState;
- private String keySpace = null;
- private String username = null;
- private final Map<String, KsDef> keyspacesMap = new HashMap<String, KsDef>();
- private final Map<String, Map<String, CfDef>> cql3KeyspacesMap = new HashMap<String, Map<String, CfDef>>();
- private final Map<String, AbstractType<?>> cfKeysComparators;
- private ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE;
- private final CfAssumptions assumptions = new CfAssumptions();
- private CliUserHelp help;
- public CliClient(CliSessionState cliSessionState, Cassandra.Client thriftClient)
- {
- this.sessionState = cliSessionState;
- this.thriftClient = thriftClient;
- this.cfKeysComparators = new HashMap<String, AbstractType<?>>();
- assumptions.readAssumptions();
- }
-
- private CliUserHelp getHelp()
- {
- if (help == null)
- help = loadHelp();
- return help;
- }
-
- private CliUserHelp loadHelp()
- {
- final InputStream is = CliClient.class.getClassLoader().getResourceAsStream("org/apache/cassandra/cli/CliHelp.yaml");
- assert is != null;
-
- try
- {
- final Constructor constructor = new Constructor(CliUserHelp.class);
- final Yaml yaml = new Yaml(constructor);
- return (CliUserHelp) yaml.load(is);
- }
- finally
- {
- FileUtils.closeQuietly(is);
- }
- }
-
- public void printBanner()
- {
- sessionState.out.println("Welcome to Cassandra CLI version " + FBUtilities.getReleaseVersionString() + "\n");
-
- sessionState.out.println("The CLI is deprecated and will be removed in Cassandra 3.0. Consider migrating to cqlsh.");
- sessionState.out.println("CQL is fully backwards compatible with Thrift data; see http://www.datastax.com/dev/blog/thrift-to-cql3\n");
-
- sessionState.out.println(getHelp().banner);
- }
-
- private void printCQL3TablesWarning(String cmd)
- {
- sessionState.err.println("\nWARNING: CQL3 tables are intentionally omitted from '" + cmd + "' output.");
- sessionState.err.println("See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details.\n");
- }
-
- // Execute a CLI Statement
- public void executeCLIStatement(String statement) throws CharacterCodingException, TException, TimedOutException, NotFoundException, NoSuchFieldException, InvalidRequestException, UnavailableException, InstantiationException, IllegalAccessException
- {
- Tree tree = CliCompiler.compileQuery(statement);
- try
- {
- switch (tree.getType())
- {
- case CliParser.NODE_EXIT:
- cleanupAndExit();
- break;
- case CliParser.NODE_THRIFT_GET:
- executeGet(tree);
- break;
- case CliParser.NODE_THRIFT_GET_WITH_CONDITIONS:
- executeGetWithConditions(tree);
- break;
- case CliParser.NODE_HELP:
- executeHelp(tree);
- break;
- case CliParser.NODE_THRIFT_SET:
- executeSet(tree);
- break;
- case CliParser.NODE_THRIFT_DEL:
- executeDelete(tree);
- break;
- case CliParser.NODE_THRIFT_COUNT:
- executeCount(tree);
- break;
- case CliParser.NODE_ADD_KEYSPACE:
- executeAddKeySpace(tree.getChild(0));
- break;
- case CliParser.NODE_ADD_COLUMN_FAMILY:
- executeAddColumnFamily(tree.getChild(0));
- break;
- case CliParser.NODE_UPDATE_KEYSPACE:
- executeUpdateKeySpace(tree.getChild(0));
- break;
- case CliParser.NODE_UPDATE_COLUMN_FAMILY:
- executeUpdateColumnFamily(tree.getChild(0));
- break;
- case CliParser.NODE_DEL_COLUMN_FAMILY:
- executeDelColumnFamily(tree);
- break;
- case CliParser.NODE_DEL_KEYSPACE:
- executeDelKeySpace(tree);
- break;
- case CliParser.NODE_SHOW_CLUSTER_NAME:
- executeShowClusterName();
- break;
- case CliParser.NODE_SHOW_VERSION:
- executeShowVersion();
- break;
- case CliParser.NODE_SHOW_KEYSPACES:
- executeShowKeySpaces();
- break;
- case CliParser.NODE_SHOW_SCHEMA:
- executeShowSchema(tree);
- break;
- case CliParser.NODE_DESCRIBE:
- executeDescribe(tree);
- break;
- case CliParser.NODE_DESCRIBE_CLUSTER:
- executeDescribeCluster();
- break;
- case CliParser.NODE_USE_TABLE:
- executeUseKeySpace(tree);
- break;
- case CliParser.NODE_TRACE_NEXT_QUERY:
- executeTraceNextQuery();
- break;
- case CliParser.NODE_CONNECT:
- executeConnect(tree);
- break;
- case CliParser.NODE_LIST:
- executeList(tree);
- break;
- case CliParser.NODE_TRUNCATE:
- executeTruncate(tree.getChild(0).getText());
- break;
- case CliParser.NODE_ASSUME:
- executeAssumeStatement(tree);
- break;
- case CliParser.NODE_CONSISTENCY_LEVEL:
- executeConsistencyLevelStatement(tree);
- break;
- case CliParser.NODE_THRIFT_INCR:
- executeIncr(tree, 1L);
- break;
- case CliParser.NODE_THRIFT_DECR:
- executeIncr(tree, -1L);
- break;
- case CliParser.NODE_DROP_INDEX:
- executeDropIndex(tree);
- break;
-
- case CliParser.NODE_NO_OP:
- // comment lines come here; they are treated as no ops.
- break;
- default:
- sessionState.err.println("Invalid Statement (Type: " + tree.getType() + ")");
- if (sessionState.batch)
- System.exit(2);
- break;
- }
- }
- catch (SchemaDisagreementException e)
- {
- throw new RuntimeException("schema does not match across nodes, (try again later).", e);
- }
- }
-
- private void cleanupAndExit()
- {
- CliMain.disconnect();
- assumptions.writeAssumptions();
- System.exit(0);
- }
-
- public KsDef getKSMetaData(String keyspace)
- throws NotFoundException, InvalidRequestException, TException
- {
- // Lazily lookup keyspace meta-data.
- if (!(keyspacesMap.containsKey(keyspace)))
- {
- KsDef ksDef = thriftClient.describe_keyspace(keyspace);
- keyspacesMap.put(keyspace, ksDef);
- cql3KeyspacesMap.put(keyspace, loadCql3Defs(thriftClient, ksDef));
- assumptions.replayAssumptions(keyspace);
- }
-
- return keyspacesMap.get(keyspace);
- }
-
- public static Map<String, CfDef> loadCql3Defs(Cassandra.Client thriftClient, KsDef thriftKs)
- {
- try
- {
- return loadCql3DefsUnchecked(thriftClient, thriftKs);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- public static Map<String, CfDef> loadCql3DefsUnchecked(Cassandra.Client thriftClient, KsDef thriftKs) throws Exception
- {
- Map<String, CfDef> cql3Defs = new HashMap<String, CfDef>();
-
- String query = "SELECT columnfamily_name, comparator, default_validator, key_validator FROM system.schema_columnfamilies WHERE keyspace_name='%s'";
- String formatted = String.format(query, thriftKs.name);
- CqlResult result = thriftClient.execute_cql3_query(ByteBufferUtil.bytes(formatted),
- Compression.NONE,
- ConsistencyLevel.ONE);
- outer:
- for (CqlRow row : result.rows)
- {
- Column rawName = row.columns.get(0);
- assert ByteBufferUtil.string(ByteBuffer.wrap(rawName.getName())).equals("columnfamily_name");
- String name = ByteBufferUtil.string(ByteBuffer.wrap(rawName.getValue()));
-
- Column rawComparator = row.columns.get(1);
- assert ByteBufferUtil.string(ByteBuffer.wrap(rawComparator.getName())).equals("comparator");
- String comparator = ByteBufferUtil.string(ByteBuffer.wrap(rawComparator.getValue()));
-
- Column rawValidator = row.columns.get(2);
- assert ByteBufferUtil.string(ByteBuffer.wrap(rawValidator.getName())).equals("default_validator");
- String validator = ByteBufferUtil.string(ByteBuffer.wrap(rawValidator.getValue()));
-
- Column rawKeyValidator = row.columns.get(3);
- assert ByteBufferUtil.string(ByteBuffer.wrap(rawKeyValidator.getName())).equals("key_validator");
- String keyValidator = ByteBufferUtil.string(ByteBuffer.wrap(rawKeyValidator.getValue()));
-
- for (CfDef cf_def : thriftKs.cf_defs)
- {
- if (cf_def.name.equals(name))
- continue outer;
- }
-
- CfDef thriftDef = new CfDef(thriftKs.name, name)
- .setComparator_type(comparator)
- .setDefault_validation_class(validator)
- .setKey_validation_class(keyValidator)
- .setColumn_metadata(Collections.<ColumnDef>emptyList());
- cql3Defs.put(name, thriftDef);
- }
-
- return cql3Defs;
- }
-
- private void executeHelp(Tree tree)
- {
- if (tree.getChildCount() > 0)
- {
- String token = tree.getChild(0).getText();
- for (CliCommandHelp ch : getHelp().commands)
- {
- if (token.equals(ch.name))
- {
- sessionState.out.println(ch.help);
- break;
- }
- }
- }
- else
- {
- sessionState.out.println(getHelp().help);
- }
- }
-
- private void executeCount(Tree statement)
- throws TException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- Tree columnFamilySpec = statement.getChild(0);
-
- String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
- int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
-
- ColumnParent colParent = new ColumnParent(columnFamily).setSuper_column((ByteBuffer) null);
-
- if (columnSpecCnt != 0)
- {
- Tree columnTree = columnFamilySpec.getChild(2);
-
- byte[] superColumn = (columnTree.getType() == CliParser.FUNCTION_CALL)
- ? convertValueByFunction(columnTree, null, null).array()
- : columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), columnFamily);
-
- colParent = new ColumnParent(columnFamily).setSuper_column(superColumn);
- }
-
- SliceRange range = new SliceRange(ByteBufferUtil.EMPTY_BYTE_BUFFER, ByteBufferUtil.EMPTY_BYTE_BUFFER, false, Integer.MAX_VALUE);
- SlicePredicate predicate = new SlicePredicate().setColumn_names(null).setSlice_range(range);
-
- int count = thriftClient.get_count(getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1)), colParent, predicate, consistencyLevel);
- sessionState.out.printf("%d cells%n", count);
- }
-
- private Iterable<CfDef> currentCfDefs()
- {
- return Iterables.concat(keyspacesMap.get(keySpace).cf_defs, cql3KeyspacesMap.get(keySpace).values());
- }
-
- private void executeDelete(Tree statement)
- throws TException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- Tree columnFamilySpec = statement.getChild(0);
-
- String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
- CfDef cfDef = getCfDef(columnFamily);
-
- ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
- int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
-
- byte[] superColumnName = null;
- byte[] columnName = null;
-
- if ((columnSpecCnt < 0) || (columnSpecCnt > 2))
- {
- sessionState.out.println("Invalid row, super column, or column specification.");
- return;
- }
-
- long startTime = System.nanoTime();
-
- Tree columnTree = (columnSpecCnt >= 1)
- ? columnFamilySpec.getChild(2)
- : null;
-
- Tree subColumnTree = (columnSpecCnt == 2)
- ? columnFamilySpec.getChild(3)
- : null;
-
- if (columnSpecCnt == 1)
- {
- assert columnTree != null;
-
- byte[] columnNameBytes = (columnTree.getType() == CliParser.FUNCTION_CALL)
- ? convertValueByFunction(columnTree, null, null).array()
- : columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
-
- boolean isSuper = cfDef.column_type.equals("Super");
- if (isSuper)
- superColumnName = columnNameBytes;
- else
- columnName = columnNameBytes;
- }
- else if (columnSpecCnt == 2)
- {
- assert columnTree != null;
- assert subColumnTree != null;
-
- // keyspace.cf['key']['column']['column']
- superColumnName = (columnTree.getType() == CliParser.FUNCTION_CALL)
- ? convertValueByFunction(columnTree, null, null).array()
- : columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
-
- columnName = (subColumnTree.getType() == CliParser.FUNCTION_CALL)
- ? convertValueByFunction(subColumnTree, null, null).array()
- : subColumnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 1), cfDef);
- }
-
- ColumnPath path = new ColumnPath(columnFamily);
- if (superColumnName != null)
- path.setSuper_column(superColumnName);
-
- if (columnName != null)
- path.setColumn(columnName);
-
- if (isCounterCF(cfDef))
- {
- thriftClient.remove_counter(key, path, consistencyLevel);
- }
- else
- {
- thriftClient.remove(key, path, FBUtilities.timestampMicros(), consistencyLevel);
- }
- sessionState.out.println(String.format("%s removed.", (columnSpecCnt == 0) ? "row" : "cell"));
- elapsedTime(startTime);
- }
-
- private void doSlice(String keyspace, ByteBuffer key, String columnFamily, byte[] superColumnName, int limit)
- throws InvalidRequestException, UnavailableException, TimedOutException, TException, NotFoundException
- {
-
- long startTime = System.nanoTime();
- ColumnParent parent = new ColumnParent(columnFamily);
- if(superColumnName != null)
- parent.setSuper_column(superColumnName);
-
- SliceRange range = new SliceRange(ByteBufferUtil.EMPTY_BYTE_BUFFER, ByteBufferUtil.EMPTY_BYTE_BUFFER, false, limit);
- SlicePredicate predicate = new SlicePredicate().setColumn_names(null).setSlice_range(range);
-
- CfDef cfDef = getCfDef(columnFamily);
- boolean isSuperCF = cfDef.column_type.equals("Super");
-
- List<ColumnOrSuperColumn> columns = thriftClient.get_slice(key, parent, predicate, consistencyLevel);
- AbstractType<?> validator;
-
- // Print out super columns or columns.
- for (ColumnOrSuperColumn cosc : columns)
- {
- if (cosc.isSetSuper_column())
- {
- SuperColumn superColumn = cosc.super_column;
-
- sessionState.out.printf("=> (super_column=%s,", formatColumnName(keyspace, columnFamily, superColumn.name));
- for (Column col : superColumn.getColumns())
- {
- validator = getValidatorForValue(cfDef, col.getName());
- sessionState.out.printf("%n (name=%s, value=%s, timestamp=%d%s)", formatSubcolumnName(keyspace, columnFamily, col.name),
- validator.getString(col.value), col.timestamp,
- col.isSetTtl() ? String.format(", ttl=%d", col.getTtl()) : "");
- }
-
- sessionState.out.println(")");
- }
- else if (cosc.isSetColumn())
- {
- Column column = cosc.column;
- validator = getValidatorForValue(cfDef, column.getName());
-
- String formattedName = isSuperCF
- ? formatSubcolumnName(keyspace, columnFamily, column.name)
- : formatColumnName(keyspace, columnFamily, column.name);
-
- sessionState.out.printf("=> (name=%s, value=%s, timestamp=%d%s)%n",
- formattedName,
- validator.getString(column.value),
- column.timestamp,
- column.isSetTtl() ? String.format(", ttl=%d", column.getTtl()) : "");
- }
- else if (cosc.isSetCounter_super_column())
- {
- CounterSuperColumn superColumn = cosc.counter_super_column;
-
- sessionState.out.printf("=> (super_column=%s,", formatColumnName(keyspace, columnFamily, superColumn.name));
- for (CounterColumn col : superColumn.getColumns())
- {
- sessionState.out.printf("%n (counter=%s, value=%s)", formatSubcolumnName(keyspace, columnFamily, col.name), col.value);
- }
- sessionState.out.println(")");
- }
- else // cosc.isSetCounter_column()
- {
- CounterColumn column = cosc.counter_column;
- String formattedName = isSuperCF
- ? formatSubcolumnName(keyspace, columnFamily, column.name)
- : formatColumnName(keyspace, columnFamily, column.name);
-
- sessionState.out.printf("=> (counter=%s, value=%s)%n", formattedName, column.value);
- }
- }
-
- sessionState.out.println("Returned " + columns.size() + " results.");
- elapsedTime(startTime);
- }
-
- private AbstractType<?> getFormatType(String compareWith)
- {
- Function function;
-
- try
- {
- function = Function.valueOf(compareWith.toUpperCase());
- }
- catch (IllegalArgumentException e)
- {
- try
- {
- return TypeParser.parse(compareWith);
- }
- catch (RequestValidationException ce)
- {
- String message = String.format("Unknown comparator '%s'. Available functions: %s", compareWith, Function.getFunctionNames());
- throw new RuntimeException(message, e);
- }
- }
-
- return function.getValidator();
- }
-
- // Execute GET statement
- private void executeGet(Tree statement)
- throws TException, NotFoundException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
- long startTime = System.nanoTime();
- Tree columnFamilySpec = statement.getChild(0);
- String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
- ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
- int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
- CfDef cfDef = getCfDef(columnFamily);
- boolean isSuper = cfDef.column_type.equals("Super");
-
- byte[] superColumnName = null;
- ByteBuffer columnName;
-
- Tree typeTree = null;
- Tree limitTree = null;
-
- int limit = 1000000;
-
- if (statement.getChildCount() >= 2)
- {
- if (statement.getChild(1).getType() == CliParser.CONVERT_TO_TYPE)
- {
- typeTree = statement.getChild(1).getChild(0);
- if (statement.getChildCount() == 3)
- limitTree = statement.getChild(2).getChild(0);
- }
- else
- {
- limitTree = statement.getChild(1).getChild(0);
- }
- }
-
- if (limitTree != null)
- {
- limit = Integer.parseInt(limitTree.getText());
-
- if (limit == 0)
- {
- throw new IllegalArgumentException("LIMIT should be greater than zero.");
- }
- }
-
- // keyspace.cf['key'] -- row slice
- if (columnSpecCnt == 0)
- {
- doSlice(keySpace, key, columnFamily, superColumnName, limit);
- return;
- }
- // keyspace.cf['key']['column'] -- slice of a super, or get of a standard
- else if (columnSpecCnt == 1)
- {
- columnName = getColumnName(columnFamily, columnFamilySpec.getChild(2));
-
- if (isSuper)
- {
- superColumnName = columnName.array();
- doSlice(keySpace, key, columnFamily, superColumnName, limit);
- return;
- }
- }
- // keyspace.cf['key']['column']['column'] -- get of a sub-column
- else if (columnSpecCnt == 2)
- {
- superColumnName = getColumnName(columnFamily, columnFamilySpec.getChild(2)).array();
- columnName = getSubColumnName(columnFamily, columnFamilySpec.getChild(3));
- }
- // The parser groks an arbitrary number of these so it is possible to get here.
- else
- {
- sessionState.out.println("Invalid row, super column, or column specification.");
- return;
- }
-
- AbstractType<?> validator = getValidatorForValue(cfDef, TBaseHelper.byteBufferToByteArray(columnName));
-
- // Perform a get()
- ColumnPath path = new ColumnPath(columnFamily);
- if(superColumnName != null) path.setSuper_column(superColumnName);
- path.setColumn(columnName);
-
- if (isCounterCF(cfDef))
- {
- doGetCounter(key, path);
- elapsedTime(startTime);
- return;
- }
-
- Column column;
- try
- {
- column = thriftClient.get(key, path, consistencyLevel).column;
- }
- catch (NotFoundException e)
- {
- sessionState.out.println("Value was not found");
- elapsedTime(startTime);
- return;
- }
-
- byte[] columnValue = column.getValue();
- String valueAsString;
-
- // we have ^(CONVERT_TO_TYPE <type>) inside of GET statement
- // which means that we should try to represent byte[] value according
- // to specified type
- if (typeTree != null)
- {
- // .getText() will give us <type>
- String typeName = CliUtils.unescapeSQLString(typeTree.getText());
- // building AbstractType from <type>
- AbstractType<?> valueValidator = getFormatType(typeName);
-
- // setting value for output
- valueAsString = valueValidator.getString(ByteBuffer.wrap(columnValue));
- // updating column value validator class
- updateColumnMetaData(cfDef, columnName, valueValidator.toString());
- }
- else
- {
- valueAsString = (validator == null) ? new String(columnValue, StandardCharsets.UTF_8) : validator.getString(ByteBuffer.wrap(columnValue));
- }
-
- String formattedColumnName = isSuper
- ? formatSubcolumnName(keySpace, columnFamily, column.name)
- : formatColumnName(keySpace, columnFamily, column.name);
-
- // print results
- sessionState.out.printf("=> (name=%s, value=%s, timestamp=%d%s)%n",
- formattedColumnName,
- valueAsString,
- column.timestamp,
- column.isSetTtl() ? String.format(", ttl=%d", column.getTtl()) : "");
- elapsedTime(startTime);
- }
-
- private void doGetCounter(ByteBuffer key, ColumnPath path)
- throws TException, NotFoundException, InvalidRequestException, UnavailableException, TimedOutException
- {
- boolean isSuper = path.super_column != null;
-
- CounterColumn column;
- try
- {
- column = thriftClient.get(key, path, consistencyLevel).counter_column;
- }
- catch (NotFoundException e)
- {
- sessionState.out.println("Value was not found");
- return;
- }
-
- String formattedColumnName = isSuper
- ? formatSubcolumnName(keySpace, path.column_family, column.name)
- : formatColumnName(keySpace, path.column_family, column.name);
-
- // print results
- sessionState.out.printf("=> (counter=%s, value=%d)%n",
- formattedColumnName,
- column.value);
- }
-
- /**
- * Process get operation with conditions (using Thrift get_indexed_slices method)
- * @param statement - tree representation of the current statement
- * Format: ^(NODE_THRIFT_GET_WITH_CONDITIONS cf ^(CONDITIONS ^(CONDITION >= column1 value1) ...) ^(NODE_LIMIT int)*)
- */
- private void executeGetWithConditions(Tree statement)
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- long startTime = System.nanoTime();
-
- IndexClause clause = new IndexClause();
- String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
- // ^(CONDITIONS ^(CONDITION $column $value) ...)
- Tree conditions = statement.getChild(1);
-
- // fetching column family definition
- CfDef columnFamilyDef = getCfDef(columnFamily);
-
- // fetching all columns
- SlicePredicate predicate = new SlicePredicate();
- SliceRange sliceRange = new SliceRange();
- sliceRange.setStart(new byte[0]).setFinish(new byte[0]);
- predicate.setSlice_range(sliceRange);
-
- for (int i = 0; i < conditions.getChildCount(); i++)
- {
- // ^(CONDITION operator $column $value)
- Tree condition = conditions.getChild(i);
-
- // =, >, >=, <, <=
- String operator = condition.getChild(0).getText();
- String columnNameString = CliUtils.unescapeSQLString(condition.getChild(1).getText());
- // it could be a basic string or function call
- Tree valueTree = condition.getChild(2);
-
- try
- {
- ByteBuffer value;
- ByteBuffer columnName = columnNameAsBytes(columnNameString, columnFamily);
-
- if (valueTree.getType() == CliParser.FUNCTION_CALL)
- {
- value = convertValueByFunction(valueTree, columnFamilyDef, columnName);
- }
- else
- {
- String valueString = CliUtils.unescapeSQLString(valueTree.getText());
- value = columnValueAsBytes(columnName, columnFamily, valueString);
- }
-
- // index operator from string
- IndexOperator idxOperator = CliUtils.getIndexOperator(operator);
- // adding new index expression into index clause
- clause.addToExpressions(new IndexExpression(columnName, idxOperator, value));
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- List<KeySlice> slices;
- clause.setStart_key(new byte[] {});
-
- // when we have ^(NODE_LIMIT Integer)
- if (statement.getChildCount() == 3)
- {
- Tree limitNode = statement.getChild(2);
- int limitValue = Integer.parseInt(limitNode.getChild(0).getText());
-
- if (limitValue == 0)
- {
- throw new IllegalArgumentException("LIMIT should be greater than zero.");
- }
-
- clause.setCount(limitValue);
- }
-
- try
- {
- ColumnParent parent = new ColumnParent(columnFamily);
- slices = thriftClient.get_indexed_slices(parent, clause, predicate, consistencyLevel);
- printSliceList(columnFamilyDef, slices);
- }
- catch (InvalidRequestException e)
- {
- throw new RuntimeException(e);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- elapsedTime(startTime);
- }
-
- // Execute SET statement
- private void executeSet(Tree statement)
- throws TException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- long startTime = System.nanoTime();
- // ^(NODE_COLUMN_ACCESS <cf> <key> <column>)
- Tree columnFamilySpec = statement.getChild(0);
- Tree keyTree = columnFamilySpec.getChild(1); // could be a function or regular text
-
- String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
- CfDef cfDef = getCfDef(columnFamily);
- int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
- String value = CliUtils.unescapeSQLString(statement.getChild(1).getText());
- Tree valueTree = statement.getChild(1);
-
- byte[] superColumnName = null;
- ByteBuffer columnName;
-
- // keyspace.cf['key']
- if (columnSpecCnt == 0)
- {
- sessionState.err.println("No cell name specified, (type 'help;' or '?' for help on syntax).");
- return;
- }
- // keyspace.cf['key']['column'] = 'value'
- else if (columnSpecCnt == 1)
- {
- // get the column name
- if (cfDef.column_type.equals("Super"))
- {
- sessionState.out.println("Column family " + columnFamily + " may only contain SuperColumns");
- return;
- }
- columnName = getColumnName(columnFamily, columnFamilySpec.getChild(2));
- }
- // keyspace.cf['key']['super_column']['column'] = 'value'
- else
- {
- assert (columnSpecCnt == 2) : "serious parsing error (this is a bug).";
-
- superColumnName = getColumnName(columnFamily, columnFamilySpec.getChild(2)).array();
- columnName = getSubColumnName(columnFamily, columnFamilySpec.getChild(3));
- }
-
- ByteBuffer columnValueInBytes;
-
- switch (valueTree.getType())
- {
- case CliParser.FUNCTION_CALL:
- columnValueInBytes = convertValueByFunction(valueTree, cfDef, columnName, true);
- break;
- default:
- columnValueInBytes = columnValueAsBytes(columnName, columnFamily, value);
- }
-
- ColumnParent parent = new ColumnParent(columnFamily);
- if(superColumnName != null)
- parent.setSuper_column(superColumnName);
-
- Column columnToInsert = new Column(columnName).setValue(columnValueInBytes).setTimestamp(FBUtilities.timestampMicros());
-
- // children count = 3 mean that we have ttl in arguments
- if (statement.getChildCount() == 3)
- {
- String ttl = statement.getChild(2).getText();
-
- try
- {
- columnToInsert.setTtl(Integer.parseInt(ttl));
- }
- catch (NumberFormatException e)
- {
- sessionState.err.println(String.format("TTL '%s' is invalid, should be a positive integer.", ttl));
- return;
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- // do the insert
- thriftClient.insert(getKeyAsBytes(columnFamily, keyTree), parent, columnToInsert, consistencyLevel);
- sessionState.out.println("Value inserted.");
- elapsedTime(startTime);
- }
-
- // Execute INCR statement
- private void executeIncr(Tree statement, long multiplier)
- throws TException, NotFoundException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- Tree columnFamilySpec = statement.getChild(0);
-
- String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec, currentCfDefs());
- ByteBuffer key = getKeyAsBytes(columnFamily, columnFamilySpec.getChild(1));
- int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
-
- byte[] superColumnName = null;
- ByteBuffer columnName;
-
- // keyspace.cf['key']['column'] -- incr standard
- if (columnSpecCnt == 1)
- {
- columnName = getColumnName(columnFamily, columnFamilySpec.getChild(2));
- }
- // keyspace.cf['key']['column']['column'] -- incr super
- else if (columnSpecCnt == 2)
- {
- superColumnName = getColumnName(columnFamily, columnFamilySpec.getChild(2)).array();
- columnName = getSubColumnName(columnFamily, columnFamilySpec.getChild(3));
- }
- // The parser groks an arbitrary number of these so it is possible to get here.
- else
- {
- sessionState.out.println("Invalid row, super column, or column specification.");
- return;
- }
-
- ColumnParent parent = new ColumnParent(columnFamily);
- if(superColumnName != null)
- parent.setSuper_column(superColumnName);
-
- long value = 1L;
-
- // children count = 3 mean that we have by in arguments
- if (statement.getChildCount() == 2)
- {
- String byValue = statement.getChild(1).getText();
-
- try
- {
- value = Long.parseLong(byValue);
- }
- catch (NumberFormatException e)
- {
- sessionState.err.println(String.format("'%s' is an invalid value, should be an integer.", byValue));
- return;
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- CounterColumn columnToInsert = new CounterColumn(columnName, multiplier * value);
-
- // do the insert
- thriftClient.add(key, parent, columnToInsert, consistencyLevel);
- sessionState.out.printf("Value %s%n", multiplier < 0 ? "decremented." : "incremented.");
- }
-
- private void executeShowClusterName() throws TException
- {
- if (!CliMain.isConnected())
- return;
-
- sessionState.out.println(thriftClient.describe_cluster_name());
- }
-
- /**
- * Add a keyspace
- * @param statement - a token tree representing current statement
- */
- private void executeAddKeySpace(Tree statement)
- {
-
- if (!CliMain.isConnected())
- return;
-
- // first value is the keyspace name, after that it is all key=value
- String keyspaceName = CliUtils.unescapeSQLString(statement.getChild(0).getText());
- KsDef ksDef = new KsDef(keyspaceName, DEFAULT_PLACEMENT_STRATEGY, new LinkedList<CfDef>());
-
- try
- {
- String mySchemaVersion = thriftClient.system_add_keyspace(updateKsDefAttributes(statement, ksDef));
- sessionState.out.println(mySchemaVersion);
-
- keyspacesMap.put(keyspaceName, thriftClient.describe_keyspace(keyspaceName));
- }
- catch (InvalidRequestException e)
- {
- throw new RuntimeException(e);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
-
- /**
- * Add a column family
- * @param statement - a token tree representing current statement
- */
- private void executeAddColumnFamily(Tree statement)
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- // first value is the column family name, after that it is all key=value
- CfDef cfDef = new CfDef(keySpace, CliUtils.unescapeSQLString(statement.getChild(0).getText()));
-
- try
- {
- String mySchemaVersion = thriftClient.system_add_column_family(updateCfDefAttributes(statement, cfDef));
- sessionState.out.println(mySchemaVersion);
- keyspacesMap.put(keySpace, thriftClient.describe_keyspace(keySpace));
- }
- catch (InvalidRequestException e)
- {
- throw new RuntimeException(e);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Update existing keyspace identified by name
- * @param statement - tree represeting statement
- */
- private void executeUpdateKeySpace(Tree statement)
- {
- if (!CliMain.isConnected())
- return;
-
- try
- {
- String keyspaceName = CliCompiler.getKeySpace(statement, thriftClient.describe_keyspaces());
-
- KsDef currentKsDef = getKSMetaData(keyspaceName);
- KsDef updatedKsDef = updateKsDefAttributes(statement, currentKsDef);
-
- String mySchemaVersion = thriftClient.system_update_keyspace(updatedKsDef);
- sessionState.out.println(mySchemaVersion);
- keyspacesMap.remove(keyspaceName);
- getKSMetaData(keyspaceName);
- }
- catch (InvalidRequestException e)
- {
- throw new RuntimeException(e);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Update existing column family identified by name
- * @param statement - tree represeting statement
- */
- private void executeUpdateColumnFamily(Tree statement)
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
-
- try
- {
- // request correct cfDef from the server (we let that call include CQL3 cf even though
- // they can't be modified by thrift because the error message that will be thrown by
- // system_update_column_family will be more useful)
- CfDef cfDef = getCfDef(thriftClient.describe_keyspace(this.keySpace), cfName, true);
-
- if (cfDef == null)
- throw new RuntimeException("Column Family " + cfName + " was not found in the current keyspace.");
-
- String mySchemaVersion = thriftClient.system_update_column_family(updateCfDefAttributes(statement, cfDef));
- sessionState.out.println(mySchemaVersion);
- keyspacesMap.put(keySpace, thriftClient.describe_keyspace(keySpace));
- }
- catch (InvalidRequestException e)
- {
- throw new RuntimeException(e);
- }
- catch (Exception e)
- {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Used to update keyspace definition attributes
- * @param statement - ANTRL tree representing current statement
- * @param ksDefToUpdate - keyspace definition to update
- * @return ksDef - updated keyspace definition
- */
- private KsDef updateKsDefAttributes(Tree statement, KsDef ksDefToUpdate)
- {
- KsDef ksDef = new KsDef(ksDefToUpdate);
-
- // removing all column definitions - thrift system_update_keyspace method requires that
- ksDef.setCf_defs(new LinkedList<CfDef>());
-
- for(int i = 1; i < statement.getChildCount(); i += 2)
- {
- String currentStatement = statement.getChild(i).getText().toUpperCase();
- AddKeyspaceArgument mArgument = AddKeyspaceArgument.valueOf(currentStatement);
- String mValue = statement.getChild(i + 1).getText();
-
- switch(mArgument)
- {
- case PLACEMENT_STRATEGY:
- ksDef.setStrategy_class(CliUtils.unescapeSQLString(mValue));
- break;
- case STRATEGY_OPTIONS:
- ksDef.setStrategy_options(getStrategyOptionsFromTree(statement.getChild(i + 1)));
- break;
- case DURABLE_WRITES:
- ksDef.setDurable_writes(Boolean.parseBoolean(mValue));
- break;
- default:
- //must match one of the above or we'd throw an exception at the valueOf statement above.
- assert(false);
- }
- }
-
- // using default snitch options if strategy is NetworkTopologyStrategy and no options were set.
- if (ksDef.getStrategy_class().contains(".NetworkTopologyStrategy"))
- {
- Map<String, String> currentStrategyOptions = ksDef.getStrategy_options();
-
- // adding default data center from SimpleSnitch
- if (currentStrategyOptions == null || currentStrategyOptions.isEmpty())
- {
- SimpleSnitch snitch = new SimpleSnitch();
- Map<String, String> options = new HashMap<String, String>();
- try
- {
- options.put(snitch.getDatacenter(InetAddress.getLocalHost()), "1");
- }
- catch (UnknownHostException e)
- {
- throw new RuntimeException(e);
- }
- ksDef.setStrategy_options(options);
- }
- }
-
- return ksDef;
- }
-
- /**
- * Update column family definition attributes
- * @param statement - ANTLR tree representing current statement
- * @param cfDefToUpdate - column family definition to apply updates on
- * @return cfDef - updated column family definition
- */
- private CfDef updateCfDefAttributes(Tree statement, CfDef cfDefToUpdate)
- {
- CfDef cfDef = new CfDef(cfDefToUpdate);
-
- for (int i = 1; i < statement.getChildCount(); i += 2)
- {
- String currentArgument = statement.getChild(i).getText().toUpperCase();
- ColumnFamilyArgument mArgument = ColumnFamilyArgument.valueOf(currentArgument);
- String mValue = statement.getChild(i + 1).getText();
-
- switch(mArgument)
- {
- case COLUMN_TYPE:
- cfDef.setColumn_type(CliUtils.unescapeSQLString(mValue));
- break;
- case COMPARATOR:
- cfDef.setComparator_type(CliUtils.unescapeSQLString(mValue));
- break;
- case SUBCOMPARATOR:
- cfDef.setSubcomparator_type(CliUtils.unescapeSQLString(mValue));
- break;
- case COMMENT:
- cfDef.setComment(CliUtils.unescapeSQLString(mValue));
- break;
- case READ_REPAIR_CHANCE:
- double chance = Double.parseDouble(mValue);
-
- if (chance < 0 || chance > 1)
- throw new RuntimeException("Error: read_repair_chance must be between 0 and 1.");
-
- cfDef.setRead_repair_chance(chance);
- break;
- case DCLOCAL_READ_REPAIR_CHANCE:
- double localChance = Double.parseDouble(mValue);
-
- if (localChance < 0 || localChance > 1)
- throw new RuntimeException("Error: dclocal_read_repair_chance must be between 0 and 1.");
-
- cfDef.setDclocal_read_repair_chance(localChance);
- break;
- case GC_GRACE:
- cfDef.setGc_grace_seconds(Integer.parseInt(mValue));
- break;
- case COLUMN_METADATA:
- Tree arrayOfMetaAttributes = statement.getChild(i + 1);
- if (!arrayOfMetaAttributes.getText().equals("ARRAY"))
- throw new RuntimeException("'column_metadata' format - [{ k:v, k:v, ..}, { ... }, ...]");
- cfDef.setColumn_metadata(getCFColumnMetaFromTree(cfDef, arrayOfMetaAttributes));
- break;
- case MEMTABLE_OPERATIONS:
- break;
- case MEMTABLE_THROUGHPUT:
- break;
- case DEFAULT_VALIDATION_CLASS:
- cfDef.setDefault_validation_class(CliUtils.unescapeSQLString(mValue));
- break;
- case MIN_COMPACTION_THRESHOLD:
- int threshold = Integer.parseInt(mValue);
- if (threshold <= 0)
- throw new RuntimeException("Disabling compaction by setting min/max compaction thresholds to 0 has been deprecated, set compaction_strategy_options={'enabled':false} instead");
- cfDef.setMin_compaction_threshold(threshold);
- break;
- case MAX_COMPACTION_THRESHOLD:
- threshold = Integer.parseInt(mValue);
- if (threshold <= 0)
- throw new RuntimeException("Disabling compaction by setting min/max compaction thresholds to 0 has been deprecated, set compaction_strategy_options={'enabled':false} instead");
- cfDef.setMax_compaction_threshold(Integer.parseInt(mValue));
- break;
- case REPLICATE_ON_WRITE:
- cfDef.setReplicate_on_write(Boolean.parseBoolean(mValue));
- break;
- case KEY_VALIDATION_CLASS:
- cfDef.setKey_validation_class(CliUtils.unescapeSQLString(mValue));
- break;
- case COMPACTION_STRATEGY:
- cfDef.setCompaction_strategy(CliUtils.unescapeSQLString(mValue));
- break;
- case COMPACTION_STRATEGY_OPTIONS:
- cfDef.setCompaction_strategy_options(getStrategyOptionsFromTree(statement.getChild(i+1)));
- break;
- case COMPRESSION_OPTIONS:
- cfDef.setCompression_options(getStrategyOptionsFromTree(statement.getChild(i+1)));
- break;
- case BLOOM_FILTER_FP_CHANCE:
- cfDef.setBloom_filter_fp_chance(Double.parseDouble(mValue));
- break;
- case MEMTABLE_FLUSH_PERIOD_IN_MS:
- cfDef.setMemtable_flush_period_in_ms(Integer.parseInt(mValue));
- break;
- case CACHING:
- cfDef.setCaching(CliUtils.unescapeSQLString(mValue));
- break;
- case CELLS_PER_ROW_TO_CACHE:
- cfDef.setCells_per_row_to_cache(CliUtils.unescapeSQLString(mValue));
- break;
- case DEFAULT_TIME_TO_LIVE:
- cfDef.setDefault_time_to_live(Integer.parseInt(mValue));
- break;
- case INDEX_INTERVAL:
- cfDef.setIndex_interval(Integer.parseInt(mValue));
- break;
- case SPECULATIVE_RETRY:
- cfDef.setSpeculative_retry(CliUtils.unescapeSQLString(mValue));
- break;
- case POPULATE_IO_CACHE_ON_FLUSH:
- cfDef.setPopulate_io_cache_on_flush(Boolean.parseBoolean(mValue));
- break;
- default:
- //must match one of the above or we'd throw an exception at the valueOf statement above.
- assert(false);
-
- }
- }
-
- return cfDef;
- }
-
- /**
- * Delete a keyspace
- * @param statement - a token tree representing current statement
- * @throws TException - exception
- * @throws InvalidRequestException - exception
- * @throws NotFoundException - exception
- * @throws SchemaDisagreementException
- */
- private void executeDelKeySpace(Tree statement)
- throws TException, InvalidRequestException, NotFoundException, SchemaDisagreementException
- {
- if (!CliMain.isConnected())
- return;
-
- String keyspaceName = CliCompiler.getKeySpace(statement, thriftClient.describe_keyspaces());
- String version = thriftClient.system_drop_keyspace(keyspaceName);
- sessionState.out.println(version);
-
- if (keyspaceName.equals(keySpace)) //we just deleted the keyspace we were authenticated too
- keySpace = null;
- }
-
- /**
- * Delete a column family
- * @param statement - a token tree representing current statement
- * @throws TException - exception
- * @throws InvalidRequestException - exception
- * @throws NotFoundException - exception
- * @throws SchemaDisagreementException
- */
- private void executeDelColumnFamily(Tree statement)
- throws TException, InvalidRequestException, NotFoundException, SchemaDisagreementException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
- String mySchemaVersion = thriftClient.system_drop_column_family(cfName);
- sessionState.out.println(mySchemaVersion);
- }
-
- private void executeList(Tree statement)
- throws TException, InvalidRequestException, NotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException, UnavailableException, TimedOutException, CharacterCodingException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- long startTime = System.nanoTime();
-
- // extract column family
- String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
-
- String rawStartKey = "";
- String rawEndKey = "";
- int limitCount = Integer.MAX_VALUE; // will reset to default later if it's not specified
- int columnCount = Integer.MAX_VALUE; // will reset to default later if it's not specified
- boolean reversed = false;
-
- // optional arguments: key range and limit
- for (int i = 1; i < statement.getChildCount(); i++)
- {
- Tree child = statement.getChild(i);
- if (child.getType() == CliParser.NODE_KEY_RANGE)
- {
- if (child.getChildCount() > 0)
- {
- rawStartKey = CliUtils.unescapeSQLString(child.getChild(0).getText());
- if (child.getChildCount() > 1)
- rawEndKey = CliUtils.unescapeSQLString(child.getChild(1).getText());
- }
- }
- else if (child.getType() == CliParser.NODE_LIMIT)
- {
- if (child.getChildCount() != 1)
- {
- sessionState.out.println("Invalid limit clause");
- return;
- }
-
- limitCount = Integer.parseInt(child.getChild(0).getText());
- if (limitCount <= 0)
- {
- sessionState.out.println("Invalid limit " + limitCount);
- return;
- }
- }
- else if (child.getType() == CliParser.NODE_COLUMNS)
- {
- if ((child.getChildCount() < 1) || (child.getChildCount() > 2))
- {
- sessionState.err.println("Invalid cells clause.");
- return;
- }
-
- String columns = child.getChild(0).getText();
-
- try
- {
- columnCount = Integer.parseInt(columns);
- if (columnCount < 0)
- {
- sessionState.err.println("Invalid cell limit: " + columnCount);
- return;
- }
-
- if (child.getChildCount() == 2)
- reversed = child.getChild(1).getType() == CliParser.NODE_REVERSED;
- }
- catch (NumberFormatException nfe)
- {
- sessionState.err.println("Invalid cell number format: " + columns);
- return;
- }
- }
- }
-
- if (limitCount == Integer.MAX_VALUE)
- {
- limitCount = 100;
- sessionState.out.println("Using default limit of 100");
- }
- if (columnCount == Integer.MAX_VALUE)
- {
- columnCount = 100;
- sessionState.out.println("Using default cell limit of 100");
- }
-
-
- CfDef columnFamilyDef = getCfDef(columnFamily);
-
- // read all columns and superColumns
- SlicePredicate predicate = new SlicePredicate();
- SliceRange sliceRange = new SliceRange();
- sliceRange.setStart(new byte[0]).setFinish(new byte[0]);
- sliceRange.setCount(columnCount);
- sliceRange.setReversed(reversed);
- predicate.setSlice_range(sliceRange);
-
- // set the key range
- KeyRange range = new KeyRange(limitCount);
- AbstractType<?> keyComparator = this.cfKeysComparators.get(columnFamily);
- ByteBuffer startKey = rawStartKey.isEmpty() ? ByteBufferUtil.EMPTY_BYTE_BUFFER : getBytesAccordingToType(rawStartKey, keyComparator);
- ByteBuffer endKey = rawEndKey.isEmpty() ? ByteBufferUtil.EMPTY_BYTE_BUFFER : getBytesAccordingToType(rawEndKey, keyComparator);
- range.setStart_key(startKey).setEnd_key(endKey);
-
- ColumnParent columnParent = new ColumnParent(columnFamily);
- List<KeySlice> keySlices = thriftClient.get_range_slices(columnParent, predicate, range, consistencyLevel);
- printSliceList(columnFamilyDef, keySlices);
- elapsedTime(startTime);
- }
-
- // DROP INDEX ON <CF>.<COLUMN>
- private void executeDropIndex(Tree statement) throws TException, SchemaDisagreementException, InvalidRequestException, NotFoundException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- // getColumnFamily will check if CF exists for us
- String columnFamily = CliCompiler.getColumnFamily(statement, currentCfDefs());
- String rawColumName = CliUtils.unescapeSQLString(statement.getChild(1).getText());
-
- CfDef cfDef = getCfDef(columnFamily);
-
- ByteBuffer columnName = columnNameAsBytes(rawColumName, cfDef);
-
- boolean foundColumn = false;
-
- for (ColumnDef column : cfDef.getColumn_metadata())
- {
- if (column.name.equals(columnName))
- {
- foundColumn = true;
-
- if (column.getIndex_type() == null)
- throw new RuntimeException(String.format("Column '%s' does not have an index.", rawColumName));
-
- column.setIndex_name(null);
- column.setIndex_type(null);
- }
- }
-
- if (!foundColumn)
- throw new RuntimeException(String.format("Column '%s' definition was not found in ColumnFamily '%s'.",
- rawColumName,
- columnFamily));
-
- String mySchemaVersion = thriftClient.system_update_column_family(cfDef);
- sessionState.out.println(mySchemaVersion);
- keyspacesMap.put(keySpace, thriftClient.describe_keyspace(keySpace));
- }
-
- // TRUNCATE <columnFamily>
- private void executeTruncate(String columnFamily) throws TException, InvalidRequestException, UnavailableException, TimedOutException
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- // getting CfDef, it will fail if there is no such column family in current keySpace.
- CfDef cfDef = getCfDef(CliCompiler.getColumnFamily(columnFamily, currentCfDefs()));
-
- thriftClient.truncate(cfDef.getName());
- sessionState.out.println(columnFamily + " truncated.");
- }
-
- /**
- * Command: CONSISTENCYLEVEL AS (ONE | QUORUM ...)
- * Tree: ^(NODE_CONSISTENCY_LEVEL AS (ONE | QUORUM ...))
- * @param statement - tree representing current statement
- */
- private void executeConsistencyLevelStatement(Tree statement)
- {
- if (!CliMain.isConnected())
- return;
-
- String userSuppliedLevel = statement.getChild(0).getText().toUpperCase();
-
- try
- {
- consistencyLevel = ConsistencyLevel.valueOf(userSuppliedLevel);
- }
- catch (IllegalArgumentException e)
- {
- String elements = "ONE, TWO, THREE, QUORUM, ALL, LOCAL_QUORUM, EACH_QUORUM, ANY";
- sessionState.out.println(String.format("'%s' is invalid. Available: %s", userSuppliedLevel, elements));
- return;
- }
-
- sessionState.out.println(String.format("Consistency level is set to '%s'.", consistencyLevel));
- }
-
- /**
- * Command: ASSUME <columnFamily> (VALIDATOR | COMPARATOR | KEYS | SUB_COMPARATOR) AS <type>
- * Tree: ^(NODE_ASSUME <columnFamily> (VALIDATOR | COMPARATOR | KEYS | SUB_COMPARATOR) <type>))
- * @param statement - tree representing current statement
- */
- private void executeAssumeStatement(Tree statement)
- {
- if (!CliMain.isConnected() || !hasKeySpace())
- return;
-
- String cfName = CliCompiler.getColumnFamily(statement, currentCfDefs());
-
- // VALIDATOR | COMPARATOR | KEYS | SUB_COMPARATOR
- String assumptionElement = statement.getChild(1).getText().toUpperCase();
-
-
- // Could be UTF8Type, IntegerType, LexicalUUIDType etc.
- String defaultType = CliUtils.unescapeSQLString(statement.getChild(2).getText());
-
- if (applyAssumption(cfName, assumptionElement, defaultType))
- {
- assumptions.addAssumption(keySpace, cfName, assumptionElement, defaultType);
- sessionState.out.println(String.format("Assumption for column family '%s' added successfully.", cfName));
- }
- }
-
- private boolean applyAssumption(String cfName, String assumptionElement, String defaultType)
- {
- CfDef columnFamily;
-
- try
- {
- columnFamily = getCfDef(cfName);
- }
- catch (RuntimeException e)
- {
- return false; // just fail if CF does not exist
- }
-
- // used to store in this.cfKeysComparator
- AbstractType<?> comparator;
-
- try
- {
- comparator = TypeParser.parse(defaultType);
- }
- catch (RequestValidationException e)
- {
- try
- {
- comparator = Function.valueOf(defaultType.toUpperCase()).getValidator();
- }
- catch (Exception ne)
- {
- String functions = Function.getFunctionNames();
- sessionState.out.println("Type '" + defaultType + "' was not found. Available: " + functions
- + " Or any class which extends o.a.c.db.marshal.AbstractType.");
- return false;
- }
- }
-
- // making string representation look property e.g. o.a.c.db.marshal.UTF8Type
- defaultType = comparator.getClass().getName();
-
- if (assumptionElement.equals("COMPARATOR"))
- {
- columnFamily.setComparator_type(defaultType);
- }
- else if (assumptionElement.equals("SUB_COMPARATOR"))
- {
- columnFamily.setSubcomparator_type(defaultType);
- }
- else if (assumptionElement.equals("VALIDATOR"))
- {
- columnFamily.setDefault_validation_class(defaultType);
- }
- else if (assumptionElement.equals("KEYS"))
- {
- this.cfKeysComparators.put(columnFamily.getName(), comparator);
- }
- else
- {
- String elements = "VALIDATOR, COMPARATOR, KEYS, SUB_COMPARATOR.";
- sessionState.out.println(String.format("'%s' is invalid. Available: %s", assumptionElement, elements));
- return false;
- }
-
- return true;
- }
-
- // SHOW API VERSION
- private void executeShowVersion() throws TException
- {
- if (!CliMain.isConnected())
- return;
-
- sessionState.out.println(thriftClient.describe_version());
- }
-
- // SHOW KEYSPACES
- private void executeShowKeySpaces() throws TException, InvalidRequestException
- {
- if (!CliMain.isConnected())
- return;
-
- printCQL3TablesWarning("show keyspaces");
-
- List<KsDef> keySpaces = thriftClient.describe_keyspaces();
-
- Collections.sort(keySpaces, new KsDefNamesComparator());
- for (KsDef keySpace : keySpaces)
- {
- describeKeySpace(keySpace.name, keySpace);
- }
- }
-
- // SHOW SCHEMA
- private void executeShowSchema(Tree statement) throws TException, InvalidRequestException
- {
- if (!CliMain.isConnected())
- return;
-
- printCQL3TablesWarning("show schema");
-
- final List<KsDef> keyspaces = thriftClient.describe_keyspaces();
- Collections.sort(keyspaces, new KsDefNamesComparator());
- final String keyspaceName = (statement.getChildCount() == 0)
- ? keySpace
- : CliCompiler.getKeySpace(statement, keyspaces);
-
- Iterator<KsDef> ksIter;
- if (keyspaceName != null)
- ksIter = Collections2.filter(keyspaces, new Predicate<KsDef>()
- {
- public boolean apply(KsDef ksDef)
- {
- return keyspaceName.equals(ksDef.name);
- }
- }).iterator();
- else
- ksIter = keyspaces.iterator();
-
- while (ksIter.hasNext())
- showKeyspace(sessionState.out, ksIter.next());
-
- sessionState.out.flush();
- }
-
- /**
- * Creates a CLI script to create the Keyspace it's Column Families
- *
- * @param output StringBuilder to write to.
- * @param ksDef KsDef to create the cli script for.
- */
- private void showKeyspace(PrintStream output, KsDef ksDef)
- {
- output.append("create keyspace ").append(CliUtils.maybeEscapeName(ksDef.name));
-
- writeAttr(output, true, "placement_strategy", normaliseType(ksDef.strategy_class, "org.apache.cassandra.locator"));
-
- if (ksDef.strategy_options != null && !ksDef.strategy_options.isEmpty())
- {
- final StringBuilder opts = new StringBuilder();
- opts.append("{");
- String prefix = "";
- for (Map.Entry<String, String> opt : ksDef.strategy_options.entrySet())
- {
- opts.append(prefix).append(CliUtils.escapeSQLString(opt.getKey())).append(" : ").append(CliUtils.escapeSQLString(opt.getValue()));
- prefix = ", ";
- }
- opts.append("}");
- writeAttrRaw(output, false, "strategy_options", opts.toString());
- }
-
- writeAttr(output, false, "durable_writes", ksDef.durable_writes);
-
- output.append(";").append(NEWLINE);
- output.append(NEWLINE);
-
- output.append("use ").append(CliUtils.maybeEscapeName(ksDef.name)).append(";");
- output.append(NEWLINE);
- output.append(NEWLINE);
-
- Collections.sort(ksDef.cf_defs, new CfDefNamesComparator());
- for (CfDef cfDef : ksDef.cf_defs)
- showColumnFamily(output, cfDef);
- output.append(NEWLINE);
- output.append(NEWLINE);
- }
-
- /**
- * Creates a CLI script for the CfDef including meta data to the supplied StringBuilder.
- *
- * @param output File to write to.
- * @param cfDef CfDef to export attributes from.
- */
- private void showColumnFamily(PrintStream output, CfDef cfDef)
- {
- output.append("create column family ").append(CliUtils.maybeEscapeName(cfDef.name));
-
- 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(output, false, "subcomparator", normaliseType(cfDef.subcomparator_type, "org.apache.cassandra.db.marshal"));
- if (!StringUtils.isEmpty(cfDef.default_validation_class))
- writeAttr(output, false, "default_validation_class",
- normaliseType(cfDef.default_validation_class, "org.apache.cassandra.db.marshal"));
- writeAttr(output, false, "key_validation_class",
- normaliseType(cfDef.key_validation_class, "org.apache.cassandra.db.marshal"));
-
- writeAttr(output, false, "read_repair_chance", cfDef.read_repair_chance);
- writeAttr(output, false, "dclocal_read_repair_chance", cfDef.dclocal_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, "compaction_strategy", cfDef.compaction_strategy);
- writeAttr(output, false, "caching", cfDef.caching);
- writeAttr(output, false, "cells_per_row_to_cache", cfDef.cells_per_row_to_cache);
- writeAttr(output, false, "default_time_to_live", cfDef.default_time_to_live);
- writeAttr(output, false, "speculative_retry", cfDef.speculative_retry);
-
- if (cfDef.isSetBloom_filter_fp_chance())
- writeAttr(output, false, "bloom_filter_fp_chance", cfDef.bloom_filter_fp_chance);
- if (!cfDef.compaction_strategy_options.isEmpty())
- {
- StringBuilder cOptions = new StringBuilder();
-
- cOptions.append("{");
-
- Map<String, String> options = cfDef.compaction_strategy_options;
-
- int i = 0, size = options.size();
-
- for (Map.Entry<String, String> entry : options.entrySet())
- {
- cOptions.append(CliUtils.quote(entry.getKey())).append(" : ").append(CliUtils.quote(entry.getValue()));
-
- if (i != size - 1)
- cOptions.append(", ");
-
- i++;
- }
-
- cOptions.append("}");
-
- writeAttrRaw(output, false, "compaction_strategy_options", cOptions.toString());
- }
- if (!StringUtils.isEmpty(cfDef.comment))
- writeAttr(output, false, "comment", cfDef.comment);
-
- if (!cfDef.column_metadata.isEmpty())
- {
- output.append(NEWLINE)
- .append(TAB)
- .append("and column_metadata = [");
-
- boolean first = true;
- for (ColumnDef colDef : cfDef.column_metadata)
- {
- if (!first)
- output.append(",");
- first = false;
- showColumnMeta(output, cfDef, colDef);
- }
-
- output.append("]");
- }
-
- if (cfDef.compression_options != null && !cfDef.compression_options.isEmpty())
- {
- StringBuilder compOptions = new StringBuilder();
-
- compOptions.append("{");
-
- int i = 0, size = cfDef.compression_options.size();
-
- for (Map.Entry<String, String> entry : cfDef.compression_options.entrySet())
- {
- compOptions.append(CliUtils.quote(entry.getKey())).append(" : ").append(CliUtils.quote(entry.getValue()));
-
- if (i != size - 1)
- compOptions.append(", ");
-
- i++;
- }
-
- compOptions.append("}");
-
- writeAttrRaw(output, false, "compression_options", compOptions.toString());
- }
- if (cfDef.isSetIndex_interval())
- writeAttr(output, false, "index_interval", cfDef.index_interval);
-
- output.append(";");
- output.append(NEWLINE);
- output.append(NEWLINE);
- }
-
- /**
- * Writes the supplied ColumnDef to the StringBuilder as a cli script.
- *
- * @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(PrintStream output, CfDef cfDef, ColumnDef colDef)
- {
- output.append(NEWLINE + TAB + TAB + "{");
-
- final AbstractType<?> comparator = getFormatType(cfDef.column_type.equals("Super")
- ? cfDef.subcomparator_type
- : cfDef.comparator_type);
- output.append("column_name : '" + CliUtils.escapeSQLString(comparator.getString(colDef.name)) + "'," + NEWLINE);
- String validationClass = normaliseType(colDef.validation_class, "org.apache.cassandra.db.marshal");
- output.append(TAB + TAB + "validation_class : " + CliUtils.escapeSQLString(validationClass));
- if (colDef.isSetIndex_name())
- {
- 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 && !colDef.index_options.isEmpty())
- {
- 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())
- {
- 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)
- output.append(",").append(NEWLINE);
- }
- output.append("}");
- }
- }
- output.append("}");
- }
-
- private String normaliseType(String path, String expectedPackage)
- {
- if (path.startsWith(expectedPackage))
- return path.substring(expectedPackage.length() + 1);
-
- return path;
- }
-
- private void writeAttr(PrintStream output, boolean first, String name, Boolean value)
- {
- writeAttrRaw(output, first, name, value.toString());
- }
- private void writeAttr(PrintStream output, boolean first, String name, Number value)
- {
- writeAttrRaw(output, first, name, value.toString());
- }
-
- private void writeAttr(PrintStream output, boolean first, String name, String value)
- {
- writeAttrRaw(output, first, name, "'" + CliUtils.escapeSQLString(value) + "'");
- }
-
- private void writeAttrRaw(PrintStream output, boolean first, String name, String 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
- * @return boolean
- */
- private boolean hasKeySpace(boolean printError)
- {
- boolean hasKeyspace = keySpace != null;
-
- if (!hasKeyspace && printError)
- sessionState.err.println("Not authorized to a working keyspace.");
-
- return hasKeyspace;
- }
-
- private boolean hasKeySpace()
- {
- return hasKeySpace(true);
- }
-
- public String getKeySpace()
- {
- return keySpace == null ? "unknown" : keySpace;
- }
-
- public void setKeySpace(String keySpace) throws NotFoundException, InvalidRequestException, TException
- {
- this.keySpace = keySpace;
- // We do nothing with the return value, but it hits a cache and the tab-completer.
- getKSMetaData(keySpace);
- }
-
- public String getUsername()
- {
- return username == null ? "default" : username;
- }
-
- public void setUsername(String username)
- {
- this.username = username;
- }
-
- // USE <keyspace_name>
- private void executeUseKeySpace(Tree statement)
- {
- if (!CliMain.isConnected())
- return;
-
- int childCount = statement.getChildCount();
- String keySpaceName, username = null, password = null;
-
- // Get keyspace name
- keySpaceName = CliUtils.unescapeSQLString(statement.getChild(0).getText());
-
- if (childCount == 3)
- {
- username = statement.getChild(1).getText();
- password = statement.getChild(2).getText();
- }
-
- if (keySpaceName == null)
- {
- sessionState.out.println("Keyspace argument required");
- return;
- }
-
- try
- {
- AuthenticationRequest authRequest;
-
- keySpaceName = CliCompiler.getKeySpace(keySpaceName, thriftClient.describe_keyspaces());
-
- thriftClient.set_keyspace(keySpaceName);
-
- if (username != null && password != null)
- {
- Map<String, String> credentials = new HashMap<String, String>();
- /* remove quotes */
- password = password.replace("\'", "");
- credentials.put(IAuthenticator.USERNAME_KEY, username);
- credentials.put(IAuthenticator.PASSWORD_KEY, password);
- authRequest = new AuthenticationRequest(credentials);
- thriftClient.login(authRequest);
- }
-
- keySpace = keySpaceName;
- this.username = username != null ? username : "default";
-
- keyspacesMap.remove(keySpace);
- CliMain.updateCompletor(CliUtils.getCfNamesByKeySpace(getKSMetaData(keySpace)));
- sessionState.out.println("Authenticated to keyspace: " + keySpace);
- }
- catch (AuthenticationException e)
- {
- sessionState.err.println("Exception during authentication to the cassandra node: " +
- "verify keyspace exists, and you are using correct credentials.");
- }
- catch (AuthorizationException e)
- {
- sessionState.err.println("You are not authorized to use keyspace: " + keySpaceName);
- }
- catch (InvalidRequestException e)
- {
- sessionState.err.println(keySpaceName + " does not exist.");
- }
- catch (NotFoundException e)
- {
- sessionState.err.println(keySpaceName + " does not exist.");
- }
- catch (TException e)
- {
- if (sessionState.debug)
- e.printStackTrace(sessionState.err);
-
- sessionState.err.println("Login failure. Did you specify 'keyspace', 'username' and 'password'?");
- }
- }
-
- private void executeTraceNextQuery() throws TException
- {
- if (!CliMain.isConnected())
- return;
-
- UUID sessionId = TimeUUIDType.instance.compose(thriftClient.trace_next_query());
-
- sessionState.out.println("Will trace next query. Session ID: " + sessionId);
- }
-
- private void describeKeySpace(String keySpaceName, KsDef metadata) throws TException
- {
- NodeProbe probe = sessionState.getNodeProbe();
-
- // getting compaction manager MBean to displaying index building information
- CompactionManagerMBean compactionManagerMBean = (probe == null) ? null : probe.getCompactionManagerProxy();
-
- // Describe and display
- sessionState.out.println("Keyspace: " + keySpaceName + ":");
- try
- {
- KsDef ks_def;
- ks_def = metadata == null ? thriftClient.describe_keyspace(keySpaceName) : metadata;
- sessionState.out.println(" Replication Strategy: " + ks_def.strategy_class);
-
- sessionState.out.println(" Durable Writes: " + ks_def.durable_writes);
-
- Map<String, String> options = ks_def.strategy_options;
- sessionState.out.println(" Options: [" + ((options == null) ? "" : FBUtilities.toString(options)) + "]");
-
- sessionState.out.println(" Column Families:");
-
- Collections.sort(ks_def.cf_defs, new CfDefNamesComparator());
-
- for (CfDef cf_def : ks_def.cf_defs)
- describeColumnFamily(ks_def, cf_def, probe);
-
- // compaction manager information
- if (compactionManagerMBean != null)
- {
- for (Map<String, String> info : compactionManagerMBean.getCompactions())
- {
- // if ongoing compaction type is index build
- if (info.get("taskType").equals(OperationType.INDEX_BUILD.toString()))
- continue;
- sessionState.out.printf("%nCurrently building index %s, completed %d of %d bytes.%n",
- info.get("columnfamily"),
- info.get("bytesComplete"),
- info.get("totalBytes"));
- }
- }
-
- // closing JMX connection
- if (probe != null)
- probe.close();
- }
- catch (InvalidRequestException e)
- {
- sessionState.out.println("Invalid request: " + e);
- }
- catch (NotFoundException e)
- {
- sessionState.out.println("Keyspace " + keySpaceName + " could not be found.");
- }
- catch (IOException e)
- {
- sessionState.out.println("Error while closing JMX connection: " + e.getMessage());
- }
- }
-
- private void describeColumnFamily(KsDef ks_def, CfDef cf_def, NodeProbe probe)
- {
- // fetching bean for current column family store
- ColumnFamilyStoreMBean cfMBean = (probe == null) ? null : probe.getCfsProxy(ks_def.getName(), cf_def.getName());
-
- boolean isSuper = cf_def.column_type.equals("Super");
- sessionState.out.printf(" ColumnFamily: %s%s%n", cf_def.name, isSuper ? " (Super)" : "");
-
- if (cf_def.comment != null && !cf_def.comment.isEmpty())
- sessionState.out.printf(" \"%s\"%n", cf_def.comment);
-
- if (cf_def.key_validation_class != null)
- sessionState.out.printf(" Key Validation Class: %s%n", cf_def.key_validation_class);
-
- if (cf_def.default_validation_class != null)
- sessionState.out.printf(" Default column value validator: %s%n", cf_def.default_validation_class);
-
- sessionState.out.printf(" Cells sorted by: %s%s%n", cf_def.comparator_type, cf_def.column_type.equals("Super") ? "/" + cf_def.subcomparator_type : "");
- sessionState.out.printf(" GC grace seconds: %s%n", cf_def.gc_grace_seconds);
- sessionState.out.printf(" Compaction min/max thresholds: %s/%s%n", cf_def.min_compaction_threshold, cf_def.max_compaction_threshold);
- sessionState.out.printf(" Read repair chance: %s%n", cf_def.read_repair_chance);
- sessionState.out.printf(" DC Local Read repair chance: %s%n", cf_def.dclocal_read_repair_chance);
- sessionState.out.printf(" Caching: %s%n", cf_def.caching);
- sessionState.out.printf(" Default time to live: %s%n", cf_def.default_time_to_live);
- sessionState.out.printf(" Bloom Filter FP chance: %s%n", cf_def.isSetBloom_filter_fp_chance() ? cf_def.bloom_filter_fp_chance : "default");
- sessionState.out.printf(" Index interval: %s%n", cf_def.isSetIndex_interval() ? cf_def.index_interval : "default");
- sessionState.out.printf(" Speculative Retry: %s%n", cf_def.speculative_retry);
-
- // if we have connection to the cfMBean established
- if (cfMBean != null)
- sessionState.out.printf(" Built indexes: %s%n", cfMBean.getBuiltIndexes());
-
- if (cf_def.getColumn_metadataSize() != 0)
- {
- String leftSpace = " ";
- String columnLeftSpace = leftSpace + " ";
-
- String compareWith = isSuper ? cf_def.subcomparator_type
- : cf_def.comparator_type;
- AbstractType<?> columnNameValidator = getFormatType(compareWith);
-
- sessionState.out.println(leftSpace + "Column Metadata:");
- for (ColumnDef columnDef : cf_def.getColumn_metadata())
- {
- String columnName = columnNameValidator.getString(columnDef.name);
- if (columnNameValidator instanceof BytesType)
- {
- try
- {
- String columnString = UTF8Type.instance.getString(columnDef.name);
- columnName = columnString + " (" + columnName + ")";
- }
- catch (MarshalException e)
- {
- // guess it wasn't a utf8 column name after all
- }
- }
-
- sessionState.out.println(leftSpace + " Column Name: " + columnName);
- sessionState.out.println(columnLeftSpace + "Validation Class: " + columnDef.getValidation_class());
-
- if
<TRUNCATED>