29 #include <boost/filesystem/operations.hpp>    30 #include <boost/filesystem/path.hpp>    36 using util::Sqlite3Statement;
    39 CREATE TABLE IF NOT EXISTS    44 CREATE TABLE IF NOT EXISTS    46     id                    INTEGER PRIMARY KEY,    47     identity              BLOB NOT NULL,    48     is_default            INTEGER DEFAULT 0    51 CREATE UNIQUE INDEX IF NOT EXISTS    52   identityIndex ON identities(identity);    54 CREATE TRIGGER IF NOT EXISTS    55   identity_default_before_insert_trigger    56   BEFORE INSERT ON identities    60     UPDATE identities SET is_default=0;    63 CREATE TRIGGER IF NOT EXISTS    64   identity_default_after_insert_trigger    65   AFTER INSERT ON identities    74       WHERE identity=NEW.identity;    77 CREATE TRIGGER IF NOT EXISTS    78   identity_default_update_trigger    79   BEFORE UPDATE ON identities    81   WHEN NEW.is_default=1 AND OLD.is_default=0    83     UPDATE identities SET is_default=0;    86 CREATE TABLE IF NOT EXISTS    88     id                    INTEGER PRIMARY KEY,    89     identity_id           INTEGER NOT NULL,    90     key_name              BLOB NOT NULL,    91     key_bits              BLOB NOT NULL,    92     is_default            INTEGER DEFAULT 0,    93     FOREIGN KEY(identity_id)    94       REFERENCES identities(id)    99 CREATE UNIQUE INDEX IF NOT EXISTS   100   keyIndex ON keys(key_name);   102 CREATE TRIGGER IF NOT EXISTS   103   key_default_before_insert_trigger   104   BEFORE INSERT ON keys   106   WHEN NEW.is_default=1   110       WHERE identity_id=NEW.identity_id;   113 CREATE TRIGGER IF NOT EXISTS   114   key_default_after_insert_trigger   121          AND identity_id=NEW.identity_id)   125       WHERE key_name=NEW.key_name;   128 CREATE TRIGGER IF NOT EXISTS   129   key_default_update_trigger   130   BEFORE UPDATE ON keys   132   WHEN NEW.is_default=1 AND OLD.is_default=0   136       WHERE identity_id=NEW.identity_id;   140 CREATE TABLE IF NOT EXISTS   142     id                    INTEGER PRIMARY KEY,   143     key_id                INTEGER NOT NULL,   144     certificate_name      BLOB NOT NULL,   145     certificate_data      BLOB NOT NULL,   146     is_default            INTEGER DEFAULT 0,   153 CREATE UNIQUE INDEX IF NOT EXISTS   154   certIndex ON certificates(certificate_name);   156 CREATE TRIGGER IF NOT EXISTS   157   cert_default_before_insert_trigger   158   BEFORE INSERT ON certificates   160   WHEN NEW.is_default=1   164       WHERE key_id=NEW.key_id;   167 CREATE TRIGGER IF NOT EXISTS   168   cert_default_after_insert_trigger   169   AFTER INSERT ON certificates   175          AND key_id=NEW.key_id)   179       WHERE certificate_name=NEW.certificate_name;   182 CREATE TRIGGER IF NOT EXISTS   183   cert_default_update_trigger   184   BEFORE UPDATE ON certificates   186   WHEN NEW.is_default=1 AND OLD.is_default=0   190       WHERE key_id=NEW.key_id;   197   boost::filesystem::path dbDir;
   198   if (!location.empty()) {
   199     dbDir = boost::filesystem::path(location);
   201 #ifdef NDN_CXX_HAVE_TESTS   202   else if (getenv(
"TEST_HOME") != 
nullptr) {
   203     dbDir = boost::filesystem::path(getenv(
"TEST_HOME")) / 
".ndn";
   205 #endif // NDN_CXX_HAVE_TESTS   206   else if (getenv(
"HOME") != 
nullptr) {
   207     dbDir = boost::filesystem::path(getenv(
"HOME")) / 
".ndn";
   210     dbDir = boost::filesystem::current_path() / 
".ndn";
   212   boost::filesystem::create_directories(dbDir);
   215   int result = sqlite3_open_v2((dbDir / 
"pib.db").c_str(), &m_database,
   216                                SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
   217 #ifdef NDN_CXX_DISABLE_SQLITE3_FS_LOCKING
   224   if (result != SQLITE_OK) {
   229   sqlite3_exec(m_database, 
"PRAGMA foreign_keys=ON", 
nullptr, 
nullptr, 
nullptr);
   232   char* errmsg = 
nullptr;
   233   result = sqlite3_exec(m_database, INITIALIZATION.c_str(), 
nullptr, 
nullptr, &errmsg);
   234   if (result != SQLITE_OK && errmsg != 
nullptr) {
   235     std::string what = 
"PIB database cannot be initialized: "s + errmsg;
   236     sqlite3_free(errmsg);
   243   sqlite3_close(m_database);
   249   static std::string scheme = 
"pib-sqlite3";
   257   statement.
bind(1, tpmLocator, SQLITE_TRANSIENT);
   260   if (sqlite3_changes(m_database) == 0) {
   262     Sqlite3Statement insertStatement(m_database, 
"INSERT INTO tpmInfo (tpm_locator) values (?)");
   263     insertStatement.
bind(1, tpmLocator, SQLITE_TRANSIENT);
   264     insertStatement.
step();
   272   int res = statement.
step();
   273   if (res == SQLITE_ROW)
   282   Sqlite3Statement statement(m_database, 
"SELECT id FROM identities WHERE identity=?");
   284   return statement.
step() == SQLITE_ROW;
   291     Sqlite3Statement statement(m_database, 
"INSERT INTO identities (identity) values (?)");
   296   if (!hasDefaultIdentity()) {
   304   Sqlite3Statement statement(m_database, 
"DELETE FROM identities WHERE identity=?");
   319   std::set<Name> identities;
   322   while (statement.
step() == SQLITE_ROW)
   334   Sqlite3Statement statement(m_database, 
"UPDATE identities SET is_default=1 WHERE identity=?");
   342   Sqlite3Statement statement(m_database, 
"SELECT identity FROM identities WHERE is_default=1");
   344   if (statement.
step() == SQLITE_ROW)
   351 PibSqlite3::hasDefaultIdentity()
 const   353   Sqlite3Statement statement(m_database, 
"SELECT identity FROM identities WHERE is_default=1");
   354   return (statement.
step() == SQLITE_ROW);
   360   Sqlite3Statement statement(m_database, 
"SELECT id FROM keys WHERE key_name=?");
   363   return (statement.
step() == SQLITE_ROW);
   374                                "INSERT INTO keys (identity_id, key_name, key_bits) "   375                                "VALUES ((SELECT id FROM identities WHERE identity=?), ?, ?)");
   378     statement.
bind(3, key.data(), key.size(), SQLITE_STATIC);
   383                                "UPDATE keys SET key_bits=? WHERE key_name=?");
   384     statement.
bind(1, key.data(), key.size(), SQLITE_STATIC);
   389   if (!hasDefaultKeyOfIdentity(identity)) {
   397   Sqlite3Statement statement(m_database, 
"DELETE FROM keys WHERE key_name=?");
   405   Sqlite3Statement statement(m_database, 
"SELECT key_bits FROM keys WHERE key_name=?");
   408   if (statement.
step() == SQLITE_ROW)
   417   std::set<Name> keyNames;
   421                              "FROM keys JOIN identities ON keys.identity_id=identities.id "   422                              "WHERE identities.identity=?");
   425   while (statement.
step() == SQLITE_ROW) {
   439   Sqlite3Statement statement(m_database, 
"UPDATE keys SET is_default=1 WHERE key_name=?");
   453                              "FROM keys JOIN identities ON keys.identity_id=identities.id "   454                              "WHERE identities.identity=? AND keys.is_default=1");
   457   if (statement.
step() == SQLITE_ROW) {
   465 PibSqlite3::hasDefaultKeyOfIdentity(
const Name& identity)
 const   469                              "FROM keys JOIN identities ON keys.identity_id=identities.id "   470                              "WHERE identities.identity=? AND keys.is_default=1");
   473   return (statement.
step() == SQLITE_ROW);
   479   Sqlite3Statement statement(m_database, 
"SELECT id FROM certificates WHERE certificate_name=?");
   481   return (statement.
step() == SQLITE_ROW);
   488   addKey(certificate.getIdentity(), certificate.getKeyName(), certificate.getContent().value_bytes());
   492                                "INSERT INTO certificates "   493                                "(key_id, certificate_name, certificate_data) "   494                                "VALUES ((SELECT id FROM keys WHERE key_name=?), ?, ?)");
   495     statement.
bind(1, certificate.getKeyName().wireEncode(), SQLITE_TRANSIENT);
   496     statement.
bind(2, certificate.getName().wireEncode(), SQLITE_TRANSIENT);
   497     statement.
bind(3, certificate.wireEncode(), SQLITE_STATIC);
   502                                "UPDATE certificates SET certificate_data=? WHERE certificate_name=?");
   503     statement.
bind(1, certificate.wireEncode(), SQLITE_STATIC);
   504     statement.
bind(2, certificate.getName().wireEncode(), SQLITE_TRANSIENT);
   508   if (!hasDefaultCertificateOfKey(certificate.getKeyName())) {
   516   Sqlite3Statement statement(m_database, 
"DELETE FROM certificates WHERE certificate_name=?");
   525                              "SELECT certificate_data FROM certificates WHERE certificate_name=?");
   528   if (statement.
step() == SQLITE_ROW)
   529     return Certificate(statement.
getBlock(0));
   537   std::set<Name> certNames;
   540                              "SELECT certificate_name "   541                              "FROM certificates JOIN keys ON certificates.key_id=keys.id "   542                              "WHERE keys.key_name=?");
   545   while (statement.
step() == SQLITE_ROW)
   559                              "UPDATE certificates SET is_default=1 WHERE certificate_name=?");
   568                              "SELECT certificate_data "   569                              "FROM certificates JOIN keys ON certificates.key_id=keys.id "   570                              "WHERE certificates.is_default=1 AND keys.key_name=?");
   573   if (statement.
step() == SQLITE_ROW)
   574     return Certificate(statement.
getBlock(0));
   580 PibSqlite3::hasDefaultCertificateOfKey(
const Name& keyName)
 const   583                              "SELECT certificate_data "   584                              "FROM certificates JOIN keys ON certificates.key_id=keys.id "   585                              "WHERE certificates.is_default=1 AND keys.key_name=?");
   588   return statement.
step() == SQLITE_ROW;
 represents a non-semantic error 
 
void removeCertificate(const Name &certName) final
Remove a certificate with name certName. 
 
Copyright (c) 2011-2015 Regents of the University of California. 
 
Name getDefaultKeyOfIdentity(const Name &identity) const final
 
represents a semantic error 
 
int getSize(int column)
get the size of column. 
 
std::set< Name > getCertificatesOfKey(const Name &keyName) const final
Get a list of certificate names of a key with id keyName. 
 
void clearIdentities() final
Erasing all certificates, keys, and identities. 
 
Certificate getDefaultCertificateOfKey(const Name &keyName) const final
 
Certificate getCertificate(const Name &certName) const final
Get a certificate with name certName. 
 
std::set< Name > getIdentities() const final
Get the name of all the identities. 
 
void setTpmLocator(const std::string &tpmLocator) final
Set the corresponding TPM information to tpmLocator. 
 
Block getBlock(int column)
get a block from column. 
 
std::string getTpmLocator() const final
Get TPM Locator. 
 
void addKey(const Name &identity, const Name &keyName, span< const uint8_t > key) final
Add a key. 
 
Buffer getKeyBits(const Name &keyName) const final
Get the key bits of a key with name keyName. 
 
static const std::string & getScheme()
 
void removeIdentity(const Name &identity) final
Remove an identity and related keys and certificates. 
 
const uint8_t * getBlob(int column)
get a pointer of byte blob from column. 
 
void setDefaultIdentity(const Name &identityName) final
Set an identity with name identityName as the default identity. 
 
void setDefaultCertificateOfKey(const Name &keyName, const Name &certName) final
Set a cert with name certName as the default of a key with keyName. 
 
int bind(int index, const char *value, size_t size, void(*destructor)(void *))
bind a string to the statement 
 
Name getDefaultIdentity() const final
Get the default identity. 
 
Represents an absolute name. 
 
PibSqlite3(const std::string &location="")
Create sqlite3-based PIB backed. 
 
void addIdentity(const Name &identity) final
Add an identity. 
 
std::string getString(int column)
get a string from column. 
 
int step()
wrapper of sqlite3_step 
 
bool hasKey(const Name &keyName) const final
Check the existence of a key with keyName. 
 
wrap an SQLite3 prepared statement 
 
~PibSqlite3() final
Destruct and cleanup internal state. 
 
void addCertificate(const Certificate &certificate) final
Add a certificate. 
 
void removeKey(const Name &keyName) final
Remove a key with keyName and related certificates. 
 
void setDefaultKeyOfIdentity(const Name &identity, const Name &keyName) final
Set an key with keyName as the default key of an identity with name identity. 
 
void toUri(std::ostream &os, name::UriFormat format=name::UriFormat::DEFAULT) const
Write URI representation of the name to the output stream. 
 
size_t wireEncode(EncodingImpl< TAG > &encoder) const
Fast encoding or block size estimation. 
 
std::set< Name > getKeysOfIdentity(const Name &identity) const final
Get all the key names of an identity with name identity. 
 
static const std::string INITIALIZATION
 
bool hasIdentity(const Name &identity) const final
Check the existence of an identity. 
 
General-purpose automatically managed/resized buffer. 
 
bool hasCertificate(const Name &certName) const final
Check the existence of a certificate with name certName.