home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 14 / hacker14.iso / programacao / pythonwin / python.exe / PICKLE2DB.PY < prev    next >
Encoding:
Python Source  |  2003-06-20  |  3.5 KB  |  128 lines

  1. #!/usr/bin/env python
  2.  
  3. """
  4. Synopsis: %(prog)s [-h|-b|-r|-a|-d] dbfile [ picklefile ]
  5.  
  6. Read the given picklefile as a series of key/value pairs and write to a new
  7. database.  If the database already exists, any contents are deleted.  The
  8. optional flags indicate the type of the database (bsddb hash, bsddb btree,
  9. bsddb recno, anydbm, dbm).  The default is hash.  If a pickle file is named
  10. it is opened for read access.  If no pickle file is named, the pickle input
  11. is read from standard input.
  12.  
  13. Note that recno databases can only contain numeric keys, so you can't dump a
  14. hash or btree database using db2pickle.py and reconstitute it to a recno
  15. database with %(prog)s.
  16. """
  17.  
  18. import getopt
  19. try:
  20.     import bsddb
  21. except ImportError:
  22.     bsddb = None
  23. try:
  24.     import dbm
  25. except ImportError:
  26.     dbm = None
  27. try:
  28.     import anydbm
  29. except ImportError:
  30.     anydbm = None
  31. import sys
  32. try:
  33.     import cPickle as pickle
  34. except ImportError:
  35.     import pickle
  36.  
  37. prog = sys.argv[0]
  38.  
  39. def usage():
  40.     sys.stderr.write(__doc__ % globals())
  41.  
  42. def main(args):
  43.     try:
  44.         opts, args = getopt.getopt(args, "hbrda",
  45.                                    ["hash", "btree", "recno", "dbm", "anydbm"])
  46.     except getopt.error:
  47.         usage()
  48.         return 1
  49.  
  50.     if len(args) == 0 or len(args) > 2:
  51.         usage()
  52.         return 1
  53.     elif len(args) == 1:
  54.         dbfile = args[0]
  55.         pfile = sys.stdin
  56.     else:
  57.         dbfile = args[0]
  58.         try:
  59.             pfile = open(args[1], 'rb')
  60.         except IOError:
  61.             sys.stderr.write("Unable to open %s\n" % args[1])
  62.             return 1
  63.  
  64.     dbopen = None
  65.     for opt, arg in opts:
  66.         if opt in ("-h", "--hash"):
  67.             try:
  68.                 dbopen = bsddb.hashopen
  69.             except AttributeError:
  70.                 sys.stderr.write("bsddb module unavailable.\n")
  71.                 return 1
  72.         elif opt in ("-b", "--btree"):
  73.             try:
  74.                 dbopen = bsddb.btopen
  75.             except AttributeError:
  76.                 sys.stderr.write("bsddb module unavailable.\n")
  77.                 return 1
  78.         elif opt in ("-r", "--recno"):
  79.             try:
  80.                 dbopen = bsddb.rnopen
  81.             except AttributeError:
  82.                 sys.stderr.write("bsddb module unavailable.\n")
  83.                 return 1
  84.         elif opt in ("-a", "--anydbm"):
  85.             try:
  86.                 dbopen = anydbm.open
  87.             except AttributeError:
  88.                 sys.stderr.write("anydbm module unavailable.\n")
  89.                 return 1
  90.         elif opt in ("-d", "--dbm"):
  91.             try:
  92.                 dbopen = dbm.open
  93.             except AttributeError:
  94.                 sys.stderr.write("dbm module unavailable.\n")
  95.                 return 1
  96.     if dbopen is None:
  97.         if bsddb is None:
  98.             sys.stderr.write("bsddb module unavailable - ")
  99.             sys.stderr.write("must specify dbtype.\n")
  100.             return 1
  101.         else:
  102.             dbopen = bsddb.hashopen
  103.  
  104.     try:
  105.         db = dbopen(dbfile, 'c')
  106.     except bsddb.error:
  107.         sys.stderr.write("Unable to open %s.  " % dbfile)
  108.         sys.stderr.write("Check for format or version mismatch.\n")
  109.         return 1
  110.     else:
  111.         for k in db.keys():
  112.             del db[k]
  113.  
  114.     while 1:
  115.         try:
  116.             (key, val) = pickle.load(pfile)
  117.         except EOFError:
  118.             break
  119.         db[key] = val
  120.  
  121.     db.close()
  122.     pfile.close()
  123.  
  124.     return 0
  125.  
  126. if __name__ == "__main__":
  127.     sys.exit(main(sys.argv[1:]))
  128.