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.