SQL: fail_metadata as JSON encoded field

fail_metadata used to be a dict in mongo. So a json encoded
field should be okay too.

We could use a pickled field instead, which would be more
flexible.
This commit is contained in:
Elrond 2012-02-12 23:49:01 +01:00
parent feba5c5287
commit cf27accc9e
3 changed files with 30 additions and 4 deletions

View File

@ -79,7 +79,7 @@ def convert_media_entries(mk_db):
('title', 'slug', 'created', ('title', 'slug', 'created',
'description', 'description',
'media_type', 'state', 'license', 'media_type', 'state', 'license',
'fail_error', 'fail_error', 'fail_metadata',
'queued_task_id',)) 'queued_task_id',))
copy_reference_attr(entry, new_entry, "uploader") copy_reference_attr(entry, new_entry, "uploader")

View File

@ -15,7 +15,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from sqlalchemy.types import TypeDecorator, Unicode from sqlalchemy.types import TypeDecorator, Unicode, VARCHAR
import json
class PathTupleWithSlashes(TypeDecorator): class PathTupleWithSlashes(TypeDecorator):
@ -35,3 +36,28 @@ class PathTupleWithSlashes(TypeDecorator):
if value is not None: if value is not None:
value = tuple(value.split('/')) value = tuple(value.split('/'))
return value return value
# The following class and only this one class is in very
# large parts based on example code from sqlalchemy.
#
# The original copyright notice and license follows:
# Copyright (C) 2005-2011 the SQLAlchemy authors and contributors <see AUTHORS file>
#
# This module is part of SQLAlchemy and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
#
class JSONEncoded(TypeDecorator):
"Represents an immutable structure as a json-encoded string."
impl = VARCHAR
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value

View File

@ -29,7 +29,7 @@ from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql.expression import desc from sqlalchemy.sql.expression import desc
from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy.ext.associationproxy import association_proxy
from mediagoblin.db.sql.extratypes import PathTupleWithSlashes from mediagoblin.db.sql.extratypes import PathTupleWithSlashes, JSONEncoded
from mediagoblin.db.sql.base import Base, DictReadAttrProxy from mediagoblin.db.sql.base import Base, DictReadAttrProxy
from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, MediaCommentMixin from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, MediaCommentMixin
@ -91,7 +91,7 @@ class MediaEntry(Base, MediaEntryMixin):
license = Column(Unicode) license = Column(Unicode)
fail_error = Column(Unicode) fail_error = Column(Unicode)
fail_metadata = Column(UnicodeText) fail_metadata = Column(JSONEncoded)
queued_media_file = Column(PathTupleWithSlashes) queued_media_file = Column(PathTupleWithSlashes)