LCOV - code coverage report
Current view: top level - ifmap - ifmap_node.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 72 86 83.7 %
Date: 2026-06-11 01:56:02 Functions: 16 18 88.9 %
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_node.h"
       6             : 
       7             : #include <iostream>
       8             : 
       9             : #include <pugixml/pugixml.hpp>
      10             : 
      11             : #include "ifmap/ifmap_table.h"
      12             : 
      13             : using namespace std;
      14             : using pugi::xml_node;
      15             : 
      16             : 
      17     1062107 : IFMapNode::IFMapNode(IFMapTable *table)
      18     1062107 :     : table_(table) {
      19     1062107 : }
      20             : 
      21             : struct IFMapObjectDeleter {
      22      105523 :     void operator()(IFMapObject *obj) const {
      23      105523 :         intrusive_ptr_release(obj);
      24      105523 :     }
      25             : };
      26             : 
      27     2124214 : IFMapNode::~IFMapNode() {
      28     1062107 :     list_.clear_and_dispose(IFMapObjectDeleter());
      29     2124214 : }
      30             : 
      31     2094727 : string IFMapNode::ToString() const {
      32     2094727 :     string repr(table_->Typename());
      33     2094727 :     repr += ":";
      34     2094727 :     repr += name_;
      35     2094727 :     return repr;
      36           0 : }
      37             : 
      38      139563 : IFMapObject *IFMapNode::Find(IFMapOrigin origin) {
      39      279508 :     for (ObjectList::iterator iter = list_.begin(); iter != list_.end();
      40             :          ++iter) {
      41       39970 :         IFMapObject *object = iter.operator->();
      42       39970 :         if (object->origin() == origin) {
      43       39779 :             return object;
      44             :         }
      45             :     }
      46       99784 :     return NULL;
      47             : }
      48             : 
      49      133118 : void IFMapNode::Insert(IFMapObject *obj) {
      50      133118 :     intrusive_ptr_add_ref(obj);
      51      133118 :     if (obj->origin().IsOriginXmpp()) {
      52          80 :         list_.push_back(*obj);
      53             :     } else {
      54      133038 :         list_.push_front(*obj);
      55             :     }
      56      133118 : }
      57             : 
      58       27595 : void IFMapNode::Remove(IFMapObject *obj) {
      59       55190 :     list_.erase(list_.iterator_to(*obj));
      60       27595 :     intrusive_ptr_release(obj);
      61       27595 : }
      62             : 
      63     1975078 : IFMapObject *IFMapNode::GetObject() {
      64     1975078 :     if (list_.empty()) {
      65      193157 :         return NULL;
      66             :     }
      67     1781921 :     return &list_.front();
      68             : }
      69             : 
      70       48386 : const IFMapObject *IFMapNode::GetObject() const {
      71       48386 :     if (list_.empty()) {
      72          24 :         return NULL;
      73             :     }
      74       48362 :     return &list_.front();
      75             : }
      76             : 
      77        3627 : IFMapNode::crc32type IFMapNode::GetConfigCrc() {
      78        3627 :     IFMapNode::crc32type crc = 0;
      79        3627 :     IFMapObject *object = Find(IFMapOrigin(IFMapOrigin::CASSANDRA));
      80        3627 :     if (object) {
      81        3028 :         crc = object->CalculateCrc();
      82        3028 :         if (crc == 0) {
      83         510 :             crc = 0xffffffff;
      84             :         }
      85             :     }
      86             : 
      87        3627 :     return crc;
      88             : }
      89             : 
      90           0 : void IFMapNode::PrintAllObjects() {
      91           0 :     cout << name_ << ": " << list_.size() << " objects" << endl;
      92           0 :     for (ObjectList::iterator iter = list_.begin(); iter != list_.end();
      93             :          ++iter) {
      94           0 :         IFMapObject *object = iter.operator->();
      95           0 :         cout << "\t" << object->origin().ToString() << endl;
      96             :     }
      97           0 : }
      98             : 
      99         444 : void IFMapNode::EncodeNodeDetail(pugi::xml_node *parent) const {
     100         444 :     xml_node node = parent->append_child("node");
     101         444 :     node.append_attribute("type") = table_->Typename();
     102         444 :     node.append_child("name").text().set(name_.c_str());
     103         444 :     const IFMapObject *object = GetObject();
     104         444 :     if (object != NULL) {
     105         420 :         object->EncodeUpdate(&node);
     106             :     }
     107         444 : }
     108             : 
     109           0 : void IFMapNode::EncodeNode(xml_node *parent) const {
     110           0 :     xml_node node = parent->append_child("node");
     111           0 :     node.append_attribute("type") = table_->Typename();
     112           0 :     node.append_child("name").text().set(name_.c_str());
     113           0 : }
     114             : 
     115         936 : void IFMapNode::EncodeNode(const Descriptor &descriptor, xml_node *parent) {
     116         936 :     xml_node node = parent->append_child("node");
     117         936 :     node.append_attribute("type") = descriptor.first.c_str();
     118         936 :     node.append_child("name").text().set(descriptor.second.c_str());
     119         936 : }
     120             : 
     121        1742 : DBEntryBase::KeyPtr IFMapNode::GetDBRequestKey() const {
     122        1742 :     IFMapTable::RequestKey *keyptr = new IFMapTable::RequestKey();
     123        1742 :     keyptr->id_name = name_;
     124        1742 :     return KeyPtr(keyptr);
     125             : }
     126             : 
     127     1062107 : void IFMapNode::SetKey(const DBRequestKey *genkey) {
     128     1062107 :     const IFMapTable::RequestKey *keyptr =
     129             :     static_cast<const IFMapTable::RequestKey *>(genkey);
     130     1062107 :     name_ = keyptr->id_name;
     131     1062107 : }
     132             : 
     133      128060 : IFMapNode *IFMapNode::DescriptorLookup(
     134             :         DB *db, const IFMapNode::Descriptor &descriptor) {
     135      128060 :     if (db == NULL) {
     136           0 :         return NULL;
     137             :     }
     138      128060 :     IFMapTable *table = IFMapTable::FindTable(db, descriptor.first);
     139      128060 :     if (table == NULL) {
     140           0 :         return NULL;
     141             :     }
     142      128060 :     return table->FindNode(descriptor.second);
     143             : }

Generated by: LCOV version 1.14