Keep private keys in memory instead of sqlite3 database

Change-Id: I1a9381218c786e9f840705af5b0584395e34a522
Refs: #3812
diff --git a/src/group-manager-db.cpp b/src/group-manager-db.cpp
index 0f8640b..6b0eb2d 100644
--- a/src/group-manager-db.cpp
+++ b/src/group-manager-db.cpp
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /**
- * Copyright (c) 2014-2015,  Regents of the University of California
+ * Copyright (c) 2014-2017,  Regents of the University of California
  *
  * This file is part of ndn-group-encrypt (Group-based Encryption Protocol for NDN).
  * See AUTHORS.md for complete list of ndn-group-encrypt authors and contributors.
@@ -61,8 +61,7 @@
   "  ekeys(                                           \n"
   "    ekey_id             INTEGER PRIMARY KEY,       \n"
   "    ekey_name           BLOB NOT NULL,             \n"
-  "    pub_key             BLOB NOT NULL,             \n"
-  "    pri_key             BLOB NOT NULL              \n"
+  "    pub_key             BLOB NOT NULL              \n"
   "  );                                               \n"
   "CREATE UNIQUE INDEX IF NOT EXISTS                  \n"
   "   ekeyNameIndex ON ekeys(ekey_name);              \n";
@@ -118,6 +117,7 @@
 
 public:
   sqlite3* m_database;
+  std::map<Name, Buffer> m_priKeyBase;
 };
 
 GroupManagerDB::GroupManagerDB(const std::string& dbPath)
@@ -342,12 +342,13 @@
 GroupManagerDB::addEKey(const Name& eKeyName, const Buffer& pubKey, const Buffer& priKey)
 {
   Sqlite3Statement statement(m_impl->m_database,
-                             "INSERT INTO ekeys(ekey_name, pub_key, pri_key) values (?, ?, ?)");
+                             "INSERT INTO ekeys(ekey_name, pub_key) values (?, ?)");
   statement.bind(1, eKeyName.wireEncode(), SQLITE_TRANSIENT);
   statement.bind(2, pubKey.buf(), pubKey.size(), SQLITE_TRANSIENT);
-  statement.bind(3, priKey.buf(), priKey.size(), SQLITE_TRANSIENT);
   if (statement.step() != SQLITE_DONE)
     BOOST_THROW_EXCEPTION(Error("Cannot add the EKey to database"));
+
+  m_impl->m_priKeyBase[eKeyName] = priKey;
 }
 
 std::tuple<Buffer, Buffer>
@@ -360,12 +361,11 @@
   Buffer pubKey, priKey;
   if (statement.step() == SQLITE_ROW) {
     pubKey = Buffer(statement.getBlob(2), statement.getSize(2));
-    priKey = Buffer(statement.getBlob(3), statement.getSize(3));
   }
   else {
     BOOST_THROW_EXCEPTION(Error("Cannot get the result from database"));
   }
-  return std::make_tuple(pubKey, priKey);
+  return std::make_tuple(pubKey, m_impl->m_priKeyBase[eKeyName]);
 }
 
 void
@@ -373,6 +373,7 @@
 {
   Sqlite3Statement statement(m_impl->m_database, "DELETE FROM ekeys");
   statement.step();
+  m_impl->m_priKeyBase.clear();
 }
 
 void
@@ -382,6 +383,9 @@
                              "DELETE FROM ekeys WHERE ekey_name=?");
   statement.bind(1, eKeyName.wireEncode(), SQLITE_TRANSIENT);
   statement.step();
+
+  auto search = m_impl->m_priKeyBase.find(eKeyName);
+  m_impl->m_priKeyBase.erase(search);
 }
 
 } // namespace gep