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-08 02:02:55 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     1061766 : IFMapNode::IFMapNode(IFMapTable *table)
      18     1061766 :     : table_(table) {
      19     1061766 : }
      20             : 
      21             : struct IFMapObjectDeleter {
      22      105527 :     void operator()(IFMapObject *obj) const {
      23      105527 :         intrusive_ptr_release(obj);
      24      105527 :     }
      25             : };
      26             : 
      27     2123532 : IFMapNode::~IFMapNode() {
      28     1061766 :     list_.clear_and_dispose(IFMapObjectDeleter());
      29     2123532 : }
      30             : 
      31     2094605 : string IFMapNode::ToString() const {
      32     2094605 :     string repr(table_->Typename());
      33     2094605 :     repr += ":";
      34     2094605 :     repr += name_;
      35     2094605 :     return repr;
      36           0 : }
      37             : 
      38      139542 : IFMapObject *IFMapNode::Find(IFMapOrigin origin) {
      39      279460 :     for (ObjectList::iterator iter = list_.begin(); iter != list_.end();
      40             :          ++iter) {
      41       39954 :         IFMapObject *object = iter.operator->();
      42       39954 :         if (object->origin() == origin) {
      43       39766 :             return object;
      44             :         }
      45             :     }
      46       99776 :     return NULL;
      47             : }
      48             : 
      49      133112 : void IFMapNode::Insert(IFMapObject *obj) {
      50      133112 :     intrusive_ptr_add_ref(obj);
      51      133112 :     if (obj->origin().IsOriginXmpp()) {
      52          80 :         list_.push_back(*obj);
      53             :     } else {
      54      133032 :         list_.push_front(*obj);
      55             :     }
      56      133112 : }
      57             : 
      58       27585 : void IFMapNode::Remove(IFMapObject *obj) {
      59       55170 :     list_.erase(list_.iterator_to(*obj));
      60       27585 :     intrusive_ptr_release(obj);
      61       27585 : }
      62             : 
      63     1974760 : IFMapObject *IFMapNode::GetObject() {
      64     1974760 :     if (list_.empty()) {
      65      192913 :         return NULL;
      66             :     }
      67     1781847 :     return &list_.front();
      68             : }
      69             : 
      70       48499 : const IFMapObject *IFMapNode::GetObject() const {
      71       48499 :     if (list_.empty()) {
      72          25 :         return NULL;
      73             :     }
      74       48474 :     return &list_.front();
      75             : }
      76             : 
      77        3626 : IFMapNode::crc32type IFMapNode::GetConfigCrc() {
      78        3626 :     IFMapNode::crc32type crc = 0;
      79        3626 :     IFMapObject *object = Find(IFMapOrigin(IFMapOrigin::CASSANDRA));
      80        3626 :     if (object) {
      81        3024 :         crc = object->CalculateCrc();
      82        3024 :         if (crc == 0) {
      83         510 :             crc = 0xffffffff;
      84             :         }
      85             :     }
      86             : 
      87        3626 :     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         445 : void IFMapNode::EncodeNodeDetail(pugi::xml_node *parent) const {
     100         445 :     xml_node node = parent->append_child("node");
     101         445 :     node.append_attribute("type") = table_->Typename();
     102         445 :     node.append_child("name").text().set(name_.c_str());
     103         445 :     const IFMapObject *object = GetObject();
     104         445 :     if (object != NULL) {
     105         420 :         object->EncodeUpdate(&node);
     106             :     }
     107         445 : }
     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        1722 : DBEntryBase::KeyPtr IFMapNode::GetDBRequestKey() const {
     122        1722 :     IFMapTable::RequestKey *keyptr = new IFMapTable::RequestKey();
     123        1722 :     keyptr->id_name = name_;
     124        1722 :     return KeyPtr(keyptr);
     125             : }
     126             : 
     127     1061766 : void IFMapNode::SetKey(const DBRequestKey *genkey) {
     128     1061766 :     const IFMapTable::RequestKey *keyptr =
     129             :     static_cast<const IFMapTable::RequestKey *>(genkey);
     130     1061766 :     name_ = keyptr->id_name;
     131     1061766 : }
     132             : 
     133      128030 : IFMapNode *IFMapNode::DescriptorLookup(
     134             :         DB *db, const IFMapNode::Descriptor &descriptor) {
     135      128030 :     if (db == NULL) {
     136           0 :         return NULL;
     137             :     }
     138      128030 :     IFMapTable *table = IFMapTable::FindTable(db, descriptor.first);
     139      128030 :     if (table == NULL) {
     140           0 :         return NULL;
     141             :     }
     142      128030 :     return table->FindNode(descriptor.second);
     143             : }

Generated by: LCOV version 1.14