shared_ptr<Data> Db::getSubTreeData(size_t level, const NonNegativeInteger& seqNo) { sqlite3_stmt* statement; sqlite3_prepare_v2(m_db, "SELECT data FROM cTrees WHERE level=? AND seqNo=?", -1, &statement, nullptr); sqlite3_bind_int(statement, 1, level); sqlite3_bind_int(statement, 2, seqNo); if (sqlite3_step(statement) == SQLITE_ROW) { auto result = make_shared<Data>(sqlite3_column_block(statement, 0)); sqlite3_finalize(statement); return result; } sqlite3_prepare_v2(m_db, "SELECT data FROM pTrees WHERE level=? AND seqNo=?", -1, &statement, nullptr); sqlite3_bind_int(statement, 1, level); sqlite3_bind_int(statement, 2, seqNo); shared_ptr<Data> result; if (sqlite3_step(statement) == SQLITE_ROW) result = make_shared<Data>(sqlite3_column_block(statement, 0)); sqlite3_finalize(statement); return result; }
std::pair<shared_ptr<Leaf>, shared_ptr<Data>> Db::getLeaf(const NonNegativeInteger& seqNo) { sqlite3_stmt* statement; sqlite3_prepare_v2(m_db, "SELECT dataName, signerSeqNo, timestamp, cert\ FROM leaves WHERE dataSeqNo=?", -1, &statement, nullptr); sqlite3_bind_int(statement, 1, seqNo); if (sqlite3_step(statement) == SQLITE_ROW) { auto leaf = make_shared<Leaf>(Name(sqlite3_column_block(statement, 0)), sqlite3_column_int(statement, 2), seqNo, sqlite3_column_int(statement, 1)); shared_ptr<Data> data; if (sqlite3_column_bytes(statement, 3) != 0) { data = make_shared<Data>(sqlite3_column_block(statement, 3)); } sqlite3_finalize(statement); return std::make_pair(leaf, data); } else { sqlite3_finalize(statement); return std::make_pair(nullptr, nullptr); } }
std::vector<shared_ptr<Data>> Db::getPendingSubTrees() { sqlite3_stmt* statement; sqlite3_prepare_v2(m_db, "SELECT data FROM pTrees ORDER BY level DESC", -1, &statement, nullptr); std::vector<shared_ptr<Data>> datas; while (sqlite3_step(statement) == SQLITE_ROW) datas.push_back(make_shared<Data>(sqlite3_column_block(statement, 0))); sqlite3_finalize(statement); return datas; }
Name PibDb::getDefaultIdentity() const { sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT identity FROM identities WHERE is_default=1", -1, &statement, nullptr); Name identity = NON_EXISTING_IDENTITY; if (sqlite3_step(statement) == SQLITE_ROW && sqlite3_column_bytes(statement, 0) != 0) { identity = Name(sqlite3_column_block(statement, 0)); } sqlite3_finalize(statement); return identity; }
shared_ptr<IdentityCertificate> PibDb::getMgmtCertificate() const { sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT local_management_cert FROM mgmt", -1, &statement, nullptr); shared_ptr<IdentityCertificate> certificate; if (sqlite3_step(statement) == SQLITE_ROW) { certificate = make_shared<IdentityCertificate>(); certificate->wireDecode(sqlite3_column_block(statement, 0)); } sqlite3_finalize(statement); return certificate; }
vector<Name> PibDb::listIdentities() const { vector<Name> identities; sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT identity FROM identities", -1, &statement, nullptr); identities.clear(); while (sqlite3_step(statement) == SQLITE_ROW) { Name name(sqlite3_column_block(statement, 0)); identities.push_back(name); } sqlite3_finalize(statement); return identities; }
Name PibDb::getDefaultCertNameOfKey(const Name& keyName) const { sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT certificate_name\ FROM certificates JOIN keys ON certificates.key_id=keys.id\ WHERE keys.key_name=? AND certificates.is_default=1", -1, &statement, nullptr); sqlite3_bind_block(statement, 1, keyName.wireEncode(), SQLITE_TRANSIENT); Name certName = NON_EXISTING_CERTIFICATE; if (sqlite3_step(statement) == SQLITE_ROW && sqlite3_column_bytes(statement, 0) != 0) { certName = Name(sqlite3_column_block(statement, 0)); } sqlite3_finalize(statement); return certName; }
shared_ptr<IdentityCertificate> PibDb::getCertificate(const Name& certificateName) const { sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT certificate_data FROM certificates WHERE certificate_name=?", -1, &statement, nullptr); sqlite3_bind_block(statement, 1, certificateName.wireEncode(), SQLITE_TRANSIENT); shared_ptr<IdentityCertificate> certificate; if (sqlite3_step(statement) == SQLITE_ROW) { certificate = make_shared<IdentityCertificate>(); certificate->wireDecode(sqlite3_column_block(statement, 0)); } sqlite3_finalize(statement); return certificate; }
Name PibDb::getDefaultKeyNameOfIdentity(const Name& identity) const { sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT key_name FROM keys JOIN identities ON keys.identity_id=identities.id\ WHERE identities.identity=? AND keys.is_default=1", -1, &statement, nullptr); sqlite3_bind_block(statement, 1, identity.wireEncode(), SQLITE_TRANSIENT); Name keyName = NON_EXISTING_KEY; if (sqlite3_step(statement) == SQLITE_ROW && sqlite3_column_bytes(statement, 0) != 0) { keyName = Name(sqlite3_column_block(statement, 0)); } sqlite3_finalize(statement); return keyName; }
vector<Name> PibDb::listKeyNamesOfIdentity(const Name& identity) const { vector<Name> keyNames; sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT key_name FROM keys JOIN identities ON keys.identity_id=identities.id\ WHERE identities.identity=?", -1, &statement, nullptr); sqlite3_bind_block(statement, 1, identity.wireEncode(), SQLITE_TRANSIENT); keyNames.clear(); while (sqlite3_step(statement) == SQLITE_ROW) { Name keyName(sqlite3_column_block(statement, 0)); keyNames.push_back(keyName); } sqlite3_finalize(statement); return keyNames; }
vector<Name> PibDb::listCertNamesOfKey(const Name& keyName) const { vector<Name> certNames; sqlite3_stmt* statement; sqlite3_prepare_v2(m_database, "SELECT certificate_name\ FROM certificates JOIN keys ON certificates.key_id=keys.id\ WHERE keys.key_name=?", -1, &statement, nullptr); sqlite3_bind_block(statement, 1, keyName.wireEncode(), SQLITE_TRANSIENT); certNames.clear(); while (sqlite3_step(statement) == SQLITE_ROW) { Name name(sqlite3_column_block(statement, 0)); certNames.push_back(name); } sqlite3_finalize(statement); return certNames; }