Пример #1
0
    def add_rules_to_database(self, file_id, ruleList):
        """ Add rules to database based on file """
        stored_rules = Session.query(Rules).filter(Rules.file == file_id).all()  # Returns entire set of rules
        stored_list = {}  # Cache of already accessed rules
        rules_to_add = []  # List of rule to add to database
        for new_rule in ruleList:
            try:

                try:
                    if int(new_rule.sid) not in stored_list or stored_list[new_rule.sid] is None:
                        stored_list[int(new_rule.sid)] = self._find_local_rule(stored_rules, int(new_rule.sid))

                    stored_local_rules = stored_list[int(new_rule.sid)]

                    if stored_local_rules is None or len(stored_local_rules) == 0:
                        # 					    print 'print %s is not in DB. Type %s' % (int(new_rule.sid), type(new_rule.sid))
                        # 					    for rules in stored_rules:
                        # 					        print 'Sid: %s Rev: %s\nRule: %s' % (rules.sid, rules.rev, rules.rule)

                        raise NoResultFound

                    old_rule = stored_local_rules[0]
                    # print '--#--\n SID: %s' % (new_rule.sid)
                    # print '---\n ID: %s \n Rule: %s --#--' % (old_rule.sid, old_rule.rule)

                    # print '-#- \n %s \n -#- \n %s-#-'  % (old_rule, new_rule)

                    if int(old_rule.rev) < int(new_rule.rev) or str(old_rule.rule) != str(new_rule.raw):
                        old_rule = self.deactivate_rule(old_rule)
                        print "Different revision or content %s" % old_rule.sid
                        raise NoResultFound

                    if new_rule.active != old_rule.active:
                        print "Rule is deactiviated: %s" % old_rule.sid
                        old_rule = deactiviate_rule(old_rule)

                    stored_local_rules[0] = old_rule
                    stored_list[int(new_rule.sid)] = stored_local_rules
                except NoResultFound:  # No result found, add rule
                    new_rule_add = Rules(new_rule, file_id)
                    rules_to_add.append(new_rule_add)
                except IndexError as e:
                    print "List index: %s" % (e)
                    print stored_local_rules
                    exit(1)
                except TypeError as e:
                    print "Type error: %s" % (e)
                    # 					print type(new_rule.sid)
                    # 					print stored_local_rules
                    exit(1)

            except OperationalError as e:
                print "EXCEPTION in add_rules_to_database\nError information: %s" % (e)  # TODO: Needs to f**k off

        Session.add_all(rules_to_add)
        Session.flush()