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