OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
ifmap_link.cc
Go to the documentation of this file.
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 IFMapLink::IFMapLink(const string &name) : link_name_(name) {
14  link_revival_ = false;
15 }
16 
18  const string &metadata, uint64_t sequence_number,
19  const IFMapOrigin &origin) {
20  left_node_ = left;
21  left_id_ = make_pair(left->table()->Typename(), left->name());
23  right_id_ = make_pair(right->table()->Typename(), right->name());
25  LinkOriginInfo origin_info(origin, sequence_number);
26  origin_info_.push_back(origin_info);
27 }
28 
30  uint64_t sequence_number) {
31  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
32  iter != origin_info_.end(); ++iter) {
33  LinkOriginInfo *origin_info = iter.operator->();
34  if (origin_info->origin == in_origin) {
35  origin_info->sequence_number = sequence_number;
36  }
37  }
38 }
39 
41  left_node_ = NULL;
42  right_node_ = NULL;
43 }
44 
46  if (IsDeleted()) {
48  }
49  return left_node_;
50 }
51 
52 const IFMapNode *IFMapLink::LeftNode(DB *db) const {
53  if (IsDeleted()) {
55  }
56  return left_node_;
57 }
58 
60  if (IsDeleted()) {
62  }
63  return right_node_;
64 }
65 
66 const IFMapNode *IFMapLink::RightNode(DB *db) const {
67  if (IsDeleted()) {
69  }
70  return right_node_;
71 }
72 
74  DBEntry::KeyPtr key;
75  return key;
76 }
77 
78 void IFMapLink::SetKey(const DBRequestKey *genkey) {
79 }
80 
81 string IFMapLink::ToString() const {
82  ostringstream repr;
83  repr << "link <" << left_id_.first << ':' << left_id_.second;
84  repr << "," << right_id_.first << ':' << right_id_.second << ">";
85  return repr.str();
86 }
87 
88 bool IFMapLink::IsLess(const DBEntry &rgen) const {
89  const IFMapLink &rhs = static_cast<const IFMapLink &>(rgen);
90  return link_name() < rhs.link_name();
91 }
92 
93 void IFMapLink::AddOriginInfo(const IFMapOrigin &in_origin, uint64_t seq_num) {
94  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
95  iter != origin_info_.end(); ++iter) {
96  LinkOriginInfo *origin_info = iter.operator->();
97  if (origin_info->origin == in_origin) {
98  origin_info->sequence_number = seq_num;
99  return;
100  }
101  }
102  LinkOriginInfo origin_info(in_origin, seq_num);
103  origin_info_.push_back(origin_info);
104 }
105 
107  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
108  iter != origin_info_.end(); ++iter) {
109  LinkOriginInfo *origin_info = iter.operator->();
110  if (origin_info->origin.origin == in_origin) {
111  origin_info_.erase(iter);
112  break;
113  }
114  }
115 }
116 
118  IFMapOrigin::Origin in_origin, bool *exists) {
119  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
120  iter != origin_info_.end(); ++iter) {
121  LinkOriginInfo *origin_info = iter.operator->();
122  if (origin_info->origin.origin == in_origin) {
123  *exists = true;
124  return *origin_info;
125  }
126  }
127 
128  LinkOriginInfo origin_info;
129  *exists = false;
130  return origin_info;
131 }
132 
134  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
135  iter != origin_info_.end(); ++iter) {
136  LinkOriginInfo *origin_info = iter.operator->();
137  if (origin_info->origin.origin == in_origin) {
138  return true;
139  }
140  }
141  return false;
142 }
143 
145  bool *exists) {
146  for (std::vector<LinkOriginInfo>::iterator iter = origin_info_.begin();
147  iter != origin_info_.end(); ++iter) {
148  LinkOriginInfo *origin_info = iter.operator->();
149  if (origin_info->origin.origin == in_origin) {
150  *exists = true;
151  return origin_info->sequence_number;
152  }
153  }
154  *exists = false;
155  return 0;
156 }
157 
158 void IFMapLink::EncodeLinkInfo(pugi::xml_node *parent) const {
159  pugi::xml_node metadata_node = parent->append_child("metadata");
160  metadata_node.append_attribute("type") = metadata_.c_str();
161 }
bool IsDeleted() const
Definition: db_entry.h:49
virtual const char * Typename() const =0
IFMapTable * table()
Definition: ifmap_node.h:29
std::unique_ptr< DBRequestKey > KeyPtr
Definition: db_entry.h:25
static IFMapNode * DescriptorLookup(DB *db, const Descriptor &descriptor)
Definition: ifmap_node.cc:133
Definition: db.h:24
const std::string & name() const
Definition: ifmap_node.h:48
Origin origin
Definition: ifmap_origin.h:41