def iterate_task(self, responder): """ Check for waiting tasks using the given ampoule TransactionChild. Returns False if there's no task waiting Returns None if an exception occurs Returns True if it processes a task """ next_task = self.connection.runQuery( """SELECT t.* FROM task t WHERE t.created + (t.delay * interval '1 second') < NOW() AND t.killed = 0 ORDER BY t.created ASC LIMIT 1 """) if not(next_task): return False try: responder.run_task( user_id = next_task[0]['user_id'], task_id = next_task[0]['id'], ) except Exception as e: import traceback trace = traceback.format_exc() err = '%s: %s' % (e.__class__.__name__, str(e)) self.connection.runOperation(sql.build_update('task', dict(killed=True, error=err, trace=trace), dict(id=next_task[0]['id']))) return None else: self.connection.runOperation(sql.build_delete('task', dict(id=next_task[0]['id']))) return True
def remove_verb(self, origin_id, name): """ Remove a verb defined directly on the given object. """ v = self.get_verb(origin_id, name) if(v): self.connection.runOperation(sql.build_delete('verb', id=v.get_id()))
def remove_property(self, origin_id, name): """ Remove a property defined on the given object """ v = self.get_property(origin_id, name) if(v): self.connection.runOperation(sql.build_delete('property', id=v.get_id()))
def test_build_delete(self): query = sql.build_delete('table', { 'col1': 'col1_data', 'col2': 'col2_data' }) expecting = "DELETE FROM table WHERE col1 = 'col1_data' AND col2 = 'col2_data'" self.assertEqual(query, expecting, 'Got "%s" when expecting "%s"' % (query, expecting))
def remove_property(self, origin_id, name): """ Remove a property defined on the given object """ v = self.get_property(origin_id, name) if (v): self.connection.runOperation( sql.build_delete('property', id=v.get_id()))
def remove_verb(self, origin_id, name): """ Remove a verb defined directly on the given object. """ v = self.get_verb(origin_id, name) if (v): self.connection.runOperation( sql.build_delete('verb', id=v.get_id()))
def remove_observer(self, object_id, observer_id): """ Remove an observer for the provided object. """ self.connection.runOperation( sql.build_delete('object_observer', object_id=object_id, observer_id=observer_id))
def update_access(self, access_id, rule, access, accessor, permission, weight, subject, deleted): """ Modify an access rule. """ record = {} if not access_id else self.connection.runQuery( sql.interp( """SELECT a.*, p.name AS permission FROM access a INNER JOIN permission p ON a.permission_id = p.id WHERE a.id = %s """, access_id)) if (record): record = record[0] else: record = {} if (deleted): self.connection.runOperation( sql.build_delete('access', id=access_id)) return record['rule'] = rule record['type'] = access record['weight'] = weight record.pop('group', '') if (access == 'group'): record['"group"'] = accessor record['accessor_id'] = None else: record['"group"'] = None record['accessor_id'] = accessor.get_id() if (record.pop('permission', '') != permission): if (permission not in self.permission_list): raise ValueError("Unknown permission: %s" % permission) record['permission_id'] = self.permission_list[permission] if (subject.get_type() == 'object'): record['object_id'] = subject.get_id() elif (subject.get_type() == 'verb'): record['verb_id'] = subject.get_id() elif (subject.get_type() == 'property'): record['property_id'] = subject.get_id() if (access_id): self.connection.runOperation( sql.build_update('access', record, dict(id=access_id))) else: self.connection.runOperation(sql.build_insert('access', **record))
def update_access(self, access_id, rule, access, accessor, permission, weight, subject, deleted): """ Modify an access rule. """ record = {} if not access_id else self.connection.runQuery(sql.interp( """SELECT a.*, p.name AS permission FROM access a INNER JOIN permission p ON a.permission_id = p.id WHERE a.id = %s """, access_id)) if(record): record = record[0] else: record = {} if(deleted): self.connection.runOperation(sql.build_delete('access', id=access_id)) return record['rule'] = rule record['type'] = access record['weight'] = weight record.pop('group', '') if(access == 'group'): record['"group"'] = accessor record['accessor_id'] = None else: record['"group"'] = None record['accessor_id'] = accessor.get_id() if(record.pop('permission', '') != permission): if(permission not in self.permission_list): raise ValueError("Unknown permission: %s" % permission) record['permission_id'] = self.permission_list[permission] if(subject.get_type() == 'object'): record['object_id'] = subject.get_id() elif(subject.get_type() == 'verb'): record['verb_id'] = subject.get_id() elif(subject.get_type() == 'property'): record['property_id'] = subject.get_id() if(access_id): self.connection.runOperation(sql.build_update('access', record, dict(id=access_id))) else: self.connection.runOperation(sql.build_insert('access', **record))
def iterate_task(self, responder): """ Check for waiting tasks using the given ampoule TransactionChild. Returns False if there's no task waiting Returns None if an exception occurs Returns True if it processes a task """ next_task = self.connection.runQuery("""SELECT t.* FROM task t WHERE t.created + (t.delay * interval '1 second') < NOW() AND t.killed = 'f' ORDER BY t.created ASC LIMIT 1 """) if not (next_task): return False try: responder.run_task( user_id=next_task[0]['user_id'], task_id=next_task[0]['id'], ) except Exception as e: import traceback trace = traceback.format_exc() err = '%s: %s' % (e.__class__.__name__, str(e)) self.connection.runOperation( sql.build_update('task', dict(killed=True, error=err, trace=trace), dict(id=next_task[0]['id']))) return None else: self.connection.runOperation( sql.build_delete('task', dict(id=next_task[0]['id']))) return True
def remove(self, obj_type, object_id): """ Destroy an object in the database. """ self.connection.runOperation(sql.build_delete(obj_type, id=object_id)) self.cache.pop('%s-%s' % (obj_type, object_id), None)
def remove_verb_name(self, verb_id, name): """ Remove a name for a given verb. """ self.connection.runOperation(sql.build_delete('verb_name', verb_id=verb_id, name=name))
def remove_observer(self, object_id, observer_id): """ Remove an observer for the provided object. """ self.connection.runOperation(sql.build_delete('object_observer', object_id=object_id, observer_id=observer_id));
def clear_observers(self, object_id): """ Make all current observers stop paying attention to the provided object. """ self.connection.runOperation(sql.build_delete('object_observer', object_id=object_id));
def remove_alias(self, object_id, alias): """ Remove an aliases for the provided object. """ self.connection.runOperation(sql.build_delete('object_alias', object_id=object_id, alias=alias));
def remove_alias(self, object_id, alias): """ Remove an aliases for the provided object. """ self.connection.runOperation( sql.build_delete('object_alias', object_id=object_id, alias=alias))
def remove_verb_name(self, verb_id, name): """ Remove a name for a given verb. """ self.connection.runOperation( sql.build_delete('verb_name', verb_id=verb_id, name=name))
def clear_observers(self, object_id): """ Make all current observers stop paying attention to the provided object. """ self.connection.runOperation( sql.build_delete('object_observer', object_id=object_id))
def test_build_delete2(self): query = sql.build_delete('table', col1='col1_data', col2='col2_data'); expecting = "DELETE FROM table WHERE col1 = 'col1_data' AND col2 = 'col2_data'" self.failUnlessEqual(query, expecting, 'Got "%s" when expecting "%s"' % (sql, expecting))
if not(next_task): return False try: responder.run_task( user_id = next_task[0]['user_id'], task_id = next_task[0]['id'], ) except Exception, e: import traceback trace = traceback.format_exc() err = '%s: %s' % (e.__class__.__name__, str(e)) self.pool.runOperation(sql.build_update('task', dict(killed=True, error=err, trace=trace), dict(id=next_task[0]['id']))) return None else: self.pool.runOperation(sql.build_delete('task', dict(id=next_task[0]['id']))) return True def register_task(self, user_id, delay, origin_id, verb_name, args, kwargs): """ Register a delayed verb call. """ task_id = self.pool.runQuery(sql.build_insert('task', dict( user_id = user_id, delay = delay, origin_id = origin_id, verb_name = verb_name, args = args, kwargs = kwargs, )) + ' RETURNING id')[0]['id'] return task_id