/gdata/tlslite/BaseDB.py

http://radioappz.googlecode.com/ · Python · 120 lines · 111 code · 4 blank · 5 comment · 2 complexity · 6cb5c86d66aa6f688e19afe074f0e261 MD5 · raw file

  1. """Base class for SharedKeyDB and VerifierDB."""
  2. import anydbm
  3. import thread
  4. class BaseDB:
  5. def __init__(self, filename, type):
  6. self.type = type
  7. self.filename = filename
  8. if self.filename:
  9. self.db = None
  10. else:
  11. self.db = {}
  12. self.lock = thread.allocate_lock()
  13. def create(self):
  14. """Create a new on-disk database.
  15. @raise anydbm.error: If there's a problem creating the database.
  16. """
  17. if self.filename:
  18. self.db = anydbm.open(self.filename, "n") #raises anydbm.error
  19. self.db["--Reserved--type"] = self.type
  20. self.db.sync()
  21. else:
  22. self.db = {}
  23. def open(self):
  24. """Open a pre-existing on-disk database.
  25. @raise anydbm.error: If there's a problem opening the database.
  26. @raise ValueError: If the database is not of the right type.
  27. """
  28. if not self.filename:
  29. raise ValueError("Can only open on-disk databases")
  30. self.db = anydbm.open(self.filename, "w") #raises anydbm.error
  31. try:
  32. if self.db["--Reserved--type"] != self.type:
  33. raise ValueError("Not a %s database" % self.type)
  34. except KeyError:
  35. raise ValueError("Not a recognized database")
  36. def __getitem__(self, username):
  37. if self.db == None:
  38. raise AssertionError("DB not open")
  39. self.lock.acquire()
  40. try:
  41. valueStr = self.db[username]
  42. finally:
  43. self.lock.release()
  44. return self._getItem(username, valueStr)
  45. def __setitem__(self, username, value):
  46. if self.db == None:
  47. raise AssertionError("DB not open")
  48. valueStr = self._setItem(username, value)
  49. self.lock.acquire()
  50. try:
  51. self.db[username] = valueStr
  52. if self.filename:
  53. self.db.sync()
  54. finally:
  55. self.lock.release()
  56. def __delitem__(self, username):
  57. if self.db == None:
  58. raise AssertionError("DB not open")
  59. self.lock.acquire()
  60. try:
  61. del(self.db[username])
  62. if self.filename:
  63. self.db.sync()
  64. finally:
  65. self.lock.release()
  66. def __contains__(self, username):
  67. """Check if the database contains the specified username.
  68. @type username: str
  69. @param username: The username to check for.
  70. @rtype: bool
  71. @return: True if the database contains the username, False
  72. otherwise.
  73. """
  74. if self.db == None:
  75. raise AssertionError("DB not open")
  76. self.lock.acquire()
  77. try:
  78. return self.db.has_key(username)
  79. finally:
  80. self.lock.release()
  81. def check(self, username, param):
  82. value = self.__getitem__(username)
  83. return self._checkItem(value, username, param)
  84. def keys(self):
  85. """Return a list of usernames in the database.
  86. @rtype: list
  87. @return: The usernames in the database.
  88. """
  89. if self.db == None:
  90. raise AssertionError("DB not open")
  91. self.lock.acquire()
  92. try:
  93. usernames = self.db.keys()
  94. finally:
  95. self.lock.release()
  96. usernames = [u for u in usernames if not u.startswith("--Reserved--")]
  97. return usernames