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-11-09 02:10:49 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             :  * 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 : }

Generated by: LCOV version 1.14