#!/usr/bin/env python
# coding: UTF-8

# pt-table-usage
#
# Copyright(c) 2015 Uptime Technologies, LLC.

import sys, os
libpath = os.path.abspath(os.path.dirname(sys.argv[0]) + "/../lib")
sys.path.append(libpath)

import getopt
import PsqlWrapper

class TableUsage:
    def build_where_clause(self, where_clause, cond):
        if where_clause is None:
            where_clause = " where "
        else:
            where_clause = where_clause + " and "
        where_clause = where_clause + " " + cond
        return where_clause

    def __init__(self, psql, owner, schema, table, debug=False):
        self.debug = debug

        self.psql = psql

        where_clause = None

        if schema is not None:
            where_clause = self.build_where_clause(where_clause, "s.schemaname = '" + schema + "'")

        if owner is not None:
            where_clause = self.build_where_clause(where_clause, "u.usename = '" + owner + "'")

        if table is not None:
            where_clause = self.build_where_clause(where_clause, "s.relname = '" + table + "'")

        if where_clause is None:
            where_clause = ''

        self.query = ' \
select \
       s.relid as "OID", \
       u.usename as "OWNER", \
       s.schemaname "SCHEMA", \
       s.relname AS "TABLE", \
       pg_relation_size(s.relid)/8192 AS "BLKS", \
       seq_scan AS "SCAN", \
       seq_tup_read AS "T_READ", \
       n_tup_ins AS "T_INS", \
       n_tup_upd AS "T_UPD", \
       n_tup_del AS "T_DEL", \
       heap_blks_read AS "B_READ", \
       heap_blks_hit AS "B_HIT", \
/* n_tup_hot_upd AS "T_HUPD", \
 n_live_tup AS "T_LIVE", \
 n_dead_tup AS "T_DEAD", */ \
 to_char(CASE WHEN last_vacuum IS NULL THEN last_autovacuum \
      WHEN last_autovacuum IS NULL THEN last_vacuum \
      WHEN last_vacuum > last_autovacuum THEN last_vacuum \
      ELSE last_autovacuum END, \'YYYY-MM-DD HH24:MI:SS\') AS "VACUUMED", \
 to_char(CASE WHEN last_analyze IS NULL THEN last_autoanalyze \
      WHEN last_autoanalyze IS NULL THEN last_analyze \
      WHEN last_analyze > last_autoanalyze THEN last_analyze \
      ELSE last_autoanalyze END, \'YYYY-MM-DD HH24:MI:SS\') AS "ANALYZED", \
      coalesce(spcname, (select spcname from pg_database d left outer join pg_tablespace t on dattablespace = t.oid where datname = current_database())) as "TABLESPACE" \
  from \
       pg_stat_user_tables s left outer join pg_statio_user_tables s2 \
            on s.relid = s2.relid \
                             left outer join pg_class c \
            on s.relid = c.oid \
                             left outer join pg_user u \
            on c.relowner = u.usesysid \
                             left outer join pg_tablespace t \
            on c.reltablespace = t.oid \
%s \
 order by \
    2,3,4 \
;' % (where_clause)

        if self.debug is True:
            print self.query

    def get(self):
        rs = self.psql.execute_query(self.query)

        self.psql.print_result(rs)

        return True

def usage():
    print ""
    print "Usage: " + os.path.basename(sys.argv[0]) + " [option...]"
    print ""
    print "Options:"
    print "    -h, --host=HOSTNAME        Host name of the postgres server"
    print "    -p, --port=PORT            Port number of the postgres server"
    print "    -U, --username=USERNAME    User name to connect"
    print "    -d, --dbname=DBNAME        Database name to connect"
    print ""
    print "    -o, --owner=STRING         Owner name"
    print "    -n, --schema=STRING        Schema name"
    print "    -t, --table=STRING         Table name"
    print ""
    print "    --help                     Print this help."
    print ""

if __name__ == "__main__":
    try:
        opts, args = getopt.getopt(sys.argv[1:], "h:p:U:d:o:n:t:i:u",
                                   ["help", "debug", "host=", "port=", "username=", "dbname=",
                                    "owner=", "schema=", "table="])
    except getopt.GetoptError, err:
        print str(err)
        usage()
        sys.exit(2)

    host     = None
    port     = None
    username = None
    dbname   = None

    owner    = None
    schema   = None
    table    = None

    debug    = None

    for o, a in opts:
        if o in ("-h", "--host"):
            host = a
        elif o in ("-p", "--port"):
            port = int(a)
        elif o in ("-U", "--username"):
            username = a
        elif o in ("-d", "--dbname"):
            dbname = a
        elif o in ("-o", "--owner"):
            owner = a
        elif o in ("-n", "--schema"):
            schema = a
        elif o in ("-t", "--table"):
            table = a
        elif o in ("--debug"):
            debug = True
        elif o in ("--help"):
            usage()
            sys.exit(0)
        else:
            print "unknown option: " + o + "," + a
            sys.exit(1)

    p = PsqlWrapper.PsqlWrapper(host=host, port=port, username=username, dbname=dbname, debug=debug)

    iu = TableUsage(p, owner, schema, table, debug=debug)
    if iu.get() is False:
        sys.exit(1)

    sys.exit(0)
