return a+"."+b;
}
-bool Bind2Backend::getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+bool Bind2Backend::getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
{
shared_ptr<State> state = s_state;
void getUpdatedMasters(vector<DomainInfo> *changedDomains);
bool getDomainInfo(const string &domain, DomainInfo &di);
time_t getCtime(const string &fname);
- virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after);
+ virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& zname, const std::string& qname, std::string& before, std::string& after);
void lookup(const QType &, const string &qdomain, DNSPacket *p=0, int zoneId=-1);
bool list(const string &target, int id);
bool get(DNSResourceRecord &);
sqlstr(qtype)<<", "<<
sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<<");\n";
} else {
+
cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio) values ("<< dirty_hack_num<<", "<<
sqlstr(stripDot(domain))<<", "<<
- sqlstr(toLower(labelReverse(domain)))<<", "<< auth <<" ,"<<
+ sqlstr(toLower(labelReverse(makeRelative(domain, lastsoa_qname))))<<", "<< auth <<" ,"<<
sqlstr(qtype)<<", "<<
sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<<");\n";
}
" from domains where name="<<toLower(sqlstr(lastsoa_qname))<<";\n";
} else
{
+ cerr<<"makeRelative('"<<stripDot(domain)<<"', '"<<lastsoa_qname<<"');"<<endl;
cout<<"insert into records (domain_id, name, ordername, auth, type,content,ttl,prio) select id ,"<<
sqlstr(toLower(stripDot(domain)))<<", "<<
- sqlstr(toLower(labelReverse(domain)))<<", "<<auth<<", "<<
+ sqlstr(toLower(labelReverse(makeRelative(stripDot(domain), lastsoa_qname))))<<", "<<auth<<", "<<
sqlstr(qtype)<<", "<<
sqlstr(stripDot(content))<<", "<<ttl<<", "<<prio<<
" from domains where name="<<toLower(sqlstr(lastsoa_qname))<<";\n";
cout<<"set autocommit on;"<<endl;
}
+ cerr<<"mode = POSTGRES: "<< (mode == POSTGRES) <<endl;
+
g_doDNSSEC=::arg().mustDo("dnssec");
namedfile=::arg()["named-conf"];
zonefile=::arg()["zone"];
-
-
int count=0, num_domainsdone=0;
if(zonefile.empty()) {
try {
if(mode==POSTGRES || mode==ORACLE) {
if(g_intransaction && ::arg().mustDo("transactions")) {
- cout<<"COMMIT WORK;"<<endl;
+ cout<<"COMMIT WORK;"<<endl;
}
if(::arg().mustDo("transactions")) {
- if(mode==POSTGRES)
- cout<<"BEGIN TRANSACTION;"<<endl;
- g_intransaction=1;
+ if(mode==POSTGRES)
+ cout<<"BEGIN TRANSACTION;"<<endl;
+ g_intransaction=1;
}
if(mode==POSTGRES) {
- if(::arg().mustDo("slave")) {
- if(i->masters.empty())
- cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
- else {
- string masters;
- for(vector<string>::const_iterator iter = i->masters.begin(); iter != i->masters.end(); ++iter) {
- if(iter != i->masters.begin())
- masters.append(1, ' ');
- masters+=*iter;
- }
- cout<<"insert into domains (name,type,master) values ("<<sqlstr(i->name)<<",'SLAVE'"<<", '"<<masters<<"');"<<endl;
- }
- }
- else
- cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
+ if(::arg().mustDo("slave")) {
+ if(i->masters.empty())
+ cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
+ else {
+ string masters;
+ for(vector<string>::const_iterator iter = i->masters.begin(); iter != i->masters.end(); ++iter) {
+ if(iter != i->masters.begin())
+ masters.append(1, ' ');
+ masters+=*iter;
+ }
+ cout<<"insert into domains (name,type,master) values ("<<sqlstr(i->name)<<",'SLAVE'"<<", '"<<masters<<"');"<<endl;
+ }
+ }
+ else
+ cout<<"insert into domains (name,type) values ("<<sqlstr(i->name)<<",'NATIVE');"<<endl;
}
else if(mode==ORACLE) {
- cout<<"insert into domains (id,name,type) values (domains_id_sequence.nextval,"<<toLower(sqlstr(i->name))<<",'NATIVE');"<<endl;
+ cout<<"insert into domains (id,name,type) values (domains_id_sequence.nextval,"<<toLower(sqlstr(i->name))<<",'NATIVE');"<<endl;
}
lastsoa_qname=i->name;
}
setArgPrefix(mode+suffix);
d_db=0;
d_logprefix="["+mode+"Backend"+suffix+"] ";
-
- d_noWildCardNoIDQuery=getArg("basic-query");
- d_noWildCardIDQuery=getArg("id-query");
- d_wildCardNoIDQuery=getArg("wildcard-query");
- d_wildCardIDQuery=getArg("wildcard-id-query");
-
- d_noWildCardANYNoIDQuery=getArg("any-query");
- d_noWildCardANYIDQuery=getArg("any-id-query");
- d_wildCardANYNoIDQuery=getArg("wildcard-any-query");
- d_wildCardANYIDQuery=getArg("wildcard-any-id-query");
+
+ d_dnssecQueries = mustDo("dnssec");
+ string authswitch = d_dnssecQueries ? "-auth" : "";
+ d_noWildCardNoIDQuery=getArg("basic-query"+authswitch);
+ d_noWildCardIDQuery=getArg("id-query"+authswitch);
+ d_wildCardNoIDQuery=getArg("wildcard-query"+authswitch);
+ d_wildCardIDQuery=getArg("wildcard-id-query"+authswitch);
+
+ d_noWildCardANYNoIDQuery=getArg("any-query"+authswitch);
+ d_noWildCardANYIDQuery=getArg("any-id-query"+authswitch);
+ d_wildCardANYNoIDQuery=getArg("wildcard-any-query"+authswitch);
+ d_wildCardANYIDQuery=getArg("wildcard-any-id-query"+authswitch);
- d_listQuery=getArg("list-query");
+ d_listQuery=getArg("list-query"+authswitch);
d_MasterOfDomainsZoneQuery=getArg("master-zone-query");
d_InfoOfDomainsZoneQuery=getArg("info-zone-query");
d_InfoOfAllMasterDomainsQuery=getArg("info-all-master-query");
d_DeleteZoneQuery=getArg("delete-zone-query");
d_CheckACLQuery=getArg("check-acl-query");
+
+ d_beforeOrderQuery = getArg("get-order-before-query");
+ d_afterOrderQuery = getArg("get-order-after-query");
+ d_setOrderAuthQuery = getArg("set-order-and-auth-query");
}
-bool GSQLBackend::getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+bool GSQLBackend::getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
{
cerr<<"gsql before/after called for id="<<id<<", qname="<<qname<<endl;
string lcqname=toLower(qname);
+
+ if(lcqname == zonename) // XXX FIXME NEED A CALL THAT DOES THIS RIGHT
+ lcqname.clear();
+ else
+ lcqname = lcqname.substr(0, lcqname.size() - zonename.length() - 1); // strip domain name
lcqname=labelReverse(lcqname);
SSql::row_t row;
- d_db->doQuery("select min(ordername) from records where ordername > '"+sqlEscape(lcqname)+"' and auth=1");
+ char output[1024];
+ snprintf(output, sizeof(output)-1, d_afterOrderQuery.c_str(), sqlEscape(lcqname).c_str(), id);
+
+ d_db->doQuery(output);
while(d_db->getRow(row)) {
- after=labelReverse(row[0]);
+ after=labelReverse(row[0])+"."+zonename;
}
- d_db->doQuery("select max(ordername) from records where ordername < '"+sqlEscape(lcqname)+"' and auth=1");
+ snprintf(output, sizeof(output)-1, d_beforeOrderQuery.c_str(), sqlEscape(lcqname).c_str(), id);
+ d_db->doQuery(output);
while(d_db->getRow(row)) {
- before=labelReverse(row[0]);
+ before=labelReverse(row[0])+"."+zonename;
}
return false;
// qtype qname domain_id
if(domain_id<0) {
if(qname[0]=='%')
- format=d_wildCardNoIDQuery;
+ format=d_wildCardNoIDQuery;
else
- format=d_noWildCardNoIDQuery;
+ format=d_noWildCardNoIDQuery;
snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(), sqlEscape(lcqname).c_str());
}
else {
if(qname[0]!='%')
- format=d_noWildCardIDQuery;
+ format=d_noWildCardIDQuery;
else
- format=d_wildCardIDQuery;
+ format=d_wildCardIDQuery;
snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(),sqlEscape(lcqname).c_str(),domain_id);
}
}
// qname domain_id
if(domain_id<0) {
if(qname[0]=='%')
- format=d_wildCardANYNoIDQuery;
+ format=d_wildCardANYNoIDQuery;
else
- format=d_noWildCardANYNoIDQuery;
+ format=d_noWildCardANYNoIDQuery;
snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str());
}
else {
if(qname[0]!='%')
- format=d_noWildCardANYIDQuery;
+ format=d_noWildCardANYIDQuery;
else
- format=d_wildCardANYIDQuery;
+ format=d_wildCardANYIDQuery;
snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str(),domain_id);
}
}
r.qtype=row[3];
r.last_modified=0;
+ if(d_dnssecQueries)
+ r.auth = !row[6].empty() && row[6][0]=='1';
+
r.domain_id=atoi(row[4].c_str());
return true;
}
void getUpdatedMasters(vector<DomainInfo> *updatedDomains);
bool getDomainInfo(const string &domain, DomainInfo &di);
void setNotified(uint32_t domain_id, uint32_t serial);
- bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after);
+ bool getBeforeAndAfterNames(uint32_t id, const std::string& zname, const std::string& qname, std::string& before, std::string& after);
private:
string d_qname;
QType d_qtype;
string d_InfoOfAllMasterDomainsQuery;
string d_DeleteZoneQuery;
string d_CheckACLQuery;
+
+ string d_beforeOrderQuery;
+ string d_afterOrderQuery;
+ string d_setOrderAuthQuery;
+
+protected:
+ bool d_dnssecQueries;
};
virtual void lookup(const QType &qtype, const string &qdomain, DNSPacket *pkt_p=0, int zoneId=-1)=0;
virtual bool get(DNSResourceRecord &)=0; //!< retrieves one DNSResource record, returns false if no more were available
- virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& qname, std::string& before, std::string& after)
+ virtual bool getBeforeAndAfterNames(uint32_t id, const std::string& zonename, const std::string& qname, std::string& before, std::string& after)
{
std::cerr<<"Default beforeAndAfter called!"<<std::endl;
return false;