/Tools/scripts/db2pickle.py

http://unladen-swallow.googlecode.com/ · Python · 135 lines · 104 code · 12 blank · 19 comment · 44 complexity · 2ed997ca2cb82a4eedc1926740e4f8c9 MD5 · raw file

  1. #!/usr/bin/env python
  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 anydbm
  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
  23. except ImportError:
  24. dbm = None
  25. try:
  26. import gdbm
  27. except ImportError:
  28. gdbm = None
  29. try:
  30. import anydbm
  31. except ImportError:
  32. anydbm = None
  33. import sys
  34. try:
  35. import cPickle 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("anydbm 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("gdbm 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 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:]))