db2pickle.py 3.5 KB

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