diff options
author | Benjamin Saller <bcsaller@objectrealms.net> | 2007-06-25 00:33:51 (GMT) |
---|---|---|
committer | Benjamin Saller <bcsaller@objectrealms.net> | 2007-06-25 00:33:51 (GMT) |
commit | 1d830942cadba3053150727c66de555f371c42a7 (patch) | |
tree | 345df75ac46f1ae39d3fa2f02866931e7db1ccdd /src/olpc/datastore/model.py | |
parent | 69c7de7c5fce0ca4fe13ae46aa3372dab9b460f0 (diff) |
mount point filtering, high level api and tests
Diffstat (limited to 'src/olpc/datastore/model.py')
-rw-r--r-- | src/olpc/datastore/model.py | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/olpc/datastore/model.py b/src/olpc/datastore/model.py index be7de93..abc2462 100644 --- a/src/olpc/datastore/model.py +++ b/src/olpc/datastore/model.py @@ -15,8 +15,7 @@ from sqlalchemy import String, Integer, Unicode, PickleType from sqlalchemy import ForeignKey, Sequence, Index from sqlalchemy import mapper, relation from sqlalchemy import create_session -from sqlalchemy import MapperExtension, EXT_PASS -from sqlalchemy.ext.sessioncontext import SessionContext +from sqlalchemy import MapperExtension, EXT_PASS, clear_mappers import datetime import mimetypes @@ -31,18 +30,20 @@ import time # we have a global thread local session factory -context = None +context = {} -def get_session(): return context.current +def get_session(backingstore): + return context[backingstore] _marker = object() + class Content(object): def __repr__(self): return "<Content id:%s>" % (self.id, ) def get_property(self, key, default=_marker): # mapped to property keys - session = get_session() + session = get_session(self.backingstore) query = session.query(Property) p = query.get_by(content_id=self.id, key=key) if not p: @@ -51,7 +52,7 @@ class Content(object): return p.value def get_properties(self, **kwargs): - session = get_session() + session = get_session(self.backingstore) query = session.query(Property) return query.select_by(content_id=self.id, **kwargs) @@ -93,8 +94,6 @@ class Content(object): if ext: return None, ext return None, None - - def get_data(self): f = self.file t = f.tell() @@ -152,7 +151,7 @@ class Property(object): def __repr__(self): return "<Property %s:%r of %s>" % (self.key, self.value, - self.content) + self.content.id) def marshall(self): """Return the value marshalled as a string""" return str(self.value) @@ -223,17 +222,16 @@ class Model(object): def __getattr__(self, key): return self.tables[key] def __getitem__(self, key): return self.mappers[key] - @property - def session(self): return get_session() - + + def prepare(self, querymanager): self.querymanager = querymanager # a single session manages the exclusive access we keep to the # db. global context - def make_session(): return create_session(bind_to=self.querymanager.db) - context = SessionContext(make_session) + self.session = create_session(bind_to=self.querymanager.db) + context[self.querymanager.backingstore] = self.session # content object content = Table('content', @@ -284,6 +282,13 @@ class Model(object): # Object Mapping # the query manager provides a mapping extension for # Content <-> BackingStore binding + + # XXX gross and not what we want, we can only define mappers + # once but we may have more than one datastore. + # this can impact all sqla in the runtime though + clear_mappers() + + content_mapper = mapper(Content, content, extension=self.querymanager.content_ext, properties = { |