# 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.
#!/usr/bin/env python
#
# Autogenerated by Thrift Compiler (0.9.1)
#
# 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

from accumulo import AccumuloProxy
from accumulo.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 '  string login(string principal,  loginProperties)'
  print '  i32 addConstraint(string login, string tableName, string constraintClassName)'
  print '  void addSplits(string login, string tableName,  splits)'
  print '  void attachIterator(string login, string tableName, IteratorSetting setting,  scopes)'
  print '  void checkIteratorConflicts(string login, string tableName, IteratorSetting setting,  scopes)'
  print '  void clearLocatorCache(string login, string tableName)'
  print '  void cloneTable(string login, string tableName, string newTableName, bool flush,  propertiesToSet,  propertiesToExclude)'
  print '  void compactTable(string login, string tableName, string startRow, string endRow,  iterators, bool flush, bool wait, CompactionStrategyConfig compactionStrategy)'
  print '  void cancelCompaction(string login, string tableName)'
  print '  void createTable(string login, string tableName, bool versioningIter, TimeType type)'
  print '  void deleteTable(string login, string tableName)'
  print '  void deleteRows(string login, string tableName, string startRow, string endRow)'
  print '  void exportTable(string login, string tableName, string exportDir)'
  print '  void flushTable(string login, string tableName, string startRow, string endRow, bool wait)'
  print '   getDiskUsage(string login,  tables)'
  print '   getLocalityGroups(string login, string tableName)'
  print '  IteratorSetting getIteratorSetting(string login, string tableName, string iteratorName, IteratorScope scope)'
  print '  string getMaxRow(string login, string tableName,  auths, string startRow, bool startInclusive, string endRow, bool endInclusive)'
  print '   getTableProperties(string login, string tableName)'
  print '  void importDirectory(string login, string tableName, string importDir, string failureDir, bool setTime)'
  print '  void importTable(string login, string tableName, string importDir)'
  print '   listSplits(string login, string tableName, i32 maxSplits)'
  print '   listTables(string login)'
  print '   listIterators(string login, string tableName)'
  print '   listConstraints(string login, string tableName)'
  print '  void mergeTablets(string login, string tableName, string startRow, string endRow)'
  print '  void offlineTable(string login, string tableName, bool wait)'
  print '  void onlineTable(string login, string tableName, bool wait)'
  print '  void removeConstraint(string login, string tableName, i32 constraint)'
  print '  void removeIterator(string login, string tableName, string iterName,  scopes)'
  print '  void removeTableProperty(string login, string tableName, string property)'
  print '  void renameTable(string login, string oldTableName, string newTableName)'
  print '  void setLocalityGroups(string login, string tableName,  groups)'
  print '  void setTableProperty(string login, string tableName, string property, string value)'
  print '   splitRangeByTablets(string login, string tableName, Range range, i32 maxSplits)'
  print '  bool tableExists(string login, string tableName)'
  print '   tableIdMap(string login)'
  print '  bool testTableClassLoad(string login, string tableName, string className, string asTypeName)'
  print '  void pingTabletServer(string login, string tserver)'
  print '   getActiveScans(string login, string tserver)'
  print '   getActiveCompactions(string login, string tserver)'
  print '   getSiteConfiguration(string login)'
  print '   getSystemConfiguration(string login)'
  print '   getTabletServers(string login)'
  print '  void removeProperty(string login, string property)'
  print '  void setProperty(string login, string property, string value)'
  print '  bool testClassLoad(string login, string className, string asTypeName)'
  print '  bool authenticateUser(string login, string user,  properties)'
  print '  void changeUserAuthorizations(string login, string user,  authorizations)'
  print '  void changeLocalUserPassword(string login, string user, string password)'
  print '  void createLocalUser(string login, string user, string password)'
  print '  void dropLocalUser(string login, string user)'
  print '   getUserAuthorizations(string login, string user)'
  print '  void grantSystemPermission(string login, string user, SystemPermission perm)'
  print '  void grantTablePermission(string login, string user, string table, TablePermission perm)'
  print '  bool hasSystemPermission(string login, string user, SystemPermission perm)'
  print '  bool hasTablePermission(string login, string user, string table, TablePermission perm)'
  print '   listLocalUsers(string login)'
  print '  void revokeSystemPermission(string login, string user, SystemPermission perm)'
  print '  void revokeTablePermission(string login, string user, string table, TablePermission perm)'
  print '  string createBatchScanner(string login, string tableName, BatchScanOptions options)'
  print '  string createScanner(string login, string tableName, ScanOptions options)'
  print '  bool hasNext(string scanner)'
  print '  KeyValueAndPeek nextEntry(string scanner)'
  print '  ScanResult nextK(string scanner, i32 k)'
  print '  void closeScanner(string scanner)'
  print '  void updateAndFlush(string login, string tableName,  cells)'
  print '  string createWriter(string login, string tableName, WriterOptions opts)'
  print '  void update(string writer,  cells)'
  print '  void flush(string writer)'
  print '  void closeWriter(string writer)'
  print '  ConditionalStatus updateRowConditionally(string login, string tableName, string row, ConditionalUpdates updates)'
  print '  string createConditionalWriter(string login, string tableName, ConditionalWriterOptions options)'
  print '   updateRowsConditionally(string conditionalWriter,  updates)'
  print '  void closeConditionalWriter(string conditionalWriter)'
  print '  Range getRowRange(string row)'
  print '  Key getFollowing(Key key, PartialKey part)'
  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 = AccumuloProxy.Client(protocol)
transport.open()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

transport.close()
