#!/usr/bin/env python
# vim:set sw=4 et:
#

"""
Dump contents of database to stdout. Database can be any file that the anydbm
module can read. Included with warcprox because it's useful for inspecting a
deduplication database or a playback index database, but it is a generic tool.
"""

try:
    import dbm
    from dbm import ndbm
    whichdb = dbm.whichdb

except:
    import anydbm 
    dbm = anydbm
    from whichdb import whichdb

import sys
import os.path

if __name__ == "__main__":
    if len(sys.argv) != 2:
        sys.stderr.write("usage: {} DBM_FILE\n".format(sys.argv[0]))
        exit(1)

    filename = sys.argv[1]
    which = whichdb(filename)

    # if which returns none and the file does not exist, print usage line
    if which == None and not os.path.exists(sys.argv[1]):
        sys.stderr.write('No such file {}\n\n'.format(sys.argv[1]))
        sys.stderr.write("usage: {} DBM_FILE\n".format(sys.argv[0]))
        exit(1)

    # covers case where an ndbm is checked with its extension & identified incorrectly
    elif 'bsd' in which:
        correct_file = filename.split(".db")[0]
        correct_which = whichdb(correct_file)
        if correct_which in ('dbm', 'dbm.ndbm'):
            filename = correct_file
            which = correct_which

    elif which == '':
        sys.stderr.write("{} is an unrecognized database type\n".format(sys.argv[1]))
        sys.stderr.write("Try the file again by removing the extension\n")
        exit(1)

    try:
        out = sys.stdout.buffer

    except AttributeError:
        out = sys.stdout

    out.write(filename.encode('UTF-8') + b' is a ' + which.encode('UTF-8') + b' db\n')

    db = dbm.open(filename, 'r')
    for key in db.keys():
        out.write(key + b":" + db[key] + b"\n")