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

import sys
import pprint
from urlparse import urlparse
from thrift.transport import TTransport
from thrift.transport import TSocket
from thrift.transport import THttpClient
from thrift.protocol import TBinaryProtocol

import Cassandra
from 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]] 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 '  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 truncate(string cfname)'
  print '   describe_schema_versions()'
  print '   describe_keyspaces()'
  print '  string describe_cluster_name()'
  print '  string describe_version()'
  print '   describe_ring(string keyspace)'
  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 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 '  CqlPreparedResult prepare_cql_query(string query, Compression compression)'
  print '  CqlResult execute_prepared_cql_query(i32 itemId,  values)'
  print '  void set_cql_version(string version)'
  print ''
  sys.exit(0)

pp = pprint.PrettyPrinter(indent = 2)
host = 'localhost'
port = 9090
uri = ''
framed = False
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

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

if http:
  transport = THttpClient.THttpClient(host, port, uri)
else:
  socket = TSocket.TSocket(host, port)
  if framed:
    transport = TTransport.TFramedTransport(socket)
  else:
    transport = TTransport.TBufferedTransport(socket)
protocol = TBinaryProtocol.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 == '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 == 'truncate':
  if len(args) != 1:
    print 'truncate requires 1 args'
    sys.exit(1)
  pp.pprint(client.truncate(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_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 == '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 == '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 == '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 == '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()
