LCOV - code coverage report
Current view: top level - ifmap - ifmap_link.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 73 100 73.0 %
Date: 2026-06-08 02:02:55 Functions: 13 18 72.2 %
Legend: Lines: hit not hit

          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      644308 : IFMapLink::IFMapLink(const string &name) : link_name_(name) {
      14      644308 :     link_revival_ = false;
      15      644308 : }
      16             : 
      17      190638 : void IFMapLink::SetProperties(IFMapNode *left, IFMapNode *right,
      18             :                               const string &metadata, uint64_t sequence_number,
      19             :                               const IFMapOrigin &origin) {
      20      190638 :     left_node_ = left;
      21      190638 :     left_id_ = make_pair(left->table()->Typename(), left->name());
      22      190638 :     right_node_ = right;
      23      190638 :     right_id_ = make_pair(right->table()->Typename(), right->name());
      24      190638 :     metadata_ = metadata;
      25      190638 :     LinkOriginInfo origin_info(origin, sequence_number);
      26      190638 :     origin_info_.push_back(origin_info);
      27      190638 : }
      28             : 
      29       13228 : void IFMapLink::UpdateProperties(const IFMapOrigin &in_origin,
      30             :                                  uint64_t sequence_number) {
      31       13228 :     for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
      32       26456 :          iter != origin_info_.end(); ++iter) {
      33       13228 :         LinkOriginInfo *origin_info = iter.operator->();
      34       13228 :         if (origin_info->origin == in_origin) {
      35       13228 :             origin_info->sequence_number = sequence_number;
      36             :         }
      37             :     }
      38       13228 : }
      39             : 
      40       64087 : void IFMapLink::ClearNodes() {
      41       64087 :     left_node_ = NULL;
      42       64087 :     right_node_ = NULL;
      43       64087 : }
      44             : 
      45      251841 : IFMapNode *IFMapLink::LeftNode(DB *db) {
      46      251841 :     if (IsDeleted()) {
      47       64015 :         return IFMapNode::DescriptorLookup(db, left_id_);
      48             :     }
      49      187826 :     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      251841 : IFMapNode *IFMapLink::RightNode(DB *db) {
      60      251841 :     if (IsDeleted()) {
      61       64015 :         return IFMapNode::DescriptorLookup(db, right_id_);
      62             :     }
      63      187826 :     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       50836 : string IFMapLink::ToString() const {
      82       50836 :     ostringstream repr;
      83       50836 :     repr << "link <" << left_id_.first << ':' << left_id_.second;
      84       50836 :     repr << "," << right_id_.first << ':' << right_id_.second << ">";
      85      101672 :     return repr.str();
      86       50836 : }
      87             : 
      88     5178550 : bool IFMapLink::IsLess(const DBEntry &rgen) const {
      89     5178550 :     const IFMapLink &rhs = static_cast<const IFMapLink &>(rgen);
      90     5178550 :     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       33285 : void IFMapLink::RemoveOriginInfo(IFMapOrigin::Origin in_origin) {
     107       33285 :     for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
     108       33291 :          iter != origin_info_.end(); ++iter) {
     109       33285 :         LinkOriginInfo *origin_info = iter.operator->();
     110       33285 :         if (origin_info->origin.origin == in_origin) {
     111       33279 :             origin_info_.erase(iter);
     112       33279 :             break;
     113             :         }
     114             :     }
     115       33285 : }
     116             : 
     117         657 : IFMapLink::LinkOriginInfo IFMapLink::GetOriginInfo(
     118             :         IFMapOrigin::Origin in_origin, bool *exists) {
     119         657 :     for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
     120         657 :          iter != origin_info_.end(); ++iter) {
     121         657 :         LinkOriginInfo *origin_info = iter.operator->();
     122         657 :         if (origin_info->origin.origin == in_origin) {
     123         657 :             *exists = true;
     124         657 :             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        4821 : uint64_t IFMapLink::sequence_number(IFMapOrigin::Origin in_origin,
     145             :                                     bool *exists) {
     146        4821 :     for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
     147        4821 :          iter != origin_info_.end(); ++iter) {
     148        4821 :         LinkOriginInfo *origin_info = iter.operator->();
     149        4821 :         if (origin_info->origin.origin == in_origin) {
     150        4821 :             *exists = true;
     151        4821 :             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 : }

Generated by: LCOV version 1.14