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