# 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.12.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 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]] [-s[sl]] [-novalidate] [-ca_certs certs] [-keyfile keyfile] [-certfile certfile] 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('  void grantNamespacePermission(string login, string user, string namespaceName, NamespacePermission perm)')
    print('  bool hasNamespacePermission(string login, string user, string namespaceName, NamespacePermission perm)')
    print('  void revokeNamespacePermission(string login, string user, string namespaceName, NamespacePermission 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('  string systemNamespace()')
    print('  string defaultNamespace()')
    print('   listNamespaces(string login)')
    print('  bool namespaceExists(string login, string namespaceName)')
    print('  void createNamespace(string login, string namespaceName)')
    print('  void deleteNamespace(string login, string namespaceName)')
    print('  void renameNamespace(string login, string oldNamespaceName, string newNamespaceName)')
    print('  void setNamespaceProperty(string login, string namespaceName, string property, string value)')
    print('  void removeNamespaceProperty(string login, string namespaceName, string property)')
    print('   getNamespaceProperties(string login, string namespaceName)')
    print('   namespaceIdMap(string login)')
    print('  void attachNamespaceIterator(string login, string namespaceName, IteratorSetting setting,  scopes)')
    print('  void removeNamespaceIterator(string login, string namespaceName, string name,  scopes)')
    print('  IteratorSetting getNamespaceIteratorSetting(string login, string namespaceName, string name, IteratorScope scope)')
    print('   listNamespaceIterators(string login, string namespaceName)')
    print('  void checkNamespaceIteratorConflicts(string login, string namespaceName, IteratorSetting setting,  scopes)')
    print('  i32 addNamespaceConstraint(string login, string namespaceName, string constraintClassName)')
    print('  void removeNamespaceConstraint(string login, string namespaceName, i32 id)')
    print('   listNamespaceConstraints(string login, string namespaceName)')
    print('  bool testNamespaceClassLoad(string login, string namespaceName, string className, string asTypeName)')
    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 = 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 == 'grantNamespacePermission':
    if len(args) != 4:
        print('grantNamespacePermission requires 4 args')
        sys.exit(1)
    pp.pprint(client.grantNamespacePermission(args[0], args[1], args[2], eval(args[3]),))

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

elif cmd == 'revokeNamespacePermission':
    if len(args) != 4:
        print('revokeNamespacePermission requires 4 args')
        sys.exit(1)
    pp.pprint(client.revokeNamespacePermission(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]),))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

transport.close()
