Procházet zdrojové kódy

[hbase] Initial Commit

Kevin Wang před 13 roky
rodič
revize
2d45ab9
50 změnil soubory, kde provedl 16433 přidání a 15 odebrání
  1. 0 15
      apps/beeswax/regenerate_thrift.sh
  2. 24 0
      apps/hbase/Makefile
  3. 2 0
      apps/hbase/babel.cfg
  4. 0 0
      apps/hbase/gen-py/__init__.py
  5. 382 0
      apps/hbase/gen-py/hbased/Hbase-remote
  6. 10286 0
      apps/hbase/gen-py/hbased/Hbase.py
  7. 1 0
      apps/hbase/gen-py/hbased/__init__.py
  8. 11 0
      apps/hbase/gen-py/hbased/constants.py
  9. 1095 0
      apps/hbase/gen-py/hbased/ttypes.py
  10. 1 0
      apps/hbase/hueversion.py
  11. 33 0
      apps/hbase/regenerate_thrift.sh
  12. 29 0
      apps/hbase/setup.py
  13. 15 0
      apps/hbase/src/hbase/__init__.py
  14. 155 0
      apps/hbase/src/hbase/api.py
  15. 34 0
      apps/hbase/src/hbase/conf.py
  16. 16 0
      apps/hbase/src/hbase/forms.py
  17. 6 0
      apps/hbase/src/hbase/locale/de/LC_MESSAGES/django.po
  18. 35 0
      apps/hbase/src/hbase/locale/en_US.pot
  19. 5 0
      apps/hbase/src/hbase/locale/es/LC_MESSAGES/django.po
  20. 6 0
      apps/hbase/src/hbase/locale/fr/LC_MESSAGES/django.po
  21. 6 0
      apps/hbase/src/hbase/locale/ja/LC_MESSAGES/django.po
  22. 6 0
      apps/hbase/src/hbase/locale/ko/LC_MESSAGES/django.po
  23. 5 0
      apps/hbase/src/hbase/locale/pt/LC_MESSAGES/django.po
  24. 6 0
      apps/hbase/src/hbase/locale/pt_BR/LC_MESSAGES/django.po
  25. 5 0
      apps/hbase/src/hbase/locale/zh_CN/LC_MESSAGES/django.po
  26. 0 0
      apps/hbase/src/hbase/management/__init__.py
  27. 0 0
      apps/hbase/src/hbase/management/commands/__init__.py
  28. 0 0
      apps/hbase/src/hbase/migrations/__init__.py
  29. 35 0
      apps/hbase/src/hbase/models.py
  30. 0 0
      apps/hbase/src/hbase/server/__init__.py
  31. 51 0
      apps/hbase/src/hbase/server/hbase_lib.py
  32. 22 0
      apps/hbase/src/hbase/settings.py
  33. 410 0
      apps/hbase/src/hbase/templates/app.mako
  34. 31 0
      apps/hbase/src/hbase/tests.py
  35. 23 0
      apps/hbase/src/hbase/urls.py
  36. 104 0
      apps/hbase/src/hbase/views.py
  37. binární
      apps/hbase/static/art/icon_24.png
  38. binární
      apps/hbase/static/art/loader.gif
  39. 559 0
      apps/hbase/static/css/hbase.css
  40. 0 0
      apps/hbase/static/help/index.html
  41. 92 0
      apps/hbase/static/js/api.js
  42. 265 0
      apps/hbase/static/js/app.js
  43. 144 0
      apps/hbase/static/js/base.js
  44. 784 0
      apps/hbase/static/js/controls.js
  45. 88 0
      apps/hbase/static/js/nav.js
  46. 245 0
      apps/hbase/static/js/utils.js
  47. 915 0
      apps/hbase/thrift/Hbase.thrift
  48. 13 0
      desktop/conf.dist/hue.ini
  49. 12 0
      desktop/conf/pseudo-distributed.ini.tmpl
  50. 476 0
      desktop/core/static/ext/js/codemirror-javascript.js

+ 0 - 15
apps/beeswax/regenerate_thrift.sh

@@ -28,21 +28,6 @@ thrift -I thrift/include -r --gen py:new_style -o ./ thrift/TCLIService.thrift
 # in one of the hive jars that we include
 rm -Rf java/src/main/gen-java/com/facebook java/src/main/gen-java/org/apache
 
-cat <<EOF
-======================================================================
-NOTE:
-======================================================================
-
-This script does *not* remove old generated files that may not be necessary anymore.
-You should probably do something like:
- > git rm -rf java/src/main/gen-java gen-py
- > ./regenerate_thrift.sh
- > git add java/src/main/gen-java gen-py
-
-======================================================================
-
-EOF
-
 # This is based on thirdparty.
 # thrift -r --gen py:new_style -o ../ ../../../../ext/thirdparty/py/thrift/contrib/fb303/if/fb303.thrift
 # C++ compilation for ODBC

+ 24 - 0
apps/hbase/Makefile

@@ -0,0 +1,24 @@
+#
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+#
+
+ifeq ($(ROOT),)
+  $(error "Error: Expect the environment variable $$ROOT to point to the Desktop installation")
+endif
+
+APP_NAME = hbase
+include $(ROOT)/Makefile.sdk

+ 2 - 0
apps/hbase/babel.cfg

@@ -0,0 +1,2 @@
+[python: src/hbase/**.py]
+[mako: src/hbase/templates/**.mako]

+ 0 - 0
apps/hbase/gen-py/__init__.py


+ 382 - 0
apps/hbase/gen-py/hbased/Hbase-remote

@@ -0,0 +1,382 @@
+#!/usr/bin/env python
+#
+# Autogenerated by Thrift Compiler (0.9.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 Hbase
+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 enableTable(Bytes tableName)'
+  print '  void disableTable(Bytes tableName)'
+  print '  bool isTableEnabled(Bytes tableName)'
+  print '  void compact(Bytes tableNameOrRegionName)'
+  print '  void majorCompact(Bytes tableNameOrRegionName)'
+  print '   getTableNames()'
+  print '   getColumnDescriptors(Text tableName)'
+  print '   getTableRegions(Text tableName)'
+  print '  void createTable(Text tableName,  columnFamilies)'
+  print '  void deleteTable(Text tableName)'
+  print '   get(Text tableName, Text row, Text column,  attributes)'
+  print '   getVer(Text tableName, Text row, Text column, i32 numVersions,  attributes)'
+  print '   getVerTs(Text tableName, Text row, Text column, i64 timestamp, i32 numVersions,  attributes)'
+  print '   getRow(Text tableName, Text row,  attributes)'
+  print '   getRowWithColumns(Text tableName, Text row,  columns,  attributes)'
+  print '   getRowTs(Text tableName, Text row, i64 timestamp,  attributes)'
+  print '   getRowWithColumnsTs(Text tableName, Text row,  columns, i64 timestamp,  attributes)'
+  print '   getRows(Text tableName,  rows,  attributes)'
+  print '   getRowsWithColumns(Text tableName,  rows,  columns,  attributes)'
+  print '   getRowsTs(Text tableName,  rows, i64 timestamp,  attributes)'
+  print '   getRowsWithColumnsTs(Text tableName,  rows,  columns, i64 timestamp,  attributes)'
+  print '  void mutateRow(Text tableName, Text row,  mutations,  attributes)'
+  print '  void mutateRowTs(Text tableName, Text row,  mutations, i64 timestamp,  attributes)'
+  print '  void mutateRows(Text tableName,  rowBatches,  attributes)'
+  print '  void mutateRowsTs(Text tableName,  rowBatches, i64 timestamp,  attributes)'
+  print '  i64 atomicIncrement(Text tableName, Text row, Text column, i64 value)'
+  print '  void deleteAll(Text tableName, Text row, Text column,  attributes)'
+  print '  void deleteAllTs(Text tableName, Text row, Text column, i64 timestamp,  attributes)'
+  print '  void deleteAllRow(Text tableName, Text row,  attributes)'
+  print '  void increment(TIncrement increment)'
+  print '  void incrementRows( increments)'
+  print '  void deleteAllRowTs(Text tableName, Text row, i64 timestamp,  attributes)'
+  print '  ScannerID scannerOpenWithScan(Text tableName, TScan scan,  attributes)'
+  print '  ScannerID scannerOpen(Text tableName, Text startRow,  columns,  attributes)'
+  print '  ScannerID scannerOpenWithStop(Text tableName, Text startRow, Text stopRow,  columns,  attributes)'
+  print '  ScannerID scannerOpenWithPrefix(Text tableName, Text startAndPrefix,  columns,  attributes)'
+  print '  ScannerID scannerOpenTs(Text tableName, Text startRow,  columns, i64 timestamp,  attributes)'
+  print '  ScannerID scannerOpenWithStopTs(Text tableName, Text startRow, Text stopRow,  columns, i64 timestamp,  attributes)'
+  print '   scannerGet(ScannerID id)'
+  print '   scannerGetList(ScannerID id, i32 nbRows)'
+  print '  void scannerClose(ScannerID id)'
+  print '   getRowOrBefore(Text tableName, Text row, Text family)'
+  print '  TRegionInfo getRegionInfo(Text row)'
+  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 = Hbase.Client(protocol)
+transport.open()
+
+if cmd == 'enableTable':
+  if len(args) != 1:
+    print 'enableTable requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.enableTable(eval(args[0]),))
+
+elif cmd == 'disableTable':
+  if len(args) != 1:
+    print 'disableTable requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.disableTable(eval(args[0]),))
+
+elif cmd == 'isTableEnabled':
+  if len(args) != 1:
+    print 'isTableEnabled requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.isTableEnabled(eval(args[0]),))
+
+elif cmd == 'compact':
+  if len(args) != 1:
+    print 'compact requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.compact(eval(args[0]),))
+
+elif cmd == 'majorCompact':
+  if len(args) != 1:
+    print 'majorCompact requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.majorCompact(eval(args[0]),))
+
+elif cmd == 'getTableNames':
+  if len(args) != 0:
+    print 'getTableNames requires 0 args'
+    sys.exit(1)
+  pp.pprint(client.getTableNames())
+
+elif cmd == 'getColumnDescriptors':
+  if len(args) != 1:
+    print 'getColumnDescriptors requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.getColumnDescriptors(eval(args[0]),))
+
+elif cmd == 'getTableRegions':
+  if len(args) != 1:
+    print 'getTableRegions requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.getTableRegions(eval(args[0]),))
+
+elif cmd == 'createTable':
+  if len(args) != 2:
+    print 'createTable requires 2 args'
+    sys.exit(1)
+  pp.pprint(client.createTable(eval(args[0]),eval(args[1]),))
+
+elif cmd == 'deleteTable':
+  if len(args) != 1:
+    print 'deleteTable requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.deleteTable(eval(args[0]),))
+
+elif cmd == 'get':
+  if len(args) != 4:
+    print 'get requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.get(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'getVer':
+  if len(args) != 5:
+    print 'getVer requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.getVer(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'getVerTs':
+  if len(args) != 6:
+    print 'getVerTs requires 6 args'
+    sys.exit(1)
+  pp.pprint(client.getVerTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),eval(args[5]),))
+
+elif cmd == 'getRow':
+  if len(args) != 3:
+    print 'getRow requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.getRow(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'getRowWithColumns':
+  if len(args) != 4:
+    print 'getRowWithColumns requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.getRowWithColumns(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'getRowTs':
+  if len(args) != 4:
+    print 'getRowTs requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.getRowTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'getRowWithColumnsTs':
+  if len(args) != 5:
+    print 'getRowWithColumnsTs requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.getRowWithColumnsTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'getRows':
+  if len(args) != 3:
+    print 'getRows requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.getRows(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'getRowsWithColumns':
+  if len(args) != 4:
+    print 'getRowsWithColumns requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.getRowsWithColumns(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'getRowsTs':
+  if len(args) != 4:
+    print 'getRowsTs requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.getRowsTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'getRowsWithColumnsTs':
+  if len(args) != 5:
+    print 'getRowsWithColumnsTs requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.getRowsWithColumnsTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'mutateRow':
+  if len(args) != 4:
+    print 'mutateRow requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.mutateRow(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'mutateRowTs':
+  if len(args) != 5:
+    print 'mutateRowTs requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.mutateRowTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'mutateRows':
+  if len(args) != 3:
+    print 'mutateRows requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.mutateRows(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'mutateRowsTs':
+  if len(args) != 4:
+    print 'mutateRowsTs requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.mutateRowsTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'atomicIncrement':
+  if len(args) != 4:
+    print 'atomicIncrement requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.atomicIncrement(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'deleteAll':
+  if len(args) != 4:
+    print 'deleteAll requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.deleteAll(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'deleteAllTs':
+  if len(args) != 5:
+    print 'deleteAllTs requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.deleteAllTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'deleteAllRow':
+  if len(args) != 3:
+    print 'deleteAllRow requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.deleteAllRow(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'increment':
+  if len(args) != 1:
+    print 'increment requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.increment(eval(args[0]),))
+
+elif cmd == 'incrementRows':
+  if len(args) != 1:
+    print 'incrementRows requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.incrementRows(eval(args[0]),))
+
+elif cmd == 'deleteAllRowTs':
+  if len(args) != 4:
+    print 'deleteAllRowTs requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.deleteAllRowTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'scannerOpenWithScan':
+  if len(args) != 3:
+    print 'scannerOpenWithScan requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpenWithScan(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'scannerOpen':
+  if len(args) != 4:
+    print 'scannerOpen requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpen(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'scannerOpenWithStop':
+  if len(args) != 5:
+    print 'scannerOpenWithStop requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpenWithStop(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'scannerOpenWithPrefix':
+  if len(args) != 4:
+    print 'scannerOpenWithPrefix requires 4 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpenWithPrefix(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),))
+
+elif cmd == 'scannerOpenTs':
+  if len(args) != 5:
+    print 'scannerOpenTs requires 5 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpenTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),))
+
+elif cmd == 'scannerOpenWithStopTs':
+  if len(args) != 6:
+    print 'scannerOpenWithStopTs requires 6 args'
+    sys.exit(1)
+  pp.pprint(client.scannerOpenWithStopTs(eval(args[0]),eval(args[1]),eval(args[2]),eval(args[3]),eval(args[4]),eval(args[5]),))
+
+elif cmd == 'scannerGet':
+  if len(args) != 1:
+    print 'scannerGet requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.scannerGet(eval(args[0]),))
+
+elif cmd == 'scannerGetList':
+  if len(args) != 2:
+    print 'scannerGetList requires 2 args'
+    sys.exit(1)
+  pp.pprint(client.scannerGetList(eval(args[0]),eval(args[1]),))
+
+elif cmd == 'scannerClose':
+  if len(args) != 1:
+    print 'scannerClose requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.scannerClose(eval(args[0]),))
+
+elif cmd == 'getRowOrBefore':
+  if len(args) != 3:
+    print 'getRowOrBefore requires 3 args'
+    sys.exit(1)
+  pp.pprint(client.getRowOrBefore(eval(args[0]),eval(args[1]),eval(args[2]),))
+
+elif cmd == 'getRegionInfo':
+  if len(args) != 1:
+    print 'getRegionInfo requires 1 args'
+    sys.exit(1)
+  pp.pprint(client.getRegionInfo(eval(args[0]),))
+
+else:
+  print 'Unrecognized method %s' % cmd
+  sys.exit(1)
+
+transport.close()

+ 10286 - 0
apps/hbase/gen-py/hbased/Hbase.py

@@ -0,0 +1,10286 @@
+#
+# Autogenerated by Thrift Compiler (0.9.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TException, TApplicationException
+from ttypes import *
+from thrift.Thrift import TProcessor
+from thrift.transport import TTransport
+from thrift.protocol import TBinaryProtocol, TProtocol
+try:
+  from thrift.protocol import fastbinary
+except:
+  fastbinary = None
+
+
+class Iface:
+  def enableTable(self, tableName):
+    """
+    Brings a table on-line (enables it)
+
+    Parameters:
+     - tableName: name of the table
+    """
+    pass
+
+  def disableTable(self, tableName):
+    """
+    Disables a table (takes it off-line) If it is being served, the master
+    will tell the servers to stop serving it.
+
+    Parameters:
+     - tableName: name of the table
+    """
+    pass
+
+  def isTableEnabled(self, tableName):
+    """
+    @return true if table is on-line
+
+    Parameters:
+     - tableName: name of the table to check
+    """
+    pass
+
+  def compact(self, tableNameOrRegionName):
+    """
+    Parameters:
+     - tableNameOrRegionName
+    """
+    pass
+
+  def majorCompact(self, tableNameOrRegionName):
+    """
+    Parameters:
+     - tableNameOrRegionName
+    """
+    pass
+
+  def getTableNames(self, ):
+    """
+    List all the userspace tables.
+
+    @return returns a list of names
+    """
+    pass
+
+  def getColumnDescriptors(self, tableName):
+    """
+    List all the column families assoicated with a table.
+
+    @return list of column family descriptors
+
+    Parameters:
+     - tableName: table name
+    """
+    pass
+
+  def getTableRegions(self, tableName):
+    """
+    List the regions associated with a table.
+
+    @return list of region descriptors
+
+    Parameters:
+     - tableName: table name
+    """
+    pass
+
+  def createTable(self, tableName, columnFamilies):
+    """
+    Create a table with the specified column families.  The name
+    field for each ColumnDescriptor must be set and must end in a
+    colon (:). All other fields are optional and will get default
+    values if not explicitly specified.
+
+    @throws IllegalArgument if an input parameter is invalid
+
+    @throws AlreadyExists if the table name already exists
+
+    Parameters:
+     - tableName: name of table to create
+     - columnFamilies: list of column family descriptors
+    """
+    pass
+
+  def deleteTable(self, tableName):
+    """
+    Deletes a table
+
+    @throws IOError if table doesn't exist on server or there was some other
+    problem
+
+    Parameters:
+     - tableName: name of table to delete
+    """
+    pass
+
+  def get(self, tableName, row, column, attributes):
+    """
+    Get a single TCell for the specified table, row, and column at the
+    latest timestamp. Returns an empty list if no such value exists.
+
+    @return value for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - attributes: Get attributes
+    """
+    pass
+
+  def getVer(self, tableName, row, column, numVersions, attributes):
+    """
+    Get the specified number of versions for the specified table,
+    row, and column.
+
+    @return list of cells for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - numVersions: number of versions to retrieve
+     - attributes: Get attributes
+    """
+    pass
+
+  def getVerTs(self, tableName, row, column, timestamp, numVersions, attributes):
+    """
+    Get the specified number of versions for the specified table,
+    row, and column.  Only versions less than or equal to the specified
+    timestamp will be returned.
+
+    @return list of cells for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - timestamp: timestamp
+     - numVersions: number of versions to retrieve
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRow(self, tableName, row, attributes):
+    """
+    Get all the data for the specified table and row at the latest
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowWithColumns(self, tableName, row, columns, attributes):
+    """
+    Get the specified columns for the specified table and row at the latest
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - columns: List of columns to return, null for all columns
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowTs(self, tableName, row, timestamp, attributes):
+    """
+    Get all the data for the specified table and row at the specified
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of the table
+     - row: row key
+     - timestamp: timestamp
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowWithColumnsTs(self, tableName, row, columns, timestamp, attributes):
+    """
+    Get the specified columns for the specified table and row at the specified
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - columns: List of columns to return, null for all columns
+     - timestamp
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRows(self, tableName, rows, attributes):
+    """
+    Get all the data for the specified table and rows at the latest
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowsWithColumns(self, tableName, rows, columns, attributes):
+    """
+    Get the specified columns for the specified table and rows at the latest
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - columns: List of columns to return, null for all columns
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowsTs(self, tableName, rows, timestamp, attributes):
+    """
+    Get all the data for the specified table and rows at the specified
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of the table
+     - rows: row keys
+     - timestamp: timestamp
+     - attributes: Get attributes
+    """
+    pass
+
+  def getRowsWithColumnsTs(self, tableName, rows, columns, timestamp, attributes):
+    """
+    Get the specified columns for the specified table and rows at the specified
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - columns: List of columns to return, null for all columns
+     - timestamp
+     - attributes: Get attributes
+    """
+    pass
+
+  def mutateRow(self, tableName, row, mutations, attributes):
+    """
+    Apply a series of mutations (updates/deletes) to a row in a
+    single transaction.  If an exception is thrown, then the
+    transaction is aborted.  Default current timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - mutations: list of mutation commands
+     - attributes: Mutation attributes
+    """
+    pass
+
+  def mutateRowTs(self, tableName, row, mutations, timestamp, attributes):
+    """
+    Apply a series of mutations (updates/deletes) to a row in a
+    single transaction.  If an exception is thrown, then the
+    transaction is aborted.  The specified timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - mutations: list of mutation commands
+     - timestamp: timestamp
+     - attributes: Mutation attributes
+    """
+    pass
+
+  def mutateRows(self, tableName, rowBatches, attributes):
+    """
+    Apply a series of batches (each a series of mutations on a single row)
+    in a single transaction.  If an exception is thrown, then the
+    transaction is aborted.  Default current timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - rowBatches: list of row batches
+     - attributes: Mutation attributes
+    """
+    pass
+
+  def mutateRowsTs(self, tableName, rowBatches, timestamp, attributes):
+    """
+    Apply a series of batches (each a series of mutations on a single row)
+    in a single transaction.  If an exception is thrown, then the
+    transaction is aborted.  The specified timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - rowBatches: list of row batches
+     - timestamp: timestamp
+     - attributes: Mutation attributes
+    """
+    pass
+
+  def atomicIncrement(self, tableName, row, column, value):
+    """
+    Atomically increment the column value specified.  Returns the next value post increment.
+
+    Parameters:
+     - tableName: name of table
+     - row: row to increment
+     - column: name of column
+     - value: amount to increment by
+    """
+    pass
+
+  def deleteAll(self, tableName, row, column, attributes):
+    """
+    Delete all cells that match the passed row and column.
+
+    Parameters:
+     - tableName: name of table
+     - row: Row to update
+     - column: name of column whose value is to be deleted
+     - attributes: Delete attributes
+    """
+    pass
+
+  def deleteAllTs(self, tableName, row, column, timestamp, attributes):
+    """
+    Delete all cells that match the passed row and column and whose
+    timestamp is equal-to or older than the passed timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: Row to update
+     - column: name of column whose value is to be deleted
+     - timestamp: timestamp
+     - attributes: Delete attributes
+    """
+    pass
+
+  def deleteAllRow(self, tableName, row, attributes):
+    """
+    Completely delete the row's cells.
+
+    Parameters:
+     - tableName: name of table
+     - row: key of the row to be completely deleted.
+     - attributes: Delete attributes
+    """
+    pass
+
+  def increment(self, increment):
+    """
+    Increment a cell by the ammount.
+    Increments can be applied async if hbase.regionserver.thrift.coalesceIncrement is set to true.
+    False is the default.  Turn to true if you need the extra performance and can accept some
+    data loss if a thrift server dies with increments still in the queue.
+
+    Parameters:
+     - increment: The single increment to apply
+    """
+    pass
+
+  def incrementRows(self, increments):
+    """
+    Parameters:
+     - increments: The list of increments
+    """
+    pass
+
+  def deleteAllRowTs(self, tableName, row, timestamp, attributes):
+    """
+    Completely delete the row's cells marked with a timestamp
+    equal-to or older than the passed timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: key of the row to be completely deleted.
+     - timestamp: timestamp
+     - attributes: Delete attributes
+    """
+    pass
+
+  def scannerOpenWithScan(self, tableName, scan, attributes):
+    """
+    Get a scanner on the current table, using the Scan instance
+    for the scan parameters.
+
+    Parameters:
+     - tableName: name of table
+     - scan: Scan instance
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerOpen(self, tableName, startRow, columns, attributes):
+    """
+    Get a scanner on the current table starting at the specified row and
+    ending at the last row in the table.  Return the specified columns.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerOpenWithStop(self, tableName, startRow, stopRow, columns, attributes):
+    """
+    Get a scanner on the current table starting and stopping at the
+    specified rows.  ending at the last row in the table.  Return the
+    specified columns.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - stopRow: row to stop scanning on. This row is *not* included in the
+    scanner's results
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerOpenWithPrefix(self, tableName, startAndPrefix, columns, attributes):
+    """
+    Open a scanner for a given prefix.  That is all rows will have the specified
+    prefix. No other rows will be returned.
+
+    @return scanner id to use with other scanner calls
+
+    Parameters:
+     - tableName: name of table
+     - startAndPrefix: the prefix (and thus start row) of the keys you want
+     - columns: the columns you want returned
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerOpenTs(self, tableName, startRow, columns, timestamp, attributes):
+    """
+    Get a scanner on the current table starting at the specified row and
+    ending at the last row in the table.  Return the specified columns.
+    Only values with the specified timestamp are returned.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - timestamp: timestamp
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerOpenWithStopTs(self, tableName, startRow, stopRow, columns, timestamp, attributes):
+    """
+    Get a scanner on the current table starting and stopping at the
+    specified rows.  ending at the last row in the table.  Return the
+    specified columns.  Only values with the specified timestamp are
+    returned.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - stopRow: row to stop scanning on. This row is *not* included in the
+    scanner's results
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - timestamp: timestamp
+     - attributes: Scan attributes
+    """
+    pass
+
+  def scannerGet(self, id):
+    """
+    Returns the scanner's current row value and advances to the next
+    row in the table.  When there are no more rows in the table, or a key
+    greater-than-or-equal-to the scanner's specified stopRow is reached,
+    an empty list is returned.
+
+    @return a TRowResult containing the current row and a map of the columns to TCells.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    @throws NotFound when the scanner reaches the end
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+    """
+    pass
+
+  def scannerGetList(self, id, nbRows):
+    """
+    Returns, starting at the scanner's current row value nbRows worth of
+    rows and advances to the next row in the table.  When there are no more
+    rows in the table, or a key greater-than-or-equal-to the scanner's
+    specified stopRow is reached,  an empty list is returned.
+
+    @return a TRowResult containing the current row and a map of the columns to TCells.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    @throws NotFound when the scanner reaches the end
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+     - nbRows: number of results to return
+    """
+    pass
+
+  def scannerClose(self, id):
+    """
+    Closes the server-state associated with an open scanner.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+    """
+    pass
+
+  def getRowOrBefore(self, tableName, row, family):
+    """
+    Get the row just before the specified one.
+
+    @return value for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - family: column name
+    """
+    pass
+
+  def getRegionInfo(self, row):
+    """
+    Get the regininfo for the specified row. It scans
+    the metatable to find region's start and end keys.
+
+    @return value for specified row/column
+
+    Parameters:
+     - row: row key
+    """
+    pass
+
+
+class Client(Iface):
+  def __init__(self, iprot, oprot=None):
+    self._iprot = self._oprot = iprot
+    if oprot is not None:
+      self._oprot = oprot
+    self._seqid = 0
+
+  def enableTable(self, tableName):
+    """
+    Brings a table on-line (enables it)
+
+    Parameters:
+     - tableName: name of the table
+    """
+    self.send_enableTable(tableName)
+    self.recv_enableTable()
+
+  def send_enableTable(self, tableName):
+    self._oprot.writeMessageBegin('enableTable', TMessageType.CALL, self._seqid)
+    args = enableTable_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_enableTable(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = enableTable_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def disableTable(self, tableName):
+    """
+    Disables a table (takes it off-line) If it is being served, the master
+    will tell the servers to stop serving it.
+
+    Parameters:
+     - tableName: name of the table
+    """
+    self.send_disableTable(tableName)
+    self.recv_disableTable()
+
+  def send_disableTable(self, tableName):
+    self._oprot.writeMessageBegin('disableTable', TMessageType.CALL, self._seqid)
+    args = disableTable_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_disableTable(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = disableTable_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def isTableEnabled(self, tableName):
+    """
+    @return true if table is on-line
+
+    Parameters:
+     - tableName: name of the table to check
+    """
+    self.send_isTableEnabled(tableName)
+    return self.recv_isTableEnabled()
+
+  def send_isTableEnabled(self, tableName):
+    self._oprot.writeMessageBegin('isTableEnabled', TMessageType.CALL, self._seqid)
+    args = isTableEnabled_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_isTableEnabled(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = isTableEnabled_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "isTableEnabled failed: unknown result");
+
+  def compact(self, tableNameOrRegionName):
+    """
+    Parameters:
+     - tableNameOrRegionName
+    """
+    self.send_compact(tableNameOrRegionName)
+    self.recv_compact()
+
+  def send_compact(self, tableNameOrRegionName):
+    self._oprot.writeMessageBegin('compact', TMessageType.CALL, self._seqid)
+    args = compact_args()
+    args.tableNameOrRegionName = tableNameOrRegionName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_compact(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = compact_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def majorCompact(self, tableNameOrRegionName):
+    """
+    Parameters:
+     - tableNameOrRegionName
+    """
+    self.send_majorCompact(tableNameOrRegionName)
+    self.recv_majorCompact()
+
+  def send_majorCompact(self, tableNameOrRegionName):
+    self._oprot.writeMessageBegin('majorCompact', TMessageType.CALL, self._seqid)
+    args = majorCompact_args()
+    args.tableNameOrRegionName = tableNameOrRegionName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_majorCompact(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = majorCompact_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def getTableNames(self, ):
+    """
+    List all the userspace tables.
+
+    @return returns a list of names
+    """
+    self.send_getTableNames()
+    return self.recv_getTableNames()
+
+  def send_getTableNames(self, ):
+    self._oprot.writeMessageBegin('getTableNames', TMessageType.CALL, self._seqid)
+    args = getTableNames_args()
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getTableNames(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getTableNames_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getTableNames failed: unknown result");
+
+  def getColumnDescriptors(self, tableName):
+    """
+    List all the column families assoicated with a table.
+
+    @return list of column family descriptors
+
+    Parameters:
+     - tableName: table name
+    """
+    self.send_getColumnDescriptors(tableName)
+    return self.recv_getColumnDescriptors()
+
+  def send_getColumnDescriptors(self, tableName):
+    self._oprot.writeMessageBegin('getColumnDescriptors', TMessageType.CALL, self._seqid)
+    args = getColumnDescriptors_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getColumnDescriptors(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getColumnDescriptors_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getColumnDescriptors failed: unknown result");
+
+  def getTableRegions(self, tableName):
+    """
+    List the regions associated with a table.
+
+    @return list of region descriptors
+
+    Parameters:
+     - tableName: table name
+    """
+    self.send_getTableRegions(tableName)
+    return self.recv_getTableRegions()
+
+  def send_getTableRegions(self, tableName):
+    self._oprot.writeMessageBegin('getTableRegions', TMessageType.CALL, self._seqid)
+    args = getTableRegions_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getTableRegions(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getTableRegions_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getTableRegions failed: unknown result");
+
+  def createTable(self, tableName, columnFamilies):
+    """
+    Create a table with the specified column families.  The name
+    field for each ColumnDescriptor must be set and must end in a
+    colon (:). All other fields are optional and will get default
+    values if not explicitly specified.
+
+    @throws IllegalArgument if an input parameter is invalid
+
+    @throws AlreadyExists if the table name already exists
+
+    Parameters:
+     - tableName: name of table to create
+     - columnFamilies: list of column family descriptors
+    """
+    self.send_createTable(tableName, columnFamilies)
+    self.recv_createTable()
+
+  def send_createTable(self, tableName, columnFamilies):
+    self._oprot.writeMessageBegin('createTable', TMessageType.CALL, self._seqid)
+    args = createTable_args()
+    args.tableName = tableName
+    args.columnFamilies = columnFamilies
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_createTable(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = createTable_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    if result.exist is not None:
+      raise result.exist
+    return
+
+  def deleteTable(self, tableName):
+    """
+    Deletes a table
+
+    @throws IOError if table doesn't exist on server or there was some other
+    problem
+
+    Parameters:
+     - tableName: name of table to delete
+    """
+    self.send_deleteTable(tableName)
+    self.recv_deleteTable()
+
+  def send_deleteTable(self, tableName):
+    self._oprot.writeMessageBegin('deleteTable', TMessageType.CALL, self._seqid)
+    args = deleteTable_args()
+    args.tableName = tableName
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_deleteTable(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = deleteTable_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def get(self, tableName, row, column, attributes):
+    """
+    Get a single TCell for the specified table, row, and column at the
+    latest timestamp. Returns an empty list if no such value exists.
+
+    @return value for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - attributes: Get attributes
+    """
+    self.send_get(tableName, row, column, attributes)
+    return self.recv_get()
+
+  def send_get(self, tableName, row, column, attributes):
+    self._oprot.writeMessageBegin('get', TMessageType.CALL, self._seqid)
+    args = get_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_get(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = get_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "get failed: unknown result");
+
+  def getVer(self, tableName, row, column, numVersions, attributes):
+    """
+    Get the specified number of versions for the specified table,
+    row, and column.
+
+    @return list of cells for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - numVersions: number of versions to retrieve
+     - attributes: Get attributes
+    """
+    self.send_getVer(tableName, row, column, numVersions, attributes)
+    return self.recv_getVer()
+
+  def send_getVer(self, tableName, row, column, numVersions, attributes):
+    self._oprot.writeMessageBegin('getVer', TMessageType.CALL, self._seqid)
+    args = getVer_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.numVersions = numVersions
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getVer(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getVer_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getVer failed: unknown result");
+
+  def getVerTs(self, tableName, row, column, timestamp, numVersions, attributes):
+    """
+    Get the specified number of versions for the specified table,
+    row, and column.  Only versions less than or equal to the specified
+    timestamp will be returned.
+
+    @return list of cells for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - column: column name
+     - timestamp: timestamp
+     - numVersions: number of versions to retrieve
+     - attributes: Get attributes
+    """
+    self.send_getVerTs(tableName, row, column, timestamp, numVersions, attributes)
+    return self.recv_getVerTs()
+
+  def send_getVerTs(self, tableName, row, column, timestamp, numVersions, attributes):
+    self._oprot.writeMessageBegin('getVerTs', TMessageType.CALL, self._seqid)
+    args = getVerTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.timestamp = timestamp
+    args.numVersions = numVersions
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getVerTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getVerTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getVerTs failed: unknown result");
+
+  def getRow(self, tableName, row, attributes):
+    """
+    Get all the data for the specified table and row at the latest
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - attributes: Get attributes
+    """
+    self.send_getRow(tableName, row, attributes)
+    return self.recv_getRow()
+
+  def send_getRow(self, tableName, row, attributes):
+    self._oprot.writeMessageBegin('getRow', TMessageType.CALL, self._seqid)
+    args = getRow_args()
+    args.tableName = tableName
+    args.row = row
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRow(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRow_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRow failed: unknown result");
+
+  def getRowWithColumns(self, tableName, row, columns, attributes):
+    """
+    Get the specified columns for the specified table and row at the latest
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - columns: List of columns to return, null for all columns
+     - attributes: Get attributes
+    """
+    self.send_getRowWithColumns(tableName, row, columns, attributes)
+    return self.recv_getRowWithColumns()
+
+  def send_getRowWithColumns(self, tableName, row, columns, attributes):
+    self._oprot.writeMessageBegin('getRowWithColumns', TMessageType.CALL, self._seqid)
+    args = getRowWithColumns_args()
+    args.tableName = tableName
+    args.row = row
+    args.columns = columns
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowWithColumns(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowWithColumns_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowWithColumns failed: unknown result");
+
+  def getRowTs(self, tableName, row, timestamp, attributes):
+    """
+    Get all the data for the specified table and row at the specified
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of the table
+     - row: row key
+     - timestamp: timestamp
+     - attributes: Get attributes
+    """
+    self.send_getRowTs(tableName, row, timestamp, attributes)
+    return self.recv_getRowTs()
+
+  def send_getRowTs(self, tableName, row, timestamp, attributes):
+    self._oprot.writeMessageBegin('getRowTs', TMessageType.CALL, self._seqid)
+    args = getRowTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowTs failed: unknown result");
+
+  def getRowWithColumnsTs(self, tableName, row, columns, timestamp, attributes):
+    """
+    Get the specified columns for the specified table and row at the specified
+    timestamp. Returns an empty list if the row does not exist.
+
+    @return TRowResult containing the row and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - columns: List of columns to return, null for all columns
+     - timestamp
+     - attributes: Get attributes
+    """
+    self.send_getRowWithColumnsTs(tableName, row, columns, timestamp, attributes)
+    return self.recv_getRowWithColumnsTs()
+
+  def send_getRowWithColumnsTs(self, tableName, row, columns, timestamp, attributes):
+    self._oprot.writeMessageBegin('getRowWithColumnsTs', TMessageType.CALL, self._seqid)
+    args = getRowWithColumnsTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.columns = columns
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowWithColumnsTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowWithColumnsTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowWithColumnsTs failed: unknown result");
+
+  def getRows(self, tableName, rows, attributes):
+    """
+    Get all the data for the specified table and rows at the latest
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - attributes: Get attributes
+    """
+    self.send_getRows(tableName, rows, attributes)
+    return self.recv_getRows()
+
+  def send_getRows(self, tableName, rows, attributes):
+    self._oprot.writeMessageBegin('getRows', TMessageType.CALL, self._seqid)
+    args = getRows_args()
+    args.tableName = tableName
+    args.rows = rows
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRows(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRows_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRows failed: unknown result");
+
+  def getRowsWithColumns(self, tableName, rows, columns, attributes):
+    """
+    Get the specified columns for the specified table and rows at the latest
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - columns: List of columns to return, null for all columns
+     - attributes: Get attributes
+    """
+    self.send_getRowsWithColumns(tableName, rows, columns, attributes)
+    return self.recv_getRowsWithColumns()
+
+  def send_getRowsWithColumns(self, tableName, rows, columns, attributes):
+    self._oprot.writeMessageBegin('getRowsWithColumns', TMessageType.CALL, self._seqid)
+    args = getRowsWithColumns_args()
+    args.tableName = tableName
+    args.rows = rows
+    args.columns = columns
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowsWithColumns(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowsWithColumns_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowsWithColumns failed: unknown result");
+
+  def getRowsTs(self, tableName, rows, timestamp, attributes):
+    """
+    Get all the data for the specified table and rows at the specified
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of the table
+     - rows: row keys
+     - timestamp: timestamp
+     - attributes: Get attributes
+    """
+    self.send_getRowsTs(tableName, rows, timestamp, attributes)
+    return self.recv_getRowsTs()
+
+  def send_getRowsTs(self, tableName, rows, timestamp, attributes):
+    self._oprot.writeMessageBegin('getRowsTs', TMessageType.CALL, self._seqid)
+    args = getRowsTs_args()
+    args.tableName = tableName
+    args.rows = rows
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowsTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowsTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowsTs failed: unknown result");
+
+  def getRowsWithColumnsTs(self, tableName, rows, columns, timestamp, attributes):
+    """
+    Get the specified columns for the specified table and rows at the specified
+    timestamp. Returns an empty list if no rows exist.
+
+    @return TRowResult containing the rows and map of columns to TCells
+
+    Parameters:
+     - tableName: name of table
+     - rows: row keys
+     - columns: List of columns to return, null for all columns
+     - timestamp
+     - attributes: Get attributes
+    """
+    self.send_getRowsWithColumnsTs(tableName, rows, columns, timestamp, attributes)
+    return self.recv_getRowsWithColumnsTs()
+
+  def send_getRowsWithColumnsTs(self, tableName, rows, columns, timestamp, attributes):
+    self._oprot.writeMessageBegin('getRowsWithColumnsTs', TMessageType.CALL, self._seqid)
+    args = getRowsWithColumnsTs_args()
+    args.tableName = tableName
+    args.rows = rows
+    args.columns = columns
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowsWithColumnsTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowsWithColumnsTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowsWithColumnsTs failed: unknown result");
+
+  def mutateRow(self, tableName, row, mutations, attributes):
+    """
+    Apply a series of mutations (updates/deletes) to a row in a
+    single transaction.  If an exception is thrown, then the
+    transaction is aborted.  Default current timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - mutations: list of mutation commands
+     - attributes: Mutation attributes
+    """
+    self.send_mutateRow(tableName, row, mutations, attributes)
+    self.recv_mutateRow()
+
+  def send_mutateRow(self, tableName, row, mutations, attributes):
+    self._oprot.writeMessageBegin('mutateRow', TMessageType.CALL, self._seqid)
+    args = mutateRow_args()
+    args.tableName = tableName
+    args.row = row
+    args.mutations = mutations
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_mutateRow(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = mutateRow_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    return
+
+  def mutateRowTs(self, tableName, row, mutations, timestamp, attributes):
+    """
+    Apply a series of mutations (updates/deletes) to a row in a
+    single transaction.  If an exception is thrown, then the
+    transaction is aborted.  The specified timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - mutations: list of mutation commands
+     - timestamp: timestamp
+     - attributes: Mutation attributes
+    """
+    self.send_mutateRowTs(tableName, row, mutations, timestamp, attributes)
+    self.recv_mutateRowTs()
+
+  def send_mutateRowTs(self, tableName, row, mutations, timestamp, attributes):
+    self._oprot.writeMessageBegin('mutateRowTs', TMessageType.CALL, self._seqid)
+    args = mutateRowTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.mutations = mutations
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_mutateRowTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = mutateRowTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    return
+
+  def mutateRows(self, tableName, rowBatches, attributes):
+    """
+    Apply a series of batches (each a series of mutations on a single row)
+    in a single transaction.  If an exception is thrown, then the
+    transaction is aborted.  Default current timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - rowBatches: list of row batches
+     - attributes: Mutation attributes
+    """
+    self.send_mutateRows(tableName, rowBatches, attributes)
+    self.recv_mutateRows()
+
+  def send_mutateRows(self, tableName, rowBatches, attributes):
+    self._oprot.writeMessageBegin('mutateRows', TMessageType.CALL, self._seqid)
+    args = mutateRows_args()
+    args.tableName = tableName
+    args.rowBatches = rowBatches
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_mutateRows(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = mutateRows_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    return
+
+  def mutateRowsTs(self, tableName, rowBatches, timestamp, attributes):
+    """
+    Apply a series of batches (each a series of mutations on a single row)
+    in a single transaction.  If an exception is thrown, then the
+    transaction is aborted.  The specified timestamp is used, and
+    all entries will have an identical timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - rowBatches: list of row batches
+     - timestamp: timestamp
+     - attributes: Mutation attributes
+    """
+    self.send_mutateRowsTs(tableName, rowBatches, timestamp, attributes)
+    self.recv_mutateRowsTs()
+
+  def send_mutateRowsTs(self, tableName, rowBatches, timestamp, attributes):
+    self._oprot.writeMessageBegin('mutateRowsTs', TMessageType.CALL, self._seqid)
+    args = mutateRowsTs_args()
+    args.tableName = tableName
+    args.rowBatches = rowBatches
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_mutateRowsTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = mutateRowsTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    return
+
+  def atomicIncrement(self, tableName, row, column, value):
+    """
+    Atomically increment the column value specified.  Returns the next value post increment.
+
+    Parameters:
+     - tableName: name of table
+     - row: row to increment
+     - column: name of column
+     - value: amount to increment by
+    """
+    self.send_atomicIncrement(tableName, row, column, value)
+    return self.recv_atomicIncrement()
+
+  def send_atomicIncrement(self, tableName, row, column, value):
+    self._oprot.writeMessageBegin('atomicIncrement', TMessageType.CALL, self._seqid)
+    args = atomicIncrement_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.value = value
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_atomicIncrement(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = atomicIncrement_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "atomicIncrement failed: unknown result");
+
+  def deleteAll(self, tableName, row, column, attributes):
+    """
+    Delete all cells that match the passed row and column.
+
+    Parameters:
+     - tableName: name of table
+     - row: Row to update
+     - column: name of column whose value is to be deleted
+     - attributes: Delete attributes
+    """
+    self.send_deleteAll(tableName, row, column, attributes)
+    self.recv_deleteAll()
+
+  def send_deleteAll(self, tableName, row, column, attributes):
+    self._oprot.writeMessageBegin('deleteAll', TMessageType.CALL, self._seqid)
+    args = deleteAll_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_deleteAll(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = deleteAll_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def deleteAllTs(self, tableName, row, column, timestamp, attributes):
+    """
+    Delete all cells that match the passed row and column and whose
+    timestamp is equal-to or older than the passed timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: Row to update
+     - column: name of column whose value is to be deleted
+     - timestamp: timestamp
+     - attributes: Delete attributes
+    """
+    self.send_deleteAllTs(tableName, row, column, timestamp, attributes)
+    self.recv_deleteAllTs()
+
+  def send_deleteAllTs(self, tableName, row, column, timestamp, attributes):
+    self._oprot.writeMessageBegin('deleteAllTs', TMessageType.CALL, self._seqid)
+    args = deleteAllTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.column = column
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_deleteAllTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = deleteAllTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def deleteAllRow(self, tableName, row, attributes):
+    """
+    Completely delete the row's cells.
+
+    Parameters:
+     - tableName: name of table
+     - row: key of the row to be completely deleted.
+     - attributes: Delete attributes
+    """
+    self.send_deleteAllRow(tableName, row, attributes)
+    self.recv_deleteAllRow()
+
+  def send_deleteAllRow(self, tableName, row, attributes):
+    self._oprot.writeMessageBegin('deleteAllRow', TMessageType.CALL, self._seqid)
+    args = deleteAllRow_args()
+    args.tableName = tableName
+    args.row = row
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_deleteAllRow(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = deleteAllRow_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def increment(self, increment):
+    """
+    Increment a cell by the ammount.
+    Increments can be applied async if hbase.regionserver.thrift.coalesceIncrement is set to true.
+    False is the default.  Turn to true if you need the extra performance and can accept some
+    data loss if a thrift server dies with increments still in the queue.
+
+    Parameters:
+     - increment: The single increment to apply
+    """
+    self.send_increment(increment)
+    self.recv_increment()
+
+  def send_increment(self, increment):
+    self._oprot.writeMessageBegin('increment', TMessageType.CALL, self._seqid)
+    args = increment_args()
+    args.increment = increment
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_increment(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = increment_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def incrementRows(self, increments):
+    """
+    Parameters:
+     - increments: The list of increments
+    """
+    self.send_incrementRows(increments)
+    self.recv_incrementRows()
+
+  def send_incrementRows(self, increments):
+    self._oprot.writeMessageBegin('incrementRows', TMessageType.CALL, self._seqid)
+    args = incrementRows_args()
+    args.increments = increments
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_incrementRows(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = incrementRows_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def deleteAllRowTs(self, tableName, row, timestamp, attributes):
+    """
+    Completely delete the row's cells marked with a timestamp
+    equal-to or older than the passed timestamp.
+
+    Parameters:
+     - tableName: name of table
+     - row: key of the row to be completely deleted.
+     - timestamp: timestamp
+     - attributes: Delete attributes
+    """
+    self.send_deleteAllRowTs(tableName, row, timestamp, attributes)
+    self.recv_deleteAllRowTs()
+
+  def send_deleteAllRowTs(self, tableName, row, timestamp, attributes):
+    self._oprot.writeMessageBegin('deleteAllRowTs', TMessageType.CALL, self._seqid)
+    args = deleteAllRowTs_args()
+    args.tableName = tableName
+    args.row = row
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_deleteAllRowTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = deleteAllRowTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    return
+
+  def scannerOpenWithScan(self, tableName, scan, attributes):
+    """
+    Get a scanner on the current table, using the Scan instance
+    for the scan parameters.
+
+    Parameters:
+     - tableName: name of table
+     - scan: Scan instance
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpenWithScan(tableName, scan, attributes)
+    return self.recv_scannerOpenWithScan()
+
+  def send_scannerOpenWithScan(self, tableName, scan, attributes):
+    self._oprot.writeMessageBegin('scannerOpenWithScan', TMessageType.CALL, self._seqid)
+    args = scannerOpenWithScan_args()
+    args.tableName = tableName
+    args.scan = scan
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpenWithScan(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpenWithScan_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpenWithScan failed: unknown result");
+
+  def scannerOpen(self, tableName, startRow, columns, attributes):
+    """
+    Get a scanner on the current table starting at the specified row and
+    ending at the last row in the table.  Return the specified columns.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpen(tableName, startRow, columns, attributes)
+    return self.recv_scannerOpen()
+
+  def send_scannerOpen(self, tableName, startRow, columns, attributes):
+    self._oprot.writeMessageBegin('scannerOpen', TMessageType.CALL, self._seqid)
+    args = scannerOpen_args()
+    args.tableName = tableName
+    args.startRow = startRow
+    args.columns = columns
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpen(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpen_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpen failed: unknown result");
+
+  def scannerOpenWithStop(self, tableName, startRow, stopRow, columns, attributes):
+    """
+    Get a scanner on the current table starting and stopping at the
+    specified rows.  ending at the last row in the table.  Return the
+    specified columns.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - stopRow: row to stop scanning on. This row is *not* included in the
+    scanner's results
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpenWithStop(tableName, startRow, stopRow, columns, attributes)
+    return self.recv_scannerOpenWithStop()
+
+  def send_scannerOpenWithStop(self, tableName, startRow, stopRow, columns, attributes):
+    self._oprot.writeMessageBegin('scannerOpenWithStop', TMessageType.CALL, self._seqid)
+    args = scannerOpenWithStop_args()
+    args.tableName = tableName
+    args.startRow = startRow
+    args.stopRow = stopRow
+    args.columns = columns
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpenWithStop(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpenWithStop_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpenWithStop failed: unknown result");
+
+  def scannerOpenWithPrefix(self, tableName, startAndPrefix, columns, attributes):
+    """
+    Open a scanner for a given prefix.  That is all rows will have the specified
+    prefix. No other rows will be returned.
+
+    @return scanner id to use with other scanner calls
+
+    Parameters:
+     - tableName: name of table
+     - startAndPrefix: the prefix (and thus start row) of the keys you want
+     - columns: the columns you want returned
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpenWithPrefix(tableName, startAndPrefix, columns, attributes)
+    return self.recv_scannerOpenWithPrefix()
+
+  def send_scannerOpenWithPrefix(self, tableName, startAndPrefix, columns, attributes):
+    self._oprot.writeMessageBegin('scannerOpenWithPrefix', TMessageType.CALL, self._seqid)
+    args = scannerOpenWithPrefix_args()
+    args.tableName = tableName
+    args.startAndPrefix = startAndPrefix
+    args.columns = columns
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpenWithPrefix(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpenWithPrefix_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpenWithPrefix failed: unknown result");
+
+  def scannerOpenTs(self, tableName, startRow, columns, timestamp, attributes):
+    """
+    Get a scanner on the current table starting at the specified row and
+    ending at the last row in the table.  Return the specified columns.
+    Only values with the specified timestamp are returned.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - timestamp: timestamp
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpenTs(tableName, startRow, columns, timestamp, attributes)
+    return self.recv_scannerOpenTs()
+
+  def send_scannerOpenTs(self, tableName, startRow, columns, timestamp, attributes):
+    self._oprot.writeMessageBegin('scannerOpenTs', TMessageType.CALL, self._seqid)
+    args = scannerOpenTs_args()
+    args.tableName = tableName
+    args.startRow = startRow
+    args.columns = columns
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpenTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpenTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpenTs failed: unknown result");
+
+  def scannerOpenWithStopTs(self, tableName, startRow, stopRow, columns, timestamp, attributes):
+    """
+    Get a scanner on the current table starting and stopping at the
+    specified rows.  ending at the last row in the table.  Return the
+    specified columns.  Only values with the specified timestamp are
+    returned.
+
+    @return scanner id to be used with other scanner procedures
+
+    Parameters:
+     - tableName: name of table
+     - startRow: Starting row in table to scan.
+    Send "" (empty string) to start at the first row.
+     - stopRow: row to stop scanning on. This row is *not* included in the
+    scanner's results
+     - columns: columns to scan. If column name is a column family, all
+    columns of the specified column family are returned. It's also possible
+    to pass a regex in the column qualifier.
+     - timestamp: timestamp
+     - attributes: Scan attributes
+    """
+    self.send_scannerOpenWithStopTs(tableName, startRow, stopRow, columns, timestamp, attributes)
+    return self.recv_scannerOpenWithStopTs()
+
+  def send_scannerOpenWithStopTs(self, tableName, startRow, stopRow, columns, timestamp, attributes):
+    self._oprot.writeMessageBegin('scannerOpenWithStopTs', TMessageType.CALL, self._seqid)
+    args = scannerOpenWithStopTs_args()
+    args.tableName = tableName
+    args.startRow = startRow
+    args.stopRow = stopRow
+    args.columns = columns
+    args.timestamp = timestamp
+    args.attributes = attributes
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerOpenWithStopTs(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerOpenWithStopTs_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerOpenWithStopTs failed: unknown result");
+
+  def scannerGet(self, id):
+    """
+    Returns the scanner's current row value and advances to the next
+    row in the table.  When there are no more rows in the table, or a key
+    greater-than-or-equal-to the scanner's specified stopRow is reached,
+    an empty list is returned.
+
+    @return a TRowResult containing the current row and a map of the columns to TCells.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    @throws NotFound when the scanner reaches the end
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+    """
+    self.send_scannerGet(id)
+    return self.recv_scannerGet()
+
+  def send_scannerGet(self, id):
+    self._oprot.writeMessageBegin('scannerGet', TMessageType.CALL, self._seqid)
+    args = scannerGet_args()
+    args.id = id
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerGet(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerGet_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerGet failed: unknown result");
+
+  def scannerGetList(self, id, nbRows):
+    """
+    Returns, starting at the scanner's current row value nbRows worth of
+    rows and advances to the next row in the table.  When there are no more
+    rows in the table, or a key greater-than-or-equal-to the scanner's
+    specified stopRow is reached,  an empty list is returned.
+
+    @return a TRowResult containing the current row and a map of the columns to TCells.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    @throws NotFound when the scanner reaches the end
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+     - nbRows: number of results to return
+    """
+    self.send_scannerGetList(id, nbRows)
+    return self.recv_scannerGetList()
+
+  def send_scannerGetList(self, id, nbRows):
+    self._oprot.writeMessageBegin('scannerGetList', TMessageType.CALL, self._seqid)
+    args = scannerGetList_args()
+    args.id = id
+    args.nbRows = nbRows
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerGetList(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerGetList_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "scannerGetList failed: unknown result");
+
+  def scannerClose(self, id):
+    """
+    Closes the server-state associated with an open scanner.
+
+    @throws IllegalArgument if ScannerID is invalid
+
+    Parameters:
+     - id: id of a scanner returned by scannerOpen
+    """
+    self.send_scannerClose(id)
+    self.recv_scannerClose()
+
+  def send_scannerClose(self, id):
+    self._oprot.writeMessageBegin('scannerClose', TMessageType.CALL, self._seqid)
+    args = scannerClose_args()
+    args.id = id
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_scannerClose(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = scannerClose_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.io is not None:
+      raise result.io
+    if result.ia is not None:
+      raise result.ia
+    return
+
+  def getRowOrBefore(self, tableName, row, family):
+    """
+    Get the row just before the specified one.
+
+    @return value for specified row/column
+
+    Parameters:
+     - tableName: name of table
+     - row: row key
+     - family: column name
+    """
+    self.send_getRowOrBefore(tableName, row, family)
+    return self.recv_getRowOrBefore()
+
+  def send_getRowOrBefore(self, tableName, row, family):
+    self._oprot.writeMessageBegin('getRowOrBefore', TMessageType.CALL, self._seqid)
+    args = getRowOrBefore_args()
+    args.tableName = tableName
+    args.row = row
+    args.family = family
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRowOrBefore(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRowOrBefore_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRowOrBefore failed: unknown result");
+
+  def getRegionInfo(self, row):
+    """
+    Get the regininfo for the specified row. It scans
+    the metatable to find region's start and end keys.
+
+    @return value for specified row/column
+
+    Parameters:
+     - row: row key
+    """
+    self.send_getRegionInfo(row)
+    return self.recv_getRegionInfo()
+
+  def send_getRegionInfo(self, row):
+    self._oprot.writeMessageBegin('getRegionInfo', TMessageType.CALL, self._seqid)
+    args = getRegionInfo_args()
+    args.row = row
+    args.write(self._oprot)
+    self._oprot.writeMessageEnd()
+    self._oprot.trans.flush()
+
+  def recv_getRegionInfo(self, ):
+    (fname, mtype, rseqid) = self._iprot.readMessageBegin()
+    if mtype == TMessageType.EXCEPTION:
+      x = TApplicationException()
+      x.read(self._iprot)
+      self._iprot.readMessageEnd()
+      raise x
+    result = getRegionInfo_result()
+    result.read(self._iprot)
+    self._iprot.readMessageEnd()
+    if result.success is not None:
+      return result.success
+    if result.io is not None:
+      raise result.io
+    raise TApplicationException(TApplicationException.MISSING_RESULT, "getRegionInfo failed: unknown result");
+
+
+class Processor(Iface, TProcessor):
+  def __init__(self, handler):
+    self._handler = handler
+    self._processMap = {}
+    self._processMap["enableTable"] = Processor.process_enableTable
+    self._processMap["disableTable"] = Processor.process_disableTable
+    self._processMap["isTableEnabled"] = Processor.process_isTableEnabled
+    self._processMap["compact"] = Processor.process_compact
+    self._processMap["majorCompact"] = Processor.process_majorCompact
+    self._processMap["getTableNames"] = Processor.process_getTableNames
+    self._processMap["getColumnDescriptors"] = Processor.process_getColumnDescriptors
+    self._processMap["getTableRegions"] = Processor.process_getTableRegions
+    self._processMap["createTable"] = Processor.process_createTable
+    self._processMap["deleteTable"] = Processor.process_deleteTable
+    self._processMap["get"] = Processor.process_get
+    self._processMap["getVer"] = Processor.process_getVer
+    self._processMap["getVerTs"] = Processor.process_getVerTs
+    self._processMap["getRow"] = Processor.process_getRow
+    self._processMap["getRowWithColumns"] = Processor.process_getRowWithColumns
+    self._processMap["getRowTs"] = Processor.process_getRowTs
+    self._processMap["getRowWithColumnsTs"] = Processor.process_getRowWithColumnsTs
+    self._processMap["getRows"] = Processor.process_getRows
+    self._processMap["getRowsWithColumns"] = Processor.process_getRowsWithColumns
+    self._processMap["getRowsTs"] = Processor.process_getRowsTs
+    self._processMap["getRowsWithColumnsTs"] = Processor.process_getRowsWithColumnsTs
+    self._processMap["mutateRow"] = Processor.process_mutateRow
+    self._processMap["mutateRowTs"] = Processor.process_mutateRowTs
+    self._processMap["mutateRows"] = Processor.process_mutateRows
+    self._processMap["mutateRowsTs"] = Processor.process_mutateRowsTs
+    self._processMap["atomicIncrement"] = Processor.process_atomicIncrement
+    self._processMap["deleteAll"] = Processor.process_deleteAll
+    self._processMap["deleteAllTs"] = Processor.process_deleteAllTs
+    self._processMap["deleteAllRow"] = Processor.process_deleteAllRow
+    self._processMap["increment"] = Processor.process_increment
+    self._processMap["incrementRows"] = Processor.process_incrementRows
+    self._processMap["deleteAllRowTs"] = Processor.process_deleteAllRowTs
+    self._processMap["scannerOpenWithScan"] = Processor.process_scannerOpenWithScan
+    self._processMap["scannerOpen"] = Processor.process_scannerOpen
+    self._processMap["scannerOpenWithStop"] = Processor.process_scannerOpenWithStop
+    self._processMap["scannerOpenWithPrefix"] = Processor.process_scannerOpenWithPrefix
+    self._processMap["scannerOpenTs"] = Processor.process_scannerOpenTs
+    self._processMap["scannerOpenWithStopTs"] = Processor.process_scannerOpenWithStopTs
+    self._processMap["scannerGet"] = Processor.process_scannerGet
+    self._processMap["scannerGetList"] = Processor.process_scannerGetList
+    self._processMap["scannerClose"] = Processor.process_scannerClose
+    self._processMap["getRowOrBefore"] = Processor.process_getRowOrBefore
+    self._processMap["getRegionInfo"] = Processor.process_getRegionInfo
+
+  def process(self, iprot, oprot):
+    (name, type, seqid) = iprot.readMessageBegin()
+    if name not in self._processMap:
+      iprot.skip(TType.STRUCT)
+      iprot.readMessageEnd()
+      x = TApplicationException(TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % (name))
+      oprot.writeMessageBegin(name, TMessageType.EXCEPTION, seqid)
+      x.write(oprot)
+      oprot.writeMessageEnd()
+      oprot.trans.flush()
+      return
+    else:
+      self._processMap[name](self, seqid, iprot, oprot)
+    return True
+
+  def process_enableTable(self, seqid, iprot, oprot):
+    args = enableTable_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = enableTable_result()
+    try:
+      self._handler.enableTable(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("enableTable", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_disableTable(self, seqid, iprot, oprot):
+    args = disableTable_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = disableTable_result()
+    try:
+      self._handler.disableTable(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("disableTable", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_isTableEnabled(self, seqid, iprot, oprot):
+    args = isTableEnabled_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = isTableEnabled_result()
+    try:
+      result.success = self._handler.isTableEnabled(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("isTableEnabled", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_compact(self, seqid, iprot, oprot):
+    args = compact_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = compact_result()
+    try:
+      self._handler.compact(args.tableNameOrRegionName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("compact", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_majorCompact(self, seqid, iprot, oprot):
+    args = majorCompact_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = majorCompact_result()
+    try:
+      self._handler.majorCompact(args.tableNameOrRegionName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("majorCompact", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getTableNames(self, seqid, iprot, oprot):
+    args = getTableNames_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getTableNames_result()
+    try:
+      result.success = self._handler.getTableNames()
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getTableNames", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getColumnDescriptors(self, seqid, iprot, oprot):
+    args = getColumnDescriptors_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getColumnDescriptors_result()
+    try:
+      result.success = self._handler.getColumnDescriptors(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getColumnDescriptors", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getTableRegions(self, seqid, iprot, oprot):
+    args = getTableRegions_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getTableRegions_result()
+    try:
+      result.success = self._handler.getTableRegions(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getTableRegions", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_createTable(self, seqid, iprot, oprot):
+    args = createTable_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = createTable_result()
+    try:
+      self._handler.createTable(args.tableName, args.columnFamilies)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    except AlreadyExists as exist:
+      result.exist = exist
+    oprot.writeMessageBegin("createTable", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_deleteTable(self, seqid, iprot, oprot):
+    args = deleteTable_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = deleteTable_result()
+    try:
+      self._handler.deleteTable(args.tableName)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("deleteTable", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_get(self, seqid, iprot, oprot):
+    args = get_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = get_result()
+    try:
+      result.success = self._handler.get(args.tableName, args.row, args.column, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("get", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getVer(self, seqid, iprot, oprot):
+    args = getVer_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getVer_result()
+    try:
+      result.success = self._handler.getVer(args.tableName, args.row, args.column, args.numVersions, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getVer", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getVerTs(self, seqid, iprot, oprot):
+    args = getVerTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getVerTs_result()
+    try:
+      result.success = self._handler.getVerTs(args.tableName, args.row, args.column, args.timestamp, args.numVersions, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getVerTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRow(self, seqid, iprot, oprot):
+    args = getRow_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRow_result()
+    try:
+      result.success = self._handler.getRow(args.tableName, args.row, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRow", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowWithColumns(self, seqid, iprot, oprot):
+    args = getRowWithColumns_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowWithColumns_result()
+    try:
+      result.success = self._handler.getRowWithColumns(args.tableName, args.row, args.columns, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowWithColumns", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowTs(self, seqid, iprot, oprot):
+    args = getRowTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowTs_result()
+    try:
+      result.success = self._handler.getRowTs(args.tableName, args.row, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowWithColumnsTs(self, seqid, iprot, oprot):
+    args = getRowWithColumnsTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowWithColumnsTs_result()
+    try:
+      result.success = self._handler.getRowWithColumnsTs(args.tableName, args.row, args.columns, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowWithColumnsTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRows(self, seqid, iprot, oprot):
+    args = getRows_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRows_result()
+    try:
+      result.success = self._handler.getRows(args.tableName, args.rows, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRows", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowsWithColumns(self, seqid, iprot, oprot):
+    args = getRowsWithColumns_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowsWithColumns_result()
+    try:
+      result.success = self._handler.getRowsWithColumns(args.tableName, args.rows, args.columns, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowsWithColumns", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowsTs(self, seqid, iprot, oprot):
+    args = getRowsTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowsTs_result()
+    try:
+      result.success = self._handler.getRowsTs(args.tableName, args.rows, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowsTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowsWithColumnsTs(self, seqid, iprot, oprot):
+    args = getRowsWithColumnsTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowsWithColumnsTs_result()
+    try:
+      result.success = self._handler.getRowsWithColumnsTs(args.tableName, args.rows, args.columns, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowsWithColumnsTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_mutateRow(self, seqid, iprot, oprot):
+    args = mutateRow_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = mutateRow_result()
+    try:
+      self._handler.mutateRow(args.tableName, args.row, args.mutations, args.attributes)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("mutateRow", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_mutateRowTs(self, seqid, iprot, oprot):
+    args = mutateRowTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = mutateRowTs_result()
+    try:
+      self._handler.mutateRowTs(args.tableName, args.row, args.mutations, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("mutateRowTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_mutateRows(self, seqid, iprot, oprot):
+    args = mutateRows_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = mutateRows_result()
+    try:
+      self._handler.mutateRows(args.tableName, args.rowBatches, args.attributes)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("mutateRows", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_mutateRowsTs(self, seqid, iprot, oprot):
+    args = mutateRowsTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = mutateRowsTs_result()
+    try:
+      self._handler.mutateRowsTs(args.tableName, args.rowBatches, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("mutateRowsTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_atomicIncrement(self, seqid, iprot, oprot):
+    args = atomicIncrement_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = atomicIncrement_result()
+    try:
+      result.success = self._handler.atomicIncrement(args.tableName, args.row, args.column, args.value)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("atomicIncrement", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_deleteAll(self, seqid, iprot, oprot):
+    args = deleteAll_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = deleteAll_result()
+    try:
+      self._handler.deleteAll(args.tableName, args.row, args.column, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("deleteAll", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_deleteAllTs(self, seqid, iprot, oprot):
+    args = deleteAllTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = deleteAllTs_result()
+    try:
+      self._handler.deleteAllTs(args.tableName, args.row, args.column, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("deleteAllTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_deleteAllRow(self, seqid, iprot, oprot):
+    args = deleteAllRow_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = deleteAllRow_result()
+    try:
+      self._handler.deleteAllRow(args.tableName, args.row, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("deleteAllRow", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_increment(self, seqid, iprot, oprot):
+    args = increment_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = increment_result()
+    try:
+      self._handler.increment(args.increment)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("increment", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_incrementRows(self, seqid, iprot, oprot):
+    args = incrementRows_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = incrementRows_result()
+    try:
+      self._handler.incrementRows(args.increments)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("incrementRows", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_deleteAllRowTs(self, seqid, iprot, oprot):
+    args = deleteAllRowTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = deleteAllRowTs_result()
+    try:
+      self._handler.deleteAllRowTs(args.tableName, args.row, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("deleteAllRowTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpenWithScan(self, seqid, iprot, oprot):
+    args = scannerOpenWithScan_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpenWithScan_result()
+    try:
+      result.success = self._handler.scannerOpenWithScan(args.tableName, args.scan, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpenWithScan", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpen(self, seqid, iprot, oprot):
+    args = scannerOpen_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpen_result()
+    try:
+      result.success = self._handler.scannerOpen(args.tableName, args.startRow, args.columns, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpen", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpenWithStop(self, seqid, iprot, oprot):
+    args = scannerOpenWithStop_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpenWithStop_result()
+    try:
+      result.success = self._handler.scannerOpenWithStop(args.tableName, args.startRow, args.stopRow, args.columns, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpenWithStop", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpenWithPrefix(self, seqid, iprot, oprot):
+    args = scannerOpenWithPrefix_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpenWithPrefix_result()
+    try:
+      result.success = self._handler.scannerOpenWithPrefix(args.tableName, args.startAndPrefix, args.columns, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpenWithPrefix", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpenTs(self, seqid, iprot, oprot):
+    args = scannerOpenTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpenTs_result()
+    try:
+      result.success = self._handler.scannerOpenTs(args.tableName, args.startRow, args.columns, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpenTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerOpenWithStopTs(self, seqid, iprot, oprot):
+    args = scannerOpenWithStopTs_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerOpenWithStopTs_result()
+    try:
+      result.success = self._handler.scannerOpenWithStopTs(args.tableName, args.startRow, args.stopRow, args.columns, args.timestamp, args.attributes)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("scannerOpenWithStopTs", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerGet(self, seqid, iprot, oprot):
+    args = scannerGet_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerGet_result()
+    try:
+      result.success = self._handler.scannerGet(args.id)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("scannerGet", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerGetList(self, seqid, iprot, oprot):
+    args = scannerGetList_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerGetList_result()
+    try:
+      result.success = self._handler.scannerGetList(args.id, args.nbRows)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("scannerGetList", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_scannerClose(self, seqid, iprot, oprot):
+    args = scannerClose_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = scannerClose_result()
+    try:
+      self._handler.scannerClose(args.id)
+    except IOError as io:
+      result.io = io
+    except IllegalArgument as ia:
+      result.ia = ia
+    oprot.writeMessageBegin("scannerClose", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRowOrBefore(self, seqid, iprot, oprot):
+    args = getRowOrBefore_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRowOrBefore_result()
+    try:
+      result.success = self._handler.getRowOrBefore(args.tableName, args.row, args.family)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRowOrBefore", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+  def process_getRegionInfo(self, seqid, iprot, oprot):
+    args = getRegionInfo_args()
+    args.read(iprot)
+    iprot.readMessageEnd()
+    result = getRegionInfo_result()
+    try:
+      result.success = self._handler.getRegionInfo(args.row)
+    except IOError as io:
+      result.io = io
+    oprot.writeMessageBegin("getRegionInfo", TMessageType.REPLY, seqid)
+    result.write(oprot)
+    oprot.writeMessageEnd()
+    oprot.trans.flush()
+
+
+# HELPER FUNCTIONS AND STRUCTURES
+
+class enableTable_args:
+  """
+  Attributes:
+   - tableName: name of the table
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('enableTable_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class enableTable_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('enableTable_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class disableTable_args:
+  """
+  Attributes:
+   - tableName: name of the table
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('disableTable_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class disableTable_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('disableTable_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class isTableEnabled_args:
+  """
+  Attributes:
+   - tableName: name of the table to check
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('isTableEnabled_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class isTableEnabled_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.BOOL, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.BOOL:
+          self.success = iprot.readBool();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('isTableEnabled_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.BOOL, 0)
+      oprot.writeBool(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class compact_args:
+  """
+  Attributes:
+   - tableNameOrRegionName
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableNameOrRegionName', None, None, ), # 1
+  )
+
+  def __init__(self, tableNameOrRegionName=None,):
+    self.tableNameOrRegionName = tableNameOrRegionName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableNameOrRegionName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('compact_args')
+    if self.tableNameOrRegionName is not None:
+      oprot.writeFieldBegin('tableNameOrRegionName', TType.STRING, 1)
+      oprot.writeString(self.tableNameOrRegionName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class compact_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('compact_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class majorCompact_args:
+  """
+  Attributes:
+   - tableNameOrRegionName
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableNameOrRegionName', None, None, ), # 1
+  )
+
+  def __init__(self, tableNameOrRegionName=None,):
+    self.tableNameOrRegionName = tableNameOrRegionName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableNameOrRegionName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('majorCompact_args')
+    if self.tableNameOrRegionName is not None:
+      oprot.writeFieldBegin('tableNameOrRegionName', TType.STRING, 1)
+      oprot.writeString(self.tableNameOrRegionName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class majorCompact_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('majorCompact_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getTableNames_args:
+
+  thrift_spec = (
+  )
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getTableNames_args')
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getTableNames_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRING,None), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype26, _size23) = iprot.readListBegin()
+          for _i27 in xrange(_size23):
+            _elem28 = iprot.readString();
+            self.success.append(_elem28)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getTableNames_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRING, len(self.success))
+      for iter29 in self.success:
+        oprot.writeString(iter29)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getColumnDescriptors_args:
+  """
+  Attributes:
+   - tableName: table name
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getColumnDescriptors_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getColumnDescriptors_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.MAP, 'success', (TType.STRING,None,TType.STRUCT,(ColumnDescriptor, ColumnDescriptor.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.MAP:
+          self.success = {}
+          (_ktype31, _vtype32, _size30 ) = iprot.readMapBegin() 
+          for _i34 in xrange(_size30):
+            _key35 = iprot.readString();
+            _val36 = ColumnDescriptor()
+            _val36.read(iprot)
+            self.success[_key35] = _val36
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getColumnDescriptors_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.MAP, 0)
+      oprot.writeMapBegin(TType.STRING, TType.STRUCT, len(self.success))
+      for kiter37,viter38 in self.success.items():
+        oprot.writeString(kiter37)
+        viter38.write(oprot)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getTableRegions_args:
+  """
+  Attributes:
+   - tableName: table name
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getTableRegions_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getTableRegions_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRegionInfo, TRegionInfo.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype42, _size39) = iprot.readListBegin()
+          for _i43 in xrange(_size39):
+            _elem44 = TRegionInfo()
+            _elem44.read(iprot)
+            self.success.append(_elem44)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getTableRegions_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter45 in self.success:
+        iter45.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class createTable_args:
+  """
+  Attributes:
+   - tableName: name of table to create
+   - columnFamilies: list of column family descriptors
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'columnFamilies', (TType.STRUCT,(ColumnDescriptor, ColumnDescriptor.thrift_spec)), None, ), # 2
+  )
+
+  def __init__(self, tableName=None, columnFamilies=None,):
+    self.tableName = tableName
+    self.columnFamilies = columnFamilies
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.columnFamilies = []
+          (_etype49, _size46) = iprot.readListBegin()
+          for _i50 in xrange(_size46):
+            _elem51 = ColumnDescriptor()
+            _elem51.read(iprot)
+            self.columnFamilies.append(_elem51)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('createTable_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.columnFamilies is not None:
+      oprot.writeFieldBegin('columnFamilies', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRUCT, len(self.columnFamilies))
+      for iter52 in self.columnFamilies:
+        iter52.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class createTable_result:
+  """
+  Attributes:
+   - io
+   - ia
+   - exist
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+    (3, TType.STRUCT, 'exist', (AlreadyExists, AlreadyExists.thrift_spec), None, ), # 3
+  )
+
+  def __init__(self, io=None, ia=None, exist=None,):
+    self.io = io
+    self.ia = ia
+    self.exist = exist
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRUCT:
+          self.exist = AlreadyExists()
+          self.exist.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('createTable_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    if self.exist is not None:
+      oprot.writeFieldBegin('exist', TType.STRUCT, 3)
+      self.exist.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteTable_args:
+  """
+  Attributes:
+   - tableName: name of table to delete
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+  )
+
+  def __init__(self, tableName=None,):
+    self.tableName = tableName
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteTable_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteTable_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteTable_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class get_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - column: column name
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype54, _vtype55, _size53 ) = iprot.readMapBegin() 
+          for _i57 in xrange(_size53):
+            _key58 = iprot.readString();
+            _val59 = iprot.readString();
+            self.attributes[_key58] = _val59
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('get_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter60,viter61 in self.attributes.items():
+        oprot.writeString(kiter60)
+        oprot.writeString(viter61)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class get_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TCell, TCell.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype65, _size62) = iprot.readListBegin()
+          for _i66 in xrange(_size62):
+            _elem67 = TCell()
+            _elem67.read(iprot)
+            self.success.append(_elem67)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('get_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter68 in self.success:
+        iter68.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getVer_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - column: column name
+   - numVersions: number of versions to retrieve
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.I32, 'numVersions', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, numVersions=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.numVersions = numVersions
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I32:
+          self.numVersions = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype70, _vtype71, _size69 ) = iprot.readMapBegin() 
+          for _i73 in xrange(_size69):
+            _key74 = iprot.readString();
+            _val75 = iprot.readString();
+            self.attributes[_key74] = _val75
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getVer_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.numVersions is not None:
+      oprot.writeFieldBegin('numVersions', TType.I32, 4)
+      oprot.writeI32(self.numVersions)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter76,viter77 in self.attributes.items():
+        oprot.writeString(kiter76)
+        oprot.writeString(viter77)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getVer_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TCell, TCell.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype81, _size78) = iprot.readListBegin()
+          for _i82 in xrange(_size78):
+            _elem83 = TCell()
+            _elem83.read(iprot)
+            self.success.append(_elem83)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getVer_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter84 in self.success:
+        iter84.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getVerTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - column: column name
+   - timestamp: timestamp
+   - numVersions: number of versions to retrieve
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.I32, 'numVersions', None, None, ), # 5
+    (6, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 6
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, timestamp=None, numVersions=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.timestamp = timestamp
+    self.numVersions = numVersions
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.I32:
+          self.numVersions = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 6:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype86, _vtype87, _size85 ) = iprot.readMapBegin() 
+          for _i89 in xrange(_size85):
+            _key90 = iprot.readString();
+            _val91 = iprot.readString();
+            self.attributes[_key90] = _val91
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getVerTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.numVersions is not None:
+      oprot.writeFieldBegin('numVersions', TType.I32, 5)
+      oprot.writeI32(self.numVersions)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 6)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter92,viter93 in self.attributes.items():
+        oprot.writeString(kiter92)
+        oprot.writeString(viter93)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getVerTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TCell, TCell.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype97, _size94) = iprot.readListBegin()
+          for _i98 in xrange(_size94):
+            _elem99 = TCell()
+            _elem99.read(iprot)
+            self.success.append(_elem99)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getVerTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter100 in self.success:
+        iter100.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRow_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 3
+  )
+
+  def __init__(self, tableName=None, row=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype102, _vtype103, _size101 ) = iprot.readMapBegin() 
+          for _i105 in xrange(_size101):
+            _key106 = iprot.readString();
+            _val107 = iprot.readString();
+            self.attributes[_key106] = _val107
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRow_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 3)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter108,viter109 in self.attributes.items():
+        oprot.writeString(kiter108)
+        oprot.writeString(viter109)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRow_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype113, _size110) = iprot.readListBegin()
+          for _i114 in xrange(_size110):
+            _elem115 = TRowResult()
+            _elem115.read(iprot)
+            self.success.append(_elem115)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRow_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter116 in self.success:
+        iter116.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowWithColumns_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - columns: List of columns to return, null for all columns
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, columns=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.columns = columns
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype120, _size117) = iprot.readListBegin()
+          for _i121 in xrange(_size117):
+            _elem122 = iprot.readString();
+            self.columns.append(_elem122)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype124, _vtype125, _size123 ) = iprot.readMapBegin() 
+          for _i127 in xrange(_size123):
+            _key128 = iprot.readString();
+            _val129 = iprot.readString();
+            self.attributes[_key128] = _val129
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowWithColumns_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter130 in self.columns:
+        oprot.writeString(iter130)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter131,viter132 in self.attributes.items():
+        oprot.writeString(kiter131)
+        oprot.writeString(viter132)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowWithColumns_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype136, _size133) = iprot.readListBegin()
+          for _i137 in xrange(_size133):
+            _elem138 = TRowResult()
+            _elem138.read(iprot)
+            self.success.append(_elem138)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowWithColumns_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter139 in self.success:
+        iter139.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowTs_args:
+  """
+  Attributes:
+   - tableName: name of the table
+   - row: row key
+   - timestamp: timestamp
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.I64, 'timestamp', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype141, _vtype142, _size140 ) = iprot.readMapBegin() 
+          for _i144 in xrange(_size140):
+            _key145 = iprot.readString();
+            _val146 = iprot.readString();
+            self.attributes[_key145] = _val146
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 3)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter147,viter148 in self.attributes.items():
+        oprot.writeString(kiter147)
+        oprot.writeString(viter148)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype152, _size149) = iprot.readListBegin()
+          for _i153 in xrange(_size149):
+            _elem154 = TRowResult()
+            _elem154.read(iprot)
+            self.success.append(_elem154)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter155 in self.success:
+        iter155.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowWithColumnsTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - columns: List of columns to return, null for all columns
+   - timestamp
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, row=None, columns=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.columns = columns
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype159, _size156) = iprot.readListBegin()
+          for _i160 in xrange(_size156):
+            _elem161 = iprot.readString();
+            self.columns.append(_elem161)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype163, _vtype164, _size162 ) = iprot.readMapBegin() 
+          for _i166 in xrange(_size162):
+            _key167 = iprot.readString();
+            _val168 = iprot.readString();
+            self.attributes[_key167] = _val168
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowWithColumnsTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter169 in self.columns:
+        oprot.writeString(iter169)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter170,viter171 in self.attributes.items():
+        oprot.writeString(kiter170)
+        oprot.writeString(viter171)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowWithColumnsTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype175, _size172) = iprot.readListBegin()
+          for _i176 in xrange(_size172):
+            _elem177 = TRowResult()
+            _elem177.read(iprot)
+            self.success.append(_elem177)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowWithColumnsTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter178 in self.success:
+        iter178.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRows_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - rows: row keys
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rows', (TType.STRING,None), None, ), # 2
+    (3, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 3
+  )
+
+  def __init__(self, tableName=None, rows=None, attributes=None,):
+    self.tableName = tableName
+    self.rows = rows
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rows = []
+          (_etype182, _size179) = iprot.readListBegin()
+          for _i183 in xrange(_size179):
+            _elem184 = iprot.readString();
+            self.rows.append(_elem184)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype186, _vtype187, _size185 ) = iprot.readMapBegin() 
+          for _i189 in xrange(_size185):
+            _key190 = iprot.readString();
+            _val191 = iprot.readString();
+            self.attributes[_key190] = _val191
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRows_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rows is not None:
+      oprot.writeFieldBegin('rows', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRING, len(self.rows))
+      for iter192 in self.rows:
+        oprot.writeString(iter192)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 3)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter193,viter194 in self.attributes.items():
+        oprot.writeString(kiter193)
+        oprot.writeString(viter194)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRows_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype198, _size195) = iprot.readListBegin()
+          for _i199 in xrange(_size195):
+            _elem200 = TRowResult()
+            _elem200.read(iprot)
+            self.success.append(_elem200)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRows_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter201 in self.success:
+        iter201.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsWithColumns_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - rows: row keys
+   - columns: List of columns to return, null for all columns
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rows', (TType.STRING,None), None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, rows=None, columns=None, attributes=None,):
+    self.tableName = tableName
+    self.rows = rows
+    self.columns = columns
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rows = []
+          (_etype205, _size202) = iprot.readListBegin()
+          for _i206 in xrange(_size202):
+            _elem207 = iprot.readString();
+            self.rows.append(_elem207)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype211, _size208) = iprot.readListBegin()
+          for _i212 in xrange(_size208):
+            _elem213 = iprot.readString();
+            self.columns.append(_elem213)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype215, _vtype216, _size214 ) = iprot.readMapBegin() 
+          for _i218 in xrange(_size214):
+            _key219 = iprot.readString();
+            _val220 = iprot.readString();
+            self.attributes[_key219] = _val220
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsWithColumns_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rows is not None:
+      oprot.writeFieldBegin('rows', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRING, len(self.rows))
+      for iter221 in self.rows:
+        oprot.writeString(iter221)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter222 in self.columns:
+        oprot.writeString(iter222)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter223,viter224 in self.attributes.items():
+        oprot.writeString(kiter223)
+        oprot.writeString(viter224)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsWithColumns_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype228, _size225) = iprot.readListBegin()
+          for _i229 in xrange(_size225):
+            _elem230 = TRowResult()
+            _elem230.read(iprot)
+            self.success.append(_elem230)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsWithColumns_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter231 in self.success:
+        iter231.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsTs_args:
+  """
+  Attributes:
+   - tableName: name of the table
+   - rows: row keys
+   - timestamp: timestamp
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rows', (TType.STRING,None), None, ), # 2
+    (3, TType.I64, 'timestamp', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, rows=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.rows = rows
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rows = []
+          (_etype235, _size232) = iprot.readListBegin()
+          for _i236 in xrange(_size232):
+            _elem237 = iprot.readString();
+            self.rows.append(_elem237)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype239, _vtype240, _size238 ) = iprot.readMapBegin() 
+          for _i242 in xrange(_size238):
+            _key243 = iprot.readString();
+            _val244 = iprot.readString();
+            self.attributes[_key243] = _val244
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rows is not None:
+      oprot.writeFieldBegin('rows', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRING, len(self.rows))
+      for iter245 in self.rows:
+        oprot.writeString(iter245)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 3)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter246,viter247 in self.attributes.items():
+        oprot.writeString(kiter246)
+        oprot.writeString(viter247)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype251, _size248) = iprot.readListBegin()
+          for _i252 in xrange(_size248):
+            _elem253 = TRowResult()
+            _elem253.read(iprot)
+            self.success.append(_elem253)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter254 in self.success:
+        iter254.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsWithColumnsTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - rows: row keys
+   - columns: List of columns to return, null for all columns
+   - timestamp
+   - attributes: Get attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rows', (TType.STRING,None), None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, rows=None, columns=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.rows = rows
+    self.columns = columns
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rows = []
+          (_etype258, _size255) = iprot.readListBegin()
+          for _i259 in xrange(_size255):
+            _elem260 = iprot.readString();
+            self.rows.append(_elem260)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype264, _size261) = iprot.readListBegin()
+          for _i265 in xrange(_size261):
+            _elem266 = iprot.readString();
+            self.columns.append(_elem266)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype268, _vtype269, _size267 ) = iprot.readMapBegin() 
+          for _i271 in xrange(_size267):
+            _key272 = iprot.readString();
+            _val273 = iprot.readString();
+            self.attributes[_key272] = _val273
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsWithColumnsTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rows is not None:
+      oprot.writeFieldBegin('rows', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRING, len(self.rows))
+      for iter274 in self.rows:
+        oprot.writeString(iter274)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter275 in self.columns:
+        oprot.writeString(iter275)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter276,viter277 in self.attributes.items():
+        oprot.writeString(kiter276)
+        oprot.writeString(viter277)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowsWithColumnsTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype281, _size278) = iprot.readListBegin()
+          for _i282 in xrange(_size278):
+            _elem283 = TRowResult()
+            _elem283.read(iprot)
+            self.success.append(_elem283)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowsWithColumnsTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter284 in self.success:
+        iter284.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRow_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - mutations: list of mutation commands
+   - attributes: Mutation attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.LIST, 'mutations', (TType.STRUCT,(Mutation, Mutation.thrift_spec)), None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, mutations=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.mutations = mutations
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.mutations = []
+          (_etype288, _size285) = iprot.readListBegin()
+          for _i289 in xrange(_size285):
+            _elem290 = Mutation()
+            _elem290.read(iprot)
+            self.mutations.append(_elem290)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype292, _vtype293, _size291 ) = iprot.readMapBegin() 
+          for _i295 in xrange(_size291):
+            _key296 = iprot.readString();
+            _val297 = iprot.readString();
+            self.attributes[_key296] = _val297
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRow_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.mutations is not None:
+      oprot.writeFieldBegin('mutations', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRUCT, len(self.mutations))
+      for iter298 in self.mutations:
+        iter298.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter299,viter300 in self.attributes.items():
+        oprot.writeString(kiter299)
+        oprot.writeString(viter300)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRow_result:
+  """
+  Attributes:
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, io=None, ia=None,):
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRow_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRowTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - mutations: list of mutation commands
+   - timestamp: timestamp
+   - attributes: Mutation attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.LIST, 'mutations', (TType.STRUCT,(Mutation, Mutation.thrift_spec)), None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, row=None, mutations=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.mutations = mutations
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.mutations = []
+          (_etype304, _size301) = iprot.readListBegin()
+          for _i305 in xrange(_size301):
+            _elem306 = Mutation()
+            _elem306.read(iprot)
+            self.mutations.append(_elem306)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype308, _vtype309, _size307 ) = iprot.readMapBegin() 
+          for _i311 in xrange(_size307):
+            _key312 = iprot.readString();
+            _val313 = iprot.readString();
+            self.attributes[_key312] = _val313
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRowTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.mutations is not None:
+      oprot.writeFieldBegin('mutations', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRUCT, len(self.mutations))
+      for iter314 in self.mutations:
+        iter314.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter315,viter316 in self.attributes.items():
+        oprot.writeString(kiter315)
+        oprot.writeString(viter316)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRowTs_result:
+  """
+  Attributes:
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, io=None, ia=None,):
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRowTs_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRows_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - rowBatches: list of row batches
+   - attributes: Mutation attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rowBatches', (TType.STRUCT,(BatchMutation, BatchMutation.thrift_spec)), None, ), # 2
+    (3, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 3
+  )
+
+  def __init__(self, tableName=None, rowBatches=None, attributes=None,):
+    self.tableName = tableName
+    self.rowBatches = rowBatches
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rowBatches = []
+          (_etype320, _size317) = iprot.readListBegin()
+          for _i321 in xrange(_size317):
+            _elem322 = BatchMutation()
+            _elem322.read(iprot)
+            self.rowBatches.append(_elem322)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype324, _vtype325, _size323 ) = iprot.readMapBegin() 
+          for _i327 in xrange(_size323):
+            _key328 = iprot.readString();
+            _val329 = iprot.readString();
+            self.attributes[_key328] = _val329
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRows_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rowBatches is not None:
+      oprot.writeFieldBegin('rowBatches', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRUCT, len(self.rowBatches))
+      for iter330 in self.rowBatches:
+        iter330.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 3)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter331,viter332 in self.attributes.items():
+        oprot.writeString(kiter331)
+        oprot.writeString(viter332)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRows_result:
+  """
+  Attributes:
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, io=None, ia=None,):
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRows_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRowsTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - rowBatches: list of row batches
+   - timestamp: timestamp
+   - attributes: Mutation attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.LIST, 'rowBatches', (TType.STRUCT,(BatchMutation, BatchMutation.thrift_spec)), None, ), # 2
+    (3, TType.I64, 'timestamp', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, rowBatches=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.rowBatches = rowBatches
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.rowBatches = []
+          (_etype336, _size333) = iprot.readListBegin()
+          for _i337 in xrange(_size333):
+            _elem338 = BatchMutation()
+            _elem338.read(iprot)
+            self.rowBatches.append(_elem338)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype340, _vtype341, _size339 ) = iprot.readMapBegin() 
+          for _i343 in xrange(_size339):
+            _key344 = iprot.readString();
+            _val345 = iprot.readString();
+            self.attributes[_key344] = _val345
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRowsTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.rowBatches is not None:
+      oprot.writeFieldBegin('rowBatches', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRUCT, len(self.rowBatches))
+      for iter346 in self.rowBatches:
+        iter346.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 3)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter347,viter348 in self.attributes.items():
+        oprot.writeString(kiter347)
+        oprot.writeString(viter348)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class mutateRowsTs_result:
+  """
+  Attributes:
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, io=None, ia=None,):
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('mutateRowsTs_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class atomicIncrement_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row to increment
+   - column: name of column
+   - value: amount to increment by
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.I64, 'value', None, None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, value=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.value = value
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.value = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('atomicIncrement_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.value is not None:
+      oprot.writeFieldBegin('value', TType.I64, 4)
+      oprot.writeI64(self.value)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class atomicIncrement_result:
+  """
+  Attributes:
+   - success
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    (0, TType.I64, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, success=None, io=None, ia=None,):
+    self.success = success
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I64:
+          self.success = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('atomicIncrement_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I64, 0)
+      oprot.writeI64(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAll_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: Row to update
+   - column: name of column whose value is to be deleted
+   - attributes: Delete attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype350, _vtype351, _size349 ) = iprot.readMapBegin() 
+          for _i353 in xrange(_size349):
+            _key354 = iprot.readString();
+            _val355 = iprot.readString();
+            self.attributes[_key354] = _val355
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAll_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter356,viter357 in self.attributes.items():
+        oprot.writeString(kiter356)
+        oprot.writeString(viter357)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAll_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAll_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: Row to update
+   - column: name of column whose value is to be deleted
+   - timestamp: timestamp
+   - attributes: Delete attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, row=None, column=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.column = column
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype359, _vtype360, _size358 ) = iprot.readMapBegin() 
+          for _i362 in xrange(_size358):
+            _key363 = iprot.readString();
+            _val364 = iprot.readString();
+            self.attributes[_key363] = _val364
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter365,viter366 in self.attributes.items():
+        oprot.writeString(kiter365)
+        oprot.writeString(viter366)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllTs_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllTs_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllRow_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: key of the row to be completely deleted.
+   - attributes: Delete attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 3
+  )
+
+  def __init__(self, tableName=None, row=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype368, _vtype369, _size367 ) = iprot.readMapBegin() 
+          for _i371 in xrange(_size367):
+            _key372 = iprot.readString();
+            _val373 = iprot.readString();
+            self.attributes[_key372] = _val373
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllRow_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 3)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter374,viter375 in self.attributes.items():
+        oprot.writeString(kiter374)
+        oprot.writeString(viter375)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllRow_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllRow_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class increment_args:
+  """
+  Attributes:
+   - increment: The single increment to apply
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'increment', (TIncrement, TIncrement.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, increment=None,):
+    self.increment = increment
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.increment = TIncrement()
+          self.increment.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('increment_args')
+    if self.increment is not None:
+      oprot.writeFieldBegin('increment', TType.STRUCT, 1)
+      self.increment.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class increment_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('increment_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class incrementRows_args:
+  """
+  Attributes:
+   - increments: The list of increments
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.LIST, 'increments', (TType.STRUCT,(TIncrement, TIncrement.thrift_spec)), None, ), # 1
+  )
+
+  def __init__(self, increments=None,):
+    self.increments = increments
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.LIST:
+          self.increments = []
+          (_etype379, _size376) = iprot.readListBegin()
+          for _i380 in xrange(_size376):
+            _elem381 = TIncrement()
+            _elem381.read(iprot)
+            self.increments.append(_elem381)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('incrementRows_args')
+    if self.increments is not None:
+      oprot.writeFieldBegin('increments', TType.LIST, 1)
+      oprot.writeListBegin(TType.STRUCT, len(self.increments))
+      for iter382 in self.increments:
+        iter382.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class incrementRows_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('incrementRows_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllRowTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: key of the row to be completely deleted.
+   - timestamp: timestamp
+   - attributes: Delete attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.I64, 'timestamp', None, None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, row=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.row = row
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype384, _vtype385, _size383 ) = iprot.readMapBegin() 
+          for _i387 in xrange(_size383):
+            _key388 = iprot.readString();
+            _val389 = iprot.readString();
+            self.attributes[_key388] = _val389
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllRowTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 3)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter390,viter391 in self.attributes.items():
+        oprot.writeString(kiter390)
+        oprot.writeString(viter391)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class deleteAllRowTs_result:
+  """
+  Attributes:
+   - io
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, io=None,):
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('deleteAllRowTs_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithScan_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - scan: Scan instance
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRUCT, 'scan', (TScan, TScan.thrift_spec), None, ), # 2
+    (3, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 3
+  )
+
+  def __init__(self, tableName=None, scan=None, attributes=None,):
+    self.tableName = tableName
+    self.scan = scan
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.scan = TScan()
+          self.scan.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype393, _vtype394, _size392 ) = iprot.readMapBegin() 
+          for _i396 in xrange(_size392):
+            _key397 = iprot.readString();
+            _val398 = iprot.readString();
+            self.attributes[_key397] = _val398
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithScan_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.scan is not None:
+      oprot.writeFieldBegin('scan', TType.STRUCT, 2)
+      self.scan.write(oprot)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 3)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter399,viter400 in self.attributes.items():
+        oprot.writeString(kiter399)
+        oprot.writeString(viter400)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithScan_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithScan_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpen_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - startRow: Starting row in table to scan.
+  Send "" (empty string) to start at the first row.
+   - columns: columns to scan. If column name is a column family, all
+  columns of the specified column family are returned. It's also possible
+  to pass a regex in the column qualifier.
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'startRow', None, None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, startRow=None, columns=None, attributes=None,):
+    self.tableName = tableName
+    self.startRow = startRow
+    self.columns = columns
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.startRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype404, _size401) = iprot.readListBegin()
+          for _i405 in xrange(_size401):
+            _elem406 = iprot.readString();
+            self.columns.append(_elem406)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype408, _vtype409, _size407 ) = iprot.readMapBegin() 
+          for _i411 in xrange(_size407):
+            _key412 = iprot.readString();
+            _val413 = iprot.readString();
+            self.attributes[_key412] = _val413
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpen_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.startRow is not None:
+      oprot.writeFieldBegin('startRow', TType.STRING, 2)
+      oprot.writeString(self.startRow)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter414 in self.columns:
+        oprot.writeString(iter414)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter415,viter416 in self.attributes.items():
+        oprot.writeString(kiter415)
+        oprot.writeString(viter416)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpen_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpen_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithStop_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - startRow: Starting row in table to scan.
+  Send "" (empty string) to start at the first row.
+   - stopRow: row to stop scanning on. This row is *not* included in the
+  scanner's results
+   - columns: columns to scan. If column name is a column family, all
+  columns of the specified column family are returned. It's also possible
+  to pass a regex in the column qualifier.
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'startRow', None, None, ), # 2
+    (3, TType.STRING, 'stopRow', None, None, ), # 3
+    (4, TType.LIST, 'columns', (TType.STRING,None), None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, startRow=None, stopRow=None, columns=None, attributes=None,):
+    self.tableName = tableName
+    self.startRow = startRow
+    self.stopRow = stopRow
+    self.columns = columns
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.startRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.stopRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype420, _size417) = iprot.readListBegin()
+          for _i421 in xrange(_size417):
+            _elem422 = iprot.readString();
+            self.columns.append(_elem422)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype424, _vtype425, _size423 ) = iprot.readMapBegin() 
+          for _i427 in xrange(_size423):
+            _key428 = iprot.readString();
+            _val429 = iprot.readString();
+            self.attributes[_key428] = _val429
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithStop_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.startRow is not None:
+      oprot.writeFieldBegin('startRow', TType.STRING, 2)
+      oprot.writeString(self.startRow)
+      oprot.writeFieldEnd()
+    if self.stopRow is not None:
+      oprot.writeFieldBegin('stopRow', TType.STRING, 3)
+      oprot.writeString(self.stopRow)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 4)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter430 in self.columns:
+        oprot.writeString(iter430)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter431,viter432 in self.attributes.items():
+        oprot.writeString(kiter431)
+        oprot.writeString(viter432)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithStop_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithStop_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithPrefix_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - startAndPrefix: the prefix (and thus start row) of the keys you want
+   - columns: the columns you want returned
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'startAndPrefix', None, None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 4
+  )
+
+  def __init__(self, tableName=None, startAndPrefix=None, columns=None, attributes=None,):
+    self.tableName = tableName
+    self.startAndPrefix = startAndPrefix
+    self.columns = columns
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.startAndPrefix = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype436, _size433) = iprot.readListBegin()
+          for _i437 in xrange(_size433):
+            _elem438 = iprot.readString();
+            self.columns.append(_elem438)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype440, _vtype441, _size439 ) = iprot.readMapBegin() 
+          for _i443 in xrange(_size439):
+            _key444 = iprot.readString();
+            _val445 = iprot.readString();
+            self.attributes[_key444] = _val445
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithPrefix_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.startAndPrefix is not None:
+      oprot.writeFieldBegin('startAndPrefix', TType.STRING, 2)
+      oprot.writeString(self.startAndPrefix)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter446 in self.columns:
+        oprot.writeString(iter446)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 4)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter447,viter448 in self.attributes.items():
+        oprot.writeString(kiter447)
+        oprot.writeString(viter448)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithPrefix_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithPrefix_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - startRow: Starting row in table to scan.
+  Send "" (empty string) to start at the first row.
+   - columns: columns to scan. If column name is a column family, all
+  columns of the specified column family are returned. It's also possible
+  to pass a regex in the column qualifier.
+   - timestamp: timestamp
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'startRow', None, None, ), # 2
+    (3, TType.LIST, 'columns', (TType.STRING,None), None, ), # 3
+    (4, TType.I64, 'timestamp', None, None, ), # 4
+    (5, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 5
+  )
+
+  def __init__(self, tableName=None, startRow=None, columns=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.startRow = startRow
+    self.columns = columns
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.startRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype452, _size449) = iprot.readListBegin()
+          for _i453 in xrange(_size449):
+            _elem454 = iprot.readString();
+            self.columns.append(_elem454)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype456, _vtype457, _size455 ) = iprot.readMapBegin() 
+          for _i459 in xrange(_size455):
+            _key460 = iprot.readString();
+            _val461 = iprot.readString();
+            self.attributes[_key460] = _val461
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.startRow is not None:
+      oprot.writeFieldBegin('startRow', TType.STRING, 2)
+      oprot.writeString(self.startRow)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 3)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter462 in self.columns:
+        oprot.writeString(iter462)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 4)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 5)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter463,viter464 in self.attributes.items():
+        oprot.writeString(kiter463)
+        oprot.writeString(viter464)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithStopTs_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - startRow: Starting row in table to scan.
+  Send "" (empty string) to start at the first row.
+   - stopRow: row to stop scanning on. This row is *not* included in the
+  scanner's results
+   - columns: columns to scan. If column name is a column family, all
+  columns of the specified column family are returned. It's also possible
+  to pass a regex in the column qualifier.
+   - timestamp: timestamp
+   - attributes: Scan attributes
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'startRow', None, None, ), # 2
+    (3, TType.STRING, 'stopRow', None, None, ), # 3
+    (4, TType.LIST, 'columns', (TType.STRING,None), None, ), # 4
+    (5, TType.I64, 'timestamp', None, None, ), # 5
+    (6, TType.MAP, 'attributes', (TType.STRING,None,TType.STRING,None), None, ), # 6
+  )
+
+  def __init__(self, tableName=None, startRow=None, stopRow=None, columns=None, timestamp=None, attributes=None,):
+    self.tableName = tableName
+    self.startRow = startRow
+    self.stopRow = stopRow
+    self.columns = columns
+    self.timestamp = timestamp
+    self.attributes = attributes
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.startRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.stopRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype468, _size465) = iprot.readListBegin()
+          for _i469 in xrange(_size465):
+            _elem470 = iprot.readString();
+            self.columns.append(_elem470)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 6:
+        if ftype == TType.MAP:
+          self.attributes = {}
+          (_ktype472, _vtype473, _size471 ) = iprot.readMapBegin() 
+          for _i475 in xrange(_size471):
+            _key476 = iprot.readString();
+            _val477 = iprot.readString();
+            self.attributes[_key476] = _val477
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithStopTs_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.startRow is not None:
+      oprot.writeFieldBegin('startRow', TType.STRING, 2)
+      oprot.writeString(self.startRow)
+      oprot.writeFieldEnd()
+    if self.stopRow is not None:
+      oprot.writeFieldBegin('stopRow', TType.STRING, 3)
+      oprot.writeString(self.stopRow)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 4)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter478 in self.columns:
+        oprot.writeString(iter478)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 5)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.attributes is not None:
+      oprot.writeFieldBegin('attributes', TType.MAP, 6)
+      oprot.writeMapBegin(TType.STRING, TType.STRING, len(self.attributes))
+      for kiter479,viter480 in self.attributes.items():
+        oprot.writeString(kiter479)
+        oprot.writeString(viter480)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerOpenWithStopTs_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.I32, 'success', None, None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.I32:
+          self.success = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerOpenWithStopTs_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.I32, 0)
+      oprot.writeI32(self.success)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerGet_args:
+  """
+  Attributes:
+   - id: id of a scanner returned by scannerOpen
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.I32, 'id', None, None, ), # 1
+  )
+
+  def __init__(self, id=None,):
+    self.id = id
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.I32:
+          self.id = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerGet_args')
+    if self.id is not None:
+      oprot.writeFieldBegin('id', TType.I32, 1)
+      oprot.writeI32(self.id)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerGet_result:
+  """
+  Attributes:
+   - success
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, success=None, io=None, ia=None,):
+    self.success = success
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype484, _size481) = iprot.readListBegin()
+          for _i485 in xrange(_size481):
+            _elem486 = TRowResult()
+            _elem486.read(iprot)
+            self.success.append(_elem486)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerGet_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter487 in self.success:
+        iter487.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerGetList_args:
+  """
+  Attributes:
+   - id: id of a scanner returned by scannerOpen
+   - nbRows: number of results to return
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.I32, 'id', None, None, ), # 1
+    (2, TType.I32, 'nbRows', None, None, ), # 2
+  )
+
+  def __init__(self, id=None, nbRows=None,):
+    self.id = id
+    self.nbRows = nbRows
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.I32:
+          self.id = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.I32:
+          self.nbRows = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerGetList_args')
+    if self.id is not None:
+      oprot.writeFieldBegin('id', TType.I32, 1)
+      oprot.writeI32(self.id)
+      oprot.writeFieldEnd()
+    if self.nbRows is not None:
+      oprot.writeFieldBegin('nbRows', TType.I32, 2)
+      oprot.writeI32(self.nbRows)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerGetList_result:
+  """
+  Attributes:
+   - success
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TRowResult, TRowResult.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, success=None, io=None, ia=None,):
+    self.success = success
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype491, _size488) = iprot.readListBegin()
+          for _i492 in xrange(_size488):
+            _elem493 = TRowResult()
+            _elem493.read(iprot)
+            self.success.append(_elem493)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerGetList_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter494 in self.success:
+        iter494.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerClose_args:
+  """
+  Attributes:
+   - id: id of a scanner returned by scannerOpen
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.I32, 'id', None, None, ), # 1
+  )
+
+  def __init__(self, id=None,):
+    self.id = id
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.I32:
+          self.id = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerClose_args')
+    if self.id is not None:
+      oprot.writeFieldBegin('id', TType.I32, 1)
+      oprot.writeI32(self.id)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class scannerClose_result:
+  """
+  Attributes:
+   - io
+   - ia
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+    (2, TType.STRUCT, 'ia', (IllegalArgument, IllegalArgument.thrift_spec), None, ), # 2
+  )
+
+  def __init__(self, io=None, ia=None,):
+    self.io = io
+    self.ia = ia
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRUCT:
+          self.ia = IllegalArgument()
+          self.ia.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('scannerClose_result')
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    if self.ia is not None:
+      oprot.writeFieldBegin('ia', TType.STRUCT, 2)
+      self.ia.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowOrBefore_args:
+  """
+  Attributes:
+   - tableName: name of table
+   - row: row key
+   - family: column name
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'tableName', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'family', None, None, ), # 3
+  )
+
+  def __init__(self, tableName=None, row=None, family=None,):
+    self.tableName = tableName
+    self.row = row
+    self.family = family
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.tableName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.family = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowOrBefore_args')
+    if self.tableName is not None:
+      oprot.writeFieldBegin('tableName', TType.STRING, 1)
+      oprot.writeString(self.tableName)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.family is not None:
+      oprot.writeFieldBegin('family', TType.STRING, 3)
+      oprot.writeString(self.family)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRowOrBefore_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.LIST, 'success', (TType.STRUCT,(TCell, TCell.thrift_spec)), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.LIST:
+          self.success = []
+          (_etype498, _size495) = iprot.readListBegin()
+          for _i499 in xrange(_size495):
+            _elem500 = TCell()
+            _elem500.read(iprot)
+            self.success.append(_elem500)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRowOrBefore_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.LIST, 0)
+      oprot.writeListBegin(TType.STRUCT, len(self.success))
+      for iter501 in self.success:
+        iter501.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRegionInfo_args:
+  """
+  Attributes:
+   - row: row key
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'row', None, None, ), # 1
+  )
+
+  def __init__(self, row=None,):
+    self.row = row
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRegionInfo_args')
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 1)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class getRegionInfo_result:
+  """
+  Attributes:
+   - success
+   - io
+  """
+
+  thrift_spec = (
+    (0, TType.STRUCT, 'success', (TRegionInfo, TRegionInfo.thrift_spec), None, ), # 0
+    (1, TType.STRUCT, 'io', (IOError, IOError.thrift_spec), None, ), # 1
+  )
+
+  def __init__(self, success=None, io=None,):
+    self.success = success
+    self.io = io
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 0:
+        if ftype == TType.STRUCT:
+          self.success = TRegionInfo()
+          self.success.read(iprot)
+        else:
+          iprot.skip(ftype)
+      elif fid == 1:
+        if ftype == TType.STRUCT:
+          self.io = IOError()
+          self.io.read(iprot)
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('getRegionInfo_result')
+    if self.success is not None:
+      oprot.writeFieldBegin('success', TType.STRUCT, 0)
+      self.success.write(oprot)
+      oprot.writeFieldEnd()
+    if self.io is not None:
+      oprot.writeFieldBegin('io', TType.STRUCT, 1)
+      self.io.write(oprot)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)

+ 1 - 0
apps/hbase/gen-py/hbased/__init__.py

@@ -0,0 +1 @@
+__all__ = ['ttypes', 'constants', 'Hbase']

+ 11 - 0
apps/hbase/gen-py/hbased/constants.py

@@ -0,0 +1,11 @@
+#
+# Autogenerated by Thrift Compiler (0.9.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TException, TApplicationException
+from ttypes import *
+

+ 1095 - 0
apps/hbase/gen-py/hbased/ttypes.py

@@ -0,0 +1,1095 @@
+#
+# Autogenerated by Thrift Compiler (0.9.0)
+#
+# DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
+#
+#  options string: py
+#
+
+from thrift.Thrift import TType, TMessageType, TException, TApplicationException
+
+from thrift.transport import TTransport
+from thrift.protocol import TBinaryProtocol, TProtocol
+try:
+  from thrift.protocol import fastbinary
+except:
+  fastbinary = None
+
+
+
+class TCell:
+  """
+  TCell - Used to transport a cell value (byte[]) and the timestamp it was
+  stored with together as a result for get and getRow methods. This promotes
+  the timestamp of a cell to a first-class value, making it easy to take
+  note of temporal data. Cell is used all the way from HStore up to HTable.
+
+  Attributes:
+   - value
+   - timestamp
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'value', None, None, ), # 1
+    (2, TType.I64, 'timestamp', None, None, ), # 2
+  )
+
+  def __init__(self, value=None, timestamp=None,):
+    self.value = value
+    self.timestamp = timestamp
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.value = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TCell')
+    if self.value is not None:
+      oprot.writeFieldBegin('value', TType.STRING, 1)
+      oprot.writeString(self.value)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 2)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class ColumnDescriptor:
+  """
+  An HColumnDescriptor contains information about a column family
+  such as the number of versions, compression settings, etc. It is
+  used as input when creating a table or adding a column.
+
+  Attributes:
+   - name
+   - maxVersions
+   - compression
+   - inMemory
+   - bloomFilterType
+   - bloomFilterVectorSize
+   - bloomFilterNbHashes
+   - blockCacheEnabled
+   - timeToLive
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'name', None, None, ), # 1
+    (2, TType.I32, 'maxVersions', None, 3, ), # 2
+    (3, TType.STRING, 'compression', None, "NONE", ), # 3
+    (4, TType.BOOL, 'inMemory', None, False, ), # 4
+    (5, TType.STRING, 'bloomFilterType', None, "NONE", ), # 5
+    (6, TType.I32, 'bloomFilterVectorSize', None, 0, ), # 6
+    (7, TType.I32, 'bloomFilterNbHashes', None, 0, ), # 7
+    (8, TType.BOOL, 'blockCacheEnabled', None, False, ), # 8
+    (9, TType.I32, 'timeToLive', None, -1, ), # 9
+  )
+
+  def __init__(self, name=None, maxVersions=thrift_spec[2][4], compression=thrift_spec[3][4], inMemory=thrift_spec[4][4], bloomFilterType=thrift_spec[5][4], bloomFilterVectorSize=thrift_spec[6][4], bloomFilterNbHashes=thrift_spec[7][4], blockCacheEnabled=thrift_spec[8][4], timeToLive=thrift_spec[9][4],):
+    self.name = name
+    self.maxVersions = maxVersions
+    self.compression = compression
+    self.inMemory = inMemory
+    self.bloomFilterType = bloomFilterType
+    self.bloomFilterVectorSize = bloomFilterVectorSize
+    self.bloomFilterNbHashes = bloomFilterNbHashes
+    self.blockCacheEnabled = blockCacheEnabled
+    self.timeToLive = timeToLive
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.name = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.I32:
+          self.maxVersions = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.compression = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.BOOL:
+          self.inMemory = iprot.readBool();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.STRING:
+          self.bloomFilterType = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 6:
+        if ftype == TType.I32:
+          self.bloomFilterVectorSize = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 7:
+        if ftype == TType.I32:
+          self.bloomFilterNbHashes = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 8:
+        if ftype == TType.BOOL:
+          self.blockCacheEnabled = iprot.readBool();
+        else:
+          iprot.skip(ftype)
+      elif fid == 9:
+        if ftype == TType.I32:
+          self.timeToLive = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('ColumnDescriptor')
+    if self.name is not None:
+      oprot.writeFieldBegin('name', TType.STRING, 1)
+      oprot.writeString(self.name)
+      oprot.writeFieldEnd()
+    if self.maxVersions is not None:
+      oprot.writeFieldBegin('maxVersions', TType.I32, 2)
+      oprot.writeI32(self.maxVersions)
+      oprot.writeFieldEnd()
+    if self.compression is not None:
+      oprot.writeFieldBegin('compression', TType.STRING, 3)
+      oprot.writeString(self.compression)
+      oprot.writeFieldEnd()
+    if self.inMemory is not None:
+      oprot.writeFieldBegin('inMemory', TType.BOOL, 4)
+      oprot.writeBool(self.inMemory)
+      oprot.writeFieldEnd()
+    if self.bloomFilterType is not None:
+      oprot.writeFieldBegin('bloomFilterType', TType.STRING, 5)
+      oprot.writeString(self.bloomFilterType)
+      oprot.writeFieldEnd()
+    if self.bloomFilterVectorSize is not None:
+      oprot.writeFieldBegin('bloomFilterVectorSize', TType.I32, 6)
+      oprot.writeI32(self.bloomFilterVectorSize)
+      oprot.writeFieldEnd()
+    if self.bloomFilterNbHashes is not None:
+      oprot.writeFieldBegin('bloomFilterNbHashes', TType.I32, 7)
+      oprot.writeI32(self.bloomFilterNbHashes)
+      oprot.writeFieldEnd()
+    if self.blockCacheEnabled is not None:
+      oprot.writeFieldBegin('blockCacheEnabled', TType.BOOL, 8)
+      oprot.writeBool(self.blockCacheEnabled)
+      oprot.writeFieldEnd()
+    if self.timeToLive is not None:
+      oprot.writeFieldBegin('timeToLive', TType.I32, 9)
+      oprot.writeI32(self.timeToLive)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class TRegionInfo:
+  """
+  A TRegionInfo contains information about an HTable region.
+
+  Attributes:
+   - startKey
+   - endKey
+   - id
+   - name
+   - version
+   - serverName
+   - port
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'startKey', None, None, ), # 1
+    (2, TType.STRING, 'endKey', None, None, ), # 2
+    (3, TType.I64, 'id', None, None, ), # 3
+    (4, TType.STRING, 'name', None, None, ), # 4
+    (5, TType.BYTE, 'version', None, None, ), # 5
+    (6, TType.STRING, 'serverName', None, None, ), # 6
+    (7, TType.I32, 'port', None, None, ), # 7
+  )
+
+  def __init__(self, startKey=None, endKey=None, id=None, name=None, version=None, serverName=None, port=None,):
+    self.startKey = startKey
+    self.endKey = endKey
+    self.id = id
+    self.name = name
+    self.version = version
+    self.serverName = serverName
+    self.port = port
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.startKey = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.endKey = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.id = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.STRING:
+          self.name = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.BYTE:
+          self.version = iprot.readByte();
+        else:
+          iprot.skip(ftype)
+      elif fid == 6:
+        if ftype == TType.STRING:
+          self.serverName = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 7:
+        if ftype == TType.I32:
+          self.port = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TRegionInfo')
+    if self.startKey is not None:
+      oprot.writeFieldBegin('startKey', TType.STRING, 1)
+      oprot.writeString(self.startKey)
+      oprot.writeFieldEnd()
+    if self.endKey is not None:
+      oprot.writeFieldBegin('endKey', TType.STRING, 2)
+      oprot.writeString(self.endKey)
+      oprot.writeFieldEnd()
+    if self.id is not None:
+      oprot.writeFieldBegin('id', TType.I64, 3)
+      oprot.writeI64(self.id)
+      oprot.writeFieldEnd()
+    if self.name is not None:
+      oprot.writeFieldBegin('name', TType.STRING, 4)
+      oprot.writeString(self.name)
+      oprot.writeFieldEnd()
+    if self.version is not None:
+      oprot.writeFieldBegin('version', TType.BYTE, 5)
+      oprot.writeByte(self.version)
+      oprot.writeFieldEnd()
+    if self.serverName is not None:
+      oprot.writeFieldBegin('serverName', TType.STRING, 6)
+      oprot.writeString(self.serverName)
+      oprot.writeFieldEnd()
+    if self.port is not None:
+      oprot.writeFieldBegin('port', TType.I32, 7)
+      oprot.writeI32(self.port)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class Mutation:
+  """
+  A Mutation object is used to either update or delete a column-value.
+
+  Attributes:
+   - isDelete
+   - column
+   - value
+   - writeToWAL
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.BOOL, 'isDelete', None, False, ), # 1
+    (2, TType.STRING, 'column', None, None, ), # 2
+    (3, TType.STRING, 'value', None, None, ), # 3
+    (4, TType.BOOL, 'writeToWAL', None, True, ), # 4
+  )
+
+  def __init__(self, isDelete=thrift_spec[1][4], column=None, value=None, writeToWAL=thrift_spec[4][4],):
+    self.isDelete = isDelete
+    self.column = column
+    self.value = value
+    self.writeToWAL = writeToWAL
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.BOOL:
+          self.isDelete = iprot.readBool();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.value = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.BOOL:
+          self.writeToWAL = iprot.readBool();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('Mutation')
+    if self.isDelete is not None:
+      oprot.writeFieldBegin('isDelete', TType.BOOL, 1)
+      oprot.writeBool(self.isDelete)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 2)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.value is not None:
+      oprot.writeFieldBegin('value', TType.STRING, 3)
+      oprot.writeString(self.value)
+      oprot.writeFieldEnd()
+    if self.writeToWAL is not None:
+      oprot.writeFieldBegin('writeToWAL', TType.BOOL, 4)
+      oprot.writeBool(self.writeToWAL)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class BatchMutation:
+  """
+  A BatchMutation object is used to apply a number of Mutations to a single row.
+
+  Attributes:
+   - row
+   - mutations
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'row', None, None, ), # 1
+    (2, TType.LIST, 'mutations', (TType.STRUCT,(Mutation, Mutation.thrift_spec)), None, ), # 2
+  )
+
+  def __init__(self, row=None, mutations=None,):
+    self.row = row
+    self.mutations = mutations
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.LIST:
+          self.mutations = []
+          (_etype3, _size0) = iprot.readListBegin()
+          for _i4 in xrange(_size0):
+            _elem5 = Mutation()
+            _elem5.read(iprot)
+            self.mutations.append(_elem5)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('BatchMutation')
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 1)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.mutations is not None:
+      oprot.writeFieldBegin('mutations', TType.LIST, 2)
+      oprot.writeListBegin(TType.STRUCT, len(self.mutations))
+      for iter6 in self.mutations:
+        iter6.write(oprot)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class TIncrement:
+  """
+  For increments that are not incrementColumnValue
+  equivalents.
+
+  Attributes:
+   - table
+   - row
+   - column
+   - ammount
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'table', None, None, ), # 1
+    (2, TType.STRING, 'row', None, None, ), # 2
+    (3, TType.STRING, 'column', None, None, ), # 3
+    (4, TType.I64, 'ammount', None, None, ), # 4
+  )
+
+  def __init__(self, table=None, row=None, column=None, ammount=None,):
+    self.table = table
+    self.row = row
+    self.column = column
+    self.ammount = ammount
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.table = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.STRING:
+          self.column = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.I64:
+          self.ammount = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TIncrement')
+    if self.table is not None:
+      oprot.writeFieldBegin('table', TType.STRING, 1)
+      oprot.writeString(self.table)
+      oprot.writeFieldEnd()
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 2)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.column is not None:
+      oprot.writeFieldBegin('column', TType.STRING, 3)
+      oprot.writeString(self.column)
+      oprot.writeFieldEnd()
+    if self.ammount is not None:
+      oprot.writeFieldBegin('ammount', TType.I64, 4)
+      oprot.writeI64(self.ammount)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class TRowResult:
+  """
+  Holds row name and then a map of columns to cells.
+
+  Attributes:
+   - row
+   - columns
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'row', None, None, ), # 1
+    (2, TType.MAP, 'columns', (TType.STRING,None,TType.STRUCT,(TCell, TCell.thrift_spec)), None, ), # 2
+  )
+
+  def __init__(self, row=None, columns=None,):
+    self.row = row
+    self.columns = columns
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.row = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.MAP:
+          self.columns = {}
+          (_ktype8, _vtype9, _size7 ) = iprot.readMapBegin() 
+          for _i11 in xrange(_size7):
+            _key12 = iprot.readString();
+            _val13 = TCell()
+            _val13.read(iprot)
+            self.columns[_key12] = _val13
+          iprot.readMapEnd()
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TRowResult')
+    if self.row is not None:
+      oprot.writeFieldBegin('row', TType.STRING, 1)
+      oprot.writeString(self.row)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.MAP, 2)
+      oprot.writeMapBegin(TType.STRING, TType.STRUCT, len(self.columns))
+      for kiter14,viter15 in self.columns.items():
+        oprot.writeString(kiter14)
+        viter15.write(oprot)
+      oprot.writeMapEnd()
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class TScan:
+  """
+  A Scan object is used to specify scanner parameters when opening a scanner.
+
+  Attributes:
+   - startRow
+   - stopRow
+   - timestamp
+   - columns
+   - caching
+   - filterString
+   - batchSize
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'startRow', None, None, ), # 1
+    (2, TType.STRING, 'stopRow', None, None, ), # 2
+    (3, TType.I64, 'timestamp', None, None, ), # 3
+    (4, TType.LIST, 'columns', (TType.STRING,None), None, ), # 4
+    (5, TType.I32, 'caching', None, None, ), # 5
+    (6, TType.STRING, 'filterString', None, None, ), # 6
+    (7, TType.I32, 'batchSize', None, None, ), # 7
+  )
+
+  def __init__(self, startRow=None, stopRow=None, timestamp=None, columns=None, caching=None, filterString=None, batchSize=None,):
+    self.startRow = startRow
+    self.stopRow = stopRow
+    self.timestamp = timestamp
+    self.columns = columns
+    self.caching = caching
+    self.filterString = filterString
+    self.batchSize = batchSize
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.startRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 2:
+        if ftype == TType.STRING:
+          self.stopRow = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 3:
+        if ftype == TType.I64:
+          self.timestamp = iprot.readI64();
+        else:
+          iprot.skip(ftype)
+      elif fid == 4:
+        if ftype == TType.LIST:
+          self.columns = []
+          (_etype19, _size16) = iprot.readListBegin()
+          for _i20 in xrange(_size16):
+            _elem21 = iprot.readString();
+            self.columns.append(_elem21)
+          iprot.readListEnd()
+        else:
+          iprot.skip(ftype)
+      elif fid == 5:
+        if ftype == TType.I32:
+          self.caching = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      elif fid == 6:
+        if ftype == TType.STRING:
+          self.filterString = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      elif fid == 7:
+        if ftype == TType.I32:
+          self.batchSize = iprot.readI32();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('TScan')
+    if self.startRow is not None:
+      oprot.writeFieldBegin('startRow', TType.STRING, 1)
+      oprot.writeString(self.startRow)
+      oprot.writeFieldEnd()
+    if self.stopRow is not None:
+      oprot.writeFieldBegin('stopRow', TType.STRING, 2)
+      oprot.writeString(self.stopRow)
+      oprot.writeFieldEnd()
+    if self.timestamp is not None:
+      oprot.writeFieldBegin('timestamp', TType.I64, 3)
+      oprot.writeI64(self.timestamp)
+      oprot.writeFieldEnd()
+    if self.columns is not None:
+      oprot.writeFieldBegin('columns', TType.LIST, 4)
+      oprot.writeListBegin(TType.STRING, len(self.columns))
+      for iter22 in self.columns:
+        oprot.writeString(iter22)
+      oprot.writeListEnd()
+      oprot.writeFieldEnd()
+    if self.caching is not None:
+      oprot.writeFieldBegin('caching', TType.I32, 5)
+      oprot.writeI32(self.caching)
+      oprot.writeFieldEnd()
+    if self.filterString is not None:
+      oprot.writeFieldBegin('filterString', TType.STRING, 6)
+      oprot.writeString(self.filterString)
+      oprot.writeFieldEnd()
+    if self.batchSize is not None:
+      oprot.writeFieldBegin('batchSize', TType.I32, 7)
+      oprot.writeI32(self.batchSize)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class IOError(TException):
+  """
+  An IOError exception signals that an error occurred communicating
+  to the Hbase master or an Hbase region server.  Also used to return
+  more general Hbase error conditions.
+
+  Attributes:
+   - message
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'message', None, None, ), # 1
+  )
+
+  def __init__(self, message=None,):
+    self.message = message
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.message = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('IOError')
+    if self.message is not None:
+      oprot.writeFieldBegin('message', TType.STRING, 1)
+      oprot.writeString(self.message)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __str__(self):
+    return repr(self)
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class IllegalArgument(TException):
+  """
+  An IllegalArgument exception indicates an illegal or invalid
+  argument was passed into a procedure.
+
+  Attributes:
+   - message
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'message', None, None, ), # 1
+  )
+
+  def __init__(self, message=None,):
+    self.message = message
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.message = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('IllegalArgument')
+    if self.message is not None:
+      oprot.writeFieldBegin('message', TType.STRING, 1)
+      oprot.writeString(self.message)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __str__(self):
+    return repr(self)
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)
+
+class AlreadyExists(TException):
+  """
+  An AlreadyExists exceptions signals that a table with the specified
+  name already exists
+
+  Attributes:
+   - message
+  """
+
+  thrift_spec = (
+    None, # 0
+    (1, TType.STRING, 'message', None, None, ), # 1
+  )
+
+  def __init__(self, message=None,):
+    self.message = message
+
+  def read(self, iprot):
+    if iprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and isinstance(iprot.trans, TTransport.CReadableTransport) and self.thrift_spec is not None and fastbinary is not None:
+      fastbinary.decode_binary(self, iprot.trans, (self.__class__, self.thrift_spec))
+      return
+    iprot.readStructBegin()
+    while True:
+      (fname, ftype, fid) = iprot.readFieldBegin()
+      if ftype == TType.STOP:
+        break
+      if fid == 1:
+        if ftype == TType.STRING:
+          self.message = iprot.readString();
+        else:
+          iprot.skip(ftype)
+      else:
+        iprot.skip(ftype)
+      iprot.readFieldEnd()
+    iprot.readStructEnd()
+
+  def write(self, oprot):
+    if oprot.__class__ == TBinaryProtocol.TBinaryProtocolAccelerated and self.thrift_spec is not None and fastbinary is not None:
+      oprot.trans.write(fastbinary.encode_binary(self, (self.__class__, self.thrift_spec)))
+      return
+    oprot.writeStructBegin('AlreadyExists')
+    if self.message is not None:
+      oprot.writeFieldBegin('message', TType.STRING, 1)
+      oprot.writeString(self.message)
+      oprot.writeFieldEnd()
+    oprot.writeFieldStop()
+    oprot.writeStructEnd()
+
+  def validate(self):
+    return
+
+
+  def __str__(self):
+    return repr(self)
+
+  def __repr__(self):
+    L = ['%s=%r' % (key, value)
+      for key, value in self.__dict__.iteritems()]
+    return '%s(%s)' % (self.__class__.__name__, ', '.join(L))
+
+  def __eq__(self, other):
+    return isinstance(other, self.__class__) and self.__dict__ == other.__dict__
+
+  def __ne__(self, other):
+    return not (self == other)

+ 1 - 0
apps/hbase/hueversion.py

@@ -0,0 +1 @@
+../../VERSION

+ 33 - 0
apps/hbase/regenerate_thrift.sh

@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+cd $(dirname $0)
+
+thrift --gen py thrift/hbase.thrift
+
+cat <<EOF
+======================================================================
+NOTE:
+======================================================================
+
+This script does *not* remove old generated files that may not be necessary anymore.
+You should probably do something like:
+ > git rm -rf java/src/main/gen-java gen-py
+ > ./regenerate_thrift.sh
+ > git add java/src/main/gen-java gen-py
+
+======================================================================
+EOF

+ 29 - 0
apps/hbase/setup.py

@@ -0,0 +1,29 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+from setuptools import setup, find_packages
+from hueversion import VERSION
+
+setup(
+      name = "hbase",
+      version = VERSION,
+      author = "Hue",
+      url = 'http://github.com/cloudera/hue',
+      description = "Explore and edit HBase clusters, tables and rows",
+      packages = find_packages('src'),
+      package_dir = {'': 'src'},
+      install_requires = ['setuptools', 'desktop'],
+      entry_points = { 'desktop.sdk.application': 'hbase=hbase' },
+)

+ 15 - 0
apps/hbase/src/hbase/__init__.py

@@ -0,0 +1,15 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.

+ 155 - 0
apps/hbase/src/hbase/api.py

@@ -0,0 +1,155 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+
+try:
+  import json
+except ImportError:
+  import simplejson as json
+import logging
+import re
+
+from django.core.urlresolvers import reverse
+from django.http import HttpResponse
+from django.utils.translation import ugettext as _
+
+from desktop.lib import thrift_util
+from desktop.lib.exceptions_renderable import PopupException
+
+from hbase.server.hbase_lib import get_thrift_attributes, get_thrift_type, get_client_type
+from hbase import conf
+
+LOG = logging.getLogger(__name__)
+
+#format methods similar to Thrift API, for similarity with catch-all
+class HbaseApi(object):
+  def query(self, action, *args):
+    try:
+      if hasattr(self,action):
+        return getattr(self, action)(*args)
+      cluster = args[0]
+      return self.queryCluster(action, cluster, *args[1:])
+    except Exception, e:
+      raise PopupException(_("Api Error: %s") % e.message)
+
+  def queryCluster(self, action, cluster, *args):
+    client = self.connectCluster(cluster)
+    method = getattr(client, action)
+    return method(*args)
+
+  def getClusters(self):
+    clusters = []
+    try:
+      full_config = json.loads(conf.HBASE_CLUSTERS.get().replace("'","\""))
+    except:
+      full_config = [conf.HBASE_CLUSTERS.get()]
+    for config in full_config: #hack cause get() is weird
+      match = re.match('\((?P<name>\w+)\|(?P<host>.+):(?P<port>[0-9]+)\)', config)
+      clusters += [{
+        'name': match.group('name'),
+        'host': match.group('host'),
+        'port': int(match.group('port'))
+      }]
+    return clusters
+
+  def getCluster(self, name):
+    try:
+      clusters = self.getClusters()
+      for cluster in clusters:
+        if cluster["name"] == name:
+          return cluster
+    except Exception, e:
+      pass
+    raise PopupException(_("Cluster by the name of %s does not exist in configuration.") % name)
+
+  def connectCluster(self, name):
+    target = self.getCluster(name)
+    return thrift_util.get_client(get_client_type(),
+                                  target['host'],
+                                  target['port'],
+                                  service_name="Hue HBase Thrift Client for %s" % name,
+                                  kerberos_principal=None,
+                                  use_sasl=False,
+                                  timeout_seconds=None)
+
+  def createTable(self, cluster, tableName, *columns):
+    client = self.connectCluster(cluster)
+    client.createTable(tableName, [get_thrift_type('ColumnDescriptor')(name=column) for column in columns])
+    return "%s successfully created" % tableName
+
+  def getTableList(self, cluster):
+    client = self.connectCluster(cluster)
+    return [{'name': name,'enabled': client.isTableEnabled(name)} for name in client.getTableNames()]
+
+  def getRows(self, cluster, tableName, columns, startRowKey, numRows, prefix = False):
+    client = self.connectCluster(cluster)
+    if prefix == False:
+      scanner = client.scannerOpen(tableName, startRowKey, columns, None)
+    else:
+      scanner = client.scannerOpenWithPrefix(tableName, startRowKey, columns, None)
+    data = client.scannerGetList(scanner, numRows)
+    client.scannerClose(scanner)
+    return data
+
+  def getRow(self, cluster, tableName, columns, startRowKey):
+    row = self.getRows(cluster, tableName, columns, startRowKey, 1)
+    if len(row) > 0:
+      return row[0]
+    return None
+
+  def getRowsFull(self, cluster, tableName, startRowKey, numRows):
+    client = self.connectCluster(cluster)
+    return self.getRows(cluster, tableName, [column for column in client.getColumnDescriptors(tableName)], startRowKey, numRows)
+
+  def getRowFull(self, cluster, tableName, startRowKey, numRows):
+    row = self.getRowsFull(cluster, tableName, startRowKey, 1)
+    if len(row) > 0:
+      return row[0]
+    return None
+
+  def deleteColumns(self, cluster, tableName, row, columns):
+    client = self.connectCluster(cluster)
+    Mutation = get_thrift_type('Mutation')
+    mutations = [Mutation(isDelete = True, column=column) for column in columns]
+    return client.mutateRow(tableName, row, mutations, None)
+
+  def deleteColumn(self, cluster, tableName, row, column):
+    return self.deleteColumns(cluster, tableName, row, [column])
+
+  def putRow(self, cluster, tableName, row, data):
+    client = self.connectCluster(cluster)
+    mutations = []
+    Mutation = get_thrift_type('Mutation')
+    for column in data.keys():
+      mutations.append(Mutation(column=column, value=str(data[column]))) # must use str for API, does thrift coerce by itself?
+    return client.mutateRow(tableName, row, mutations, None)
+
+  def putColumn(self, cluster, tableName, row, column, value):
+    return self.putRow(cluster, tableName, row, {column: value})
+
+  def getRowQuerySet(self, cluster, tableName, columns, queries):
+    client = self.connectCluster(cluster)
+    aggregate_data = []
+    queries = sorted(queries, key=lambda query: query['scan_length']) #sort by scan length
+    for query in queries:
+      scan_length = int(query['scan_length'])
+      if query['row_key'] == "null":
+        query['row_key'] = ""
+      if scan_length == 1:
+        aggregate_data += self.getRows(cluster, tableName, query['columns'] or columns, query['row_key'], query['scan_length'], query['prefix']) #to be replaced in future
+      elif scan_length > 1:
+        aggregate_data += self.getRows(cluster, tableName, query['columns'] or columns, query['row_key'], query['scan_length'], query['prefix'])
+    return aggregate_data

+ 34 - 0
apps/hbase/src/hbase/conf.py

@@ -0,0 +1,34 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+"""
+Configuration options for the hbase application.
+"""
+import re
+
+from desktop.lib.conf import Config
+
+HBASE_CLUSTERS = Config(
+  key="hbase_clusters",
+  default="(Cluster|localhost:9090)",
+  help="Comma-separated list of HBase Thrift servers for clusters in the format of '(name|host:port)'.",
+  type=str)
+
+TRUNCATE_LIMIT = Config(
+  key="truncate_limit",
+  default="500",
+  help="Hard limit of rows or columns per row fetched before truncating.",
+  type=int)

+ 16 - 0
apps/hbase/src/hbase/forms.py

@@ -0,0 +1,16 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.

+ 6 - 0
apps/hbase/src/hbase/locale/de/LC_MESSAGES/django.po

@@ -0,0 +1,6 @@
+# German translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+

+ 35 - 0
apps/hbase/src/hbase/locale/en_US.pot

@@ -0,0 +1,35 @@
+# Translations template for Hue.
+# Copyright (C) 2012 Cloudera, Inc
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Hue VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2012-07-31 11:34-0700\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 0.9.6\n"
+
+#: src/about/templates/index.mako:20
+msgid "About Hue"
+msgstr ""
+
+#: src/about/templates/index.mako:25
+msgid "Configuration"
+msgstr ""
+
+#: src/about/templates/index.mako:26
+msgid "Check for misconfiguration"
+msgstr ""
+
+#: src/about/templates/index.mako:27
+msgid "Server Logs"
+msgstr ""
+

+ 5 - 0
apps/hbase/src/hbase/locale/es/LC_MESSAGES/django.po

@@ -0,0 +1,5 @@
+# Spanish translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#

+ 6 - 0
apps/hbase/src/hbase/locale/fr/LC_MESSAGES/django.po

@@ -0,0 +1,6 @@
+# French translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+

+ 6 - 0
apps/hbase/src/hbase/locale/ja/LC_MESSAGES/django.po

@@ -0,0 +1,6 @@
+# Japanese translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+

+ 6 - 0
apps/hbase/src/hbase/locale/ko/LC_MESSAGES/django.po

@@ -0,0 +1,6 @@
+# Korean translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+

+ 5 - 0
apps/hbase/src/hbase/locale/pt/LC_MESSAGES/django.po

@@ -0,0 +1,5 @@
+# Portuguese translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#

+ 6 - 0
apps/hbase/src/hbase/locale/pt_BR/LC_MESSAGES/django.po

@@ -0,0 +1,6 @@
+# Portuguese (Brazil) translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#
+

+ 5 - 0
apps/hbase/src/hbase/locale/zh_CN/LC_MESSAGES/django.po

@@ -0,0 +1,5 @@
+# Chinese (China) translations for Hue.
+# Copyright (C) 2012 Cloudera
+# This file is distributed under the same license as the Hue project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+#

+ 0 - 0
apps/hbase/src/hbase/management/__init__.py


+ 0 - 0
apps/hbase/src/hbase/management/commands/__init__.py


+ 0 - 0
apps/hbase/src/hbase/migrations/__init__.py


+ 35 - 0
apps/hbase/src/hbase/models.py

@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+
+try:
+  import json
+except ImportError:
+  import simplejson as json
+import posixpath
+
+from django.db import models
+from django.contrib.auth.models import User
+from django.utils.translation import ugettext as _, ugettext_lazy as _t
+
+from desktop.lib.exceptions_renderable import PopupException
+
+
+class PresetView(models.Model): # preset views for loading toggled/untoggled columns/rows
+	pass
+
+class TypeAlias(models.Model): # non-native data types, default alias of string, parsed in custom user-defined way
+	pass

+ 0 - 0
apps/hbase/src/hbase/server/__init__.py


+ 51 - 0
apps/hbase/src/hbase/server/hbase_lib.py

@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+
+import logging
+import re
+import sys,os
+
+from thrift import Thrift
+from thrift.transport.TSocket import TSocket
+from thrift.transport.TTransport import TBufferedTransport
+from thrift.protocol import TBinaryProtocol
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '../../../gen-py'))
+
+from hbased import Hbase as thrift_hbase
+from hbased import ttypes
+
+from desktop.lib.exceptions_renderable import PopupException
+
+LOG = logging.getLogger(__name__)
+
+
+def get_client_type():
+  return thrift_hbase.Client
+
+def get_thrift_type(name):
+  if not hasattr(ttypes,name):
+    return False
+  return getattr(ttypes,name)
+
+def get_thrift_attributes(name):
+  thrift_type = get_thrift_type(name)
+  attrs = {}
+  for spec in thrift_type.thrift_spec:
+    if spec is not None:
+      attrs[spec[2]] = spec[1]
+  return attrs

+ 22 - 0
apps/hbase/src/hbase/settings.py

@@ -0,0 +1,22 @@
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+DJANGO_APPS = ['hbase']
+NICE_NAME = 'HBase Browser'
+MENU_INDEX = 12
+ICON = '/hbase/static/art/icon_24.png'
+
+REQUIRES_HADOOP = False
+IS_URL_NAMESPACED = True

+ 410 - 0
apps/hbase/src/hbase/templates/app.mako

@@ -0,0 +1,410 @@
+## Licensed to Cloudera, Inc. under one
+## or more contributor license agreements.  See the NOTICE file
+## distributed with this work for additional information
+## regarding copyright ownership.  Cloudera, Inc. 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.
+<%!
+  from desktop.views import commonheader, commonfooter
+  from django.utils.translation import ugettext as _
+%>
+
+<%namespace name="actionbar" file="actionbar.mako" />
+
+${ commonheader(None, "hbase", user) | n,unicode } 
+
+<link href="/hbase/static/css/hbase.css" rel="stylesheet" type="text/css" />
+
+<%def name="datatable(datasource,rowTemplate = 'itemTemplate')">
+  <table data-datasource="${datasource}" class="table table-striped table-condensed datatables tablescroller-disable">
+      <thead>
+        <tr>
+          <th width="1%"><div data-bind="click: ${datasource}.toggleSelectAll, css: {hueCheckbox: true,'icon-ok':${datasource}.selected().length == ${datasource}.items().length && ${datasource}.items().length>0}"></div></th>
+          <!-- ko foreach: ${datasource}.columns() -->
+            <th data-bind="text:$data"></th> <!-- need to i18n first -->
+          <!-- /ko -->
+        </tr>
+      </thead>
+      <tbody data-bind="template: {name: '${rowTemplate}', foreach: ${datasource}.items}">
+
+      </tbody>
+      <tfoot>
+      <tr data-bind="visible: ${datasource}.isLoading()">
+          <td colspan="8" class="left">
+              <img src="/static/art/spinner.gif" />
+          </td>
+      </tr>
+          <tr data-bind="visible: ${datasource}.items().length == 0 && !${datasource}.isLoading()">
+              <td colspan="8">
+                  <div class="alert">
+                      ${_('There are no tables matching the search criteria.')}
+                  </div>
+            </td>
+          </tr>
+      </tfoot>
+  </table>
+</%def>
+
+<%def name="smartview(datasource)">
+  <div class="smartview" data-bind="foreach: ${datasource}.items()">
+    <div class="smartview-row" data-bind="css:{selected:$data.isSelected()}, visible: $data.items().length > 0 || $data.isLoading()">
+      <h5 data-bind="click: lockClickOrigin($data.select, $element)"><code class="row_key" data-bind="text: $data.row.slice(0, 100) + ($data.row.length > 100 ? '...' : '')"></code> <i class="icon-check-sign" data-bind="visible:$data.isSelected()"></i> <img data-bind="visible: $data.isLoading()" src="/static/art/spinner.gif" />
+        <span class="smartview-row-controls controls-hover-bottom">
+          <button class="btn" data-bind="click: $data.reload, clickBubble: false" data-toggle="tooltip" title="${_('Refresh Row')}"><i class="icon-refresh"></i></button>
+          % if user.is_superuser:
+            <button class="btn" data-bind="click: $data.drop, clickBubble: false" data-toggle="tooltip" title="${_('Delete Row')}"><i class="icon-trash"></i></button>
+          % endif
+        </span>
+        <span class="smartview-row-controls pull-right">
+          <button class="btn" data-bind="click: $data.toggleSelectedCollapse, enable: $data.selected().length > 0, clickBubble: false" data-toggle="tooltip" title="${_('Toggle Collapse Selected')}"><i class="icon-resize-small"></i></button>
+          <button class="btn" data-bind="click: $data.toggleSelectAllVisible, enable: $data.displayedItems().length > 0, clickBubble: false" data-toggle="tooltip" title="${_('Select All Visible')}"><i class="icon-check"></i></button>
+          <input type="text" placeholder="Filter Column Names/Family" data-bind="value: $data.searchQuery, valueUpdate: $data.items().length < 100 ? 'afterkeydown' : 'change', clickBubble: false"/>
+          ${sortBtn('$data.sortDropDown')}
+          % if user.is_superuser:
+            <button class="btn" data-bind="enable: $data.selected().length > 0, click: $data.dropSelected, clickBubble: false"><i class="icon-trash"></i> Drop Columns</button>
+          % endif
+          <a href="#new_column_modal" data-bind="click:function(){$('#new_column_row_key').val($data.row);app.focusModel($data);logGA('#new_column_modal');}" class="btn" data-toggle="modal" title="${_('Add New Column/Cell')}"><i class="icon-plus"></i></a>
+        </span>
+      </h5>
+      <ul class="smartview-cells" data-bind="event: {scroll: onScroll}">
+        <!-- ko foreach: $data.displayedItems() -->
+        <li data-bind="css: {'active': $data.isSelected()}, click: $data.select">
+          <div>
+            <h6><span class="label" data-bind="text: $data.name.split(':')[0]+':', style: {'backgroundColor': stringHashColor($data.name.split(':')[0])}"></span> <span data-bind="text: $data.name.split(':')[1]"></span></h6>
+            <span class="timestamp label"><i class='icon-time'></i> <span data-bind="text: convertTimestamp($data.timestamp)"></span></span>
+            % if user.is_superuser:
+              <a class="corner-btn btn" data-bind="click: $data.drop, clickBubble: false"><i class="icon-trash"></i></a>
+            % endif
+            <a class="corner-btn btn" data-bind="visible: $data.editing(), event: { mousedown: function(){launchModal('cell_edit_modal',{content:$data, mime: detectMimeType($data.value())})} }"><i class="icon-pencil"></i> ${_('Full Editor')}</a>
+            <pre data-bind="text: $data.value().length > 146 ? $data.value().substring(0, 144)+'...' : $data.value(), click: $data.value().length > 146 ? function(){launchModal('cell_edit_modal',{content:$data, mime: detectMimeType($data.value())})} : function(){$data.editing(true)}, clickBubble: false, visible: !$data.isLoading() && !$data.editing()"></pre>
+            <textarea data-bind="visible: !$data.isLoading() && $data.editing(), hasfocus: $data.editing, value: $data.value, click:function(){}, clickBubble: false"></textarea>
+            <img src="/static/art/spinner.gif" data-bind="visible: $data.isLoading() " />
+          </div>
+        </li>
+        <!-- /ko -->
+      </ul>
+    </div>
+  </div>
+  <br/>
+  <div class="alert alert-error" data-bind="visible: ${datasource}.truncateCount() > 0 && !${datasource}.isLoading()">
+    <b>${_('Notice:')} <i data-bind="text: ${datasource}.truncateCount"></i> ${_('entries truncated')}</b> ${_('at')} <i data-bind="text: ${datasource}.truncateLimit"></i> ${_('items per set.')}
+  </div>
+  <div class="alert alert-warning" data-bind="visible: !${datasource}.isLoading()">
+      ${_('Query executed in')} <i data-bind="text:${datasource}.lastReloadTime() + 's'"></i> ${_('fetching')} <i data-bind="text: ${datasource}.items().length"></i> ${_('rows')}.
+  </div>
+  <center data-bind="visible: ${datasource}.isLoading()"><i class="icon-spinner icon-spin loader-main"></i></center>
+</%def>
+
+<%def name="sortBtn(datasource)">
+  <div class="btn-group">
+    <button class="btn" data-bind="click: ${datasource}.toggleSortMode">${_('Sort By')} <i data-bind="text: ${datasource}.sortField(), clickBubble: false"></i> <b data-bind="text: ${datasource}.sortAsc() ? 'ASC' : 'DESC'">ASC</b></button>
+    <button class="btn dropdown-toggle" data-toggle="dropdown" data-bind="clickBubble: false">
+      <span class="caret"></span>
+    </button>
+    <ul class="dropdown-menu" data-bind="foreach: ${datasource}.sortFields">
+      <li><a data-bind="click: function(){('sortDropDown' in $parent ? $parent : $parent.views.tabledata).sortDropDown.sortField($data)}, text: $data, clickBubble: false"></a></li>
+    </ul>
+  </div>
+</%def>
+
+<div class="container-fluid">
+  <!-- Page Header -->
+  <h1>
+    <a href="/hbase/">HBase Browser</a> - <a data-bind="text: app.cluster(), attr: { href: '#' + app.cluster() }"></a>
+    <span data-bind="visible: app.station() == 'table'">/ <a data-bind="text: app.views.tabledata.name()"></a></span>
+    <span class="pull-right">
+      <span class="dropdown">
+        <a class="dropdown-toggle btn" id="dLabel" data-toggle="dropdown">
+          Switch Cluster
+          <b class="caret"></b>
+        </a>
+        <ul id="cluster-menu" class="dropdown-menu" role="menu" aria-labelledby="dLabel" data-bind="foreach: app.clusters()">
+          <li><a data-bind="text: $data.name, click: function(){ routie($data.name); }"></a></li>
+        </ul>
+      </span>
+    </span>
+  </h1>
+
+  <!-- breadcrumbs -->
+  <ul id="hbase-breadcrumbs" class="nav nav-pills hueBreadcrumbBar" data-bind="visible: false"></ul>
+
+  <!-- Application Pages -->
+  <div id="main"></div>
+
+  <div id="hbase-page-clusterview" class="hbase-page"> <!-- maybe turn these into script tags, then populate them into #main and then rerender + apply bindings to old viemodels to have modular viewmodels? -->
+    <div class="actionbar">
+      <div class="well well-small">
+        <input type="text" class="input-large search-query" placeholder="Search for Table Name" data-bind="value: views.tables.searchQuery">
+        % if user.is_superuser:
+          <span class="btn-group">
+            <button class="btn" data-bind="enable: views.tables.selected().length > 0, click: views.tables.enableSelected"><i class="icon-check-sign"></i> ${_('Enable')}</button>
+            <button class="btn dropdown-toggle" data-toggle="dropdown" data-bind="clickBubble: false, enable: views.tables.selected().length > 0">
+              <span class="caret"></span>
+            </button>
+            <ul class="dropdown-menu">
+              <li><a data-bind="click: views.tables.disableSelected"><i class="icon-remove-sign"></i> ${_('Disable')}</a></li>
+            </ul>
+          </span>
+          <button class="btn" data-bind="enable: views.tables.selected().length > 0, click: views.tables.dropSelected"><i class="icon-trash"></i> ${_('Drop')}</button>
+        % endif
+        <span class="pull-right">
+          <a href="#new_table_modal" role="button" data-bind="click: function(){app.focusModel(app.views.tables);}" class="btn" data-toggle="modal"><i class='icon-plus-sign'></i> ${_('New Table')}</a>
+        </span>
+      </div>
+    </div>
+
+    ${datatable('views.tables')}
+
+    <script id="itemTemplate" type="text/html">
+      <tr>
+        <td><div data-bind="click: $data.select, css: {hueCheckbox: true,'icon-ok':$data.isSelected}" data-row-selector-exclude="true"></div></td>
+        <td width="90%"><a data-bind="text:$data.name,attr: {href: '#'+app.cluster()+'/'+$data.name}" data-row-selector="true"></a></td>
+        <td width="5%"><div data-bind="click: $data.toggle, css: {hueCheckbox: true,'icon-ok':$data.enabled}" data-row-selector-exclude="true"></div></td>
+      </tr>
+    </script>
+
+    <!-- New Table Modal -->
+    <form id="new_table_modal" action="createTable" method="POST" class="modal hide fade ajaxSubmit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>${_('Create New Table')} - <span class="pageTitle"></span></h3>
+      </div>
+      <div class="modal-body controls">
+        <input type="hidden" name="cluster" data-bind="value:app.cluster"/>
+        <label>${_('Table Name')}:</label> <input name="tableName" placeholder="Table1" type="text"/>
+        <label>${_('Column Families')}:</label> <!-- clean up later -->
+        <ul>
+        </ul>
+        <a class="btn action_addColumn"><i class="icon-plus-sign"></i> ${_('Add Column Family')}</a>
+      </div>
+      <div class="modal-footer">
+        <button class="btn" data-dismiss="modal" aria-hidden="true">${_('Cancel')}</button>
+        <input type="submit" class="btn btn-primary" value="${_('Submit')}"/>
+      </div>
+    </form>
+  </div>
+
+  <!-- Table View Page -->
+  <div id="hbase-page-dataview" class="hbase-page">
+    <div class="subnav sticky">
+      <div class="container-fluid">
+        <div class="row-fluid">
+          <div class="span6">
+            <div id="searchbar-main" class="span10" data-bind="click: function(){search.focused(true)}">
+              <div id="search-tags" data-bind="html: search.renderedValue()">
+              </div>
+              <input id="tag-input" class="tag-searchbar" type="text" autocomplete="off" placeholder="${_('row_key1, row_key2 + scan_length, row[ cf:column ], [ cf:col1 cf:col2 ]')}" data-bind="event: { keydown: search.onKeyDown, keyup: search.onKeyDown, change: search.onKeyDown }, value: search.cur_input, valueUpdate: 'afterkeydown', click: function(){$($element).attr('placeholder','').addClass('active')}, hasfocus: search.focused, css: { 'active': search.cur_input() != '' }">
+            </div>
+            <ul id="search-typeahead" data-bind="visible: search.focused()">
+              <!-- ko if: search.mode() != 'idle' -->
+              <li><a><b data-bind="text: search.modes[search.mode()].hint"></b>: <span data-bind="html: search.hintText()"></span> <code class="pull-right" data-bind="text: search.modes[search.mode()].type"></code></a></li>
+              <!-- /ko -->
+              <!-- ko foreach: search.activeHints() -->
+              <li data-bind="event: { mousedown: function(){app.search.cur_input(app.search.cur_input() + $data.shortcut);} }, css: {active: self.activeHint}"><a><span data-bind="text: $data.hint"></span> <code class="pull-right" data-bind="text: $data.shortcut"></code></a></li>
+              <!-- /ko -->
+            </ul>
+          <span id="column-family-selectors">
+            <!-- ko foreach: views.tabledata.columnFamilies() -->
+              <span class="label" data-bind="text: $data.name, style: {'backgroundColor': ($data.enabled()) ? stringHashColor($data.name.split(':')[0]) : '#ccc' ,'cursor':'pointer'}, click: $data.toggle"></span>
+            <!-- /ko -->
+           </span>
+          </div>
+          <div class="span6">
+            <span class="pull-right">
+              <input type="text" placeholder="Filter Columns/Families" style="margin-left: 5px;" data-bind="value: app.views.tabledata.columnQuery, clickBubble: false"/>
+              <button class="btn" data-bind="click: views.tabledata.toggleSelectAll" style="margin-left: 5px;" data-toggle="tooltip" title="${_('Toggle Select All Rows')}"><i class="icon-check-sign"></i> ${_('All')}</button>
+              ${sortBtn('views.tabledata.sortDropDown')}
+            </span>
+            <span class="smartview-row-controls pull-right" data-bind="if: views.tabledata.items().length > 0 && views.tabledata.selected().length > 0">
+              <button class="btn" data-bind="click: views.tabledata.batchSelectedAlias.bind(null, 'toggleSelectedCollapse'), clickBubble: false" data-toggle="tooltip" title="${_('Toggle Collapse Selected')}"><i class="icon-resize-small"></i></button>
+              <button class="btn" data-bind="click: views.tabledata.batchSelectedAlias.bind(null, 'toggleSelectAllVisible'), clickBubble: false" data-toggle="tooltip" title="${_('Select All Visible')}"><i class="icon-check"></i></button>
+              ${#sortBtn('views.tabledata.items()[0].sortDropDown')
+            }
+              % if user.is_superuser:
+                <button class="btn" data-bind="enable: views.tabledata.items()[0].selected().length > 0, click: views.tabledata.items()[0].dropSelected, clickBubble: false"><i class="icon-trash"></i> ${_('Drop Columns')}</button>
+              % endif
+            </span>
+          </div>
+        </div>
+      </div>
+    </div>
+    <br/>
+
+    ${smartview('views.tabledata')}
+
+    <br/><br/><br/><br/>
+    <div class="subnav navbar-fixed-bottom well-small">
+        <div class="container-fluid">
+          <div class="footer-slider">
+            <b>${_('Displaying')}</b>
+            <!-- ko foreach: app.views.tabledata.querySet -->
+            <span data-bind="visible: $data.scan_length() > 1 || $data.editing()"><b data-bind="text: $data.scan_length, visible: !$data.editing(), click: $data.editing.bind(true)"></b>
+            <input type="number" style="width:30px" data-bind="value: $data.scan_length, visible: $data.editing()"/>
+            entr<span data-bind="text: $data.scan_length() > 1 ? 'ies' : 'y'"></span> ${_('starting from')}</span>
+            <code data-bind="text: $data.row_key, visible: !$data.editing(), click: $data.editing.bind(true)"></code><input type="text" class="input-small" placeholder="row_key" data-bind="value: $data.row_key, visible: $data.editing()"/>
+            <span data-bind="visible: $data != app.views.tabledata.querySet()[app.views.tabledata.querySet().length - 1],
+                             text: $data == app.views.tabledata.querySet()[app.views.tabledata.querySet().length - 2] ? 'and' : ','"></span>
+            <!-- /ko -->
+            <a class="btn" data-bind="click: app.views.tabledata.addQuery"><i class="icon-plus-sign"></i> ${_('Add Query Field')}</a>
+            <a class="btn btn-primary" data-bind="click: app.views.tabledata.evaluateQuery">${_('Go')}</a>
+          </div>
+          <span class="pull-right">
+            % if user.is_superuser:
+              <button class="btn" data-bind="enable: views.tabledata.selected().length > 0, click: views.tabledata.dropSelected"><i class="icon-trash"></i> ${_('Drop Rows')}</button>
+            % endif
+            <a href="#new_row_modal" data-bind="click:function(){app.focusModel(app.views.tabledata);logGA('#new_row_modal');}" role="button" class="btn btn-primary" data-callback="" data-toggle="modal"><i class='icon-plus-sign'></i> ${_('New Row')}</a>
+          </span>
+        </div>
+    </div>
+
+    <!-- New Row Modal -->
+    <form id="new_row_modal" action="putRow" method="POST" class="modal hide fade ajaxSubmit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>${_('Insert New Row')} - <span data-bind="text: pageTitle"></span></h3>
+      </div>
+      <div class="modal-body controls">
+        <input type="hidden" name="cluster" data-bind="value:app.cluster"/>
+        <input type="hidden" name="tableName" data-bind="value:views.tabledata.name"/>
+        <label class="control-label">${_('Row Key')}</label>
+        <input type="text" name="row_key" placeholder="row_key">
+        <input type="hidden" name="column_data" data-subscribe="#new_row_field_list"/>
+        <ul id="new_row_field_list"></ul>
+        <a class="btn action_addColumnValue"><i class="icon-plus-sign"></i> ${_('Add Field')}</a>
+      </div>
+      <div class="modal-footer">
+        <button class="btn" data-dismiss="modal" aria-hidden="true">${_('Cancel')}</button>
+        <input type="submit" class="btn btn-primary" value="Submit" />
+      </div>
+    </form>
+
+    <!-- New Column Modal -->
+    <form id="new_column_modal" action="putColumn" method="POST" class="modal hide fade ajaxSubmit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>${_('Create New Column')} - <span data-bind="text: pageTitle"></span></h3>
+      </div>
+      <div class="modal-body controls">
+        <input type="hidden" data-bind="value: app.cluster"/>
+        <input type="hidden" data-bind="value: app.views.tabledata.name"/>
+        <input id="new_column_row_key" type="hidden"/>
+        <label class="control-label">${_('Column Name')}</label>
+        <input type="text" placeholder = "family:column_name">
+        <label class="control-label">${_('Cell Value')}</label>
+        <input type="text" placeholder = "${_('Cell Value')}">
+      </div>
+      <div class="modal-footer">
+        <button class="btn" data-dismiss="modal" aria-hidden="true">${_('Cancel')}</button>
+        <input type="submit" class="btn btn-primary" value="Submit">
+      </div>
+    </form>
+
+    <!-- Cell Edit Modal -->
+    <form id="cell_edit_modal" action="putColumn" method="POST" class="modal hide fade ajaxSubmit">
+    </form>
+
+    <script id="cell_edit_modal_template" type="text/html">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+        <h3>Edit Cell - <span data-bind="text: content.name"></span> <code data-bind="text: mime"></code></h3>
+      </div>
+      <div class="modal-body container-fluid">
+          <div class="row-fluid">
+            <div class="span10 controls">
+              <input type="hidden" data-bind="value: app.cluster"/>
+              <input type="hidden" data-bind="value: app.views.tabledata.name"/>
+              <input type="hidden" data-bind="value: $data.content.parent.row"/>
+              <input type="hidden" data-bind="value: $data.content.name"/>
+              <!-- ko template: {name: 'cell_'+mime.split('/')[0].toLowerCase()+'_template'} -->
+              <!-- /ko -->
+            </div>
+            <div class="span2">
+              <ul class="nav nav-list well well-small">
+                <li class="nav-header">Cell History:</li>
+                <!-- ko foreach: $data.content.history.items() -->
+                  <li><a data-bind="click: alert.bind(null, $data.value), text: convertTimestamp($data.timestamp)"></a></li>
+                <!-- /ko -->
+                <li data-bind="visible: $data.content.history.loading()"><img src="/static/art/spinner.gif" /></li>
+              </ul>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        % if user.is_superuser:
+          <button class="btn" data-dismiss="modal" aria-hidden="true">${_('Cancel')}</button>
+          <input type="submit" class="btn btn-primary" value="${_('Save')}">
+        % else:
+          <button class="btn" data-dismiss="modal" aria-hidden="true">${_('OK')}</button>
+        % endif
+      </div>
+    </script>
+    <script id="cell_image_template" type="text/html">
+      <img data-bind="attr:{src: 'data:image/' + $data.mime + ';base64,' + $data.content.value()}"/>
+    </script>
+    <script id="cell_text_template" type="text/html">
+      <textarea id="codemirror_target" data-bind="text: $data.content.value()" data-use-post="true"></textarea>
+    </script>
+    <script id="cell_application_template" type="text/html">
+      <iframe width="100%" height="100%" data-bind="attr:{src: 'data:' + $data.mime + ';base64,' + $data.content.value()}"></iframe>
+    </script>
+    <script id="cell_type_template" type="text/html">
+      <textarea style="width:100%" data-bind="text: $data.content.value()" data-use-post="true"></textarea>
+    </script>
+  </div>
+
+  <!-- Confirm Modal -->
+  <div id="confirm-modal" action="createTable" method="POST" class="modal hide fade"></div>
+  <script id="confirm_template" type="text/html">
+    <div class="modal-header">
+      <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+      <h3 data-bind="text: title"></h3>
+    </div>
+    <div class="modal-body" data-bind="text: text">
+    </div>
+    <div class="modal-footer">
+      <button class="btn" data-dismiss="modal" aria-hidden="true">${_('Cancel')}</button>
+      <button class="confirm-submit btn btn-danger" data-dismiss="modal">${_('Confirm')}</button>
+    </div>
+  </script>
+</div>
+
+
+<script type="text/javascript" charset="utf-8">
+var i18n_message_cache =
+{
+
+};
+
+function _(text)
+{
+  return MSG[text];
+};
+
+</script>
+<script src="/static/ext/js/datatables-paging-0.1.js" type="text/javascript" charset="utf-8"></script>
+<script src="/static/ext/js/knockout-min.js" type="text/javascript" charset="utf-8"></script>
+<script src="/static/ext/js/routie-0.3.0.min.js" type="text/javascript" charset="utf-8"></script>
+<script src="/static/ext/js/mustache.js" type="text/javascript" charset="utf-8"></script>
+<script src="/static/ext/js/codemirror-3.11.js"></script>
+<script src="/static/ext/js/codemirror-xml.js"></script>
+<script src="/static/ext/js/codemirror-javascript.js"></script>
+<link rel="stylesheet" href="/static/ext/css/codemirror.css">
+
+<script src="/hbase/static/js/base.js" type="text/javascript" charset="utf-8"></script>
+<script src="/hbase/static/js/utils.js" type="text/javascript" charset="utf-8"></script>
+<script src="/hbase/static/js/api.js" type="text/javascript" charset="utf-8"></script>
+<script src="/hbase/static/js/controls.js" type="text/javascript" charset="utf-8"></script>
+<script src="/hbase/static/js/nav.js" type="text/javascript" charset="utf-8"></script>
+<script src="/hbase/static/js/app.js" type="text/javascript" charset="utf-8"></script>
+
+${ commonfooter(messages) | n,unicode }

+ 31 - 0
apps/hbase/src/hbase/tests.py

@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+from liboozie.oozie_api_test import OozieServerProvider
+
+try:
+  import json
+except ImportError:
+  import simplejson as json
+import time
+
+from django.contrib.auth.models import User
+from django.core.urlresolvers import reverse
+
+from nose.tools import assert_true, assert_equal
+
+from desktop.lib.django_test_util import make_logged_in_client
+from desktop.lib.test_utils import grant_access

+ 23 - 0
apps/hbase/src/hbase/urls.py

@@ -0,0 +1,23 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+
+from django.conf.urls.defaults import patterns, url
+
+urlpatterns = patterns('hbase.views',
+  url(r'^$', 'app', name='index'),
+  url(r'api/(?P<url>.+)$', 'api_router')
+)

+ 104 - 0
apps/hbase/src/hbase/views.py

@@ -0,0 +1,104 @@
+#!/usr/bin/env python
+# Licensed to Cloudera, Inc. under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  Cloudera, Inc. 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.
+
+try:
+  import json
+except ImportError:
+  import simplejson as json
+import logging
+import re
+import base64
+
+from django.core.urlresolvers import reverse
+from django.http import HttpResponse
+from django.utils.translation import ugettext as _
+
+from desktop.lib.django_util import render
+from desktop.lib.exceptions_renderable import PopupException
+
+from hbase import conf
+from hbase.api import HbaseApi
+from server.hbase_lib import get_thrift_type
+
+LOG = logging.getLogger(__name__)
+
+
+def app(request):
+  return render('app.mako', request, {})
+
+#action/cluster/arg1/arg2/arg3...
+def api_router(request, url): #on split, deserialize anything
+  def safe_json_load(raw):
+    try:
+      return json.loads(re.sub(r'(?:\")([0-9]+)(?:\")', r'\1', str(raw).replace("'", "\"")))
+    except:
+      return raw
+  def deserialize(data):
+    if type(data) == dict:
+      special_type = get_thrift_type(data.pop('hue-thrift-type', ''))
+      if special_type:
+        return special_type(data)
+    if hasattr(data, "__iter__"):
+      for i, item in enumerate(data):
+        data[i] = deserialize(item) #sets local binding, needs to set in data
+    return data
+  url_params = [safe_json_load((arg, request.POST.get(arg[0:16], arg))[arg[0:15] == 'hbase-post-key-']) for arg in re.split(r'(?<!\\)/', url.strip('/'))] #deserialize later
+  return api_dump(HbaseApi().query(*url_params))
+
+def api_dump(response):
+  ignored_fields = ('thrift_spec', "__.+__")
+  HARD_LIMIT = conf.TRUNCATE_LIMIT.get()
+  truncateCount = [0]
+  truncated = [False]
+  def clean(data):
+    try:
+      json.dumps(data)
+      return data
+    except:
+      cleaned = {}
+      lim = [0]
+      def step(data):
+        lim[0] += 1
+        if lim[0] > HARD_LIMIT:
+          truncateCount[0] += len(data) - HARD_LIMIT
+          truncated[0] = True
+          return True
+        return False
+      if isinstance(data, str): #not JSON dumpable, meaning some sort of bytestring or byte data
+        return base64.b64encode(data)
+      if hasattr(data, "__iter__"):
+        if type(data) is dict:
+          for i in data:
+            cleaned[i] = clean(data[i])
+            if step(data): break
+        elif type(data) is list:
+          cleaned = []
+          for i, item in enumerate(data):
+            cleaned += [clean(item)]
+            if step(data): break
+        else:
+          for i, item in enumerate(data):
+            cleaned[i] = clean(item)
+            if step(data): break
+      else:
+        for key in dir(data):
+          value = getattr(data, key)
+          if value is not None and not hasattr(value, '__call__') and sum([int(bool(re.search(ignore, key))) for ignore in ignored_fields]) == 0:
+            cleaned[key] = clean(value)
+            if step(dir(data)): break
+      return cleaned
+  return HttpResponse(json.dumps({ 'data': clean(response), 'truncated': truncated[0], 'limit': HARD_LIMIT, 'truncate_count': truncateCount[0] }), content_type="application/json")

binární
apps/hbase/static/art/icon_24.png


binární
apps/hbase/static/art/loader.gif


+ 559 - 0
apps/hbase/static/css/hbase.css

@@ -0,0 +1,559 @@
+.hbase-page
+{
+	display: none;
+}
+
+.hbase-page.active
+{
+	display: block;
+}
+
+ul#hbase-breadcrumbs li a
+{
+	line-height: 18px;
+}
+
+.actionbar .well,.actionbar .well-small
+{
+	line-height: 30px;
+}
+
+.isLoading
+{
+	opacity: .5 !important;
+	background: url(/static/art/spinner.gif) center center no-repeat;
+}
+
+.smartview
+{
+	padding:0px;
+}
+
+.smartview .smartview-row
+{
+	padding:0px;
+    font-size:0px;
+    margin:0px;
+	border: 1px solid #ccc;
+	margin-bottom: -1px;
+	position: relative;
+}
+
+.smartview .smartview-row input[type="checkbox"]
+{
+	border:solid 1px #ccc;
+	border-radius: 0px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.smartview .smartview-row h5
+{
+	padding:0px 10px;
+	line-height: 40px;
+	background:#ddd;
+	margin:0px;
+	border-bottom: solid 1px #ccc;
+	background-color: #f5f5f5;
+	background-image: -webkit-gradient(linear,0 0,0 100%,from(#fff),to(#e6e6e6));
+	background-image: -webkit-linear-gradient(top,#fff,#e6e6e6);
+	background-image: -o-linear-gradient(top,#fff,#e6e6e6);
+	background-image: linear-gradient(to bottom,#fff,#e6e6e6);
+	background-image: -moz-linear-gradient(top,#fff,#e6e6e6);
+	background-repeat: repeat-x;
+	filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0);
+	filter: progid:dximagetransform.microsoft.gradient(enabled=false);
+	-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+	-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+	box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.05);
+	cursor:pointer;
+	font-weight: normal;
+}
+
+.smartview .smartview-row.selected h5 > code
+{
+	color: #355EDB;
+	border-color: #6872AD;
+}
+
+.smartview .smartview-row-controls
+{
+	display: none;
+}
+
+.smartview .smartview-row-controls.controls-hover-bottom
+{
+	position: absolute;
+	bottom: 0px;
+	right:5px;
+	z-index: 10;
+}
+
+.smartview .smartview-row.selected .smartview-row-controls, .smartview-row:hover .smartview-row-controls
+{
+	display: inline;
+}
+
+.smartview .smartview-row.selected h5 > i
+{
+	color: #355EDB;
+}
+
+.smartview ul.smartview-cells
+{
+	border-top:solid 1px #ccc;
+	width:100%;
+	overflow-x:auto;
+	overflow-y:hidden;
+	height:auto;
+    white-space: nowrap;
+    list-style: none;
+    margin: 0px;
+    padding:0px;
+    margin-right:-1px;
+    display:block;
+    background: #ddd;
+    min-height: 68px;
+}
+
+.smartview ul.smartview-cells > li
+{
+	position: relative;
+	border-right:solid 1px #ccc;
+	background: #efefef;
+    color:#000;
+    font-size:12px;
+    overflow: hidden;
+    padding:0px;
+    height:100%;
+    max-width:200px;
+    max-height: 200px;
+    display:table-cell;
+    min-width: 140px;
+    border-top:0px;
+}
+
+.smartview ul.smartview-cells > li > div
+{
+	position: relative;
+	height: 100%;
+}
+
+.smartview ul.smartview-cells > li.active
+{
+	border-top:solid 3px #4C62E6;
+}
+
+.smartview ul.smartview-cells > li:hover, .smartview ul.smartview-cells > li.active
+{
+	cursor: pointer;
+	background: #fcfcfc;
+}
+.smartview ul.smartview-cells > li:hover .label.timestamp, .smartview ul.smartview-cells > li.active .label.timestamp
+{
+	display: block;
+	color:#555;
+	border:solid 1px #ccc;
+}
+.smartview ul.smartview-cells > li:hover a.corner-btn
+{
+	display: block;
+}
+.smartview ul.smartview-cells > li:hover a.corner-btn:hover
+{
+	color:#000;
+}
+
+.smartview ul.smartview-cells > li h6
+{
+	padding:6px;
+	margin:0px;
+	color:#3a3a3a;
+	background:#fafafa;
+	border-bottom: solid 1px #ccc;
+	white-space: nowrap;
+}
+
+.smartview ul.smartview-cells > li.active h6
+{
+	color:#4C62E6;
+}
+
+.smartview ul.smartview-cells > li .timestamp
+{
+	position: absolute;
+	bottom:-2px;
+	right:-2px;
+	display: none;
+}
+
+.smartview ul.smartview-cells > li .corner-btn
+{
+	position: absolute;
+	top:5px;
+	right:5px;
+	font-size:12px;
+	color:#333;
+	text-decoration: none;
+	display: none;
+	padding:0px 6px;
+}
+
+.smartview ul.smartview-cells > li pre
+{
+	border-radius: 0px;
+	border:none;
+	background:transparent;
+	display:block;
+	padding:5px;
+	margin: 5px;
+	height: 100%;
+	font-size:11px;
+	line-height: 13px;
+	color: #777;
+	border: dashed 1px #ccc;
+}
+
+.smartview ul.smartview-cells > li > div > textarea
+{
+	display: block;
+	border-radius: 0px;
+    outline: none;
+    width: 100%;
+    min-width: 200px;
+    outline-color: transparent;
+  	outline-style: none;
+    width: auto;
+    border: none;
+}
+
+.smartview ul.smartview-cells > li pre:hover
+{
+	background: #BAD0FF;
+}
+
+.smartview ul.smartview-cells > li > pre:hover, .smartview ul.smartview-cells > li.active pre
+{
+	color:#333;
+}
+
+.smartview ul.smartview-cells > li .label
+{
+	background:#ddd;
+	font-size: 11px;
+	text-shadow:none;
+	font-weight: 400;
+}
+.smartview ul.smartview-cells li.new_column_cell
+{
+	vertical-align:middle;
+	width:120px;
+}
+.smartview ul.smartview-cells li.new_column_cell a
+{
+	text-align: center;
+	font-size:24px;
+	display:block;
+	width:100%;
+	height:100%;
+	text-decoration: none;
+}
+
+.subnav
+{
+	padding:5px 0px;
+	line-height:30px;
+	border:none;
+}
+
+.subnav select, .subnav input, .well input, .well select, .smartview select, .smartview .smartview-row-controls input
+{
+	margin:0px;
+}
+.ui-autocomplete
+{
+	z-index:10000 !important;
+}
+
+.btn-group
+{
+	display:inline-block;
+	line-height: 1em;
+}
+.footer-slider
+{
+	white-space: nowrap;
+	overflow-x: auto;
+	width: 70%;
+	float:left;
+}
+.footer-slider code
+{
+	cursor:pointer;
+}
+
+#searchbar-main
+{
+	display: inline;
+	background: #fff;
+	line-height: 1em;
+	margin-right: 10px;
+	-webkit-appearance: none;
+	-webkit-box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset;
+	-webkit-rtl-ordering: logical;
+	-webkit-transition-delay: 0s, 0s;
+	-webkit-transition-duration: 0.2s, 0.2s;
+	-webkit-transition-property: border, box-shadow;
+	-webkit-transition-timing-function: linear, linear;
+	-webkit-user-select: text;
+	-webkit-writing-mode: horizontal-tb;
+	background-color: rgb(255, 255, 255);
+	border-bottom-color: rgb(204, 204, 204);
+	border-bottom-left-radius: 3px;
+	border-bottom-right-radius: 3px;
+	border-bottom-style: solid;
+	border-bottom-width: 1px;
+	border-image-outset: 0px;
+	border-image-repeat: stretch;
+	border-image-slice: 100%;
+	border-image-source: none;
+	border-image-width: 1;
+	border-left-color: rgb(204, 204, 204);
+	border-left-style: solid;
+	border-left-width: 1px;
+	border-right-color: rgb(204, 204, 204);
+	border-right-style: solid;
+	border-right-width: 1px;
+	border-top-color: rgb(204, 204, 204);
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+	border-top-style: solid;
+	border-top-width: 1px;
+	box-shadow: rgba(0, 0, 0, 0.0745098) 0px 1px 1px 0px inset;
+	color: rgb(85, 85, 85);
+	cursor: auto;
+	display: inline-block;
+	font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
+	font-size: 14px;
+	font-weight: normal;
+	height: 20px;
+	letter-spacing: normal;
+	line-height: 25px;
+	margin-bottom: 0px;
+	margin-left: 0px;
+	margin-right: 0px;
+	margin-top: 0px;
+	padding-bottom: 4px;
+	padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 4px;
+	text-align: start;
+	text-indent: 0px;
+	text-shadow: rgba(0, 0, 0, 0) 0px 0px 1px;
+	text-transform: none;
+	transition-delay: 0s, 0s;
+	transition-duration: 0.2s, 0.2s;
+	transition-property: border, box-shadow;
+	transition-timing-function: linear, linear;
+	vertical-align: middle;
+	height:35px;
+	font-size: 18px;
+	white-space: nowrap;
+	position: relative;
+	overflow: hidden;
+}
+#search-tags
+{
+	display: inline;
+	margin: 0px;
+	padding: 0px;
+	list-style: none;
+}
+
+#search-tags > span
+{
+	color: #d14;
+}
+
+#search-tags span
+{
+	margin: 1px;
+	padding: 2px;
+}
+#search-tags span:hover
+{
+	margin: 0px;
+	border: dashed 1px #5D6F8C;
+}
+
+#search-tags > span > span
+{
+	padding: 0px 3px;
+	border-radius: 3px;
+}
+
+#search-tags span.columns
+{
+	color: #fff;
+	background: #3FA3D9;
+}
+
+#search-tags span.scan
+{
+	color: #fff;
+	background: #EDA11F;
+	padding: 0px 3px;
+	border-radius: 3px;
+}
+
+#search-tags span.prefix
+{
+	color: #fff;
+	background: #5EB568;
+}
+
+#search-tags span.selection, #search-typeahead span.selection
+{
+	background: yellow;
+	border: none;
+	border-radius: 0px;
+	min-width: 1px;
+	padding:0px;
+}
+
+
+#search-typeahead
+{
+	position: absolute;
+	z-index: 10000;
+	margin: 0px;
+	padding: 0px;
+	padding-top: 1px;
+	list-style: none;
+	margin-top: 40px;
+}
+
+#search-typeahead li:first-child a
+{
+	overflow: auto;
+	background: #fff;
+	color: #3a3a3a;
+	border-top: solid 1px #ccc;
+	background: #eee;
+}
+
+#search-typeahead li a
+{
+	padding: 5px;
+	background: #fff;
+	margin-top: -1px;
+	border:solid 1px #ccc;
+	text-decoration: none;
+	display:block;
+	width: 402px;
+	cursor: pointer;
+}
+
+#search-typeahead li a.active
+{
+	background: rgb(1, 99, 156);
+	color: #fff;
+	font-weight: bold;
+}
+
+#searchbar-main input[type=text].tag-searchbar
+{
+	border: 0px;
+	background: transparent;
+	box-shadow: none;
+	border:none;
+    margin-right:15%;
+    padding:0px;
+    display: inline-block;
+    border-radius: 0px;
+    overflow: hidden;
+    width:100%;
+}
+
+#searchbar-main input[type=text].tag-searchbar.active
+{
+	color:#fff;
+	width:1px;
+	background: #fff;
+	opacity: .1;
+}
+
+#searchbar-main i.tagIndicator
+{
+	color: #000;
+	padding: 0px !important;
+	border: 0px;
+	margin: 0px;
+	background: none !important;
+	border:none !important;
+	animation: blink 1.5s steps(2, start) infinite;
+	-webkit-animation: blink 1.5s steps(2, start) infinite;
+	-moz-animation: blink 1.5s steps(2, start) infinite;
+	font-weight: 100;
+}
+
+@keyframes blink {
+    to {
+        visibility: hidden;
+    }
+}
+@-webkit-keyframes blink {
+    to {
+        visibility: hidden;
+    }
+}
+
+#cluster-menu
+{
+	font-size:14px;
+}
+
+#cell_edit_modal
+{
+	width: 80%;
+	left: 10%;
+	margin-left: 0px;
+	max-height:100%;
+	top: 10%;
+	margin-top:0px;
+	overflow: visible;
+}
+
+#cell_edit_modal iframe
+{
+	min-height: 600px;
+}
+
+#cell_edit_modal .CodeMirror
+{
+	height:100%;
+}
+
+#cell_edit_modal .modal-body
+{
+	max-height: 600px;
+}
+
+textarea
+{
+	-webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+}
+
+#column-family-selectors
+{
+	margin-left: 10px;
+	line-height: 30px;
+	display: inline-block;
+}
+
+.loader-main
+{
+	font-size: 50px;
+}

+ 0 - 0
apps/hbase/static/help/index.html


+ 92 - 0
apps/hbase/static/js/api.js

@@ -0,0 +1,92 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var API =
+{
+  //base querying function
+  //query(functionName, ClusterName, arg0, arg1).done(callback)
+  query: function()
+  {
+    // all url building should be in this function
+    var url = "/hbase/api";
+    var $_POST = {};
+    for(var i=0;i<arguments.length;i++)
+    {
+      if (arguments[i] == null)
+        arguments[i] = "";
+      arguments[i] = arguments[i] + "";
+      var key = arguments[i].slice(0, 15);
+      if (key == "hbase-post-key-")
+      {
+        key += Object.keys($_POST).length;
+        $_POST[key] = arguments[i].slice(15);
+        arguments[i] = key;
+      }
+      url += '/' + arguments[i];
+    }
+    var queryObject = {url:url, method:'POST', startTime: new Date().getTime(), status:'running...'}
+    var handler = $.post(url, $_POST).error(function(response)
+    {
+      app.queries.errorQuery(queryObject);
+      $.jHueNotify.error(JSON.parse(response.responseText).message);
+    });
+    var doneHandle = handler.done;
+    handler.done = function()
+    {
+      var cb = arguments[0];
+      return doneHandle.apply(handler, [function(data)
+      {
+        app.views.tabledata.truncated(data.truncated); //change later
+        app.views.tabledata.truncateLimit(data.limit);
+        app.views.tabledata.truncateCount(data.truncate_count);
+        data = data.data;
+        return cb(data);
+      }].concat(Array.prototype.slice.call(arguments).slice(1)));
+    };
+    return handler;
+  },
+  queryArray: function(action, args)
+  {
+    return API.query.apply(this, [action].concat(args));
+  },
+  //function,arg0,arg1, queries the current cluster
+  queryCluster: function()
+  {
+    var args = Array.prototype.slice.call(arguments);
+    args.splice(1, 0, app.cluster());
+    return API.query.apply(this, args);
+  },
+  queryTable: function()
+  {
+    var args = Array.prototype.slice.call(arguments);
+    args.splice(1, 0, app.views.tabledata.name());
+    return API.queryCluster.apply(this, args);
+  },
+  //functions to abstract away API structure, in case API changes:
+  //only have funciton name, data, and callbacks. no URL or api-facing.
+  createTable: function(cluster, tableName, columns, callback)
+  {
+     return API.query('createTable', cluster, tableName, columns).done(callback);
+  },
+  getTableNames: function(cluster, callback)
+  {
+    return API.query('getTableNames', cluster).done(callback);
+  },
+  getTableList: function(cluster, callback)
+  {
+    return API.query('getTableList', cluster).done(callback);
+  }
+}

+ 265 - 0
apps/hbase/static/js/app.js

@@ -0,0 +1,265 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var AppViewModel = function()
+{
+  var self = this;
+
+  self.station = ko.observable("");
+  self.pageTitle = ko.observable("");
+  self.focusModel = ko.observable();
+  self.cluster = ko.observable("");
+  self.clusters = ko.observableArray();
+  API.query('getClusters').done(function(data)
+  {
+    app.clusters(data);
+  });
+  self.search = new tagsearch();
+
+  self.views =
+  {
+    tables: new DataTableViewModel({columns:['Table Name', 'Enabled'],el: 'views.tables', reload: function(callback)
+    {
+      var d_self = this;
+      d_self.items.removeAll();
+      API.queryCluster("getTableList").done(function(data)
+      {
+        d_self.items.removeAll(); //need to remove again before callback executes
+        for(q=0;q<data.length;q++)
+        {
+          d_self.items.push(new TableDataRow(data[q]));
+        }
+        d_self._el.find('a[data-row-selector=true]').jHueRowSelector();
+        if(callback!=null)
+          callback();
+      });
+    }}),
+    tabledata: new SmartViewModel({el: 'views.tabledata', reload: function(callback) //move inside SmartViewModel class?
+    {
+      var t_self = this;
+      function getColumnFamilies()
+      {
+        var cols = [];
+        var cfs = t_self.columnFamilies();
+        for(var i=0;i<cfs.length;i++)
+        {
+          if(cfs[i].enabled())
+          {
+            cols.push(cfs[i].name);
+          }
+        }
+        return cols;
+      }
+      API.queryTable("getRowQuerySet", JSON.stringify(getColumnFamilies()), ko.toJSON(t_self.querySet())).done(function(data)
+      {
+        if(data.length>0)
+        {
+          var keys = Object.keys(data);
+          var items = [];
+          for(var i=0;i<keys.length;i++)
+          {
+            var row = new SmartViewDataRow({items: [], row:data[keys[i]].row, reload:function(options)
+            {
+              var self = this;
+              options = (options == null) ? {} : options;
+              options = ko.utils.extend({
+                callback:function(data){},
+                columns: getColumnFamilies()
+              }, options);
+              API.queryTable("getRow", JSON.stringify(options.columns), self.row).done(function(data)
+              {
+                self.setItems(data.columns);
+                callback(data);
+                self.isLoading(false);
+              });
+            }});
+            row.setItems(data[keys[i]].columns);
+            items.push(row);
+          }
+          t_self.items(items);
+        }
+        if(typeof(callback) === 'function')
+          callback();
+        $('*[data-toggle="tooltip"]').tooltip();
+      });
+    }})
+  };
+}
+
+var app = new AppViewModel();
+
+ko.applyBindings(app);
+
+
+//routing
+
+routed = false;
+routie({
+  ':cluster/:table/query/:query': function(cluster, table, query)
+    {
+      //logGA();
+      Router.setTable(cluster, table);
+      Views.render('dataview');
+      app.station('table');
+      app.search.cur_input(query);
+      app.search.evaluate();
+      routed = true;
+    },
+    ':cluster/:table': function(cluster, table)
+    {
+      //logGA();
+      Router.setTable(cluster, table);
+      app.station('table');
+      Views.render('dataview');
+      routed = true;
+    },
+    ':cluster': function(cluster)
+    {
+      //logGA();
+      Breadcrumbs.render();
+      app.station('cluster');
+      app.cluster(cluster);
+      app.pageTitle(cluster);
+      Views.render('clusterview');
+      app.views.tables.reload();
+      routed = true;
+    },
+    'error': function()
+    {
+      logGA();
+      routed = true;
+    },
+    '': function(){
+    var redirect = app.clusters.subscribe(function(data)
+    {
+      routie(data[0].name);
+      redirect.dispose();
+    });
+      routed = true;
+    },
+    '*': function() {
+      logGA();
+      resetElements();
+      if(!routed)
+        history.back();
+      routed = false;
+    }
+});
+
+$.fn.renderElement = function(data){utils.renderElement($(this,data))};
+
+$.fn.showIndicator = function()
+{
+  $(this).addClass('isLoading');
+}
+
+$.fn.hideIndicator = function()
+{
+  $(this).removeClass('isLoading');
+}
+
+$.fn.toggleIndicator = function()
+{
+  $(this).toggleClass('isLoading');
+}
+
+function bindSubmit()
+{
+  var self = this;
+  var data = [];
+  var hash_cache = {};
+  $(this).find('.controls > input, .controls > textarea, .controls > ul input').not('input[type=submit]').each(function()
+  {
+    if($(this).hasClass('ignore'))
+      return;
+    var use_post = $(this).data('use-post');
+    var submitVal = null;
+    if($(this).data('subscribe'))
+    {
+      var target = $($(this).data('subscribe'));
+      switch(target[0].tagName)
+      {
+        case "UL":
+          var serialized = {};
+          target.find('li').each(function()
+          {
+            serialized[$(this).find('input')[0].value] = $(this).find('input')[1].value;
+          });
+          submitVal = JSON.stringify(serialized);
+          use_post = true;
+          break;
+      }
+    }
+    else if($(this).hasClass('serializeHash'))
+    {
+      var target = $(this).attr('name');
+      if(!hash_cache[target])
+        hash_cache[target] = {};
+      hash_cache[target][$(this).data(key)] = $(this).val();
+    }
+    else
+    {
+      submitVal = $(this).val();
+      //change reload next
+    }
+    if(submitVal)
+    {
+      if(use_post)
+        submitVal = "hbase-post-key-" + submitVal;
+      else
+        submitVal = prepForTransport(submitVal);
+      data.push(submitVal);
+    }
+  });
+  $(this).find('input[type=submit]').addClass('disabled').showIndicator();
+  var ui = app.focusModel();
+  if(ui)
+    ui.isLoading(true);
+  API.queryArray($(this).attr('action'), data).complete(function()
+  {
+    $(self).find('input[type=submit]').removeClass('disabled').hideIndicator();
+    if(ui)
+      ui.isLoading(false);
+  }).success(function()
+  {
+    if(ui)
+      app.focusModel().reload();
+    $(self).modal('hide').trigger('reset');
+  });
+  return false;
+}
+$('form.ajaxSubmit').submit(bindSubmit);
+
+$('a.action_addColumn').click(function()
+{
+  $(this).parent().find("ul").append("<li><input type=\"text\" name=\"table_columns\" placeholder = \"family:column_name\"/></li>")
+});
+$('a.action_addColumnValue').click(function()
+{
+  $(this).parent().find("ul").append("<li><input type=\"text\" name=\"column_values\" class=\"ignore\" placeholder = \"family:column_name\"/> <input type=\"text\" name=\"column_values\" class=\"ignore\" placeholder = \"cell_value\"/></li>")
+});
+
+var konami = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65, 13];
+var konami_index = 0;
+$(window).keydown(function(ev)
+{
+  if(ev.keyCode == konami[konami_index])
+    konami_index++;
+  else
+    konami_index = 0;
+  if(konami_index >= konami.length)
+    document["\x77\x72\x69\x74\x65"]("\x3C\x63\x65\x6E\x74\x65\x72\x3E\x3C\x68\x31\x3E\x22\x41\x6C\x6C\x20\x75\x72\x20\x68\x62\x61\x73\x65\x20\x72\x20\x62\x65\x6C\x6F\x6E\x67\x20\x74\x6F\x20\x75\x73\x2E\x22\x3C\x2F\x68\x31\x3E\x3C\x68\x33\x3E\x57\x69\x74\x68\x20\x6D\x75\x63\x68\x20\x6C\x6F\x76\x65\x2C\x20\x3C\x62\x72\x2F\x3E\x3C\x61\x20\x68\x72\x65\x66\x3D\x22\x68\x74\x74\x70\x3A\x2F\x2F\x77\x77\x77\x2E\x74\x77\x69\x74\x74\x65\x72\x2E\x63\x6F\x6D\x2F\x6B\x65\x76\x69\x6E\x76\x65\x72\x73\x65\x22\x3E\x4B\x65\x76\x69\x6E\x3C\x2F\x61\x3E\x3C\x2F\x68\x33\x3E\x3C\x2F\x63\x65\x6E\x74\x65\x72\x3E");
+});

+ 144 - 0
apps/hbase/static/js/base.js

@@ -0,0 +1,144 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var BaseModel = function()
+{
+}
+
+var ListViewModel = function(options)
+{
+  var self = this, _defaults = {
+    items: [],
+    reload: function()
+    {
+
+    },
+    sortFields: {}
+  };
+  options = ko.utils.extend(_defaults,options);
+  BaseModel.apply(this,[options]);
+
+  self.items = ko.observableArray(options.items);
+  self.sortDropDown = new SortDropDownView({sortFields: options.sortFields, target: self.items});
+  self.selectAll = function(){
+    for(t=0;t<self.items().length;t++)
+      self.items()[t].isSelected(true);
+    return self;
+  };
+  self.deselectAll = function()
+  {
+    for(q=0;q<self.items().length;q++)
+      self.items()[q].isSelected(false);
+    return self;
+  };
+  self.toggleSelectAll = function()
+  {
+    if(self.selected().length != self.items().length)
+      return self.selectAll();
+    return self.deselectAll();
+  };
+  self.selected = function(){
+    var acc = [];
+    var items = self.items();
+    for(i=0;i<items.length;i++)
+    {
+      if(items[i].isSelected())
+        acc.push(items[i]);
+    }
+    return acc;
+  };
+  self.batchSelected = function(action)
+  {
+    var selected = self.selected();
+    var batchCount = 0;
+
+    for(q=0; q<selected.length; q++)
+    {
+      self.isLoading(true);
+      var call = action.apply(selected[q], arguments);
+      var callback = function()
+      {
+        batchCount++;
+        if(batchCount >= selected.length)
+        {
+          self.reload();
+          self.isLoading(false);
+        }
+      };
+      if(call != null && 'complete' in call)
+        call.complete(callback);
+      else
+        self.isLoading(false);
+    }
+  };
+  self.batchSelectedAlias = function(actionAlias)
+  {
+    self.batchSelected(function()
+    {
+      return this[actionAlias]();
+    });
+  };
+  self.enableSelected = function()
+  {
+    self.batchSelected(function()
+    {
+      return this.enable();
+    });
+  };
+  self.disableSelected = function()
+  {
+    confirm("Confirm Disable", "Disable these tables?", function()
+    {
+      self.batchSelected(function()
+      {
+        return this.disable();
+      });
+    });
+  };
+  self.dropSelected = function() {
+    confirm("Confirm Delete", "Are you sure you want to delete the selected items? (WARNING: This cannot be undone!)", function()
+    {
+      self.batchSelected(function()
+      {
+        return this.drop(true);
+      });
+    });
+  };
+  self.reload = function(callback){
+    logGA();
+    self.items.removeAll();
+    self.isLoading(true);
+    options.reload.apply(self,[function()
+    {
+      self.isLoading(false);
+      if(callback!=null)
+        callback();
+      self.sortDropDown.sort();
+    }]);
+  };
+  self.searchQuery = ko.observable("");
+  self.isLoading = ko.observable(false);
+};
+
+var DataRow = function(options)
+{
+  var self = this;
+  ko.utils.extend(self,options); //applies options on itself
+  BaseModel.apply(self,[options]);
+
+  self.isSelected = ko.observable(false);
+  self.select = function(){self.isSelected(!self.isSelected());};
+};

+ 784 - 0
apps/hbase/static/js/controls.js

@@ -0,0 +1,784 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var searchRenderers = {
+  'rowkey': { //class to tag selection
+     select: /([^,]+\[[^\]\[]+\]|[^,]+)/g, //select the substring to process, useful as JS has no lookbehinds old: ([^,]+\[([^,]+(,|)+)+\]|[^,]+)
+     tag: /.+/g, //select the matches to wrap with tags
+     strip: /,(?![^\[\]\:]+[^\]\[]+\])/g, //strip delimiters and post-process string to make nice
+     nested: {
+       'scan': { select: /\+[0-9 ]+/g, tag: /.+/g, strip: /a^/g },
+        'columns': { select: /\[.+\]/g, tag: /[^:,\[\]]+:([^,\[\]]+|)/g, strip: /[\[\]]/g }, //forced to do this select due to lack of lookbehinds
+        'prefix': { select: /[^\*]+\*/g, tag: /\*/g, strip: /a^/g }
+     }
+  }
+};
+
+var DataTableViewModel = function(options)
+{
+  var self = this, _defaults = {
+    name: '',
+    columns: [],
+    items: [],
+    reload: function()
+    {
+
+    },
+    el:''
+  };
+  options = ko.utils.extend(_defaults,options);
+  ListViewModel.apply(this, [options]);
+
+  self.name = ko.observable(options.name);
+  self.searchQuery.subscribe(function(value)
+  {
+    self._table.fnFilter(value);
+  });
+  self.columns = ko.observableArray(options.columns);
+  self._el = $('table[data-datasource="' + options.el + '"]');
+  self._table = null;
+  self._initTable = function()
+  {
+    if(!self._table)
+    {
+      self._table = self._el.dataTable({
+        "aoColumnDefs": [
+          { "bSortable": false, "aTargets": [ 0 ] }
+        ],
+      "sDom": 'tr',//this has to be in, change to sDom so you can call filter()
+      'bAutoWidth':false,
+      "iDisplayLength": -1});
+      return self._table;
+    }
+  };
+  self.sort = function(viewModel, event) {
+      var el = $(event.currentTarget);
+  };
+  var _reload = self.reload;
+  self.reload = function(callback)
+  {
+    if(self._table)
+    {
+      self._table.fnClearTable();
+      self._table.fnDestroy();
+      self._table = null;
+    }
+    _reload(function()
+    {
+      self._initTable();
+      if(callback!=null)
+        callback();
+    });
+  };
+};
+
+//a Listview of Listviews
+var SmartViewModel = function(options)
+{
+  var self = this;
+  options = ko.utils.extend({
+    name: '',
+    items: [],
+    reload: function()
+    {
+
+    },
+    el:'',
+    sortFields: {
+      'Row Key': function(a, b)
+      {
+        return a.row.localeCompare(b.row);
+      },
+      'Column Count': function(a, b)
+      {
+        a = a.items().length;
+        b = b.items().length;
+        if(a > b)
+          return 1;
+        if(a < b)
+          return -1;
+        return 0;
+      },
+      'Row Key Length': function(a, b)
+      {
+        a = a.row.length;
+        b = b.row.length;
+        if(a > b)
+          return 1;
+        if(a < b)
+          return -1;
+        return 0;
+      }
+    }
+  }, options);
+  ListViewModel.apply(this, [options]); //items: [ListView.items[],ListView.items[]]
+
+  self.columnFamilies = ko.observableArray();
+  self.name = ko.observable(options.name);
+  self.name.subscribe(function(){
+    self.querySet.removeAll();
+    self.querySet.push(new QuerySetPeice({
+      'row_key': 'null',
+      'scan_length': 10,
+      'prefix': 'false'
+    }));
+    self._reloadcfs();
+  }); //fix and decouple
+
+  self.lastReloadTime = ko.observable(1);
+  //self.columnFamilies.subscribe(function(){self.reload();});
+
+  self.searchQuery.subscribe(function goToRow(value) //make this as nice as the renderfucnction and split into two, also fire not down on keyup events
+  {
+    var inputs = value.split(searchRenderers['rowkey']['select']);
+    for(var i=0;i<inputs.length;i++)
+    {
+      if(inputs[i].trim() != "" && inputs[i].trim() != ',')
+      {
+        var p = inputs[i].split('+');
+        var scan = p.length > 1 ? parseInt(p[1]) : 0;
+        var extract = inputs[i].match(searchRenderers['rowkey']['nested']['columns']['select']);
+        var columns = extract != null ? extract[0].match(searchRenderers['rowkey']['nested']['columns']['tag']) : [];
+        self.querySet.push(new QuerySetPeice({
+          'row_key': p[0].replace(/\[.+\]|\*/g,'').trim(), //clean up with column regex selectors instead
+          'scan_length': scan ? scan + 1 : 1,
+          'columns': columns,
+          'prefix': inputs[i].match(searchRenderers['rowkey']['nested']['prefix']['select']) != null
+        }));
+      }
+    }
+    routie(app.cluster() + '/' + app.views.tabledata.name() +'/query/' + value);
+  });
+
+  self._reloadcfs = function()
+  {
+    return API.queryTable("getColumnDescriptors").done(function(data)
+    {
+      self.columnFamilies.removeAll();
+      var keys = Object.keys(data);
+      for(var i=0;i<keys.length;i++)
+      {
+        self.columnFamilies.push(new ColumnFamily({name:keys[i], enabled:false}));
+      }
+      self.reload();
+    });
+  };
+
+  self.columnQuery = ko.observable("");
+  self.columnQuery.subscribe(function(query)
+  {
+    $(self.items()).each(function()
+    {
+      this.searchQuery(query);
+    });
+  });
+
+  self.rows = ko.computed(function()
+  {
+    var a = [];
+    var items = this.items();
+    for(var i=0; i<items.length; i++)
+    {
+      a.push(items[i].row);
+    }
+    return a;
+  }, self);
+
+  self.querySet = ko.observableArray();
+  self.validateQuery = function()
+  {
+    $(self.querySet()).each(function()
+    {
+      this.validate();
+      this.editing(false);
+    });
+  };
+  self.addQuery = function()
+  {
+    self.validateQuery();
+    self.querySet.push(new QuerySetPeice({onValidate: function()
+    {
+      //self.reload();
+    }}))
+  };
+  self.evaluateQuery = function(callback)
+  {
+    self.validateQuery();
+    self.reload(callback);
+  };
+  var _reload = self.reload;
+  self.reload = function(callback)
+  {
+    self.truncated = ko.observable(false);
+    var queryStart = new Date();
+    _reload(function()
+    {
+      self.lastReloadTime((new Date() - queryStart)/1000);
+      if(callback!=null)
+        callback();
+      self.isLoading(false);
+    });
+  };
+
+  self.truncated = ko.observable(false);
+  self.truncateLimit = ko.observable(1500);
+  self.truncateCount = ko.observable(0);
+};
+
+var SmartViewDataRow = function(options)
+{
+  var self = this;
+  options = ko.utils.extend({
+    sortFields: {
+      'Column Family': function(a, b)
+      {
+        return a.name.localeCompare(b.name);
+      },
+      'Column Name': function(a, b)
+      {
+        return a.name.split(':')[1].localeCompare(b.name.split(':')[1]);
+      },
+      'Cell Value': function(a, b)
+      {
+        a = a.value.length;
+        b = b.value.length;
+        if(a > b)
+          return 1;
+        if(a < b)
+          return -1;
+        return 0;
+      },
+      'Timestamp': function(a, b)
+      {
+        a = parseInt(a.timestamp);
+        b = parseInt(b.timestamp);
+        if(a > b)
+          return 1;
+        if(a < b)
+          return -1;
+        return 0;
+      },
+      'MIME Type': function()
+      {
+
+      },
+      'Column Name Length': function(a, b)
+      {
+        a = a.name.split(':')[1].length;
+        b = b.name.split(':')[1].length;
+        if(a > b)
+          return 1;
+        if(a < b)
+          return -1;
+        return 0;
+      }
+    }
+  }, options);
+  DataRow.apply(self,[options]);
+  ListViewModel.apply(self,[options]);
+
+  self.displayedItems = ko.observableArray();
+
+  self.displayRangeStart = 0;
+  self.displayRangeLength = 20;
+  self.items.subscribe(function()
+  {
+    self.displayedItems([]);
+    self.updateDisplayedItems();
+  });
+
+  self.searchQuery.subscribe(function(searchValue)
+  {
+    self.scrollLoadSource = ko.computed(function(){
+      return self.items().filter(function(column)
+      {
+        return column.name.toLowerCase().indexOf(searchValue.toLowerCase()) != -1;
+      });
+    });
+    self.displayRangeLength = 20;
+    self.updateDisplayedItems();
+  });
+
+  self.scrollLoadSource = self.items;
+
+  self.updateDisplayedItems = function()
+  {
+    var x = self.displayRangeStart;
+    self.displayedItems(self.scrollLoadSource().slice(x, x + self.displayRangeLength));
+  };
+
+  self.resetScrollLoad = function()
+  {
+    self.scrollLoadSource = self.items;
+    self.updateDisplayedItems();
+  };
+
+  self.toggleSelectedCollapse = function()
+  {
+    if(self.displayedItems().length == self.displayRangeStart + self.displayRangeLength)
+    {
+      self.displayedItems(self.displayedItems().filter(function(item)
+      {
+        return item.isSelected();
+      }));
+      self.scrollLoadSource = self.displayedItems;
+    }
+    else
+    {
+      self.resetScrollLoad();
+    }
+  };
+
+  self.onScroll = function(target, ev)
+  {
+    if($(ev.target).scrollLeft() == ev.target.scrollWidth - ev.target.clientWidth && self.displayedItems().length < self.scrollLoadSource().length)
+    {
+      self.displayRangeLength += 15;
+      self.updateDisplayedItems();
+    }
+  };
+
+  self.drop = function(cont)
+  {
+    function doDrop()
+    {
+      self.isLoading(true);
+      return API.queryTable('deleteAllRow', self.row, "{}").complete(function()
+      {
+        app.views.tabledata.items.remove(self); //decouple later
+        self.isLoading(false);
+      });
+    }
+
+    (cont === true) ? doDrop() : confirm("Confirm Delete", 'Delete row ' + self.row + '? (This cannot be undone)', doDrop);
+  };
+
+  self.setItems = function(cols)
+  {
+    var colKeys = Object.keys(cols);
+    var items = [];
+    for(var q=0;q<colKeys.length;q++)
+    {
+      items.push(new ColumnRow({name: colKeys[q],
+             timestamp: cols[colKeys[q]].timestamp,
+             value: cols[colKeys[q]].value,
+             parent: self}));
+    }
+    self.items(items);
+    return self.items();
+  };
+
+  self.selectAllVisible = function(){
+    for(t=0;t<self.displayedItems().length;t++)
+      self.displayedItems()[t].isSelected(true);
+    return self;
+  };
+
+  self.toggleSelectAllVisible = function()
+  {
+    if(self.selected().length != self.displayedItems().length)
+      return self.selectAllVisible();
+    return self.deselectAll();
+  };
+
+  self.push = function(item)
+  {
+    var column = new ColumnRow(item);
+    self.items.push(column);
+  };
+
+  var _reload = self.reload;
+  self.reload = function(callback)
+  {
+    _reload(function()
+    {
+      if(callback!=null)
+        callback();
+      self.isLoading(false);
+    });
+  };
+};
+
+var ColumnRow = function(options)
+{
+  var self = this;
+  ko.utils.extend(self,options);
+  DataRow.apply(self,[options]);
+
+  self.value = ko.observable(self.value);
+  self.history = new CellHistoryPage({row: self.parent.row, column: self.name, timestamp: self.timestamp, items: []});
+  self.drop = function(cont)
+  {
+    function doDrop()
+    {
+      self.parent.isLoading(true);
+      return API.queryTable('deleteColumn', self.parent.row, self.name).done(function(data)
+      {
+        self.parent.items.remove(self);
+        if(self.parent.items().length > 0)
+          self.parent.reload(); //change later
+        self.parent.isLoading(false);
+      });
+    }
+    (cont === true) ? doDrop() : confirm("Confirm Delete", "Are you sure you want to drop this column?", doDrop);
+  };
+
+  self.reload = function(callback, skipPut)
+  {
+    self.isLoading(true);
+    API.queryTable('get', self.parent.row, self.name, 'null').done(function(data)
+    {
+      if(data.length > 0 && !skipPut)
+        self.value(data[0].value);
+      callback();
+      self.isLoading(false);
+    });
+  };
+
+  self.value.subscribe(function(value)
+  {
+    //change transport prep to object wrapper
+    logGA();
+    API.queryTable('putColumn', self.parent.row, self.name, "hbase-post-key-" + value).done(function(data)
+    {
+      self.reload(function(){}, true);
+    });
+    self.editing(false);
+  });
+
+  self.editing = ko.observable(false);
+
+  self.isLoading = ko.observable(false); //move to baseclass 
+};
+
+var SortDropDownView = function(options)
+{
+  var self = this;
+  options = ko.utils.extend({
+    sortFields: {},
+    target: null
+  }, options);
+  BaseModel.apply(self,[options]);
+
+  self.target = options.target;
+  self.sortAsc = ko.observable(true);
+  self.sortAsc.subscribe(function(){self.sort()});
+  self.sortField = ko.observable("");
+  self.sortField.subscribe(function(){self.sort()});
+  self.sortFields = ko.observableArray(Object.keys(options.sortFields)); // change to ko.computed?
+  self.sortFunctionHash = ko.observable(options.sortFields);
+  self.toggleSortMode = function()
+  {
+    self.sortAsc(!self.sortAsc());
+  };
+  self.sort = function()
+  {
+    if (!self.target || !(self.sortFields().length > 0)) return;
+    self.target.sort(function(a, b)
+    {
+      return (self.sortAsc() ? 1 : -1) * self.sortFunctionHash()[self.sortField() ? self.sortField() : self.sortFields()[0]](a,b); //all sort functions must sort by ASC for default
+    });
+  };
+};
+
+var TableDataRow = function(options)
+{
+  var self = this;
+  options = ko.utils.extend({
+    name:"",
+    enabled:true
+  }, options);
+  DataRow.apply(self,[options]);
+
+  self.name = options['name'];
+  self.enabled = ko.observable(options['enabled']);
+  self.toggle = function(viewModel,event){
+    var action = ['enable','disable'][self.enabled() << 0], el = $(event.currentTarget);
+    confirm("Confirm "+action, "Are you sure you want to " + action + " this table?", function() //gotta i18n this!
+    {
+      el.showIndicator();
+      return self[action](el).complete(function()
+      {
+        el.hideIndicator();
+      });
+    });
+  };
+  self.enable = function(el)
+  {
+    return API.queryCluster('enableTable',self.name).complete(function()
+    {
+      self.enabled(true);
+    });
+  };
+  self.disable = function(el)
+  {
+    return API.queryCluster('disableTable',self.name).complete(function()
+    {
+      self.enabled(false);
+    });
+  };
+  self.drop = function(el)
+  {
+    return API.queryCluster('deleteTable',self.name);
+  };
+};
+
+var QuerySetPeice = function(options)
+{
+  var self = this;
+  options = ko.utils.extend({
+    row_key: "null",
+    scan_length: 1,
+    prefix: false,
+    columns: [],
+    onValidate: function(){}
+  }, options);
+  BaseModel.apply(self,[options]);
+
+  self.row_key = ko.observable(options.row_key);
+  self.scan_length = ko.observable(options.scan_length);
+  self.columns = ko.observableArray(options.columns);
+  self.prefix = ko.observable(options.prefix);
+  self.editing = ko.observable(true);
+
+  self.validate = function()
+  {
+    if(self.scan_length() <= 0 || self.row_key() == "")
+      return app.views.tabledata.querySet.remove(self); //change later
+    return options.onValidate();
+  };
+  self.row_key.subscribe(self.validate.bind());
+  self.scan_length.subscribe(self.validate.bind());
+};
+
+var ColumnFamily = function(options)
+{
+  this.name = options.name;
+  this.enabled = ko.observable(options.enabled);
+  this.toggle = function()
+  {
+    this.enabled(!this.enabled());
+    app.views.tabledata.reload();
+  };
+}
+
+
+//tagsearch
+var tagsearch = function()
+{
+  var self = this;
+  self.tags = ko.observableArray();
+  self.mode = ko.observable('idle');
+  self.cur_input = ko.observable('');
+  self.hints = ko.observableArray([
+    {
+      hint: 'End Query',
+      shortcut: ',',
+      mode: ['rowkey', 'prefix', 'scan'],
+      selected: false
+    },
+    {
+      hint: 'Mark Row Prefix',
+      shortcut: '*',
+      mode: ['rowkey'],
+      selected: false
+    },
+    {
+      hint: 'Start Scan',
+      shortcut: '+',
+      mode: ['rowkey', 'prefix'],
+      selected: false
+    },
+    {
+      hint: 'Start Select Columns',
+      shortcut: '[',
+      mode: ['rowkey', 'prefix'],
+      selected: false
+    },
+    {
+      hint: 'End Column/Family',
+      shortcut: ',',
+      mode: ['columns'],
+      selected: false
+    },
+    {
+      hint: 'End Select Columns',
+      shortcut: ']',
+      mode: ['columns'],
+      selected: false
+    }
+  ]);
+  self.activeHints = ko.computed(function()
+  {
+    var ret = [];
+    $(self.hints()).each(function(i, hint)
+    {
+      if (hint.mode.indexOf(self.mode()) > -1)
+        ret.push(hint);
+    });
+    return ret;
+  });
+  self.activeHint = ko.observable(-1);
+  self.modes =
+  {
+    'rowkey': {
+      hint: 'Row Key Value',
+      type: 'String'
+    },
+    'scan': {
+      hint: 'Length of Scan or Row Key',
+      type: 'Integer'
+    },
+    'columns': {
+      hint: 'Column Family: Column Name',
+      type: 'String'
+    },
+    'prefix': {
+      hint: 'Rows starting with',
+      type: 'String'
+    }
+  }
+
+  self.modeQueue = ['idle'];
+  self.focused = ko.observable(false);
+
+  self.insertTag = function(tag)
+  {
+    var mode = tag.indexOf('+') != -1 ? 'scan' : 'rowkey';
+    var tag = {value: tag, tag: mode} //parse mode
+    self.tags.push(tag);
+  }
+
+  self.render = function(input, renderers)
+  {
+    var keys = Object.keys(renderers);
+    for(var i=0; i<keys.length; i++)
+    {
+      input = input.replace(renderers[keys[i]].select, function(selected)
+      {
+        var hasMatched = false;
+        var processed = selected.replace(renderers[keys[i]].tag, function(tagged)
+        {
+          hasMatched = true;
+          return " <span class='" + keys[i] + " tagsearchTag' title='" + keys[i] + "' data-toggle='tooltip'>" + ('nested' in renderers[keys[i]] ? self.render(tagged, renderers[keys[i]].nested) : tagged).trim() + "</span> ";
+        });
+        if(hasMatched)
+          processed = processed.replace(renderers[keys[i]].strip, '');
+        return processed;
+      });
+    }
+    return input;
+  };
+
+
+  self.updateMode = function(value)
+  {
+    var selection = value.slice(0, self.selectionEnd());
+    var endindex = selection.slice(selection.lastIndexOf(',')).indexOf(',');
+    if(endindex == -1) endindex = selection.length;
+    var lastbit = value.substring(selection.lastIndexOf(','), endindex).trim();
+    if(lastbit == "," || lastbit == "")
+    {
+      self.mode('idle');
+      return;
+    }
+    var tokens = "[]+,-";
+    var m = 'rowkey';
+    for(var i=selection.length - 1; i>=0; i--)
+    {
+      if(tokens.indexOf(selection[i]) != -1)
+      {
+        if(selection[i] == '[')
+          m = 'columns';
+        else if(selection[i] == ']')
+          m = 'rowkey';
+        else if(selection[i] == '+')
+          m = 'scan';
+        else if(selection[i] == '-')
+          m = 'prefix';
+        break;
+      }
+    }
+    self.mode(m.trim());
+  };
+
+  self.selectionStart = ko.observable(0);
+  self.selectionEnd = ko.observable(0);
+
+  self.renderedValue = ko.computed(function()
+  {
+    var pre = self.cur_input();
+    var s = self.selectionStart(), e = self.selectionEnd();
+    var indicator = (self.focused()) ? '<i class="tagIndicator">|</i>' : '';
+    self.updateMode(self.cur_input());
+    return self.render(pre.slice(0, e) + indicator + pre.slice(e), searchRenderers);
+  });
+
+  self.hintText = ko.computed(function()
+  {
+    var value = self.cur_input();
+    var selection = value.slice(0, self.selectionEnd());
+    var index = selection.lastIndexOf(',') + 1;
+    var endindex = value.slice(index).indexOf(',');
+    endindex = endindex == -1 ? value.length : endindex;
+    var pre = value.substring(index, index + endindex);
+    var s = self.selectionStart() - index, e = self.selectionEnd() - index;
+    if(s == e)
+      e += 1;
+    s = s < 0 ? 0 : s;
+    e = e > pre.length ? pre.length : e;
+    return pre.slice(0, s) + "<span class='selection'>" + pre.slice(s, e) + "</span>" + pre.slice(e);
+  });
+
+  self.onKeyDown = function(target, ev)
+  {
+    self.selectionStart($('#tag-input')[0].selectionStart);
+    self.selectionEnd($('#tag-input')[0].selectionEnd);
+    if(ev.keyCode == 13 && self.cur_input().slice(self.cur_input().lastIndexOf(',')).trim() != ",")
+    {
+        self.evaluate();
+    }
+    return true;
+  }
+
+  self.evaluate = function()
+  {
+    app.views.tabledata.searchQuery(self.cur_input());
+  }
+};
+
+var CellHistoryPage = function(options)
+{
+  var self = this;
+
+  self.items = ko.observableArray(options.items);
+  self.loading = ko.observable(false);
+
+  self.reload = function(timestamp, append)
+  {
+    if(!timestamp)
+      timestamp = options.timestamp
+    API.queryTable("getVerTs", options.row, options.column, timestamp, 10, 'null').done(function(res)
+    {
+      self.loading = ko.observable(true);
+      if(!append)
+        self.items(res);
+      else
+        self.items(self.items() + res);
+      self.loading = ko.observable(false);
+    });
+  };
+};

+ 88 - 0
apps/hbase/static/js/nav.js

@@ -0,0 +1,88 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var Router =
+{
+  go: function(page)
+  {
+    if(!Views.render(page))
+      return history.back();
+    return page;
+  },
+  setTable: function(cluster, table)
+  {
+    Router.setCluster(cluster);
+    app.pageTitle(cluster + ' / ' + table);
+    app.views.tabledata.name(table);
+      app.views.tabledata.name(table);
+      app.focusModel(app.views.tabledata);
+  },
+  setCluster: function(cluster)
+  {
+    Router.set();
+    app.cluster(cluster);
+  },
+  set: function()
+  {
+      Breadcrumbs.render();
+  }
+}
+
+var Breadcrumbs =
+{
+  _selector_root:'#hbase-breadcrumbs',
+  //renders breadcrumbs automaticall
+  render:function(mutators)
+  {
+    root = $(Breadcrumbs._selector_root).html('');
+    crumbs = ['/hbase'].concat(document.URL.split('/').splice(4));
+    biglink = "";
+    for(i=0;i<crumbs.length;i++)
+    {
+      biglink += crumbs[i] + '/'
+      function clean_url(url)
+      {
+        replacers = {'/': '', '#': '', '_': ' ', '^[a-z]': function(a) { return a.toUpperCase(); }};
+        keys = Object.keys(replacers);
+        for(q=0;q<keys.length;q++)
+        {
+          url = url.replace(new RegExp(keys[q],'g'), replacers[keys[q]]);
+        }
+        return url;
+      }
+      if(crumbs[i]!="")
+        root.append('<li><a href="' + biglink + '">' + clean_url(crumbs[i]) + '</a></li><li><a href="' + biglink + '">/</a></li>');
+    }
+    return root.find('li:last-child').remove();
+  }
+}
+
+var Views =
+{
+  render:function(view)
+  {
+    page = $('.hbase-page#hbase-page-' + view);
+    if(!page)
+      return false;
+    $('.hbase-page.active').removeClass('active');
+    page.addClass('active');
+    return page;
+  },
+  displayError:function(error)
+  {
+    console.log(error);
+  }
+}

+ 245 - 0
apps/hbase/static/js/utils.js

@@ -0,0 +1,245 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. 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.
+
+var utils =
+{
+  //take an element with mustache templates as content and re-render
+  renderElement:function(element,data)
+  {
+    element.html(Mustache.render(element.html(), data));
+  },
+  renderElements:function(selector,data)
+  {
+    if(selector == null || typeof(selector) == "undefined")
+      selector = '';
+    $(selector).each(function()
+    {
+      utils._renderElement(this);
+    });
+  },
+  renderPage:function(page_selector,data)
+  {
+    return utils.renderElements('.' + PAGE_TEMPLATE_PREFIX + page_selector,data);
+  },
+  setTitle:function(title)
+  {
+    $('.page-title').text(title);
+    return this;
+  },
+  getTitle:function()
+  {
+    return $('.page-title').text();
+  }
+}
+
+
+function hashToArray(hash)
+{
+  var keys = Object.keys(hash);
+  var output = [];
+  for(var i=0;i<keys.length;i++)
+  {
+    output.push({'key':keys[i],'value':hash[keys[i]]});
+  }
+  return output;
+}
+
+function stringHashColor(str) {
+  var r = 0, g = 0, b = 0, a = 0;
+  for(var i=0;i<str.length;i++)
+  {
+    var c = str.charCodeAt(i);
+    a += c;
+    r += Math.floor(Math.abs(Math.sin(c)) * a);
+    g += Math.floor(Math.abs(Math.cos(c)) * a);
+    b += Math.floor(Math.abs(Math.tan(c)) * a);
+  }
+    return 'rgb('+(r%190)+','+(g%190)+','+(b%190)+')'; //always keep values under 180, to keep it darker
+}
+
+function scrollTo(posY)
+{
+  $('html, body').animate({scrollTop: posY - 120}, 400);
+}
+
+function lockClickOrigin(func, origin)
+{
+  return function(target, ev)
+  {
+    if(origin != ev.target)
+      return function(){};
+    return func(target, ev);
+  };
+}
+
+function confirm(title, text, callback)
+{
+  var modal = $('#confirm-modal');
+  ko.cleanNode(modal[0]);
+  modal.attr('data-bind','template: {name: "confirm_template"}');
+  ko.applyBindings({
+    title: title,
+    text: text
+  }, modal[0]);
+  modal.find('.confirm-submit').click(callback);
+  modal.modal('show');
+}
+
+function launchModal(modal, data)
+{
+  var element = $('#'+modal);
+  ko.cleanNode(element[0]);
+  element.attr('data-bind','template: {name: "'+modal+'_template"}');
+  ko.applyBindings(data, element[0]);
+  element.is('.ajaxSubmit') ? element.submit(bindSubmit) : '';
+  switch(modal)
+  {
+    case 'cell_edit_modal':
+      if(data.mime.split('/')[0] == 'text')
+      {
+        var target = document.getElementById('codemirror_target');
+        var mime = data.mime;
+        if(mime == "text/json")
+        {
+          mime = {name: "javascript", json: true};
+        }
+            var cm = CodeMirror.fromTextArea(target, {
+              mode: mime,
+            tabMode: 'indent',
+            lineNumbers: true
+            });
+            setTimeout(function(){cm.refresh()}, 401); //CM invis bug workaround
+            element.find('input[type=submit]').click(function()
+            {
+              cm.save();
+            });
+          }
+          app.focusModel(data.content);
+      data.content.history.reload();
+      break;
+  }
+  element.modal('show');
+  logGA('#' + modal);
+}
+
+function parseXML(xml)
+{
+  var parser, xmlDoc;
+  if (window.DOMParser)
+  {
+     parser = new DOMParser();
+      xmlDoc = parser.parseFromString(xml,"text/xml");
+  }
+  else
+    {
+    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
+    xmlDoc.async = false;
+    xmlDoc.loadXML(xml);
+    }
+    return new XMLSerializer().serializeToString(xmlDoc);
+}
+
+function detectMimeType(data)
+{
+  var MIME_TESTS =
+  {
+    'type/null':function(data){return !data;},
+    'type/int':function(data){return !isNaN(parseInt(data));},
+    'text/json':function(data)
+    {
+      try
+      {
+        return JSON.parse(data);
+      }
+      catch(err){}
+    },
+    'text/xml':function(data)
+    {
+      return parseXML(data).indexOf('parsererror') == -1;
+    }
+  }
+  var keys = Object.keys(MIME_TESTS);
+  for(var i=0;i<keys.length;i++)
+  {
+    if(MIME_TESTS[keys[i]](data))
+      return keys[i];
+  }
+  //images
+  var types = ['image/png','image/gif','image/jpg','application/pdf']
+  var b64 = ['iVBORw','R0lG','/9j/','JVBERi']
+  try
+  {
+    var decoded = atob(data).toLowerCase().trim();
+    for(var i=0;i<types.length;i++)
+    {
+      var location = decoded.indexOf(types[i].split('/')[1]);
+      if(location >= 0 && location<10) //stupid guess
+        return types[i];
+    }
+  }
+  catch(error)
+  {
+  }
+  for(var i=0;i<types.length;i++)
+  {
+    if(data.indexOf(b64[i]) >= 0 && data.indexOf(b64[i]) <= 10)
+      return types[i];
+  }
+  return 'type/null';
+}
+
+function convertTimestamp(timestamp)
+{
+  var date = new Date(parseInt(timestamp)*1000);
+  return date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
+}
+
+function resetElements()
+{
+  $(window).scroll(function(e)
+  {
+    $(".subnav.sticky").each(function()
+    {
+      var padder = $(this).data('padder'), top = $(this).position().top;
+      if(padder && top <= padder.position().top)
+      {
+        $(this).removeClass('subnav-fixed').data('padder').remove();
+        $(this).removeData('padder');
+      }
+      else if(!padder && top <= window.scrollY + $('.navbar').outerHeight())
+      {
+        $(this).addClass('subnav-fixed').data('padder',$('<div></div>').insertBefore($(this)).css('height',$(this).outerHeight()));
+      }
+    });
+  });
+};
+
+function prepForTransport(value)
+{
+  value = value.replace(/\"/g,'\\"').replace(/\//g,'\\/');
+  if(isNaN(parseInt(value)) && value.trim() != '')
+    value = '"'+value+'"';
+  return encodeURIComponent(value);
+};
+
+function logGA(postfix)
+{
+  if(postfix == null)
+    postfix = ""
+  if (typeof _gaq != 'undefined' && _gaq != null && _gaq != undefined){
+       _gaq.push(['_trackPageview', '/hbase/' + document.URL.slice(document.URL.indexOf('/hbase')) + postfix]);
+    }
+};

+ 915 - 0
apps/hbase/thrift/Hbase.thrift

@@ -0,0 +1,915 @@
+/*
+ * 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.
+ */
+
+// ----------------------------------------------------------------
+// Hbase.thrift
+//
+// This is a Thrift interface definition file for the Hbase service.
+// Target language libraries for C++, Java, Ruby, PHP, (and more) are
+// generated by running this file through the Thrift compiler with the
+// appropriate flags. The Thrift compiler binary and runtime
+// libraries for various languages are available
+// from the Apache Incubator (http://incubator.apache.org/thrift/)
+//
+// See the package.html file for information on the version of Thrift
+// used to generate the *.java files checked into the Hbase project.
+// ----------------------------------------------------------------
+
+namespace java org.apache.hadoop.hbase.thrift.generated
+namespace cpp  apache.hadoop.hbase.thrift
+namespace rb Apache.Hadoop.Hbase.Thrift
+namespace py hbased
+namespace perl Hbased
+namespace php Hbased
+//
+// Types
+//
+
+// NOTE: all variables with the Text type are assumed to be correctly
+// formatted UTF-8 strings.  This is a programming language and locale
+// dependent property that the client application is repsonsible for
+// maintaining.  If strings with an invalid encoding are sent, an
+// IOError will be thrown.
+
+typedef binary Text
+typedef binary Bytes
+typedef i32    ScannerID
+
+/**
+ * TCell - Used to transport a cell value (byte[]) and the timestamp it was 
+ * stored with together as a result for get and getRow methods. This promotes
+ * the timestamp of a cell to a first-class value, making it easy to take 
+ * note of temporal data. Cell is used all the way from HStore up to HTable.
+ */
+struct TCell{
+  1:Bytes value,
+  2:i64 timestamp
+}
+
+/**
+ * An HColumnDescriptor contains information about a column family
+ * such as the number of versions, compression settings, etc. It is
+ * used as input when creating a table or adding a column.
+ */
+struct ColumnDescriptor {
+  1:Text name,
+  2:i32 maxVersions = 3,
+  3:string compression = "NONE",
+  4:bool inMemory = 0,
+  5:string bloomFilterType = "NONE",
+  6:i32 bloomFilterVectorSize = 0,
+  7:i32 bloomFilterNbHashes = 0,
+  8:bool blockCacheEnabled = 0,
+  9:i32 timeToLive = -1
+}
+
+/**
+ * A TRegionInfo contains information about an HTable region.
+ */
+struct TRegionInfo {
+  1:Text startKey,
+  2:Text endKey,
+  3:i64 id,
+  4:Text name,
+  5:byte version,
+  6:Text serverName,
+  7:i32 port
+}
+
+/**
+ * A Mutation object is used to either update or delete a column-value.
+ */
+struct Mutation {
+  1:bool isDelete = 0,
+  2:Text column,
+  3:Text value,
+  4:bool writeToWAL = 1
+}
+
+
+/**
+ * A BatchMutation object is used to apply a number of Mutations to a single row.
+ */
+struct BatchMutation {
+  1:Text row,
+  2:list<Mutation> mutations
+}
+
+/**
+ * For increments that are not incrementColumnValue
+ * equivalents.
+ */
+struct TIncrement {
+  1:Text table,
+  2:Text row,
+  3:Text column,
+  4:i64  ammount
+}
+
+/**
+ * Holds row name and then a map of columns to cells. 
+ */
+struct TRowResult {
+  1:Text row,
+  2:map<Text, TCell> columns
+}
+
+/**
+ * A Scan object is used to specify scanner parameters when opening a scanner.
+ */
+struct TScan {
+  1:optional Text startRow,
+  2:optional Text stopRow,
+  3:optional i64 timestamp,
+  4:optional list<Text> columns,
+  5:optional i32 caching,
+  6:optional Text filterString,
+  7:optional i32 batchSize
+}
+
+//
+// Exceptions
+//
+/**
+ * An IOError exception signals that an error occurred communicating
+ * to the Hbase master or an Hbase region server.  Also used to return
+ * more general Hbase error conditions.
+ */
+exception IOError {
+  1:string message
+}
+
+/**
+ * An IllegalArgument exception indicates an illegal or invalid
+ * argument was passed into a procedure.
+ */
+exception IllegalArgument {
+  1:string message
+}
+
+/**
+ * An AlreadyExists exceptions signals that a table with the specified
+ * name already exists
+ */
+exception AlreadyExists {
+  1:string message
+}
+
+//
+// Service 
+//
+
+service Hbase {
+  /**
+   * Brings a table on-line (enables it)
+   */
+  void enableTable(
+    /** name of the table */
+    1:Bytes tableName
+  ) throws (1:IOError io)
+    
+  /**
+   * Disables a table (takes it off-line) If it is being served, the master
+   * will tell the servers to stop serving it.
+   */
+  void disableTable(
+    /** name of the table */
+    1:Bytes tableName
+  ) throws (1:IOError io)
+
+  /**
+   * @return true if table is on-line
+   */
+  bool isTableEnabled(
+    /** name of the table to check */
+    1:Bytes tableName
+  ) throws (1:IOError io)
+    
+  void compact(1:Bytes tableNameOrRegionName)
+    throws (1:IOError io)
+  
+  void majorCompact(1:Bytes tableNameOrRegionName)
+    throws (1:IOError io)
+    
+  /**
+   * List all the userspace tables.
+   *
+   * @return returns a list of names
+   */
+  list<Text> getTableNames()
+    throws (1:IOError io)
+
+  /**
+   * List all the column families assoicated with a table.
+   *
+   * @return list of column family descriptors
+   */
+  map<Text,ColumnDescriptor> getColumnDescriptors (
+    /** table name */
+    1:Text tableName
+  ) throws (1:IOError io)
+
+  /**
+   * List the regions associated with a table.
+   *
+   * @return list of region descriptors
+   */
+  list<TRegionInfo> getTableRegions(
+    /** table name */
+    1:Text tableName)
+    throws (1:IOError io)
+
+  /**
+   * Create a table with the specified column families.  The name
+   * field for each ColumnDescriptor must be set and must end in a
+   * colon (:). All other fields are optional and will get default
+   * values if not explicitly specified.
+   *
+   * @throws IllegalArgument if an input parameter is invalid
+   *
+   * @throws AlreadyExists if the table name already exists
+   */
+  void createTable(
+    /** name of table to create */
+    1:Text tableName,
+
+    /** list of column family descriptors */
+    2:list<ColumnDescriptor> columnFamilies
+  ) throws (1:IOError io, 2:IllegalArgument ia, 3:AlreadyExists exist)
+
+  /**
+   * Deletes a table
+   *
+   * @throws IOError if table doesn't exist on server or there was some other
+   * problem
+   */
+  void deleteTable(
+    /** name of table to delete */
+    1:Text tableName
+  ) throws (1:IOError io)
+
+  /** 
+   * Get a single TCell for the specified table, row, and column at the
+   * latest timestamp. Returns an empty list if no such value exists.
+   *
+   * @return value for specified row/column
+   */
+  list<TCell> get(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** column name */
+    3:Text column,
+
+    /** Get attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get the specified number of versions for the specified table,
+   * row, and column.
+   *
+   * @return list of cells for specified row/column
+   */
+  list<TCell> getVer(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** column name */
+    3:Text column,
+
+    /** number of versions to retrieve */
+    4:i32 numVersions,
+
+    /** Get attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get the specified number of versions for the specified table,
+   * row, and column.  Only versions less than or equal to the specified
+   * timestamp will be returned.
+   *
+   * @return list of cells for specified row/column
+   */
+  list<TCell> getVerTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** column name */
+    3:Text column,
+
+    /** timestamp */
+    4:i64 timestamp,
+
+    /** number of versions to retrieve */
+    5:i32 numVersions,
+
+    /** Get attributes */
+    6:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get all the data for the specified table and row at the latest
+   * timestamp. Returns an empty list if the row does not exist.
+   * 
+   * @return TRowResult containing the row and map of columns to TCells
+   */
+  list<TRowResult> getRow(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** Get attributes */
+    3:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get the specified columns for the specified table and row at the latest
+   * timestamp. Returns an empty list if the row does not exist.
+   * 
+   * @return TRowResult containing the row and map of columns to TCells
+   */
+  list<TRowResult> getRowWithColumns(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** List of columns to return, null for all columns */
+    3:list<Text> columns,
+
+    /** Get attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get all the data for the specified table and row at the specified
+   * timestamp. Returns an empty list if the row does not exist.
+   * 
+   * @return TRowResult containing the row and map of columns to TCells
+   */
+  list<TRowResult> getRowTs(
+    /** name of the table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** timestamp */
+    3:i64 timestamp,
+
+    /** Get attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+    
+  /** 
+   * Get the specified columns for the specified table and row at the specified
+   * timestamp. Returns an empty list if the row does not exist.
+   * 
+   * @return TRowResult containing the row and map of columns to TCells
+   */
+  list<TRowResult> getRowWithColumnsTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** List of columns to return, null for all columns */
+    3:list<Text> columns,
+    4:i64 timestamp,
+
+    /** Get attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Get all the data for the specified table and rows at the latest
+   * timestamp. Returns an empty list if no rows exist.
+   *
+   * @return TRowResult containing the rows and map of columns to TCells
+   */
+  list<TRowResult> getRows(
+    /** name of table */
+    1:Text tableName,
+
+    /** row keys */
+    2:list<Text> rows
+
+    /** Get attributes */
+    3:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Get the specified columns for the specified table and rows at the latest
+   * timestamp. Returns an empty list if no rows exist.
+   *
+   * @return TRowResult containing the rows and map of columns to TCells
+   */
+  list<TRowResult> getRowsWithColumns(
+    /** name of table */
+    1:Text tableName,
+
+    /** row keys */
+    2:list<Text> rows,
+
+    /** List of columns to return, null for all columns */
+    3:list<Text> columns,
+
+    /** Get attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Get all the data for the specified table and rows at the specified
+   * timestamp. Returns an empty list if no rows exist.
+   *
+   * @return TRowResult containing the rows and map of columns to TCells
+   */
+  list<TRowResult> getRowsTs(
+    /** name of the table */
+    1:Text tableName,
+
+    /** row keys */
+    2:list<Text> rows
+
+    /** timestamp */
+    3:i64 timestamp,
+
+    /** Get attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Get the specified columns for the specified table and rows at the specified
+   * timestamp. Returns an empty list if no rows exist.
+   *
+   * @return TRowResult containing the rows and map of columns to TCells
+   */
+  list<TRowResult> getRowsWithColumnsTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** row keys */
+    2:list<Text> rows
+
+    /** List of columns to return, null for all columns */
+    3:list<Text> columns,
+    4:i64 timestamp,
+
+    /** Get attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Apply a series of mutations (updates/deletes) to a row in a
+   * single transaction.  If an exception is thrown, then the
+   * transaction is aborted.  Default current timestamp is used, and
+   * all entries will have an identical timestamp.
+   */
+  void mutateRow(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** list of mutation commands */
+    3:list<Mutation> mutations,
+
+    /** Mutation attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /** 
+   * Apply a series of mutations (updates/deletes) to a row in a
+   * single transaction.  If an exception is thrown, then the
+   * transaction is aborted.  The specified timestamp is used, and
+   * all entries will have an identical timestamp.
+   */
+  void mutateRowTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** list of mutation commands */
+    3:list<Mutation> mutations,
+
+    /** timestamp */
+    4:i64 timestamp,
+
+    /** Mutation attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /** 
+   * Apply a series of batches (each a series of mutations on a single row)
+   * in a single transaction.  If an exception is thrown, then the
+   * transaction is aborted.  Default current timestamp is used, and
+   * all entries will have an identical timestamp.
+   */
+  void mutateRows(
+    /** name of table */
+    1:Text tableName,
+
+    /** list of row batches */
+    2:list<BatchMutation> rowBatches,
+
+    /** Mutation attributes */
+    3:map<Text, Text> attributes
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /** 
+   * Apply a series of batches (each a series of mutations on a single row)
+   * in a single transaction.  If an exception is thrown, then the
+   * transaction is aborted.  The specified timestamp is used, and
+   * all entries will have an identical timestamp.
+   */
+  void mutateRowsTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** list of row batches */
+    2:list<BatchMutation> rowBatches,
+
+    /** timestamp */
+    3:i64 timestamp,
+
+    /** Mutation attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /**
+   * Atomically increment the column value specified.  Returns the next value post increment.
+   */
+  i64 atomicIncrement(
+    /** name of table */
+    1:Text tableName,
+
+    /** row to increment */
+    2:Text row,
+
+    /** name of column */
+    3:Text column,
+
+    /** amount to increment by */
+    4:i64 value
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+    
+  /** 
+   * Delete all cells that match the passed row and column.
+   */
+  void deleteAll(
+    /** name of table */
+    1:Text tableName,
+
+    /** Row to update */
+    2:Text row,
+
+    /** name of column whose value is to be deleted */
+    3:Text column,
+
+    /** Delete attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Delete all cells that match the passed row and column and whose
+   * timestamp is equal-to or older than the passed timestamp.
+   */
+  void deleteAllTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** Row to update */
+    2:Text row,
+
+    /** name of column whose value is to be deleted */
+    3:Text column,
+
+    /** timestamp */
+    4:i64 timestamp,
+
+    /** Delete attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Completely delete the row's cells.
+   */
+  void deleteAllRow(
+    /** name of table */
+    1:Text tableName,
+
+    /** key of the row to be completely deleted. */
+    2:Text row,
+
+    /** Delete attributes */
+    3:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Increment a cell by the ammount.
+   * Increments can be applied async if hbase.regionserver.thrift.coalesceIncrement is set to true.
+   * False is the default.  Turn to true if you need the extra performance and can accept some
+   * data loss if a thrift server dies with increments still in the queue.
+   */
+  void increment(
+    /** The single increment to apply */
+    1:TIncrement increment
+  ) throws (1:IOError io)
+
+
+  void incrementRows(
+    /** The list of increments */
+    1:list<TIncrement> increments
+  ) throws (1:IOError io)
+
+  /**
+   * Completely delete the row's cells marked with a timestamp
+   * equal-to or older than the passed timestamp.
+   */
+  void deleteAllRowTs(
+    /** name of table */
+    1:Text tableName,
+
+    /** key of the row to be completely deleted. */
+    2:Text row,
+
+    /** timestamp */
+    3:i64 timestamp,
+
+    /** Delete attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Get a scanner on the current table, using the Scan instance
+   * for the scan parameters.
+   */
+  ScannerID scannerOpenWithScan(
+    /** name of table */
+    1:Text tableName,
+
+    /** Scan instance */
+    2:TScan scan,
+
+    /** Scan attributes */
+    3:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get a scanner on the current table starting at the specified row and
+   * ending at the last row in the table.  Return the specified columns.
+   *
+   * @return scanner id to be used with other scanner procedures
+   */
+  ScannerID scannerOpen(
+    /** name of table */
+    1:Text tableName,
+
+    /**
+     * Starting row in table to scan.
+     * Send "" (empty string) to start at the first row.
+     */
+    2:Text startRow,
+
+    /**
+     * columns to scan. If column name is a column family, all
+     * columns of the specified column family are returned. It's also possible
+     * to pass a regex in the column qualifier.
+     */
+    3:list<Text> columns,
+
+    /** Scan attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get a scanner on the current table starting and stopping at the
+   * specified rows.  ending at the last row in the table.  Return the
+   * specified columns.
+   *
+   * @return scanner id to be used with other scanner procedures
+   */
+  ScannerID scannerOpenWithStop(
+    /** name of table */
+    1:Text tableName,
+
+    /**
+     * Starting row in table to scan.
+     * Send "" (empty string) to start at the first row.
+     */
+    2:Text startRow,
+
+    /**
+     * row to stop scanning on. This row is *not* included in the
+     * scanner's results
+     */
+    3:Text stopRow,
+
+    /**
+     * columns to scan. If column name is a column family, all
+     * columns of the specified column family are returned. It's also possible
+     * to pass a regex in the column qualifier.
+     */
+    4:list<Text> columns,
+
+    /** Scan attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Open a scanner for a given prefix.  That is all rows will have the specified
+   * prefix. No other rows will be returned.
+   *
+   * @return scanner id to use with other scanner calls
+   */
+  ScannerID scannerOpenWithPrefix(
+    /** name of table */
+    1:Text tableName,
+
+    /** the prefix (and thus start row) of the keys you want */
+    2:Text startAndPrefix,
+
+    /** the columns you want returned */
+    3:list<Text> columns,
+
+    /** Scan attributes */
+    4:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get a scanner on the current table starting at the specified row and
+   * ending at the last row in the table.  Return the specified columns.
+   * Only values with the specified timestamp are returned.
+   *
+   * @return scanner id to be used with other scanner procedures
+   */
+  ScannerID scannerOpenTs(
+    /** name of table */
+    1:Text tableName,
+
+    /**
+     * Starting row in table to scan.
+     * Send "" (empty string) to start at the first row.
+     */
+    2:Text startRow,
+
+    /**
+     * columns to scan. If column name is a column family, all
+     * columns of the specified column family are returned. It's also possible
+     * to pass a regex in the column qualifier.
+     */
+    3:list<Text> columns,
+
+    /** timestamp */
+    4:i64 timestamp,
+
+    /** Scan attributes */
+    5:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /** 
+   * Get a scanner on the current table starting and stopping at the
+   * specified rows.  ending at the last row in the table.  Return the
+   * specified columns.  Only values with the specified timestamp are
+   * returned.
+   *
+   * @return scanner id to be used with other scanner procedures
+   */
+  ScannerID scannerOpenWithStopTs(
+    /** name of table */
+    1:Text tableName,
+
+    /**
+     * Starting row in table to scan.
+     * Send "" (empty string) to start at the first row.
+     */
+    2:Text startRow,
+
+    /**
+     * row to stop scanning on. This row is *not* included in the
+     * scanner's results
+     */
+    3:Text stopRow,
+
+    /**
+     * columns to scan. If column name is a column family, all
+     * columns of the specified column family are returned. It's also possible
+     * to pass a regex in the column qualifier.
+     */
+    4:list<Text> columns,
+
+    /** timestamp */
+    5:i64 timestamp,
+
+    /** Scan attributes */
+    6:map<Text, Text> attributes
+  ) throws (1:IOError io)
+
+  /**
+   * Returns the scanner's current row value and advances to the next
+   * row in the table.  When there are no more rows in the table, or a key
+   * greater-than-or-equal-to the scanner's specified stopRow is reached,
+   * an empty list is returned.
+   *
+   * @return a TRowResult containing the current row and a map of the columns to TCells.
+   *
+   * @throws IllegalArgument if ScannerID is invalid
+   *
+   * @throws NotFound when the scanner reaches the end
+   */
+  list<TRowResult> scannerGet(
+    /** id of a scanner returned by scannerOpen */
+    1:ScannerID id
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /**
+   * Returns, starting at the scanner's current row value nbRows worth of
+   * rows and advances to the next row in the table.  When there are no more 
+   * rows in the table, or a key greater-than-or-equal-to the scanner's 
+   * specified stopRow is reached,  an empty list is returned.
+   *
+   * @return a TRowResult containing the current row and a map of the columns to TCells.
+   *
+   * @throws IllegalArgument if ScannerID is invalid
+   *
+   * @throws NotFound when the scanner reaches the end
+   */
+  list<TRowResult> scannerGetList(
+    /** id of a scanner returned by scannerOpen */
+    1:ScannerID id,
+
+    /** number of results to return */
+    2:i32 nbRows
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /**
+   * Closes the server-state associated with an open scanner.
+   *
+   * @throws IllegalArgument if ScannerID is invalid
+   */
+  void scannerClose(
+    /** id of a scanner returned by scannerOpen */
+    1:ScannerID id
+  ) throws (1:IOError io, 2:IllegalArgument ia)
+
+  /**
+   * Get the row just before the specified one.
+   *
+   * @return value for specified row/column
+   */
+  list<TCell> getRowOrBefore(
+    /** name of table */
+    1:Text tableName,
+
+    /** row key */
+    2:Text row,
+
+    /** column name */
+    3:Text family
+  ) throws (1:IOError io)
+
+  /**
+   * Get the regininfo for the specified row. It scans
+   * the metatable to find region's start and end keys.
+   *
+   * @return value for specified row/column
+   */
+  TRegionInfo getRegionInfo(
+    /** row key */
+    1:Text row,
+
+  ) throws (1:IOError io)
+}

+ 13 - 0
desktop/conf.dist/hue.ini

@@ -486,6 +486,19 @@
   ## impala_principal=impala/hostname.foo.com
 
 
+###########################################################################
+# Settings to configure Hbase
+###########################################################################
+
+[hbase]
+  # Comma-separated list of HBase Thrift servers for
+  # clusters in the format of '(name|host:port)'.
+  ## hbase_clusters=(Cluster|localhost:9090)
+
+  # Hard limit of rows or columns per row fetched before truncating.
+  ## truncate_limit = 500
+
+
 ###########################################################################
 # Settings to configure Solr Search
 ###########################################################################

+ 12 - 0
desktop/conf/pseudo-distributed.ini.tmpl

@@ -490,6 +490,18 @@
   ## impala_principal=impala/hostname.foo.com
 
 
+###########################################################################
+# Settings to configure Hbase
+###########################################################################
+
+[hbase]
+  # Comma-separated list of HBase Thrift servers for
+  # clusters in the format of '(name|host:port)'.
+  ## hbase_clusters=(Cluster|localhost:9090)
+
+  # Hard limit of rows or columns per row fetched before truncating.
+  ## truncate_limit = 500
+
 ###########################################################################
 # Settings to configure Solr Search
 ###########################################################################

+ 476 - 0
desktop/core/static/ext/js/codemirror-javascript.js

@@ -0,0 +1,476 @@
+// TODO actually recognize syntax of TypeScript constructs
+
+CodeMirror.defineMode("javascript", function(config, parserConfig) {
+  var indentUnit = config.indentUnit;
+  var statementIndent = parserConfig.statementIndent;
+  var jsonMode = parserConfig.json;
+  var isTS = parserConfig.typescript;
+
+  // Tokenizer
+
+  var keywords = function(){
+    function kw(type) {return {type: type, style: "keyword"};}
+    var A = kw("keyword a"), B = kw("keyword b"), C = kw("keyword c");
+    var operator = kw("operator"), atom = {type: "atom", style: "atom"};
+
+    var jsKeywords = {
+      "if": kw("if"), "while": A, "with": A, "else": B, "do": B, "try": B, "finally": B,
+      "return": C, "break": C, "continue": C, "new": C, "delete": C, "throw": C,
+      "var": kw("var"), "const": kw("var"), "let": kw("var"),
+      "function": kw("function"), "catch": kw("catch"),
+      "for": kw("for"), "switch": kw("switch"), "case": kw("case"), "default": kw("default"),
+      "in": operator, "typeof": operator, "instanceof": operator,
+      "true": atom, "false": atom, "null": atom, "undefined": atom, "NaN": atom, "Infinity": atom,
+      "this": kw("this")
+    };
+
+    // Extend the 'normal' keywords with the TypeScript language extensions
+    if (isTS) {
+      var type = {type: "variable", style: "variable-3"};
+      var tsKeywords = {
+        // object-like things
+        "interface": kw("interface"),
+        "class": kw("class"),
+        "extends": kw("extends"),
+        "constructor": kw("constructor"),
+
+        // scope modifiers
+        "public": kw("public"),
+        "private": kw("private"),
+        "protected": kw("protected"),
+        "static": kw("static"),
+
+        "super": kw("super"),
+
+        // types
+        "string": type, "number": type, "bool": type, "any": type
+      };
+
+      for (var attr in tsKeywords) {
+        jsKeywords[attr] = tsKeywords[attr];
+      }
+    }
+
+    return jsKeywords;
+  }();
+
+  var isOperatorChar = /[+\-*&%=<>!?|~^]/;
+
+  function chain(stream, state, f) {
+    state.tokenize = f;
+    return f(stream, state);
+  }
+
+  function nextUntilUnescaped(stream, end) {
+    var escaped = false, next;
+    while ((next = stream.next()) != null) {
+      if (next == end && !escaped)
+        return false;
+      escaped = !escaped && next == "\\";
+    }
+    return escaped;
+  }
+
+  // Used as scratch variables to communicate multiple values without
+  // consing up tons of objects.
+  var type, content;
+  function ret(tp, style, cont) {
+    type = tp; content = cont;
+    return style;
+  }
+
+  function jsTokenBase(stream, state) {
+    var ch = stream.next();
+    if (ch == '"' || ch == "'")
+      return chain(stream, state, jsTokenString(ch));
+    else if (/[\[\]{}\(\),;\:\.]/.test(ch))
+      return ret(ch);
+    else if (ch == "0" && stream.eat(/x/i)) {
+      stream.eatWhile(/[\da-f]/i);
+      return ret("number", "number");
+    }
+    else if (/\d/.test(ch) || ch == "-" && stream.eat(/\d/)) {
+      stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/);
+      return ret("number", "number");
+    }
+    else if (ch == "/") {
+      if (stream.eat("*")) {
+        return chain(stream, state, jsTokenComment);
+      }
+      else if (stream.eat("/")) {
+        stream.skipToEnd();
+        return ret("comment", "comment");
+      }
+      else if (state.lastType == "operator" || state.lastType == "keyword c" ||
+               /^[\[{}\(,;:]$/.test(state.lastType)) {
+        nextUntilUnescaped(stream, "/");
+        stream.eatWhile(/[gimy]/); // 'y' is "sticky" option in Mozilla
+        return ret("regexp", "string-2");
+      }
+      else {
+        stream.eatWhile(isOperatorChar);
+        return ret("operator", null, stream.current());
+      }
+    }
+    else if (ch == "#") {
+      stream.skipToEnd();
+      return ret("error", "error");
+    }
+    else if (isOperatorChar.test(ch)) {
+      stream.eatWhile(isOperatorChar);
+      return ret("operator", null, stream.current());
+    }
+    else {
+      stream.eatWhile(/[\w\$_]/);
+      var word = stream.current(), known = keywords.propertyIsEnumerable(word) && keywords[word];
+      return (known && state.lastType != ".") ? ret(known.type, known.style, word) :
+                     ret("variable", "variable", word);
+    }
+  }
+
+  function jsTokenString(quote) {
+    return function(stream, state) {
+      if (!nextUntilUnescaped(stream, quote))
+        state.tokenize = jsTokenBase;
+      return ret("string", "string");
+    };
+  }
+
+  function jsTokenComment(stream, state) {
+    var maybeEnd = false, ch;
+    while (ch = stream.next()) {
+      if (ch == "/" && maybeEnd) {
+        state.tokenize = jsTokenBase;
+        break;
+      }
+      maybeEnd = (ch == "*");
+    }
+    return ret("comment", "comment");
+  }
+
+  // Parser
+
+  var atomicTypes = {"atom": true, "number": true, "variable": true, "string": true, "regexp": true, "this": true};
+
+  function JSLexical(indented, column, type, align, prev, info) {
+    this.indented = indented;
+    this.column = column;
+    this.type = type;
+    this.prev = prev;
+    this.info = info;
+    if (align != null) this.align = align;
+  }
+
+  function inScope(state, varname) {
+    for (var v = state.localVars; v; v = v.next)
+      if (v.name == varname) return true;
+  }
+
+  function parseJS(state, style, type, content, stream) {
+    var cc = state.cc;
+    // Communicate our context to the combinators.
+    // (Less wasteful than consing up a hundred closures on every call.)
+    cx.state = state; cx.stream = stream; cx.marked = null, cx.cc = cc;
+
+    if (!state.lexical.hasOwnProperty("align"))
+      state.lexical.align = true;
+
+    while(true) {
+      var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement;
+      if (combinator(type, content)) {
+        while(cc.length && cc[cc.length - 1].lex)
+          cc.pop()();
+        if (cx.marked) return cx.marked;
+        if (type == "variable" && inScope(state, content)) return "variable-2";
+        return style;
+      }
+    }
+  }
+
+  // Combinator utils
+
+  var cx = {state: null, column: null, marked: null, cc: null};
+  function pass() {
+    for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]);
+  }
+  function cont() {
+    pass.apply(null, arguments);
+    return true;
+  }
+  function register(varname) {
+    function inList(list) {
+      for (var v = list; v; v = v.next)
+        if (v.name == varname) return true;
+      return false;
+    }
+    var state = cx.state;
+    if (state.context) {
+      cx.marked = "def";
+      if (inList(state.localVars)) return;
+      state.localVars = {name: varname, next: state.localVars};
+    } else {
+      if (inList(state.globalVars)) return;
+      state.globalVars = {name: varname, next: state.globalVars};
+    }
+  }
+
+  // Combinators
+
+  var defaultVars = {name: "this", next: {name: "arguments"}};
+  function pushcontext() {
+    cx.state.context = {prev: cx.state.context, vars: cx.state.localVars};
+    cx.state.localVars = defaultVars;
+  }
+  function popcontext() {
+    cx.state.localVars = cx.state.context.vars;
+    cx.state.context = cx.state.context.prev;
+  }
+  function pushlex(type, info) {
+    var result = function() {
+      var state = cx.state, indent = state.indented;
+      if (state.lexical.type == "stat") indent = state.lexical.indented;
+      state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info);
+    };
+    result.lex = true;
+    return result;
+  }
+  function poplex() {
+    var state = cx.state;
+    if (state.lexical.prev) {
+      if (state.lexical.type == ")")
+        state.indented = state.lexical.indented;
+      state.lexical = state.lexical.prev;
+    }
+  }
+  poplex.lex = true;
+
+  function expect(wanted) {
+    return function(type) {
+      if (type == wanted) return cont();
+      else if (wanted == ";") return pass();
+      else return cont(arguments.callee);
+    };
+  }
+
+  function statement(type) {
+    if (type == "var") return cont(pushlex("vardef"), vardef1, expect(";"), poplex);
+    if (type == "keyword a") return cont(pushlex("form"), expression, statement, poplex);
+    if (type == "keyword b") return cont(pushlex("form"), statement, poplex);
+    if (type == "{") return cont(pushlex("}"), block, poplex);
+    if (type == ";") return cont();
+    if (type == "if") return cont(pushlex("form"), expression, statement, poplex, maybeelse(cx.state.indented));
+    if (type == "function") return cont(functiondef);
+    if (type == "for") return cont(pushlex("form"), expect("("), pushlex(")"), forspec1, expect(")"),
+                                      poplex, statement, poplex);
+    if (type == "variable") return cont(pushlex("stat"), maybelabel);
+    if (type == "switch") return cont(pushlex("form"), expression, pushlex("}", "switch"), expect("{"),
+                                         block, poplex, poplex);
+    if (type == "case") return cont(expression, expect(":"));
+    if (type == "default") return cont(expect(":"));
+    if (type == "catch") return cont(pushlex("form"), pushcontext, expect("("), funarg, expect(")"),
+                                        statement, poplex, popcontext);
+    return pass(pushlex("stat"), expression, expect(";"), poplex);
+  }
+  function expression(type) {
+    return expressionInner(type, false);
+  }
+  function expressionNoComma(type) {
+    return expressionInner(type, true);
+  }
+  function expressionInner(type, noComma) {
+    var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma;
+    if (atomicTypes.hasOwnProperty(type)) return cont(maybeop);
+    if (type == "function") return cont(functiondef);
+    if (type == "keyword c") return cont(noComma ? maybeexpressionNoComma : maybeexpression);
+    if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop);
+    if (type == "operator") return cont(noComma ? expressionNoComma : expression);
+    if (type == "[") return cont(pushlex("]"), commasep(expressionNoComma, "]"), poplex, maybeop);
+    if (type == "{") return cont(pushlex("}"), commasep(objprop, "}"), poplex, maybeop);
+    return cont();
+  }
+  function maybeexpression(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expression);
+  }
+  function maybeexpressionNoComma(type) {
+    if (type.match(/[;\}\)\],]/)) return pass();
+    return pass(expressionNoComma);
+  }
+
+  function maybeoperatorComma(type, value) {
+    if (type == ",") return cont(expression);
+    return maybeoperatorNoComma(type, value, maybeoperatorComma);
+  }
+  function maybeoperatorNoComma(type, value, me) {
+    if (!me) me = maybeoperatorNoComma;
+    if (type == "operator") {
+      if (/\+\+|--/.test(value)) return cont(me);
+      if (value == "?") return cont(expression, expect(":"), expression);
+      return cont(expression);
+    }
+    if (type == ";") return;
+    if (type == "(") return cont(pushlex(")", "call"), commasep(expressionNoComma, ")"), poplex, me);
+    if (type == ".") return cont(property, me);
+    if (type == "[") return cont(pushlex("]"), expression, expect("]"), poplex, me);
+  }
+  function maybelabel(type) {
+    if (type == ":") return cont(poplex, statement);
+    return pass(maybeoperatorComma, expect(";"), poplex);
+  }
+  function property(type) {
+    if (type == "variable") {cx.marked = "property"; return cont();}
+  }
+  function objprop(type, value) {
+    if (type == "variable") {
+      cx.marked = "property";
+      if (value == "get" || value == "set") return cont(getterSetter);
+    } else if (type == "number" || type == "string") {
+      cx.marked = type + " property";
+    }
+    if (atomicTypes.hasOwnProperty(type)) return cont(expect(":"), expressionNoComma);
+  }
+  function getterSetter(type) {
+    if (type == ":") return cont(expression);
+    if (type != "variable") return cont(expect(":"), expression);
+    cx.marked = "property";
+    return cont(functiondef);
+  }
+  function commasep(what, end) {
+    function proceed(type) {
+      if (type == ",") {
+        var lex = cx.state.lexical;
+        if (lex.info == "call") lex.pos = (lex.pos || 0) + 1;
+        return cont(what, proceed);
+      }
+      if (type == end) return cont();
+      return cont(expect(end));
+    }
+    return function(type) {
+      if (type == end) return cont();
+      else return pass(what, proceed);
+    };
+  }
+  function block(type) {
+    if (type == "}") return cont();
+    return pass(statement, block);
+  }
+  function maybetype(type) {
+    if (type == ":") return cont(typedef);
+    return pass();
+  }
+  function typedef(type) {
+    if (type == "variable"){cx.marked = "variable-3"; return cont();}
+    return pass();
+  }
+  function vardef1(type, value) {
+    if (type == "variable") {
+      register(value);
+      return isTS ? cont(maybetype, vardef2) : cont(vardef2);
+    }
+    return pass();
+  }
+  function vardef2(type, value) {
+    if (value == "=") return cont(expressionNoComma, vardef2);
+    if (type == ",") return cont(vardef1);
+  }
+  function maybeelse(indent) {
+    return function(type, value) {
+      if (type == "keyword b" && value == "else") {
+        cx.state.lexical = new JSLexical(indent, 0, "form", null, cx.state.lexical);
+        return cont(statement, poplex);
+      }
+      return pass();
+    };
+  }
+  function forspec1(type) {
+    if (type == "var") return cont(vardef1, expect(";"), forspec2);
+    if (type == ";") return cont(forspec2);
+    if (type == "variable") return cont(formaybein);
+    return pass(expression, expect(";"), forspec2);
+  }
+  function formaybein(_type, value) {
+    if (value == "in") return cont(expression);
+    return cont(maybeoperatorComma, forspec2);
+  }
+  function forspec2(type, value) {
+    if (type == ";") return cont(forspec3);
+    if (value == "in") return cont(expression);
+    return pass(expression, expect(";"), forspec3);
+  }
+  function forspec3(type) {
+    if (type != ")") cont(expression);
+  }
+  function functiondef(type, value) {
+    if (type == "variable") {register(value); return cont(functiondef);}
+    if (type == "(") return cont(pushlex(")"), pushcontext, commasep(funarg, ")"), poplex, statement, popcontext);
+  }
+  function funarg(type, value) {
+    if (type == "variable") {register(value); return isTS ? cont(maybetype) : cont();}
+  }
+
+  // Interface
+
+  return {
+    startState: function(basecolumn) {
+      return {
+        tokenize: jsTokenBase,
+        lastType: null,
+        cc: [],
+        lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false),
+        localVars: parserConfig.localVars,
+        globalVars: parserConfig.globalVars,
+        context: parserConfig.localVars && {vars: parserConfig.localVars},
+        indented: 0
+      };
+    },
+
+    token: function(stream, state) {
+      if (stream.sol()) {
+        if (!state.lexical.hasOwnProperty("align"))
+          state.lexical.align = false;
+        state.indented = stream.indentation();
+      }
+      if (state.tokenize != jsTokenComment && stream.eatSpace()) return null;
+      var style = state.tokenize(stream, state);
+      if (type == "comment") return style;
+      state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type;
+      return parseJS(state, style, type, content, stream);
+    },
+
+    indent: function(state, textAfter) {
+      if (state.tokenize == jsTokenComment) return CodeMirror.Pass;
+      if (state.tokenize != jsTokenBase) return 0;
+      var firstChar = textAfter && textAfter.charAt(0), lexical = state.lexical;
+      if (lexical.type == "stat" && firstChar == "}") lexical = lexical.prev;
+      if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat")
+        lexical = lexical.prev;
+      var type = lexical.type, closing = firstChar == type;
+
+      if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? 4 : 0);
+      else if (type == "form" && firstChar == "{") return lexical.indented;
+      else if (type == "form") return lexical.indented + indentUnit;
+      else if (type == "stat")
+        return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? statementIndent || indentUnit : 0);
+      else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false)
+        return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);
+      else if (lexical.align) return lexical.column + (closing ? 0 : 1);
+      else return lexical.indented + (closing ? 0 : indentUnit);
+    },
+
+    electricChars: ":{}",
+    blockCommentStart: jsonMode ? null : "/*",
+    blockCommentEnd: jsonMode ? null : "*/",
+    lineComment: jsonMode ? null : "//",
+
+    jsonMode: jsonMode
+  };
+});
+
+CodeMirror.defineMIME("text/javascript", "javascript");
+CodeMirror.defineMIME("text/ecmascript", "javascript");
+CodeMirror.defineMIME("application/javascript", "javascript");
+CodeMirror.defineMIME("application/ecmascript", "javascript");
+CodeMirror.defineMIME("application/json", {name: "javascript", json: true});
+CodeMirror.defineMIME("application/x-json", {name: "javascript", json: true});
+CodeMirror.defineMIME("text/typescript", { name: "javascript", typescript: true });
+CodeMirror.defineMIME("application/typescript", { name: "javascript", typescript: true });