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 >>> >>