#!/usr/bin/env python

import anydbm
import sys

def usage():
	sys.stderr.write('Usage: %s -i input_database -o output_database -t type_of_output_database\n' % sys.argv[0])
	sys.stderr.write('Input database format is automatically detected\n')
	sys.stderr.write('-t must specify dbhash, gdbm, dbm, dumbdbm or anydbm\n')
	sys.stderr.write('dbhash is part of the Berkely DB library\n')
	sys.stderr.write('gdbm is the GNU database format\n')
	sys.stderr.write('dbm is the traditional *ix ndbm format\n')
	sys.stderr.write('dumbdbm is a fallback, safe but slow format\n')
	sys.stderr.write('anydbm will pick a database format for you\n')
	sys.exit(1)

input_database_name = ''
output_database_name = ''
output_database_type = ''

while sys.argv[1:]:
	if sys.argv[1] == '-i' and sys.argv[2:]:
		input_database_name = sys.argv[2]
		del sys.argv[1]
		del sys.argv[1]
	if sys.argv[1] == '-o' and sys.argv[2:]:
		output_database_name = sys.argv[2]
		del sys.argv[1]
		del sys.argv[1]
	elif sys.argv[1] == '-t' and sys.argv[2:]:
		output_database_type = sys.argv[2]
		del sys.argv[1]
		del sys.argv[1]
	else:
		usage()

if output_database_type == 'dbhash':
	import dbhash
	target_db_type = dbhash
elif output_database_type == 'gdbm':
	import gdbm
	target_db_type = gdbm
elif output_database_type == 'dbm':
	import dbm
	target_db_type = dbm
elif output_database_type == 'dumbdbm':
	import dumbdbm
	target_db_type = dumbdbm
elif output_database_type == 'anydbm':
	# we always import anydbm, since it's needed for input
	#import anydbm
	target_db_type = anydbm
else:
	sys.stderr.write('Bad output database format specified\n')
	usage()

if input_database_name == '':
	sys.stderr.write('Must give -i\n')
	usage()

if output_database_name == '':
	sys.stderr.write('Must give -o\n')
	usage()

if output_database_type == '':
	sys.stderr.write('Must give -t\n')
	usage()

source_db = anydbm.open(input_database_name,'r')
destination_db = target_db_type.open(output_database_name,'c')

keys = source_db.keys()
keys.sort()
num_keys=len(keys)

for keyno in range(num_keys):
	print keyno,num_keys,"%5.2f%%" % (keyno*100.0/num_keys),keys[keyno]
	if source_db.has_key(keys[keyno]):
		destination_db[keys[keyno]] = source_db[keys[keyno]]
	else:
		print 'Bad!  Key %s nonexistent in source database!' % keys[keyno]

source_db.close()
destination_db.close()

