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

# pt-tablespace-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
import log

class TablespaceUsage:
    def __init__(self, psql, debug=False):
        self.psql = psql
        self.debug = debug
        self.rs = []
        return

    def get_database_names(self):
        query = "select datname from pg_database where datallowconn = true order by datname"

        d = []
        rs = self.psql.execute_query(query)
        for r in rs[1:len(rs)-1]:
            d.append(r[0])

        log.debug(d)

        return d

    def get_tablespace_per_database(self, dbname):
        p = PsqlWrapper.PsqlWrapper(host=self.psql.host, port=self.psql.port, username=self.psql.username, dbname=dbname, debug=self.debug)

        query = " \
SELECT coalesce(spcname, (select spcname from pg_database d left outer join pg_tablespace t on dattablespace = t.oid where datname = current_database())), \
       ceil(sum(pg_relation_size)/1024/1024) \
  FROM ( SELECT oid, \
                pg_relation_size(oid), \
                reltablespace \
           FROM pg_class ) r \
       LEFT OUTER JOIN pg_tablespace t \
           on r.reltablespace = t.oid \
 GROUP BY spcname;"

        rs = p.execute_query(query)
        log.debug(rs)

        for r in rs[1:len(rs)-1]:
            log.debug(r)
            a = []
            a.append(r[0])
            if r[0] == 'pg_global':
                a.append('')
            else:
                a.append(dbname)
            a.append(r[1])
            self.rs.append(a)

            log.debug(a)

    def get(self):
        header = []
        header.append(['TABLESPACE', 'DBNAME', 'SIZE (MB)'])

        d = self.get_database_names()

        for dbname in d:
            self.get_tablespace_per_database(dbname)

        log.debug(self.rs)

        found = False
        rs = []
        for r in self.rs:
            if r[0] == 'pg_global':
                if found is False:
                    rs.append(r)
                found = True
            else:
                rs.append(r)

        header.extend(sorted(rs))

        log.debug(header)
        self.psql.print_result(header)
        
        return False

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 "    --help                     Print this help."
    print ""

if __name__ == "__main__":
    try:
        opts, args = getopt.getopt(sys.argv[1:], "h:p:U:d:",
                                   ["help", "debug", "host=", "port=", "username=", "dbname="])
    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 ("--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)

    tu = TablespaceUsage(p, debug=debug)
    if tu.get() is False:
        sys.exit(1)

    sys.exit(0)
