Source code for etcdb.cli

"""
Command line functions
"""
from __future__ import print_function

import readline
import sys
import time

import click
import pyetcd

import etcdb


[docs]def get_query(prompt): """ Get input from a user terminated by a semicolon and return a string. :param prompt: A prompt string. :type prompt: str :return: User input without a trailing semicolon. :rtype: str """ readline.parse_and_bind('set editing-mode vi') query = "" while True: line = raw_input(prompt) query += "%s " % line if ';' in line: break user_input = query.split(';', 1)[0] user_input = user_input.strip(' \n\t') return user_input
@click.command() @click.option('-h', '--host', help='Host to connect to etcd node', default='127.0.0.1', show_default=True) @click.option('-v', '--version', help='Show tool version and exit.', is_flag=True, default=False) def main(host, version): """ Read and execute user input. """ if version: print(etcdb.__version__) exit(0) print('Etcdb version %s, pyetcd version %s' % (etcdb.__version__, pyetcd.__version__)) prompt = 'etcd@%s> ' % host connection = etcdb.connect(host=host) cursor = connection.cursor() while True: query = get_query(prompt) if query == 'quit': exit(0) try: start_time = time.time() cursor.execute(query) _print_table(cursor, execution_time=time.time() - start_time) except etcdb.Error as err: print(err) except KeyboardInterrupt: print('Query is interrupted') def _print_table(cursor, execution_time=0.0): n_rows = cursor.n_rows def _print_dashes(): columns = cursor.result_set.columns printf( '-' * ( sum(c.print_width for c in columns) + 3 * cursor.n_cols + 1 ) + '\n' ) def _print_header(): printf("|") for col in cursor.result_set.columns: printf(" %-*s |" % (col.print_width, col)) # printf(" %s | ", col) printf('\n') def _print_row(result_row): printf("|") i = 0 columns = cursor.result_set.columns for field in result_row: printf(" %-*s |" % (columns[i].print_width, field)) i += 1 printf('\n') if n_rows > 0: _print_dashes() _print_header() _print_dashes() while True: row = cursor.fetchone() if not row: break _print_row(row) if n_rows > 0: _print_dashes() def _rows(num): return 'row' if num == 1 else 'rows' printf( "%d %s in set (%0.2f sec)\n\n" % ( n_rows, _rows(n_rows), execution_time) )
[docs]def printf(fmt, *args): """ Printf implemetnation in Python. :param fmt: Format string. See man 3 printf for syntax. :type fmt: str :param args: Arguments to print. """ sys.stdout.write(fmt % args)