fix-4.0-template-merge.patch

Add support for merging vector attributes - Simon Boulet, 04/05/2013 04:08 AM

Download (1.93 KB)

View differences:

src/template/Template.cc
697 697

  
698 698
    for (it = from_tmpl->attributes.begin(); it != from_tmpl->attributes.end(); ++it)
699 699
    {
700
        this->erase(it->first);
701
    }
700
        // Check if an attribute already exists with given name
701
        vector<Attribute *> matches;
702
        get(it->first, matches);
702 703

  
703
    for (it = from_tmpl->attributes.begin(); it != from_tmpl->attributes.end(); ++it)
704
    {
705
        this->set(it->second->clone());
704
        if (matches.size() == 0)
705
        {
706
            // Add new attribute
707
            this->set(it->second->clone());
708
            continue;
709
        }
710

  
711
        Attribute * attr = matches[0];
712
 
713
        if (attr->type() != it->second->type() || attr->type() == Attribute::SIMPLE)
714
        {
715
            // Replace existing attribute
716
            this->erase(it->first);
717
            this->set(it->second->clone());
718
        }
719
        else if (attr->type() == Attribute::VECTOR)
720
        {
721
            // Replace values of the first vector that matched
722
            const map<string,string> values = ((VectorAttribute*) it->second)->value();
723

  
724
            map<string,string>::const_iterator it;
725

  
726
            for (it = values.begin(); it != values.end(); ++it)
727
            {
728
                ((VectorAttribute*) attr)->replace(it->first, it->second);
729
            }
730
        }
706 731
    }
707 732

  
708 733
    return 0;
709
-