Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/olpc/datastore/model.py
diff options
context:
space:
mode:
authorBenjamin Saller <bcsaller@objectrealms.net>2007-07-02 19:45:28 (GMT)
committer Benjamin Saller <bcsaller@objectrealms.net>2007-07-02 19:45:28 (GMT)
commit12a564c450f75121dc59919496290cbfe4c2704b (patch)
treea7cf9c24757084c6555e1760333b20cbfd8c37ac /src/olpc/datastore/model.py
parent07a88e504b544552915815e04bef235aca247aa2 (diff)
propertys via the create/update dict
key:kind -> value see test/properties.txt
Diffstat (limited to 'src/olpc/datastore/model.py')
-rw-r--r--src/olpc/datastore/model.py25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/olpc/datastore/model.py b/src/olpc/datastore/model.py
index f70e68f..d678b59 100644
--- a/src/olpc/datastore/model.py
+++ b/src/olpc/datastore/model.py
@@ -11,7 +11,7 @@ __copyright__ = 'Copyright ObjectRealms, LLC, 2007'
__license__ = 'The GNU Public License V2+'
from sqlalchemy import Table, Column, UniqueConstraint
-from sqlalchemy import String, Integer, Unicode, PickleType
+from sqlalchemy import String, Integer, Unicode
from sqlalchemy import ForeignKey, Sequence, Index
from sqlalchemy import mapper, relation
from sqlalchemy import create_session
@@ -31,11 +31,15 @@ import time
# we have a global thread local session factory
context = {}
+propertyTypes = {}
+_marker = object()
def get_session(backingstore):
return context[backingstore]
-_marker = object()
+def registerPropertyType(kind, class_): propertyTypes[kind] = class_
+def propertyByKind(kind): return propertyTypes[kind]
+
class Content(object):
def __repr__(self):
@@ -56,7 +60,6 @@ class Content(object):
query = session.query(Property)
return query.select_by(content_id=self.id, **kwargs)
-
# Backingstore dependent bindings
def get_file(self):
@@ -206,6 +209,15 @@ class NumberProperty(Property):
value = property(get_value, set_value)
+class BinaryProperty(Property):
+ # base64 encode binary data
+ def __init__(self, key, value, type="binary"):
+ Property.__init__(self, key, value, type)
+
+ def get_value(self): return self._value.decode('base64')
+ def set_value(self, value): self._value = value.encode('base64')
+ value = property(get_value, set_value)
+
class Model(object):
""" Manages the global state of the metadata model index. This is
@@ -259,7 +271,7 @@ class Model(object):
Column('id', Integer, Sequence('property_id_seq'), primary_key=True),
Column('content_id', Integer, ForeignKey('content.id')),
Column('key', Unicode, ),
- Column('value', PickleType, ),
+ Column('value', Unicode, ),
Column('type', Unicode, ),
# unique key to content mapping
UniqueConstraint('content_id', 'key',
@@ -325,7 +337,7 @@ class Model(object):
self.addPropertyType(DateProperty, 'date')
self.addPropertyType(NumberProperty, 'number')
self.addPropertyType(TextProperty, 'text')
-
+ self.addPropertyType(BinaryProperty, 'binary')
@@ -355,3 +367,6 @@ class Model(object):
polymorphic_identity=typename,
properties=properties
)
+
+ registerPropertyType(typename, PropertyClass)
+