Thank you for updating the code. Since manual did not specified that quotes 
should be a part of encoder, so I was bit confused with unexpected 
behavior. =)

One remark about your updated code: as I understood from web2py 
documentation, "native type" is a type that natively supported by database? 
If yes, then i'm not sure that some sql dialect has native type "string". 
Shall we rely in such case on "fieldtype.native" which is varying from db 
to db, instead of using "fieldtype.type", which is definitely stated as 
"one of the standard web2py types"?

Or I missed something with native types?

Regards,
Alexander

вторник, 5 июня 2012 г., 18:58:37 UTC+3 пользователь Massimo Di Pierro 
написал:
>
> Good catch. This is a minor change of backward compatibility (the '%' was 
> supposed to be in encoder) but we agreed this is an experimental feature 
> and you are suggesting a good improvement compatible with the example in 
> the manual.
>
> I implemented it in trunk with some minor changes:
>
> if isinstance(fieldtype, SQLCustomType):
>             value = fieldtype.encoder(obj)
>             if fieldtype.native in ('string','text'):
>                 return self.adapt(value)
>             return value
>
> On Tuesday, 5 June 2012 01:23:58 UTC-5, Alexander Shashkevych wrote:
>>
>> I tried another field name, but result the same. I think dal has 
>> incomplete handling of custom types. I analyzed dal code and found that 
>> constructed query for my example was:
>>
>> INSERT INTO posts(content,html,title) VALUES 
>> (\xd0\x94\xd0\xb2\xd0\xb0,\xd0\xa2\xd1\x80\xd0\xb8,\xd0\x9e\xd0\xb4\xd0\xb8\xd0\xbd);
>>
>> As you can see values are not enclosed by quotes. This is incorrect as 
>> for me. I rewrote my custom type:
>>
>> utext = SQLCustomType(
>>     type="text",
>>     native="text",
>>     encoder = lambda x: "'%s'" % x.replace("'", "''").encode("utf-8"),
>>     decoder = lambda x: x.decode("utf-8")
>> )
>>
>> And it works after such update, but example from the web2py book wouldn't 
>> work also:
>>
>> compressed = SQLCustomType(
>>      type ='text',
>>      native='text',
>>      encoder =(lambda x: zlib.compress(x or '')),
>>      decoder = (lambda x: zlib.decompress(x))
>> )
>>
>> Further analysis shown that DAL doesn't check SQLCustomType.type while 
>> constructing query and simply calls SQLCustomType.encoder(). But it should 
>> check the type of SQLCustomType and enclose it with quotes in case of 
>> string/text type. I updated BaseAdapter.represent() with following code:
>>
>> ...
>> if isinstance(fieldtype, SQLCustomType):
>>     if fieldtype.type == "string" or fieldtype.type == "text": # added
>>        return self.adapt(fieldtype.encoder(obj))               # added
>>     return fieldtype.encoder(obj)
>> ...
>>
>> Now my custom type doesn't require code that adds quotes - now this does 
>> DAL. =)
>>
>> Could you comment how my fix fits DAL design?
>>
>
вторник, 5 июня 2012 г., 18:58:37 UTC+3 пользователь Massimo Di Pierro 
написал:
>
> Good catch. This is a minor change of backward compatibility (the '%' was 
> supposed to be in encoder) but we agreed this is an experimental feature 
> and you are suggesting a good improvement compatible with the example in 
> the manual.
>
> I implemented it in trunk with some minor changes:
>
> if isinstance(fieldtype, SQLCustomType):
>             value = fieldtype.encoder(obj)
>             if fieldtype.native in ('string','text'):
>                 return self.adapt(value)
>             return value
>
> On Tuesday, 5 June 2012 01:23:58 UTC-5, Alexander Shashkevych wrote:
>>
>> I tried another field name, but result the same. I think dal has 
>> incomplete handling of custom types. I analyzed dal code and found that 
>> constructed query for my example was:
>>
>> INSERT INTO posts(content,html,title) VALUES 
>> (\xd0\x94\xd0\xb2\xd0\xb0,\xd0\xa2\xd1\x80\xd0\xb8,\xd0\x9e\xd0\xb4\xd0\xb8\xd0\xbd);
>>
>> As you can see values are not enclosed by quotes. This is incorrect as 
>> for me. I rewrote my custom type:
>>
>> utext = SQLCustomType(
>>     type="text",
>>     native="text",
>>     encoder = lambda x: "'%s'" % x.replace("'", "''").encode("utf-8"),
>>     decoder = lambda x: x.decode("utf-8")
>> )
>>
>> And it works after such update, but example from the web2py book wouldn't 
>> work also:
>>
>> compressed = SQLCustomType(
>>      type ='text',
>>      native='text',
>>      encoder =(lambda x: zlib.compress(x or '')),
>>      decoder = (lambda x: zlib.decompress(x))
>> )
>>
>> Further analysis shown that DAL doesn't check SQLCustomType.type while 
>> constructing query and simply calls SQLCustomType.encoder(). But it should 
>> check the type of SQLCustomType and enclose it with quotes in case of 
>> string/text type. I updated BaseAdapter.represent() with following code:
>>
>> ...
>> if isinstance(fieldtype, SQLCustomType):
>>     if fieldtype.type == "string" or fieldtype.type == "text": # added
>>        return self.adapt(fieldtype.encoder(obj))               # added
>>     return fieldtype.encoder(obj)
>> ...
>>
>> Now my custom type doesn't require code that adds quotes - now this does 
>> DAL. =)
>>
>> Could you comment how my fix fits DAL design?
>>
>

Reply via email to