LCOV - code coverage report
Current view: top level - ifmap - ifmap_link_table.cc (source / functions) Hit Total Coverage
Test: OpenSDN C/C++ coverage (all TARGET_SET jobs) Lines: 76 85 89.4 %
Date: 2026-06-22 02:21:21 Functions: 12 14 85.7 %
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/ifmap_link_table.h"
       6             : 
       7             : #include <boost/bind/bind.hpp>
       8             : 
       9             : #include "db/db.h"
      10             : #include "db/db_graph.h"
      11             : #include "db/db_table_partition.h"
      12             : #include "ifmap/ifmap_link.h"
      13             : #include "ifmap/ifmap_log.h"
      14             : #include "ifmap/ifmap_log_types.h"
      15             : 
      16             : using namespace std;
      17             : using namespace boost::placeholders;
      18             : 
      19        8213 : IFMapLinkTable::IFMapLinkTable(DB *db, const string &name, DBGraph *graph)
      20        8213 :         : DBGraphTable(db, name, graph) {
      21        8213 : }
      22             : 
      23           0 : void IFMapLinkTable::Input(DBTablePartition *partition, DBClient *client,
      24             :                            DBRequest *req) {
      25           0 :     assert(false);
      26             : }
      27             : 
      28      362976 : std::unique_ptr<DBEntry> IFMapLinkTable::AllocEntry(
      29             :         const DBRequestKey *key) const {
      30      362976 :     const RequestKey *rkey = static_cast<const RequestKey *>(key);
      31      362976 :     unique_ptr<DBEntry> entry(new IFMapLink(rkey->name));
      32      362976 :     return entry;
      33             : }
      34             : 
      35             : // Generate an unique name for the link node and it should
      36             : // be independent of the order in which the right and left nodes are specified
      37      362949 : std::string IFMapLinkTable::LinkKey(const string &metadata,
      38             :                                         IFMapNode *left, IFMapNode *right) {
      39      362949 :     ostringstream oss;
      40      362949 :     if (left->ToString() < right->ToString()) {
      41      154847 :         oss << metadata << "," << left->ToString() << "," << right->ToString();
      42             :     } else {
      43      208102 :         oss << metadata << "," << right->ToString() << "," << left->ToString();
      44             :     }
      45      725898 :     return oss.str();
      46      362949 : }
      47             : 
      48      159811 : IFMapLink *IFMapLinkTable::AddLink(IFMapNode *left, IFMapNode *right,
      49             :                              const string &metadata, uint64_t sequence_number,
      50             :                              const IFMapOrigin &origin) {
      51             :     DBTablePartition *partition =
      52      159811 :         static_cast<DBTablePartition *>(GetTablePartition(0));
      53             : 
      54      159811 :     string link_name = LinkKey(metadata, left, right);
      55      159811 :     IFMapLink *link = FindLink(link_name);
      56      159811 :     if (link) {
      57           4 :         assert(link->IsDeleted());
      58           4 :         link->SetLinkRevival(true);
      59           4 :         link->ClearDelete();
      60           4 :         link->set_last_change_at_to_now();
      61           4 :         partition->Change(link);
      62             :     } else {
      63      159807 :         link = new IFMapLink(link_name);
      64      159807 :         partition->Add(link);
      65             :     }
      66      159811 :     link->SetProperties(left, right, metadata, sequence_number, origin);
      67      159811 :     assert(dynamic_cast<IFMapNode *>(left));
      68      159811 :     assert(dynamic_cast<IFMapNode *>(right));
      69      159811 :     return link;
      70      159811 : }
      71             : 
      72      203106 : IFMapLink *IFMapLinkTable::FindLink(const string &metadata, IFMapNode *left, IFMapNode *right) {
      73      203106 :     string link_name = LinkKey(metadata, left, right);
      74      406212 :     return FindLink(link_name);
      75      203106 : }
      76             : 
      77      362976 : IFMapLink *IFMapLinkTable::FindLink(const string &name) {
      78             : 
      79             :     DBTablePartition *partition =
      80      362976 :         static_cast<DBTablePartition *>(GetTablePartition(0));
      81      362976 :     RequestKey key;
      82      362976 :     key.name = name;
      83      725952 :     return static_cast<IFMapLink *>(partition->Find(&key));
      84      362976 : }
      85             : 
      86           0 : IFMapLink *IFMapLinkTable::FindNextLink(const string &name) {
      87             : 
      88             :     DBTablePartition *partition =
      89           0 :         static_cast<DBTablePartition *>(GetTablePartition(0));
      90           0 :     RequestKey key;
      91           0 :     key.name = name;
      92           0 :     return static_cast<IFMapLink *>(partition->FindNext(&key));
      93           0 : }
      94             : 
      95       33281 : void IFMapLinkTable::DeleteLink(IFMapLink *link) {
      96       33281 :     DBGraphEdge *edge = static_cast<DBGraphEdge *>(link);
      97       33281 :     graph()->Unlink(edge);
      98       33281 :     link->set_last_change_at_to_now();
      99       33281 :     link->ClearNodes();
     100             :     DBTablePartition *partition =
     101       33281 :         static_cast<DBTablePartition *>(GetTablePartition(0));
     102       33281 :     partition->Delete(edge);
     103       33281 : }
     104             : 
     105       33287 : void IFMapLinkTable::DeleteLink(IFMapLink *link, const IFMapOrigin &origin) {
     106       33287 :     link->RemoveOriginInfo(origin.origin);
     107       33287 :     if (link->is_origin_empty()) {
     108       33281 :         DeleteLink(link);
     109             :     }
     110       33287 : }
     111             : 
     112        8213 : DBTable *IFMapLinkTable::CreateTable(DB *db, const string &name,
     113             :                                      DBGraph *graph) {
     114        8213 :     IFMapLinkTable *table = new IFMapLinkTable(db, name, graph);
     115        8213 :     table->Init();
     116        8213 :     return table;
     117             : }
     118             : 
     119        8213 : void IFMapLinkTable::Clear() {
     120             :     DBTablePartition *partition = static_cast<DBTablePartition *>(
     121        8213 :         GetTablePartition(0));
     122             : 
     123        8213 :     assert(!HasListeners());
     124        8213 :     for (IFMapLink *link = static_cast<IFMapLink *>(partition->GetFirst()),
     125      134743 :                  *next = NULL; link != NULL; link = next) {
     126      126530 :         next = static_cast<IFMapLink *>(partition->GetNext(link));
     127      126530 :         if (link->IsDeleted()) {
     128           0 :             continue;
     129             :         }
     130      126530 :         graph()->Unlink(link);
     131      126530 :         partition->Delete(link);
     132             :     }
     133        8213 : }
     134             : 
     135        8213 : void IFMapLinkTable_Init(DB *db, DBGraph *graph) {
     136             :     DBTable *table =
     137        8213 :             IFMapLinkTable::CreateTable(db, "__ifmap_metadata__.0", graph);
     138        8213 :     db->AddTable(table);
     139        8213 : }
     140             : 
     141         159 : void IFMapLinkTable_Clear(DB *db) {
     142             :     IFMapLinkTable *ltable = static_cast<IFMapLinkTable *>(
     143         159 :             db->FindTable("__ifmap_metadata__.0"));
     144         159 :     ltable->Clear();
     145         159 : }

Generated by: LCOV version 1.14