Home | History | Annotate | Download | only in scripts
      1 #!/usr/bin/env python
      2 
      3 """
      4 Synopsis: %(prog)s [-h|-g|-b|-r|-a] dbfile [ picklefile ]
      5 
      6 Convert the database file given on the command line to a pickle
      7 representation.  The optional flags indicate the type of the database:
      8 
      9     -a - open using anydbm
     10     -b - open as bsddb btree file
     11     -d - open as dbm file
     12     -g - open as gdbm file
     13     -h - open as bsddb hash file
     14     -r - open as bsddb recno file
     15 
     16 The default is hash.  If a pickle file is named it is opened for write
     17 access (deleting any existing data).  If no pickle file is named, the pickle
     18 output is written to standard output.
     19 
     20 """
     21 
     22 import getopt
     23 try:
     24     import bsddb
     25 except ImportError:
     26     bsddb = None
     27 try:
     28     import dbm
     29 except ImportError:
     30     dbm = None
     31 try:
     32     import gdbm
     33 except ImportError:
     34     gdbm = None
     35 try:
     36     import anydbm
     37 except ImportError:
     38     anydbm = None
     39 import sys
     40 try:
     41     import cPickle as pickle
     42 except ImportError:
     43     import pickle
     44 
     45 prog = sys.argv[0]
     46 
     47 def usage():
     48     sys.stderr.write(__doc__ % globals())
     49 
     50 def main(args):
     51     try:
     52         opts, args = getopt.getopt(args, "hbrdag",
     53                                    ["hash", "btree", "recno", "dbm",
     54                                     "gdbm", "anydbm"])
     55     except getopt.error:
     56         usage()
     57         return 1
     58 
     59     if len(args) == 0 or len(args) > 2:
     60         usage()
     61         return 1
     62     elif len(args) == 1:
     63         dbfile = args[0]
     64         pfile = sys.stdout
     65     else:
     66         dbfile = args[0]
     67         try:
     68             pfile = open(args[1], 'wb')
     69         except IOError:
     70             sys.stderr.write("Unable to open %s\n" % args[1])
     71             return 1
     72 
     73     dbopen = None
     74     for opt, arg in opts:
     75         if opt in ("-h", "--hash"):
     76             try:
     77                 dbopen = bsddb.hashopen
     78             except AttributeError:
     79                 sys.stderr.write("bsddb module unavailable.\n")
     80                 return 1
     81         elif opt in ("-b", "--btree"):
     82             try:
     83                 dbopen = bsddb.btopen
     84             except AttributeError:
     85                 sys.stderr.write("bsddb module unavailable.\n")
     86                 return 1
     87         elif opt in ("-r", "--recno"):
     88             try:
     89                 dbopen = bsddb.rnopen
     90             except AttributeError:
     91                 sys.stderr.write("bsddb module unavailable.\n")
     92                 return 1
     93         elif opt in ("-a", "--anydbm"):
     94             try:
     95                 dbopen = anydbm.open
     96             except AttributeError:
     97                 sys.stderr.write("anydbm module unavailable.\n")
     98                 return 1
     99         elif opt in ("-g", "--gdbm"):
    100             try:
    101                 dbopen = gdbm.open
    102             except AttributeError:
    103                 sys.stderr.write("gdbm module unavailable.\n")
    104                 return 1
    105         elif opt in ("-d", "--dbm"):
    106             try:
    107                 dbopen = dbm.open
    108             except AttributeError:
    109                 sys.stderr.write("dbm module unavailable.\n")
    110                 return 1
    111     if dbopen is None:
    112         if bsddb is None:
    113             sys.stderr.write("bsddb module unavailable - ")
    114             sys.stderr.write("must specify dbtype.\n")
    115             return 1
    116         else:
    117             dbopen = bsddb.hashopen
    118 
    119     try:
    120         db = dbopen(dbfile, 'r')
    121     except bsddb.error:
    122         sys.stderr.write("Unable to open %s.  " % dbfile)
    123         sys.stderr.write("Check for format or version mismatch.\n")
    124         return 1
    125 
    126     for k in db.keys():
    127         pickle.dump((k, db[k]), pfile, 1==1)
    128 
    129     db.close()
    130     pfile.close()
    131 
    132     return 0
    133 
    134 if __name__ == "__main__":
    135     sys.exit(main(sys.argv[1:]))
    136