#!/usr/bin/env python
#
# Autogenerated by Thrift Compiler (0.10.0)
#
# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
#
#  options string: py
#

import sys
import pprint
if sys.version_info[0] > 2:
    from urllib.parse import urlparse
else:
    from urlparse import urlparse
from thrift.transport import TTransport, TSocket, TSSLSocket, THttpClient
from thrift.protocol.TBinaryProtocol import TBinaryProtocol

from cassandra import Cassandra
from cassandra.ttypes import *

if len(sys.argv) <= 1 or sys.argv[1] == '--help':
    print('')
    print('Usage: ' + sys.argv[0] + ' [-h host[:port]] [-u url] [-f[ramed]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] function [arg1 [arg2...]]')
    print('')
    print('Functions:')
    print('  void login(AuthenticationRequest auth_request)')
    print('  void set_keyspace(string keyspace)')
    print('  ColumnOrSuperColumn get(string key, ColumnPath column_path, ConsistencyLevel consistency_level)')
    print('   get_slice(string key, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level)')
    print('  i32 get_count(string key, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level)')
    print('   multiget_slice( keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level)')
    print('   multiget_count( keys, ColumnParent column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level)')
    print('   get_range_slices(ColumnParent column_parent, SlicePredicate predicate, KeyRange range, ConsistencyLevel consistency_level)')
    print('   get_paged_slice(string column_family, KeyRange range, string start_column, ConsistencyLevel consistency_level)')
    print('   get_indexed_slices(ColumnParent column_parent, IndexClause index_clause, SlicePredicate column_predicate, ConsistencyLevel consistency_level)')
    print('  void insert(string key, ColumnParent column_parent, Column column, ConsistencyLevel consistency_level)')
    print('  void add(string key, ColumnParent column_parent, CounterColumn column, ConsistencyLevel consistency_level)')
    print('  CASResult cas(string key, string column_family,  expected,  updates, ConsistencyLevel serial_consistency_level, ConsistencyLevel commit_consistency_level)')
    print('  void remove(string key, ColumnPath column_path, i64 timestamp, ConsistencyLevel consistency_level)')
    print('  void remove_counter(string key, ColumnPath path, ConsistencyLevel consistency_level)')
    print('  void batch_mutate( mutation_map, ConsistencyLevel consistency_level)')
    print('  void atomic_batch_mutate( mutation_map, ConsistencyLevel consistency_level)')
    print('  void truncate(string cfname)')
    print('   get_multi_slice(MultiSliceRequest request)')
    print('   describe_schema_versions()')
    print('   describe_keyspaces()')
    print('  string describe_cluster_name()')
    print('  string describe_version()')
    print('   describe_ring(string keyspace)')
    print('   describe_local_ring(string keyspace)')
    print('   describe_token_map()')
    print('  string describe_partitioner()')
    print('  string describe_snitch()')
    print('  KsDef describe_keyspace(string keyspace)')
    print('   describe_splits(string cfName, string start_token, string end_token, i32 keys_per_split)')
    print('  string trace_next_query()')
    print('   describe_splits_ex(string cfName, string start_token, string end_token, i32 keys_per_split)')
    print('  string system_add_column_family(CfDef cf_def)')
    print('  string system_drop_column_family(string column_family)')
    print('  string system_add_keyspace(KsDef ks_def)')
    print('  string system_drop_keyspace(string keyspace)')
    print('  string system_update_keyspace(KsDef ks_def)')
    print('  string system_update_column_family(CfDef cf_def)')
    print('  CqlResult execute_cql_query(string query, Compression compression)')
    print('  CqlResult execute_cql3_query(string query, Compression compression, ConsistencyLevel consistency)')
    print('  CqlPreparedResult prepare_cql_query(string query, Compression compression)')
    print('  CqlPreparedResult prepare_cql3_query(string query, Compression compression)')
    print('  CqlResult execute_prepared_cql_query(i32 itemId,  values)')
    print('  CqlResult execute_prepared_cql3_query(i32 itemId,  values, ConsistencyLevel consistency)')
    print('  void set_cql_version(string version)')
    print('')
    sys.exit(0)

pp = pprint.PrettyPrinter(indent=2)
host = 'localhost'
port = 9090
uri = ''
framed = False
ssl = False
validate = True
ca_certs = None
keyfile = None
certfile = None
http = False
argi = 1

if sys.argv[argi] == '-h':
    parts = sys.argv[argi + 1].split(':')
    host = parts[0]
    if len(parts) > 1:
        port = int(parts[1])
    argi += 2

if sys.argv[argi] == '-u':
    url = urlparse(sys.argv[argi + 1])
    parts = url[1].split(':')
    host = parts[0]
    if len(parts) > 1:
        port = int(parts[1])
    else:
        port = 80
    uri = url[2]
    if url[4]:
        uri += '?%s' % url[4]
    http = True
    argi += 2

if sys.argv[argi] == '-f' or sys.argv[argi] == '-framed':
    framed = True
    argi += 1

if sys.argv[argi] == '-s' or sys.argv[argi] == '-ssl':
    ssl = True
    argi += 1

if sys.argv[argi] == '-novalidate':
    validate = False
    argi += 1

if sys.argv[argi] == '-ca_certs':
    ca_certs = sys.argv[argi+1]
    argi += 2

if sys.argv[argi] == '-keyfile':
    keyfile = sys.argv[argi+1]
    argi += 2

if sys.argv[argi] == '-certfile':
    certfile = sys.argv[argi+1]
    argi += 2

cmd = sys.argv[argi]
args = sys.argv[argi + 1:]

if http:
    transport = THttpClient.THttpClient(host, port, uri)
else:
    if ssl:
        socket = TSSLSocket.TSSLSocket(host, port, validate=validate, ca_certs=ca_certs, keyfile=keyfile, certfile=certfile)
    else:
        socket = TSocket.TSocket(host, port)
    if framed:
        transport = TTransport.TFramedTransport(socket)
    else:
        transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol(transport)
client = Cassandra.Client(protocol)
transport.open()

if cmd == 'login':
    if len(args) != 1:
        print('login requires 1 args')
        sys.exit(1)
    pp.pprint(client.login(eval(args[0]),))

elif cmd == 'set_keyspace':
    if len(args) != 1:
        print('set_keyspace requires 1 args')
        sys.exit(1)
    pp.pprint(client.set_keyspace(args[0],))

elif cmd == 'get':
    if len(args) != 3:
        print('get requires 3 args')
        sys.exit(1)
    pp.pprint(client.get(args[0], eval(args[1]), eval(args[2]),))

elif cmd == 'get_slice':
    if len(args) != 4:
        print('get_slice requires 4 args')
        sys.exit(1)
    pp.pprint(client.get_slice(args[0], eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'get_count':
    if len(args) != 4:
        print('get_count requires 4 args')
        sys.exit(1)
    pp.pprint(client.get_count(args[0], eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'multiget_slice':
    if len(args) != 4:
        print('multiget_slice requires 4 args')
        sys.exit(1)
    pp.pprint(client.multiget_slice(eval(args[0]), eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'multiget_count':
    if len(args) != 4:
        print('multiget_count requires 4 args')
        sys.exit(1)
    pp.pprint(client.multiget_count(eval(args[0]), eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'get_range_slices':
    if len(args) != 4:
        print('get_range_slices requires 4 args')
        sys.exit(1)
    pp.pprint(client.get_range_slices(eval(args[0]), eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'get_paged_slice':
    if len(args) != 4:
        print('get_paged_slice requires 4 args')
        sys.exit(1)
    pp.pprint(client.get_paged_slice(args[0], eval(args[1]), args[2], eval(args[3]),))

elif cmd == 'get_indexed_slices':
    if len(args) != 4:
        print('get_indexed_slices requires 4 args')
        sys.exit(1)
    pp.pprint(client.get_indexed_slices(eval(args[0]), eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'insert':
    if len(args) != 4:
        print('insert requires 4 args')
        sys.exit(1)
    pp.pprint(client.insert(args[0], eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'add':
    if len(args) != 4:
        print('add requires 4 args')
        sys.exit(1)
    pp.pprint(client.add(args[0], eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'cas':
    if len(args) != 6:
        print('cas requires 6 args')
        sys.exit(1)
    pp.pprint(client.cas(args[0], args[1], eval(args[2]), eval(args[3]), eval(args[4]), eval(args[5]),))

elif cmd == 'remove':
    if len(args) != 4:
        print('remove requires 4 args')
        sys.exit(1)
    pp.pprint(client.remove(args[0], eval(args[1]), eval(args[2]), eval(args[3]),))

elif cmd == 'remove_counter':
    if len(args) != 3:
        print('remove_counter requires 3 args')
        sys.exit(1)
    pp.pprint(client.remove_counter(args[0], eval(args[1]), eval(args[2]),))

elif cmd == 'batch_mutate':
    if len(args) != 2:
        print('batch_mutate requires 2 args')
        sys.exit(1)
    pp.pprint(client.batch_mutate(eval(args[0]), eval(args[1]),))

elif cmd == 'atomic_batch_mutate':
    if len(args) != 2:
        print('atomic_batch_mutate requires 2 args')
        sys.exit(1)
    pp.pprint(client.atomic_batch_mutate(eval(args[0]), eval(args[1]),))

elif cmd == 'truncate':
    if len(args) != 1:
        print('truncate requires 1 args')
        sys.exit(1)
    pp.pprint(client.truncate(args[0],))

elif cmd == 'get_multi_slice':
    if len(args) != 1:
        print('get_multi_slice requires 1 args')
        sys.exit(1)
    pp.pprint(client.get_multi_slice(eval(args[0]),))

elif cmd == 'describe_schema_versions':
    if len(args) != 0:
        print('describe_schema_versions requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_schema_versions())

elif cmd == 'describe_keyspaces':
    if len(args) != 0:
        print('describe_keyspaces requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_keyspaces())

elif cmd == 'describe_cluster_name':
    if len(args) != 0:
        print('describe_cluster_name requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_cluster_name())

elif cmd == 'describe_version':
    if len(args) != 0:
        print('describe_version requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_version())

elif cmd == 'describe_ring':
    if len(args) != 1:
        print('describe_ring requires 1 args')
        sys.exit(1)
    pp.pprint(client.describe_ring(args[0],))

elif cmd == 'describe_local_ring':
    if len(args) != 1:
        print('describe_local_ring requires 1 args')
        sys.exit(1)
    pp.pprint(client.describe_local_ring(args[0],))

elif cmd == 'describe_token_map':
    if len(args) != 0:
        print('describe_token_map requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_token_map())

elif cmd == 'describe_partitioner':
    if len(args) != 0:
        print('describe_partitioner requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_partitioner())

elif cmd == 'describe_snitch':
    if len(args) != 0:
        print('describe_snitch requires 0 args')
        sys.exit(1)
    pp.pprint(client.describe_snitch())

elif cmd == 'describe_keyspace':
    if len(args) != 1:
        print('describe_keyspace requires 1 args')
        sys.exit(1)
    pp.pprint(client.describe_keyspace(args[0],))

elif cmd == 'describe_splits':
    if len(args) != 4:
        print('describe_splits requires 4 args')
        sys.exit(1)
    pp.pprint(client.describe_splits(args[0], args[1], args[2], eval(args[3]),))

elif cmd == 'trace_next_query':
    if len(args) != 0:
        print('trace_next_query requires 0 args')
        sys.exit(1)
    pp.pprint(client.trace_next_query())

elif cmd == 'describe_splits_ex':
    if len(args) != 4:
        print('describe_splits_ex requires 4 args')
        sys.exit(1)
    pp.pprint(client.describe_splits_ex(args[0], args[1], args[2], eval(args[3]),))

elif cmd == 'system_add_column_family':
    if len(args) != 1:
        print('system_add_column_family requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_add_column_family(eval(args[0]),))

elif cmd == 'system_drop_column_family':
    if len(args) != 1:
        print('system_drop_column_family requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_drop_column_family(args[0],))

elif cmd == 'system_add_keyspace':
    if len(args) != 1:
        print('system_add_keyspace requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_add_keyspace(eval(args[0]),))

elif cmd == 'system_drop_keyspace':
    if len(args) != 1:
        print('system_drop_keyspace requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_drop_keyspace(args[0],))

elif cmd == 'system_update_keyspace':
    if len(args) != 1:
        print('system_update_keyspace requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_update_keyspace(eval(args[0]),))

elif cmd == 'system_update_column_family':
    if len(args) != 1:
        print('system_update_column_family requires 1 args')
        sys.exit(1)
    pp.pprint(client.system_update_column_family(eval(args[0]),))

elif cmd == 'execute_cql_query':
    if len(args) != 2:
        print('execute_cql_query requires 2 args')
        sys.exit(1)
    pp.pprint(client.execute_cql_query(args[0], eval(args[1]),))

elif cmd == 'execute_cql3_query':
    if len(args) != 3:
        print('execute_cql3_query requires 3 args')
        sys.exit(1)
    pp.pprint(client.execute_cql3_query(args[0], eval(args[1]), eval(args[2]),))

elif cmd == 'prepare_cql_query':
    if len(args) != 2:
        print('prepare_cql_query requires 2 args')
        sys.exit(1)
    pp.pprint(client.prepare_cql_query(args[0], eval(args[1]),))

elif cmd == 'prepare_cql3_query':
    if len(args) != 2:
        print('prepare_cql3_query requires 2 args')
        sys.exit(1)
    pp.pprint(client.prepare_cql3_query(args[0], eval(args[1]),))

elif cmd == 'execute_prepared_cql_query':
    if len(args) != 2:
        print('execute_prepared_cql_query requires 2 args')
        sys.exit(1)
    pp.pprint(client.execute_prepared_cql_query(eval(args[0]), eval(args[1]),))

elif cmd == 'execute_prepared_cql3_query':
    if len(args) != 3:
        print('execute_prepared_cql3_query requires 3 args')
        sys.exit(1)
    pp.pprint(client.execute_prepared_cql3_query(eval(args[0]), eval(args[1]), eval(args[2]),))

elif cmd == 'set_cql_version':
    if len(args) != 1:
        print('set_cql_version requires 1 args')
        sys.exit(1)
    pp.pprint(client.set_cql_version(args[0],))

else:
    print('Unrecognized method %s' % cmd)
    sys.exit(1)

transport.close()
