bool LMDBBackend::getDomainMetadata(const string& name, const std::string& kind, std::vector<std::string>& meta)
{
- if (kind == "PRESIGNED") {
- meta.push_back("1");
- } else if (kind == "NSEC3PARAM") {
- meta.push_back("1 0 1 abcd");
+ if (kind == "PRESIGNED" || kind == "NSEC3PARAM") {
+ int rc;
+ MDB_val key, data;
+ string key_str, cur_value;
+ vector<string> valparts;
+
+ key_str=d_querykey = string( name.rbegin(), name.rend() );
+ key.mv_data = (char *)key_str.c_str();
+ key.mv_size = key_str.length();
+
+ if ((rc = mdb_cursor_get(zone_cursor, &key, &data, MDB_SET_KEY)) == 0) {
+ cur_value.assign((const char *)data.mv_data, data.mv_size);
+ stringtok(valparts,cur_value,"\t");
+
+ if (valparts.size() == 4) {
+ if (kind == "PRESIGNED")
+ meta.push_back("1");
+ else
+ meta.push_back(valparts[3]);
+ }
+ }
+
+ if (rc == MDB_NOTFOUND)
+ DEBUGLOG("Metadata records for zone: '"<<name<<"'' not found. This is impossible !!!"<<endl);
}
+
return true;
}
vector<string>parts;
stringtok(parts,data,"\t");
- if(parts.size() != 3 )
+ if(parts.size() < 3 )
throw PDNSException("Invalid record in zone table: " + data );
fillSOAData( parts[2], soa );
void emitData(string zone, ZoneParserTNG &zpt){
- bool hasSOA = false;
+ bool hasSOA=false, isPresigned=false;
int numRefs=g_numRefs;
int numRecords=g_numRecords;
+ string metaData;
SOAData sd;
DNSResourceRecord rr;
MDB_val key, data, keyExt, dataExt;
while(zpt.get(rr)) {
numRecords++;
if (rr.qtype == QType::SOA) {
- hasSOA = true;
+ hasSOA=true;
fillSOAData(rr.content, sd);
sd.ttl=rr.ttl;
continue;
}
- if (rr.qtype == QType::NSEC3PARAM)
+ if (rr.qtype == QType::NSEC3PARAM) {
+ metaData=rr.content;
continue; // TODO set metadata
+ }
string keyStr, dataStr;
if (rr.qtype == QType::RRSIG) {
+ isPresigned=true;
RRSIGRecordContent rrc(rr.content);
keyStr=zone+"\t"+makeRelative(stripDot(rr.qname), zone)+"\t"+DNSRecordContent::NumberToType(rrc.d_type);
dataStr=itoa(rr.ttl)+"\t"+rr.content;
string keyStr=(reverse(stripDot(zone)));
string dataStr=itoa(g_numZones+1)+"\t"+itoa(sd.ttl)+"\t"+serializeSOAData(sd);
+ if (isPresigned)
+ dataStr.append("\t"+metaData);
+
key.mv_data = (char*)keyStr.c_str();
key.mv_size = keyStr.length();
data.mv_data = (char*)dataStr.c_str();