object: Switch code to use ndn-cxx

This commit also moves code to ndn::chronoshare namespace

Change-Id: I63817cce605620c3c68d98ac4e46e1a265dc3d3b
diff --git a/src/object-db.cpp b/src/object-db.cpp
index e522b51..a77f2a5 100644
--- a/src/object-db.cpp
+++ b/src/object-db.cpp
@@ -18,34 +18,37 @@
  * See AUTHORS.md for complete list of ChronoShare authors and contributors.
  */
 
-#include "object-db.h"
-#include "db-helper.h"
-#include "logging.h"
-#include <boost/make_shared.hpp>
+#include "object-db.hpp"
+#include "db-helper.hpp"
+#include "core/logging.hpp"
+
 #include <iostream>
 #include <sys/stat.h>
 
-_LOG_INIT(Object.Db);
+#include <ndn-cxx/util/sqlite3-statement.hpp>
 
-using namespace std;
-using namespace Ndnx;
-using namespace boost;
+namespace ndn {
+namespace chronoshare {
+
+_LOG_INIT(ObjectDb);
+
 namespace fs = boost::filesystem;
+using ndn::util::Sqlite3Statement;
 
-const std::string INIT_DATABASE = "\
-CREATE TABLE                                                            \n \
-    File(                                                               \n\
-        device_name     BLOB NOT NULL,                                  \n\
-        segment         INTEGER,                                        \n\
-        content_object  BLOB,                                           \n\
-                                                                        \
-        PRIMARY KEY (device_name, segment)                              \n\
-    );                                                                  \n\
-CREATE INDEX device ON File(device_name);                               \n\
-";
+const std::string INIT_DATABASE = R"SQL(
+CREATE TABLE
+   File(
+        device_name     BLOB NOT NULL,
+        segment         INTEGER,
+        content_object  BLOB,
+
+        PRIMARY KEY (device_name, segment)
+    );
+CREATE INDEX device ON File(device_name);
+)SQL";
 
 ObjectDb::ObjectDb(const fs::path& folder, const std::string& hash)
-  : m_lastUsed(time(NULL))
+  : m_lastUsed(time::steady_clock::now())
 {
   fs::path actualFolder = folder / "objects" / hash.substr(0, 2);
   fs::create_directories(actualFolder);
@@ -54,30 +57,38 @@
 
   int res = sqlite3_open((actualFolder / hash.substr(2, hash.size() - 2)).c_str(), &m_db);
   if (res != SQLITE_OK) {
-    BOOST_THROW_EXCEPTION(Error::Db() << errmsg_info_str(
-                            "Cannot open/create dabatabase: [" +
-                            (actualFolder / hash.substr(2, hash.size() - 2)).string() + "]"));
+    BOOST_THROW_EXCEPTION(Error("Cannot open/create database: [" +
+                                (actualFolder / hash.substr(2, hash.size() - 2)).string() + "]"));
   }
 
   // Alex: determine if tables initialized. if not, initialize... not sure what is the best way to go...
   // for now, just attempt to create everything
 
   char* errmsg = 0;
-  res = sqlite3_exec(m_db, INIT_DATABASE.c_str(), NULL, NULL, &errmsg);
+  res = sqlite3_exec(m_db, INIT_DATABASE.c_str(), nullptr, nullptr, &errmsg);
   if (res != SQLITE_OK && errmsg != 0) {
-    // _LOG_TRACE ("Init \"error\": " << errmsg);
     sqlite3_free(errmsg);
   }
 
-  // _LOG_DEBUG ("open db");
-
   willStartSave();
 }
 
+ObjectDb::~ObjectDb()
+{
+  didStopSave();
+
+  int res = sqlite3_close(m_db);
+  if (res != SQLITE_OK) {
+    // complain
+  }
+}
+
 bool
-ObjectDb::DoesExist(const boost::filesystem::path& folder, const Ccnx::Name& deviceName,
+ObjectDb::doesExist(const boost::filesystem::path& folder, const Name& deviceName,
                     const std::string& hash)
 {
+  BOOST_ASSERT(hash.size() > 2);
+
   fs::path actualFolder = folder / "objects" / hash.substr(0, 2);
   bool retval = false;
 
@@ -89,8 +100,8 @@
                        "SELECT count(*), count(nullif(content_object,0)) FROM File WHERE device_name=?",
                        -1, &stmt, 0);
 
-    CcnxCharbufPtr buf = deviceName.toCcnxCharbuf();
-    sqlite3_bind_blob(stmt, 1, buf->buf(), buf->length(), SQLITE_TRANSIENT);
+    sqlite3_bind_blob(stmt, 1, deviceName.wireEncode().wire(), deviceName.wireEncode().size(),
+                      SQLITE_TRANSIENT);
 
     int res = sqlite3_step(stmt);
     if (res == SQLITE_ROW) {
@@ -111,105 +122,60 @@
   return retval;
 }
 
-
-ObjectDb::~ObjectDb()
-{
-  didStopSave();
-
-  // _LOG_DEBUG ("close db");
-  int res = sqlite3_close(m_db);
-  if (res != SQLITE_OK) {
-    // complain
-  }
-}
-
 void
-ObjectDb::saveContentObject(const Ccnx::Name& deviceName, sqlite3_int64 segment,
-                            const Ccnx::Bytes& data)
+ObjectDb::saveContentObject(const Name& deviceName, sqlite3_int64 segment, const Data& data)
 {
-  sqlite3_stmt* stmt;
-  sqlite3_prepare_v2(m_db, "INSERT INTO File "
-                           "(device_name, segment, content_object) "
-                           "VALUES (?, ?, ?)",
-                     -1, &stmt, 0);
-
-  //_LOG_DEBUG ("Saving content object for [" << deviceName << ", seqno: " << segment << ", size: " << data.size () << "]");
-
-  CcnxCharbufPtr buf = deviceName.toCcnxCharbuf();
-  sqlite3_bind_blob(stmt, 1, buf->buf(), buf->length(), SQLITE_STATIC);
-  sqlite3_bind_int64(stmt, 2, segment);
-  sqlite3_bind_blob(stmt, 3, &data[0], data.size(), SQLITE_STATIC);
-
-  sqlite3_step(stmt);
-  //_LOG_DEBUG ("After saving object: " << sqlite3_errmsg (m_db));
-  sqlite3_finalize(stmt);
-
   // update last used time
-  m_lastUsed = time(NULL);
+  m_lastUsed = time::steady_clock::now();
+
+  Sqlite3Statement stmt(m_db, "INSERT INTO File "
+                                "(device_name, segment, content_object) "
+                                "VALUES (?, ?, ?)");
+
+  _LOG_DEBUG("Saving content object for [" << deviceName << ", seqno: " << segment << ", size: "
+                                           << data.wireEncode().size()
+                                           << "]");
+  stmt.bind(1, deviceName.wireEncode(), SQLITE_STATIC);
+  stmt.bind(2, segment);
+  stmt.bind(3, data.wireEncode(), SQLITE_STATIC);
+  stmt.step();
 }
 
-Ccnx::BytesPtr
-ObjectDb::fetchSegment(const Ccnx::Name& deviceName, sqlite3_int64 segment)
+shared_ptr<Data>
+ObjectDb::fetchSegment(const Name& deviceName, sqlite3_int64 segment)
 {
-  sqlite3_stmt* stmt;
-  sqlite3_prepare_v2(m_db, "SELECT content_object FROM File WHERE device_name=? AND segment=?", -1,
-                     &stmt, 0);
+  // update last used time
+  m_lastUsed = time::steady_clock::now();
 
-  CcnxCharbufPtr buf = deviceName.toCcnxCharbuf();
-  sqlite3_bind_blob(stmt, 1, buf->buf(), buf->length(), SQLITE_TRANSIENT);
-  sqlite3_bind_int64(stmt, 2, segment);
+  Sqlite3Statement stmt(m_db, "SELECT content_object FROM File WHERE device_name=? AND segment=?");
+  stmt.bind(1, deviceName.wireEncode(), SQLITE_STATIC);
+  stmt.bind(2, segment);
 
-  BytesPtr ret;
-
-  int res = sqlite3_step(stmt);
-  if (res == SQLITE_ROW) {
-    const unsigned char* buf = reinterpret_cast<const unsigned char*>(sqlite3_column_blob(stmt, 0));
-    int bufBytes = sqlite3_column_bytes(stmt, 0);
-
-    ret = make_shared<Bytes>(buf, buf + bufBytes);
+  if (stmt.step() == SQLITE_ROW) {
+    return make_shared<Data>(stmt.getBlock(0));
   }
-
-  sqlite3_finalize(stmt);
-
-  // update last used time
-  m_lastUsed = time(NULL);
-
-  return ret;
+  else {
+    return nullptr;
+  }
 }
 
-time_t
-ObjectDb::secondsSinceLastUse()
+const time::steady_clock::TimePoint&
+ObjectDb::getLastUsed() const
 {
-  return (time(NULL) - m_lastUsed);
+  return m_lastUsed;
 }
 
-// sqlite3_int64
-// ObjectDb::getNumberOfSegments (const Ndnx::Name &deviceName)
-// {
-//   sqlite3_stmt *stmt;
-//   sqlite3_prepare_v2 (m_db, "SELECT count(*) FROM File WHERE device_name=?", -1, &stmt, 0);
-
-//   bool retval = false;
-//   int res = sqlite3_step (stmt);
-//   if (res == SQLITE_ROW)
-//     {
-//       retval = true;
-//     }
-//   sqlite3_finalize (stmt);
-
-//   return retval;
-// }
-
 void
 ObjectDb::willStartSave()
 {
   sqlite3_exec(m_db, "BEGIN TRANSACTION;", 0, 0, 0);
-  // _LOG_DEBUG ("Open transaction: " << sqlite3_errmsg (m_db));
 }
 
 void
 ObjectDb::didStopSave()
 {
   sqlite3_exec(m_db, "END TRANSACTION;", 0, 0, 0);
-  // _LOG_DEBUG ("Close transaction: " << sqlite3_errmsg (m_db));
 }
+
+} // namespace chronoshare
+} // namespace ndn