On Thu, Jun 9, 2011 at 7:21 PM, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> On Jun 9, 2011, at 12:37 PM, Eric Lemoine wrote:
>
>> On Thu, Jun 9, 2011 at 6:28 PM, Michael Bayer <mike...@zzzcomputing.com> 
>> wrote:
>>>
>>>
>>> That's the default adaption provided by TypeEngine.adapt().    Provide your 
>>> own adapt() that does what's needed.  For examples see Interval, Enum.
>>
>> Ok, I'll take a look at adapt(). Note that our Geometry type isn't
>> specific to Oracle though.
>
> When you get it going, if you can show us what you're doing, we can create a 
> prototypical version of your type, demonstrating the kind of "add new 
> arguments per dialect" functionality it has,  and add it to our test suite, 
> to ensure those usage patterns don't break.   SQLAlchemy usually uses 
> distinct type classes per backend to handle backend-specific arguments, so 
> your approach of allowing DB-specific keyword arguments to a single type, 
> which while entirely appropriate in your case, isn't a pattern we test for at 
> the moment.


Hi Michael


Here's our TypeEngine:


class GeometryBase(TypeEngine):
    """Base Geometry column type for all spatial databases.

    Converts bind/result values to/from a generic Persistent value.
    This is used as a base class and overridden into dialect specific
    Persistent values.
    """

    name = 'GEOMETRY'

    def __init__(self, dimension=2, srid=4326, spatial_index=True, **kwargs):
        self.dimension = dimension
        self.srid = srid
        self.spatial_index = spatial_index
        self.kwargs = kwargs
        super(GeometryBase, self).__init__()

    def bind_processor(self, dialect):
        def process(value):
            if value is not None:
                if isinstance(value, SpatialElement):
                    if isinstance(value.desc, SpatialElement):
                        return value.desc.desc
                    return value.desc
                else:
                    return value
            else:
                return value
        return process

    def result_processor(self, dialect, coltype=None):
        def process(value):
            if value is not None:
                return PersistentSpatialElement(value)
            else:
                return value
        return process

    def _compiler_dispatch(self, *args):
        """Required for the Cast() operator when used for the compilation
        of DBSpatialElement"""
        return self.name

    def adapt(self, cls, **kwargs):
        return cls(dimension=self.dimension, srid=self.srid,
                   spatial_index=self.spatial_index,
                   **self.kwargs)




So dialect-specific parameters are stored in self.kwargs.

I can try to add a test to SQLAlchemy if you indicate me where this
test should go.

Cheers

-- 
Eric Lemoine

Camptocamp France SAS
Savoie Technolac, BP 352
73377 Le Bourget du Lac, Cedex

Tel : 00 33 4 79 44 44 96
Mail : eric.lemo...@camptocamp.com
http://www.camptocamp.com

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to