| Index: boto/sdb/persist/object.py
|
| diff --git a/boto/sdb/persist/object.py b/boto/sdb/persist/object.py
|
| deleted file mode 100644
|
| index 993df1ee836bf38ffa59da99993c225c4d31468f..0000000000000000000000000000000000000000
|
| --- a/boto/sdb/persist/object.py
|
| +++ /dev/null
|
| @@ -1,207 +0,0 @@
|
| -# Copyright (c) 2006,2007,2008 Mitch Garnaat http://garnaat.org/
|
| -#
|
| -# Permission is hereby granted, free of charge, to any person obtaining a
|
| -# copy of this software and associated documentation files (the
|
| -# "Software"), to deal in the Software without restriction, including
|
| -# without limitation the rights to use, copy, modify, merge, publish, dis-
|
| -# tribute, sublicense, and/or sell copies of the Software, and to permit
|
| -# persons to whom the Software is furnished to do so, subject to the fol-
|
| -# lowing conditions:
|
| -#
|
| -# The above copyright notice and this permission notice shall be included
|
| -# in all copies or substantial portions of the Software.
|
| -#
|
| -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
| -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
| -# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
| -# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
| -# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
| -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
| -# IN THE SOFTWARE.
|
| -
|
| -from boto.exception import SDBPersistenceError
|
| -from boto.sdb.persist import get_manager, object_lister
|
| -from boto.sdb.persist.property import Property, ScalarProperty
|
| -import uuid
|
| -
|
| -class SDBBase(type):
|
| - "Metaclass for all SDBObjects"
|
| - def __init__(cls, name, bases, dict):
|
| - super(SDBBase, cls).__init__(name, bases, dict)
|
| - # Make sure this is a subclass of SDBObject - mainly copied from django ModelBase (thanks!)
|
| - try:
|
| - if filter(lambda b: issubclass(b, SDBObject), bases):
|
| - # look for all of the Properties and set their names
|
| - for key in dict.keys():
|
| - if isinstance(dict[key], Property):
|
| - property = dict[key]
|
| - property.set_name(key)
|
| - prop_names = []
|
| - props = cls.properties()
|
| - for prop in props:
|
| - prop_names.append(prop.name)
|
| - setattr(cls, '_prop_names', prop_names)
|
| - except NameError:
|
| - # 'SDBObject' isn't defined yet, meaning we're looking at our own
|
| - # SDBObject class, defined below.
|
| - pass
|
| -
|
| -class SDBObject(object):
|
| - __metaclass__ = SDBBase
|
| -
|
| - _manager = get_manager()
|
| -
|
| - @classmethod
|
| - def get_lineage(cls):
|
| - l = [c.__name__ for c in cls.mro()]
|
| - l.reverse()
|
| - return '.'.join(l)
|
| -
|
| - @classmethod
|
| - def get(cls, id=None, **params):
|
| - if params.has_key('manager'):
|
| - manager = params['manager']
|
| - else:
|
| - manager = cls._manager
|
| - if manager.domain and id:
|
| - a = cls._manager.domain.get_attributes(id, '__type__')
|
| - if a.has_key('__type__'):
|
| - return cls(id, manager)
|
| - else:
|
| - raise SDBPersistenceError('%s object with id=%s does not exist' % (cls.__name__, id))
|
| - else:
|
| - rs = cls.find(**params)
|
| - try:
|
| - obj = rs.next()
|
| - except StopIteration:
|
| - raise SDBPersistenceError('%s object matching query does not exist' % cls.__name__)
|
| - try:
|
| - rs.next()
|
| - except StopIteration:
|
| - return obj
|
| - raise SDBPersistenceError('Query matched more than 1 item')
|
| -
|
| - @classmethod
|
| - def find(cls, **params):
|
| - if params.has_key('manager'):
|
| - manager = params['manager']
|
| - del params['manager']
|
| - else:
|
| - manager = cls._manager
|
| - keys = params.keys()
|
| - if len(keys) > 4:
|
| - raise SDBPersistenceError('Too many fields, max is 4')
|
| - parts = ["['__type__'='%s'] union ['__lineage__'starts-with'%s']" % (cls.__name__, cls.get_lineage())]
|
| - properties = cls.properties()
|
| - for key in keys:
|
| - found = False
|
| - for property in properties:
|
| - if property.name == key:
|
| - found = True
|
| - if isinstance(property, ScalarProperty):
|
| - checker = property.checker
|
| - parts.append("['%s' = '%s']" % (key, checker.to_string(params[key])))
|
| - else:
|
| - raise SDBPersistenceError('%s is not a searchable field' % key)
|
| - if not found:
|
| - raise SDBPersistenceError('%s is not a valid field' % key)
|
| - query = ' intersection '.join(parts)
|
| - if manager.domain:
|
| - rs = manager.domain.query(query)
|
| - else:
|
| - rs = []
|
| - return object_lister(None, rs, manager)
|
| -
|
| - @classmethod
|
| - def list(cls, max_items=None, manager=None):
|
| - if not manager:
|
| - manager = cls._manager
|
| - if manager.domain:
|
| - rs = manager.domain.query("['__type__' = '%s']" % cls.__name__, max_items=max_items)
|
| - else:
|
| - rs = []
|
| - return object_lister(cls, rs, manager)
|
| -
|
| - @classmethod
|
| - def properties(cls):
|
| - properties = []
|
| - while cls:
|
| - for key in cls.__dict__.keys():
|
| - if isinstance(cls.__dict__[key], Property):
|
| - properties.append(cls.__dict__[key])
|
| - if len(cls.__bases__) > 0:
|
| - cls = cls.__bases__[0]
|
| - else:
|
| - cls = None
|
| - return properties
|
| -
|
| - # for backwards compatibility
|
| - find_properties = properties
|
| -
|
| - def __init__(self, id=None, manager=None):
|
| - if manager:
|
| - self._manager = manager
|
| - self.id = id
|
| - if self.id:
|
| - self._auto_update = True
|
| - if self._manager.domain:
|
| - attrs = self._manager.domain.get_attributes(self.id, '__type__')
|
| - if len(attrs.keys()) == 0:
|
| - raise SDBPersistenceError('Object %s: not found' % self.id)
|
| - else:
|
| - self.id = str(uuid.uuid4())
|
| - self._auto_update = False
|
| -
|
| - def __setattr__(self, name, value):
|
| - if name in self._prop_names:
|
| - object.__setattr__(self, name, value)
|
| - elif name.startswith('_'):
|
| - object.__setattr__(self, name, value)
|
| - elif name == 'id':
|
| - object.__setattr__(self, name, value)
|
| - else:
|
| - self._persist_attribute(name, value)
|
| - object.__setattr__(self, name, value)
|
| -
|
| - def __getattr__(self, name):
|
| - if not name.startswith('_'):
|
| - a = self._manager.domain.get_attributes(self.id, name)
|
| - if a.has_key(name):
|
| - object.__setattr__(self, name, a[name])
|
| - return a[name]
|
| - raise AttributeError
|
| -
|
| - def __repr__(self):
|
| - return '%s<%s>' % (self.__class__.__name__, self.id)
|
| -
|
| - def _persist_attribute(self, name, value):
|
| - if self.id:
|
| - self._manager.domain.put_attributes(self.id, {name : value}, replace=True)
|
| -
|
| - def _get_sdb_item(self):
|
| - return self._manager.domain.get_item(self.id)
|
| -
|
| - def save(self):
|
| - attrs = {'__type__' : self.__class__.__name__,
|
| - '__module__' : self.__class__.__module__,
|
| - '__lineage__' : self.get_lineage()}
|
| - for property in self.properties():
|
| - attrs[property.name] = property.to_string(self)
|
| - if self._manager.domain:
|
| - self._manager.domain.put_attributes(self.id, attrs, replace=True)
|
| - self._auto_update = True
|
| -
|
| - def delete(self):
|
| - if self._manager.domain:
|
| - self._manager.domain.delete_attributes(self.id)
|
| -
|
| - def get_related_objects(self, ref_name, ref_cls=None):
|
| - if self._manager.domain:
|
| - query = "['%s' = '%s']" % (ref_name, self.id)
|
| - if ref_cls:
|
| - query += " intersection ['__type__'='%s']" % ref_cls.__name__
|
| - rs = self._manager.domain.query(query)
|
| - else:
|
| - rs = []
|
| - return object_lister(ref_cls, rs, self._manager)
|
| -
|
|
|