Line data Source code
1 : /* 2 : * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved. 3 : */ 4 : 5 : #include "ifmap_link.h" 6 : 7 : #include <sstream> 8 : #include <pugixml/pugixml.hpp> 9 : #include "ifmap/ifmap_table.h" 10 : 11 : using namespace std; 12 : 13 644283 : IFMapLink::IFMapLink(const string &name) : link_name_(name) { 14 644283 : link_revival_ = false; 15 644283 : } 16 : 17 190618 : void IFMapLink::SetProperties(IFMapNode *left, IFMapNode *right, 18 : const string &metadata, uint64_t sequence_number, 19 : const IFMapOrigin &origin) { 20 190618 : left_node_ = left; 21 190618 : left_id_ = make_pair(left->table()->Typename(), left->name()); 22 190618 : right_node_ = right; 23 190618 : right_id_ = make_pair(right->table()->Typename(), right->name()); 24 190618 : metadata_ = metadata; 25 190618 : LinkOriginInfo origin_info(origin, sequence_number); 26 190618 : origin_info_.push_back(origin_info); 27 190618 : } 28 : 29 13234 : void IFMapLink::UpdateProperties(const IFMapOrigin &in_origin, 30 : uint64_t sequence_number) { 31 13234 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 32 26468 : iter != origin_info_.end(); ++iter) { 33 13234 : LinkOriginInfo *origin_info = iter.operator->(); 34 13234 : if (origin_info->origin == in_origin) { 35 13234 : origin_info->sequence_number = sequence_number; 36 : } 37 : } 38 13234 : } 39 : 40 64055 : void IFMapLink::ClearNodes() { 41 64055 : left_node_ = NULL; 42 64055 : right_node_ = NULL; 43 64055 : } 44 : 45 251820 : IFMapNode *IFMapLink::LeftNode(DB *db) { 46 251820 : if (IsDeleted()) { 47 64015 : return IFMapNode::DescriptorLookup(db, left_id_); 48 : } 49 187805 : return left_node_; 50 : } 51 : 52 0 : const IFMapNode *IFMapLink::LeftNode(DB *db) const { 53 0 : if (IsDeleted()) { 54 0 : return IFMapNode::DescriptorLookup(db, left_id_); 55 : } 56 0 : return left_node_; 57 : } 58 : 59 251820 : IFMapNode *IFMapLink::RightNode(DB *db) { 60 251820 : if (IsDeleted()) { 61 64015 : return IFMapNode::DescriptorLookup(db, right_id_); 62 : } 63 187805 : return right_node_; 64 : } 65 : 66 0 : const IFMapNode *IFMapLink::RightNode(DB *db) const { 67 0 : if (IsDeleted()) { 68 0 : return IFMapNode::DescriptorLookup(db, right_id_); 69 : } 70 0 : return right_node_; 71 : } 72 : 73 0 : DBEntry::KeyPtr IFMapLink::GetDBRequestKey() const { 74 0 : DBEntry::KeyPtr key; 75 0 : return key; 76 : } 77 : 78 0 : void IFMapLink::SetKey(const DBRequestKey *genkey) { 79 0 : } 80 : 81 50838 : string IFMapLink::ToString() const { 82 50838 : ostringstream repr; 83 50838 : repr << "link <" << left_id_.first << ':' << left_id_.second; 84 50838 : repr << "," << right_id_.first << ':' << right_id_.second << ">"; 85 101676 : return repr.str(); 86 50838 : } 87 : 88 5178498 : bool IFMapLink::IsLess(const DBEntry &rgen) const { 89 5178498 : const IFMapLink &rhs = static_cast<const IFMapLink &>(rgen); 90 5178498 : return link_name() < rhs.link_name(); 91 : } 92 : 93 4 : void IFMapLink::AddOriginInfo(const IFMapOrigin &in_origin, uint64_t seq_num) { 94 4 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 95 8 : iter != origin_info_.end(); ++iter) { 96 4 : LinkOriginInfo *origin_info = iter.operator->(); 97 4 : if (origin_info->origin == in_origin) { 98 0 : origin_info->sequence_number = seq_num; 99 0 : return; 100 : } 101 : } 102 4 : LinkOriginInfo origin_info(in_origin, seq_num); 103 4 : origin_info_.push_back(origin_info); 104 : } 105 : 106 33317 : void IFMapLink::RemoveOriginInfo(IFMapOrigin::Origin in_origin) { 107 33317 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 108 33323 : iter != origin_info_.end(); ++iter) { 109 33317 : LinkOriginInfo *origin_info = iter.operator->(); 110 33317 : if (origin_info->origin.origin == in_origin) { 111 33311 : origin_info_.erase(iter); 112 33311 : break; 113 : } 114 : } 115 33317 : } 116 : 117 651 : IFMapLink::LinkOriginInfo IFMapLink::GetOriginInfo( 118 : IFMapOrigin::Origin in_origin, bool *exists) { 119 651 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 120 651 : iter != origin_info_.end(); ++iter) { 121 651 : LinkOriginInfo *origin_info = iter.operator->(); 122 651 : if (origin_info->origin.origin == in_origin) { 123 651 : *exists = true; 124 651 : return *origin_info; 125 : } 126 : } 127 : 128 0 : LinkOriginInfo origin_info; 129 0 : *exists = false; 130 0 : return origin_info; 131 : } 132 : 133 0 : bool IFMapLink::HasOrigin(IFMapOrigin::Origin in_origin) { 134 0 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 135 0 : iter != origin_info_.end(); ++iter) { 136 0 : LinkOriginInfo *origin_info = iter.operator->(); 137 0 : if (origin_info->origin.origin == in_origin) { 138 0 : return true; 139 : } 140 : } 141 0 : return false; 142 : } 143 : 144 4762 : uint64_t IFMapLink::sequence_number(IFMapOrigin::Origin in_origin, 145 : bool *exists) { 146 4762 : for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin(); 147 4762 : iter != origin_info_.end(); ++iter) { 148 4762 : LinkOriginInfo *origin_info = iter.operator->(); 149 4762 : if (origin_info->origin.origin == in_origin) { 150 4762 : *exists = true; 151 4762 : return origin_info->sequence_number; 152 : } 153 : } 154 0 : *exists = false; 155 0 : return 0; 156 : } 157 : 158 468 : void IFMapLink::EncodeLinkInfo(pugi::xml_node *parent) const { 159 468 : pugi::xml_node metadata_node = parent->append_child("metadata"); 160 468 : metadata_node.append_attribute("type") = metadata_.c_str(); 161 468 : }