예제 #1
0
 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
예제 #2
0
 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()))
예제 #3
0
 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()))
예제 #4
0
파일: test_sql.py 프로젝트: wzzbzz/antioch
 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))
예제 #5
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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()))
예제 #6
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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()))
예제 #7
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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))
예제 #8
0
파일: exchange.py 프로젝트: wzzbzz/antioch
    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))
예제 #9
0
 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))
예제 #10
0
파일: exchange.py 프로젝트: wzzbzz/antioch
    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
예제 #11
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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)
예제 #12
0
 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))
예제 #13
0
 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));
예제 #14
0
 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));
예제 #15
0
 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));
예제 #16
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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))
예제 #17
0
 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)
예제 #18
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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))
예제 #19
0
파일: exchange.py 프로젝트: wzzbzz/antioch
 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))
예제 #20
0
 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))
예제 #21
0
     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