add Rrset
Change-Id: Ic8a37ee63fb5b0266966d3888fba5d3d0a479b44
diff --git a/src/rrset.cpp b/src/rrset.cpp
new file mode 100644
index 0000000..4559479
--- /dev/null
+++ b/src/rrset.cpp
@@ -0,0 +1,45 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "rrset.hpp"
+
+namespace ndn {
+namespace ndns {
+
+Rrset::Rrset(Zone* zone)
+ : m_id(0)
+ , m_zone(zone)
+{
+}
+
+std::ostream&
+operator<<(std::ostream& os, const Rrset& rrset)
+{
+ os << "Rrset: Id=" << rrset.getId();
+ if (rrset.getZone() != 0)
+ os << " Zone=(" << *rrset.getZone() << ")";
+
+ os << " Label=" << rrset.getLabel()
+ << " Type=" << rrset.getType()
+ << " Version=" << rrset.getVersion();
+ return os;
+}
+
+} // namespace ndns
+} // namespace ndn
diff --git a/src/rrset.hpp b/src/rrset.hpp
new file mode 100644
index 0000000..69b311b
--- /dev/null
+++ b/src/rrset.hpp
@@ -0,0 +1,210 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (c) 2014, Regents of the University of California.
+ *
+ * This file is part of NDNS (Named Data Networking Domain Name Service).
+ * See AUTHORS.md for complete list of NDNS authors and contributors.
+ *
+ * NDNS is free software: you can redistribute it and/or modify it under the terms
+ * of the GNU General Public License as published by the Free Software Foundation,
+ * either version 3 of the License, or (at your option) any later version.
+ *
+ * NDNS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
+ * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * NDNS, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NDNS_RRSET_HPP
+#define NDNS_RRSET_HPP
+
+#include "zone.hpp"
+
+namespace ndn {
+namespace ndns {
+
+/**
+ * @brief Resource Record Set (rrset) define the the entry's attributes in NDNS
+ * this class also reflects the table (rrset) schema in the database
+ *
+ * The class is copyable, since it may be assigned to another Rrset instance
+ * when resolving Response or Query from database
+ */
+class Rrset
+{
+public:
+ explicit
+ Rrset(Zone* zone = 0);
+
+ /**
+ * @brief get the id
+ *
+ * Default value is 0, the database has to guarantee that id is greater than 0.
+ */
+ uint64_t
+ getId() const
+ {
+ return m_id;
+ }
+
+ /**
+ * @brief set the id
+ *
+ * Default value is 0, the database has to guarantee that id is greater than 0.
+ */
+ void
+ setId(uint64_t id)
+ {
+ m_id = id;
+ }
+
+ /**
+ * @brief get the zone where the record is stored
+ */
+ Zone*
+ getZone() const
+ {
+ return m_zone;
+ }
+
+ /**
+ * @brief set the zone where the record is stored
+ */
+ void
+ setZone(Zone* zone)
+ {
+ m_zone = zone;
+ }
+
+ /**
+ * @brief get the label of rrset
+ */
+ const Name&
+ getLabel() const
+ {
+ return m_label;
+ }
+
+ /**
+ * @brief set the label of rrset
+ */
+ void
+ setLabel(const Name& label)
+ {
+ m_label = label;
+ }
+
+ /**
+ * @brief get the type of this rrset
+ */
+ const name::Component&
+ getType() const
+ {
+ return m_type;
+ }
+
+ /**
+ * @brief set the type of this rrset
+ */
+ void
+ setType(const name::Component& type)
+ {
+ m_type = type;
+ }
+
+ /**
+ * @brief get version of the data
+ */
+ const name::Component&
+ getVersion() const
+ {
+ return m_version;
+ }
+
+ /**
+ * @brief set version of the rrset
+ */
+ void
+ setVersion(const name::Component& version)
+ {
+ m_version = version;
+ }
+
+ /**
+ * @brief get ttl of the rrset
+ */
+ const time::seconds&
+ getTtl() const
+ {
+ return m_ttl;
+ }
+
+ /**
+ * @brief set ttl of the rrset
+ */
+ void
+ setTtl(const time::seconds& ttl)
+ {
+ m_ttl = ttl;
+ }
+
+ /**
+ * @brief get wire formatted block of the Response
+ */
+ const Block&
+ getData() const
+ {
+ return m_data;
+ }
+
+ /**
+ * @brief set wire formatted block of the Response
+ */
+ void
+ setData(const Block& data)
+ {
+ m_data = data;
+ }
+
+ /**
+ * @brief compare two rrset instance
+ *
+ * Note that comparison ignores id, TTL, and Data when comparing RR sets
+ */
+ bool
+ operator==(const Rrset& other) const
+ {
+ return (getZone() == other.getZone() && getLabel() == other.getLabel() &&
+ getType() == other.getType() && getVersion() == other.getVersion());
+ }
+
+ /**
+ * @brief compare two rrset instance
+ *
+ * Note that comparison ignores id, TTL, and Data when comparing RR sets
+ */
+ bool
+ operator!=(const Rrset& other) const
+ {
+ return !(*this == other);
+ }
+
+private:
+ uint64_t m_id;
+ Zone* m_zone;
+ Name m_label;
+ name::Component m_type;
+ name::Component m_version;
+ time::seconds m_ttl;
+ Block m_data;
+};
+
+std::ostream&
+operator<<(std::ostream& os, const Rrset& Rrset);
+
+} // namespace ndns
+} // namespace ndn
+
+#endif // NDNS_RRSET_HPP