Here's the full code for insert:

def insert(self, **fields):
    self._attempt_upload(fields)
    if any(f(fields) for f in self._before_insert): return 0
    ret = self._db._adapter.insert(self,self._listify(fields))
    ret and [f(fields,ret) for f in self._after_insert]
    return ret

ret is the id of the inserted record (or 0 if the insert fails). ret is 
passed to the _after_insert functions in case those functions need to 
reference the inserted record for any reason. It does not appear the 
functions need to return anything. The reason for ret and [f(fields, ret)...is 
so the _after_insert functions only get executed if the insert was 
successful. If the insert failed, ret will be 0, which will evaluate to 
False, which will prevent the part after the "and" from being evaluated 
(i.e., the functions won't be called).

Note, if any of the _before_insert functions return anything that evaluates 
to True (i.e., any values other than False, None, 0, or an empty string, 
list, dict, etc.), then the insert will be abandoned (i.e., 0 is returned 
immediately). So, the _before_insert functions can be used to prevent an 
insert if desired.

Anthony

On Monday, June 11, 2012 9:06:35 AM UTC-4, Omri Har-Shemesh wrote:
>
> Hi Anthony,
>
> thanks for the reply! 
> I have been looking at the code and there is something I don't really 
> understand (sorry for a noob question):
> when the functions get called, they are called using a pattern:
>
> ret = ...
> ret and [f(fields,ret) for f in self._after_insert]
> return ret
>
> The question is - should the function I define return something?
> Is the result of the function call used somehow, somewhere?
>
> I suspect that using ret and [] is simply in order to invoke the functions,
> but then I don't understand why not use something like
> [f(fields,ret) for f in self._after_insert]
> without using the and operator.
>
> Best wishes,
> Omri
>
> On Wednesday, June 6, 2012 3:44:46 PM UTC+2, Anthony wrote:
>>
>> In trunk, there are now triggers for DAL tables:
>>
>>         self._before_insert = []
>>         self._before_update = [lambda self,fs:self.delete_uploaded_files(
>> fs)]
>>         self._before_delete = [lambda self:self.delete_uploaded_files()]
>>         self._after_insert = []
>>         self._after_update = []
>>         self._after_delete = []
>>
>> You could define a function that stores a timestamp in the cache and add 
>> it to the three "_after_" triggers for the relevant tables. Then just check 
>> the timestamp to see if it is more recent than the last request. To 
>> determine the time of the last request, you could store a timestamp in the 
>> session upon each request (so it will be specific to each user).
>>
>> Anthony
>>
>> On Wednesday, June 6, 2012 5:30:56 AM UTC-4, Omri Har-Shemesh wrote:
>>>
>>> Is it possible to watch a table for changes and define a callback 
>>> whenever the table is changed?
>>> I am trying to implement a mechanism where the client is asking for data 
>>> every 5 seconds from the server
>>> and the server should only return not a null value whenever the data has 
>>> changed. The problem is that
>>> the data is quite complex and is inferred from several tables. 
>>> Therefore, in order to save processing time,
>>> I want to calculate this data and return it only when I know it has 
>>> changed.
>>>
>>> Thanks,
>>> Omri
>>>
>>

Reply via email to