def library_pg(args, l, config):
    """Report on the operation of a Postgres Library database"""
    import tabulate
    import terminaltables
    from textwrap import fill
    from ambry.util.text import getTerminalSize
    import sys

    if args.connect:
        try:
            l.database.connection.execute('SELECT * FROM pg_stat_activity;')
            sys.exit(0)
        except Exception as e:
            prt(str(e))
            sys.exit(1)

    db = l.database

    (x, y) = getTerminalSize()

    if args.processes:

        headers = None
        rows = []

        for row in db.connection.execute('SELECT pid, client_addr, application_name ass, query FROM pg_stat_activity '):
            if not headers:
                headers = row.keys()
            row = list(str(e) for e in row)

            row[3] = fill(row[3],x-50)
            rows.append(row)

        #print tabulate.tabulate(rows, headers)
        table =  terminaltables.UnixTable([headers]+rows)
        print table.table

    if args.blocks:

        headers = None
        rows = []

        q1 = """
SELECT pid, database, mode, locktype, mode, relation, tuple, virtualxid FROM pg_locks order by pid;
"""


        q2 = """
  SELECT blocked_locks.pid     AS blocked_pid,
         -- blocked_activity.usename  AS blocked_user,
         blocking_locks.pid     AS blocking_pid,
         -- blocking_activity.usename AS blocking_user,
         blocked_activity.query    AS blocked_statement,
         blocking_activity.query   AS current_statement_in_blocking_process
   FROM  pg_catalog.pg_locks         blocked_locks
    JOIN pg_catalog.pg_stat_activity blocked_activity  ON blocked_activity.pid = blocked_locks.pid
    JOIN pg_catalog.pg_locks         blocking_locks
        ON blocking_locks.locktype = blocked_locks.locktype
        AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
        AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
        AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
        AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
        AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
        AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
        AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
        AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
        AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
        AND blocking_locks.pid != blocked_locks.pid

    JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
   WHERE NOT blocked_locks.GRANTED;

"""

        for row in db.connection.execute(q2):
            if not headers:
                headers = row.keys()
            row = list(str(e) for e in row)

            row[2] = fill(row[2],(x-50)/2)
            row[3] = fill(row[3], (x-50)/2)
            rows.append(row)

        if rows:
            table = terminaltables.UnixTable([headers] + rows)
            print table.table

    if args.locks:

            headers = None
            rows = []

            q = """
    SELECT pid, database, mode, locktype, mode, relation::regclass, tuple, virtualxid
    FROM pg_locks
    ORDER BY pid
    ;
    """


            for row in db.connection.execute(q):
                if not headers:
                    headers = row.keys()
                row = list(str(e) for e in row)

                row[2] = fill(row[2], (x - 50) / 2)
                row[3] = fill(row[3], (x - 50) / 2)
                rows.append(row)

            if rows:
                table = terminaltables.UnixTable([headers] + rows)
                print table.table
Report on the operation of a Postgres Library database