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

# pt-replication-stat
#
# 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 copy
import getopt
import time

import log
import PsqlWrapper

class ReplicationStatistics:
    def __init__(self, psql, debug=False):
        self.debug  = debug
        self.psql   = psql
        self.header = None

    def get(self):
        if self.psql.get_version() == 9.0:
            log.error("PostgreSQL 9.0 is not supported.")
            sys.exit(1)

        pidcol = "pid"

        if self.psql.get_version() == 9.1:
            pidcol = "procpid"

        query = ' \
select null as "PID", \
       null as "NAME", \
       null as "HOST", \
       null as "PORT", \
       \'local\' as "STATE", \
       pg_current_xlog_insert_location() as "SENT", \
       pg_current_xlog_location() as "WRITTTEN", \
       null as "FLUSHED", \
       null as "REPLAYED", \
       null as "PRI", \
       \'master\' as "MODE" \
union all \
select %s, \
       application_name as name, \
       client_addr as addr, \
       client_port as port, \
       state, \
       sent_location as sent, \
       write_location as write, \
       flush_location as flush, \
       replay_location as reply, \
       sync_priority as pri, \
       sync_state as mode \
  from pg_stat_replication \
;' % pidcol

        log.debug(query)

        rs = p.execute_query(query)
        if rs is None or len(rs) == 0:
            log.error("Cannot retreive statitics from the server. Connecting to wrong server?")
            sys.exit(1)
        else:
            p.print_result(rs)

        print("")

        return True

def usage():
    print ""
    print "Usage: " + os.path.basename(sys.argv[0]) + " [option...] [delay [count]]"
    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

    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"):
            log.setLevel(log.DEBUG)
            debug = True
        elif o in ("--help"):
            usage()
            sys.exit(0)
        else:
            print "unknown option: " + o + "," + a
            sys.exit(1)

    delay = None
    count = None

    if len(args) >= 1:
        delay = int(args[0])
    if len(args) >= 2:
        count = int(args[1])

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

    i = 0
    while True:
        os.system("date")
        stat = ReplicationStatistics(p, debug=debug)
        stat.get()
        i = i + 1

        if delay is None:
            break

        if count is not None and i >= count:
            break

        try:
            time.sleep(delay)
        except KeyboardInterrupt, err:
            log.info("Terminated.")
            break

    sys.exit(0)
