summaryrefslogtreecommitdiff
path: root/repoze/bfg/zodb.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/zodb.py')
-rw-r--r--repoze/bfg/zodb.py37
1 files changed, 37 insertions, 0 deletions
diff --git a/repoze/bfg/zodb.py b/repoze/bfg/zodb.py
new file mode 100644
index 000000000..976c687fb
--- /dev/null
+++ b/repoze/bfg/zodb.py
@@ -0,0 +1,37 @@
+from zope.interface import implements
+
+from repoze.zodbconn.middleware import get_conn
+
+from repoze.bfg.interfaces import IPolicy
+
+class ZODBGetitemPolicy:
+
+ implements(IPolicy)
+
+ def __init__(self, dbname, prefix=()):
+ self.dbname = dbname
+ self.prefix = prefix
+ self.get_conn = get_conn
+
+ def __call__(self, environ):
+ conn = self.get_conn(environ, self.dbname)
+ if conn is None:
+ raise ValueError('No such connection %s' % self.dbname)
+
+ path = environ['PATH_INFO'].split('/')
+ path = list(self.prefix) + path
+
+ ob = conn.open()
+
+ name = ''
+ while path:
+ element = path.pop(0)
+ try:
+ ob = ob[element]
+ except KeyError:
+ if path:
+ name = path.pop(0)
+ break
+
+ return ob, name, path
+