package org.apache.hadoop.hive.cassandra; import org.apache.cassandra.thrift.Cassandra; import org.apache.cassandra.thrift.InvalidRequestException; import org.apache.commons.lang.StringUtils; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class CassandraClientHolder { private static final Logger log = LoggerFactory.getLogger(CassandraClientHolder.class); private Cassandra.Client client; private final TTransport transport; private String keyspace; public CassandraClientHolder(TTransport transport) throws CassandraException { this(transport, null); } public CassandraClientHolder(TTransport transport, String keyspace) throws CassandraException { this.transport = transport; this.keyspace = keyspace; initClient(); } public boolean isOpen() { return client != null && transport != null && transport.isOpen(); } public String getKeyspace() { return keyspace; } private void initClient() throws CassandraException { try { transport.open(); } catch (TTransportException e) { throw new CassandraException("unable to connect to server", e); } client = new Cassandra.Client(new TBinaryProtocol(transport)); // connect to last known keyspace setKeyspace(keyspace); } /** * Set the client with the (potentially) new keyspace. Safe to call this * repeatedly with the same keyspace. * @return * @throws CassandraException */ public void setKeyspace(String ks) throws CassandraException { if ( ks == null ) { return; } if (keyspace == null || !StringUtils.equals(keyspace, ks)) { try { this.keyspace = ks; client.set_keyspace(keyspace); } catch (InvalidRequestException e) { throw new CassandraException(e); } catch (TException e) { throw new CassandraException(e); } } } public Cassandra.Client getClient() { return client; } public void close() { if ( transport == null || !transport.isOpen() ) { return; } try { transport.flush(); } catch (Exception e) { log.error("Could not flush transport for client holder: "+ toString(), e); } finally { try { if (transport.isOpen()) { transport.close(); } } catch (Exception e) { log.error("Error on transport close for client: " + toString(),e); } } } }