#!/usr/bin/env python


class Dump:
    """
    This class defines methods used to parse and output the results
    of SQL injection actions

    @author: Bernardo Damele
    """

    def string(self, header, string):
        if string:
            if "\n" in string:
                print "%s:\n---\n%s---\n" % (header, string)
            else:
                print "%s:    '%s'\n" % (header, string)
        else:
            print "%s:\tNone\n" % header


    def list(self, header, list):
        print "%s [%d]:\n" % (header, len(list))

        list.sort()
        for element in list:
            print "[*] %s" % element
        print


    def passwordHashes(self, header, passwordHashes):
        print "%s:\n" % header

        for user, passwords in passwordHashes.items():
            print "[*] %s [%d]:" % (user, len(passwords))

            for password in passwords:
                print "    password hash: %s" % password
        print


    def dbTables(self, dbTables):
        maxlength = 0

        for tables in dbTables.values():
            for table in tables:
                maxlength = max(maxlength, len(table))

        lines = "-" * (int(maxlength) + 2)

        for db, tables in dbTables.items():
            print "Database: %s" % db

            if len(tables) == 1:
                print "[1 table]"
            else:
                print "[%d tables]" % len(tables)

            print "+%s+" % lines

            for table in tables:
                blank = " " * (maxlength - len(table))
                print  "| %s%s |\n" % (table, blank),

            print "+%s+\n" % lines


    def dbTableColumns(self, tableColumns):
        for db, tables in tableColumns.items():
            if not db:
                db = "All"

            for table, columns in tables.items():
                maxlength1 = 0
                maxlength2 = 0

                for column, coltype in columns.items():
                    maxlength1 = max(maxlength1, len(column))
                    maxlength2 = max(maxlength2, len(coltype))

                maxlength1 = max(maxlength1, len("COLUMN"))
                maxlength2 = max(maxlength2, len("TYPE"))
                lines1 = "-" * (int(maxlength1) + 2)
                lines2 = "-" * (int(maxlength2) + 2)

                print "Database: %s\nTable: %s" % (db, table)

                if len(columns) == 1:
                    print "[1 column]"
                else:
                    print "[%d columns]" % len(columns)

                print "+%s+%s+" % (lines1, lines2)

                blank1 = " " * (maxlength1 - len("COLUMN"))
                blank2 = " " * (maxlength2 - len("TYPE"))

                print "| Column%s" % blank1,
                print "| Type%s |" % blank2
                print "+%s+%s+" % (lines1, lines2)

                for column, coltype in columns.items():
                    blank1 = " " * (maxlength1 - len(column))
                    blank2 = " " * (maxlength2 - len(coltype))
                    print "| %s%s" % (column, blank1),
                    print "| %s%s |" % (coltype, blank2)

                print "+%s+%s+\n" % (lines1, lines2)


    def dbTableValues(self, tableValues):
        db = tableValues["__infos__"]["db"]
        if not db:
            db = "All"
        table = tableValues["__infos__"]["table"]
        count = int(tableValues["__infos__"]["count"])

        separator = ""

        for column, info in tableValues.items():
            if column != "__infos__":
                lines = "-" * (int(info["length"]) + 2)
                separator += "+%s" % lines

        separator += "+"
        print "Database: %s\nTable: %s" % (db, table)

        count = int(tableValues["__infos__"]["count"])
        if count == 1:
            print "[1 entry]"
        else:
            print "[%d entries]" % count

        print separator

        for column, info in tableValues.items():
            if column != "__infos__":
                maxlength = int(info["length"])
                blank = " " * (maxlength - len(column))
                print  "| %s%s" % (column, blank),

        print "|\n%s" % separator

        for i in range(count):
            for column, info in tableValues.items():
                if column != "__infos__":
                    value = info["values"][i]
                    maxlength = int(info["length"])
                    blank = " " * (maxlength - len(value))
                    print  "| %s%s" % (value, blank),

            print "|"

        print "%s\n" % separator

