Source code for etcdb.execute.dml.show

"""Implement SHOW queries."""
import json

from pyetcd import EtcdKeyNotFound

from etcdb import OperationalError, ProgrammingError
from etcdb.resultset import ResultSet, ColumnSet, Column, Row


[docs]def show_databases(etcd_client): """ Execute SHOW [FULL] TABLES query :param etcd_client: etcd client :type etcd_client: pyetcd.client.Client :return: ResultSet instance :rtype: ResultSet """ etcd_response = etcd_client.read('/') columns = ColumnSet().add(Column('Database')) result_set = ResultSet(columns) try: for node in etcd_response.node['nodes']: val = node['key'].lstrip('/') result_set.add_row(Row((val,))) except KeyError: pass return result_set
[docs]def show_tables(etcd_client, tree, db): """ Execute SHOW [FULL] TABLES query# :param etcd_client: etcd client :type etcd_client: pyetcd.client.Client :param db: Current database :type db: str :param tree: Parse tree :type tree: SQLTree :return: ResultSet instance :rtype: ResultSet """ columns = ColumnSet().add(Column('Tables_in_%s' % db)) if tree.options['full']: columns.add(Column('Table_type')) result_set = ResultSet(columns) try: etcd_response = etcd_client.read('/%s' % db) except EtcdKeyNotFound: raise OperationalError('No database selected') try: for node in etcd_response.node['nodes']: table_name = node['key'].replace('/%s/' % db, '', 1) row = (table_name, ) if tree.options['full']: row += ('BASE TABLE',) result_set.add_row(Row(row)) except KeyError: pass return result_set
[docs]def desc_table(etcd_client, tree, db): """ Execute DESC table query# :param etcd_client: etcd client :type etcd_client: pyetcd.client.Client :param tree: Parse tree :type tree: SQLTree :param db: Current database :type db: str :return: ResultSet instance :rtype: ResultSet """ key = '/{db}/{table}/_fields'.format(db=db, table=tree.table) try: etcd_result = etcd_client.read(key) except EtcdKeyNotFound: raise ProgrammingError('Table `{db}`.`{table}` ' 'doesn\'t exist'.format(db=db, table=tree.table)) columns = ColumnSet() columns.add(Column('Field')) columns.add(Column('Type')) columns.add(Column('Null')) columns.add(Column('Key')) columns.add(Column('Default')) columns.add(Column('Extra')) result_set = ResultSet(columns) fields = json.loads(etcd_result.node['value']) for key, value in fields.iteritems(): field_type = value['type'] if value['options']['nullable']: nullable = 'YES' else: nullable = 'NO' indexes = '' if 'primary' in value['options'] and value['options']['primary']: indexes = 'PRI' if 'unique' in value['options'] and value['options']['unique']: indexes = 'UNI' try: default_value = value['options']['default'] except KeyError: default_value = '' extra = '' if 'auto_increment' in value['options'] \ and value['options']['auto_increment']: extra = 'auto_increment' result_set.add_row( Row( (key, field_type, nullable, indexes, default_value, extra) ) ) return result_set