From 36d772ab520c55f71c876259d1c28f3795b478d3 Mon Sep 17 00:00:00 2001 From: Bert Hubert Date: Thu, 2 Jan 2003 15:43:00 +0000 Subject: [PATCH] generic sql commands git-svn-id: svn://svn.powerdns.com/pdns/trunk/pdns@108 d19b8d6e-7fed-0310-83ef-9ca221ded41b --- ChangeLog | 2 +- debian/changelog | 6 ++ modules/gpgsqlbackend/gpgsqlbackend.cc | 18 ++++- pdns/backends/bind/bindbackend.cc | 5 +- pdns/backends/gsql/gsqlbackend.cc | 100 +++++++++++++++++-------- pdns/backends/gsql/gsqlbackend.hh | 12 +++ pdns/receiver.cc | 4 +- pdns/tcpreceiver.cc | 4 +- pdns/ueberbackend.cc | 40 ++-------- 9 files changed, 115 insertions(+), 76 deletions(-) diff --git a/ChangeLog b/ChangeLog index e0d86d8bd..9ddd607e2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,7 +6,7 @@ Changes since 2.9.3a: - major brokenness in slave support in gmysql/gpgsql (mark) - solaris compilation fixes - make IPv6 work again on FreeBSD (Peter van Dijk) - + - neglected to properly initialize the socklen of accept of dynlistener ;-( Changes since 2.9.2: - windows compilation patches diff --git a/debian/changelog b/debian/changelog index 548da50db..658fceee6 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +pdns (2.9.4-1) unstable; urgency=low + + * fill in the blanks + + -- Wichert Akkerman Sat, 21 Dec 2002 20:16:16 +0100 + pdns (2.9.3a-1) unstable; urgency=low * New upstream release; fixes a problem in zone2sql diff --git a/modules/gpgsqlbackend/gpgsqlbackend.cc b/modules/gpgsqlbackend/gpgsqlbackend.cc index 3a4e427c1..d85ad45fc 100644 --- a/modules/gpgsqlbackend/gpgsqlbackend.cc +++ b/modules/gpgsqlbackend/gpgsqlbackend.cc @@ -1,4 +1,4 @@ -// $Id: gpgsqlbackend.cc,v 1.1 2002/12/16 18:02:09 ahu Exp $ +// $Id: gpgsqlbackend.cc,v 1.2 2003/01/02 15:43:00 ahu Exp $ #include #include @@ -40,7 +40,8 @@ class gPgSQLFactory : public BackendFactory { public: gPgSQLFactory(const string &mode) : BackendFactory(mode),d_mode(mode) {} - + + // XXX FIXME this stuff is duplicate with gmysqlbackend void declareArguments(const string &suffix="") { declare(suffix,"dbname","Pdns backend database name to connect to","powerdns"); @@ -60,6 +61,19 @@ public: declare(suffix,"wildcard-any-id-query","Wildcard ANY with ID query","select content,ttl,prio,type,domain_id,name from records where like '%s' and domain_id='%d'"); declare(suffix,"list-query","AXFR query", "select content,ttl,prio,type,domain_id,name from records where domain_id='%d'"); + declare(suffix,"master-zone-query","Data", "select master from domains where name='%s' and type='SLAVE'"); + + declare(suffix,"info-zone-query","","select id,name,master,last_check,notified_serial,type from domains where name='%s'"); + + declare(suffix,"info-all-slaves-query","","select id,name,master,last_check,type from domains where type='SLAVE'"); + declare(suffix,"supermaster-query","", "select account from supermasters where ip='%s' and nameserver='%s'"); + declare(suffix,"insert-slave-query","", "insert into domains (type,name,master,account) values('SLAVE','%s','%s','%s')"); + declare(suffix,"insert-record-query","", "insert into records (content,ttl,prio,type,domain_id,name) values ('%s',%d,%d,'%s',%d,'%s')"); + declare(suffix,"update-serial-query","", "update domains set notified_serial=%d where id=%d"); + declare(suffix,"update-lastcheck-query","", "update domains set last_check=%d where id=%d"); + declare(suffix,"info-all-master-query","", "select id,name,master,last_check,notified_serial,type from domains where type='MASTER'"); + declare(suffix,"delete-zone-query","", "delete from records where domain_id=%d"); + } diff --git a/pdns/backends/bind/bindbackend.cc b/pdns/backends/bind/bindbackend.cc index 96d41b612..036b9930a 100644 --- a/pdns/backends/bind/bindbackend.cc +++ b/pdns/backends/bind/bindbackend.cc @@ -15,7 +15,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -// $Id: bindbackend.cc,v 1.10 2002/12/30 21:00:56 ahu Exp $ +// $Id: bindbackend.cc,v 1.11 2003/01/02 15:43:00 ahu Exp $ #include #include #include @@ -748,6 +748,9 @@ bool BindBackend::handle::get_normal(DNSResourceRecord &r) bool BindBackend::list(int id) { + if(!d_zone_id_map.count(id)) + return false; + d_handle=new BindBackend::handle; DLOG(L<<"BindBackend constructing handle for list of "< #include @@ -19,8 +19,13 @@ using namespace std; void GSQLBackend::setNotified(u_int32_t domain_id, u_int32_t serial) { + char output[1024]; + snprintf(output,sizeof(output)-1, + d_UpdateSerialOfZoneQuery.c_str(), + serial, domain_id); + try { - d_db->doQuery("update domains set notified_serial="+itoa(serial)+" where id="+itoa(domain_id)); + d_db->doQuery(output); } catch(SSqlException &e) { throw AhuException("GSQLBackend unable to refresh domain_id "+itoa(domain_id)+": "+e.txtReason()); @@ -29,8 +34,13 @@ void GSQLBackend::setNotified(u_int32_t domain_id, u_int32_t serial) void GSQLBackend::setFresh(u_int32_t domain_id) { + char output[1024]; + snprintf(output,sizeof(output)-1,d_UpdateLastCheckofZoneQuery.c_str(), + time(0), + domain_id); + try { - d_db->doQuery("update domains set last_check="+itoa(time(0))+" where id="+itoa(domain_id)); + d_db->doQuery(output); } catch (SSqlException &e) { throw AhuException("GSQLBackend unable to refresh domain_id "+itoa(domain_id)+": "+e.txtReason()); @@ -39,11 +49,15 @@ void GSQLBackend::setFresh(u_int32_t domain_id) bool GSQLBackend::isMaster(const string &domain, const string &ip) { + char output[1024]; + snprintf(output,sizeof(output)-1, + d_MasterOfDomainsZoneQuery.c_str(), + sqlEscape(domain).c_str()); try { - d_db->doQuery("select master from domains where name='"+sqlEscape(domain)+"' and type='SLAVE'", d_result); + d_db->doQuery(output, d_result); } catch (SSqlException &e) { - throw AhuException("GSQLBackend unable to retrieve list of slave domains: "+e.txtReason()); + throw AhuException("GSQLBackend unable to retrieve list of master domains: "+e.txtReason()); } if(d_result.empty()) @@ -56,9 +70,11 @@ bool GSQLBackend::getDomainInfo(const string &domain, DomainInfo &di) { /* list all domains that need refreshing for which we are slave, and insert into SlaveDomain: id,name,master IP,serial */ - + char output[1024]; + snprintf(output,sizeof(output)-1,d_InfoOfDomainsZoneQuery.c_str(), + sqlEscape(domain).c_str()); try { - d_db->doQuery("select id,name,master,last_check,notified_serial,type from domains where name='"+sqlEscape(domain)+"'",d_result); + d_db->doQuery(output,d_result); } catch(SSqlException &e) { throw AhuException("GSQLBackend unable to retrieve information about a domain: "+e.txtReason()); @@ -80,7 +96,7 @@ bool GSQLBackend::getDomainInfo(const string &domain, DomainInfo &di) try { SOAData sd; if(!getSOA(domain,sd)) - L< *unfreshDomains) { /* list all domains that need refreshing for which we are slave, and insert into SlaveDomain: id,name,master IP,serial */ + char output[1024]; + snprintf(output,sizeof(output)-1,d_InfoOfAllSlaveDomainsQuery.c_str()); try { - d_db->doQuery("select id,name,master,last_check,type from domains where type='SLAVE'",d_result); + d_db->doQuery(output,d_result); } catch (SSqlException &e) { throw AhuException("GSQLBackend unable to retrieve list of slave domains: "+e.txtReason()); @@ -138,9 +156,11 @@ void GSQLBackend::getUpdatedMasters(vector *updatedDomains) { /* list all domains that need notifications for which we are master, and insert into updatedDomains id,name,master IP,serial */ + char output[1024]; + snprintf(output,sizeof(output)-1,d_InfoOfAllMasterDomainsQuery.c_str()); try { - d_db->doQuery("select id,name,master,last_check,notified_serial,type from domains where type='MASTER'",d_result); + d_db->doQuery(output,d_result); } catch(SSqlException &e) { throw AhuException("GSQLBackend unable to retrieve list of master domains: "+e.txtReason()); @@ -205,6 +225,17 @@ GSQLBackend::GSQLBackend(const string &mode, const string &suffix) d_wildCardANYIDQuery=getArg("wildcard-any-id-query"); d_listQuery=getArg("list-query"); + + d_MasterOfDomainsZoneQuery=getArg("master-zone-query"); + d_InfoOfDomainsZoneQuery=getArg("info-zone-query"); + d_InfoOfAllSlaveDomainsQuery=getArg("info-all-slaves-query"); + d_SuperMasterInfoQuery=getArg("supermaster-query"); + d_InsertSlaveZoneQuery=getArg("insert-slave-query"); + d_InsertRecordQuery=getArg("insert-record-query"); + d_UpdateSerialOfZoneQuery=getArg("update-serial-query"); + d_UpdateLastCheckofZoneQuery=getArg("update-lastcheck-query"); + d_InfoOfAllMasterDomainsQuery=getArg("info-all-master-query"); + d_DeleteZoneQuery=getArg("delete-zone-query"); } @@ -225,14 +256,14 @@ void GSQLBackend::lookup(const QType &qtype,const string &qname, DNSPacket *pkt_ else format=d_noWildCardNoIDQuery; - snprintf(output,1023, format.c_str(),sqlEscape(qtype.getName()).c_str(), sqlEscape(lcqname).c_str()); + snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(), sqlEscape(lcqname).c_str()); } else { if(qname[0]!='%') format=d_noWildCardIDQuery; else format=d_wildCardIDQuery; - snprintf(output,1023, format.c_str(),sqlEscape(qtype.getName()).c_str(),sqlEscape(lcqname).c_str(),domain_id); + snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(qtype.getName()).c_str(),sqlEscape(lcqname).c_str(),domain_id); } } else { @@ -244,14 +275,14 @@ void GSQLBackend::lookup(const QType &qtype,const string &qname, DNSPacket *pkt_ else format=d_noWildCardANYNoIDQuery; - snprintf(output,1023, format.c_str(),sqlEscape(lcqname).c_str()); + snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str()); } else { if(qname[0]!='%') format=d_noWildCardANYIDQuery; else format=d_wildCardANYIDQuery; - snprintf(output,1023, format.c_str(),sqlEscape(lcqname).c_str(),domain_id); + snprintf(output,sizeof(output)-1, format.c_str(),sqlEscape(lcqname).c_str(),domain_id); } } DLOG(L<< "Query: '" << output << "'"<doQuery(output); } @@ -288,11 +319,14 @@ bool GSQLBackend::list(int domain_id ) bool GSQLBackend::superMasterBackend(const string &ip, const string &domain, const vector&nsset, string *account, DNSBackend **ddb) { + string format; + char output[1024]; + format = d_SuperMasterInfoQuery; // check if we know the ip/ns couple in the database for(vector::const_iterator i=nsset.begin();i!=nsset.end();++i) { try { - d_db->doQuery(("select account from supermasters where ip='"+sqlEscape(ip)+"' and nameserver='"+sqlEscape(i->content)+"'"), - d_result); + snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(ip).c_str(),sqlEscape(i->content).c_str()); + d_db->doQuery(output, d_result); } catch (SSqlException &e) { throw AhuException("GSQLBackend unable to search for a domain: "+e.txtReason()); @@ -309,10 +343,12 @@ bool GSQLBackend::superMasterBackend(const string &ip, const string &domain, con bool GSQLBackend::createSlaveDomain(const string &ip, const string &domain, const string &account) { + string format; + char output[1024]; + format = d_InsertSlaveZoneQuery; + snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(domain).c_str(),sqlEscape(ip).c_str(),sqlEscape(account).c_str()); try { - d_db->doQuery(("insert into domains (type,name,master,account) values('SLAVE','"+ - sqlEscape(domain)+"','"+ - sqlEscape(ip)+"','"+sqlEscape(account)+"')")); + d_db->doQuery(output); } catch(SSqlException &e) { throw AhuException("Database error trying to insert new slave '"+domain+"': "+ e.txtReason()); @@ -344,19 +380,14 @@ bool GSQLBackend::get(DNSResourceRecord &r) bool GSQLBackend::feedRecord(const DNSResourceRecord &r) { - ostringstream os; - - os<<"insert into records (content,ttl,prio,type,domain_id,name) values ('"<< - sqlEscape(r.content)<<"', "<< - r.ttl<<", "<< - r.priority<<", '"<doQuery(os.str()); + d_db->doQuery(output); } catch (SSqlException &e) { throw AhuException(e.txtReason()); @@ -366,9 +397,11 @@ bool GSQLBackend::feedRecord(const DNSResourceRecord &r) bool GSQLBackend::startTransaction(const string &domain, int domain_id) { + char output[1024]; + snprintf(output,sizeof(output)-1,d_DeleteZoneQuery.c_str(),domain_id); try { d_db->doQuery("begin"); - d_db->doQuery("delete from records where domain_id="+itoa(domain_id)); + d_db->doQuery(output); } catch (SSqlException &e) { throw AhuException("Database failed to start transaction: "+e.txtReason()); @@ -425,6 +458,7 @@ public: declare(suffix,"list-query","AXFR query", "select content,ttl,prio,type,domain_id,name from records where domain_id='%d'"); + } DNSBackend *make(const string &suffix="") diff --git a/pdns/backends/gsql/gsqlbackend.hh b/pdns/backends/gsql/gsqlbackend.hh index fdd3f9102..209ab4576 100644 --- a/pdns/backends/gsql/gsqlbackend.hh +++ b/pdns/backends/gsql/gsqlbackend.hh @@ -55,4 +55,16 @@ private: string d_wildCardANYIDQuery; string d_listQuery; string d_logprefix; + + string d_MasterOfDomainsZoneQuery; + string d_InfoOfDomainsZoneQuery; + string d_InfoOfAllSlaveDomainsQuery; + string d_SuperMasterInfoQuery; + string d_InsertSlaveZoneQuery; + string d_InsertRecordQuery; + string d_UpdateSerialOfZoneQuery; + string d_UpdateLastCheckofZoneQuery; + string d_InfoOfAllMasterDomainsQuery; + string d_DeleteZoneQuery; + }; diff --git a/pdns/receiver.cc b/pdns/receiver.cc index 6677f6cdf..6f6d45e25 100644 --- a/pdns/receiver.cc +++ b/pdns/receiver.cc @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -// $Id: receiver.cc,v 1.5 2002/12/19 20:15:55 ahu Exp $ +// $Id: receiver.cc,v 1.6 2003/01/02 15:43:00 ahu Exp $ #include #include #include @@ -154,7 +154,7 @@ static string DLRestHandler(const vector&parts, pid_t ppid) static string DLCycleHandler(const vector&parts, pid_t ppid) { - kill(cpid,SIGKILL); + kill(cpid,SIGKILL); // why? return "ok"; } diff --git a/pdns/tcpreceiver.cc b/pdns/tcpreceiver.cc index c15eb38d0..dbc81d107 100644 --- a/pdns/tcpreceiver.cc +++ b/pdns/tcpreceiver.cc @@ -304,10 +304,10 @@ int TCPNameserver::doAXFR(const string &target, DNSPacket *q, int outsock) DLOG(L<<"Issuing list command - opening dedicated database connection"<list(sd.domain_id))) { + if(!(B->list(sd.domain_id))) { L<setRcode(2); // 'SERVFAIL' sendDelPacket(outpacket,outsock); diff --git a/pdns/ueberbackend.cc b/pdns/ueberbackend.cc index 8769e35c3..ed7440444 100644 --- a/pdns/ueberbackend.cc +++ b/pdns/ueberbackend.cc @@ -16,7 +16,7 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -// $Id: ueberbackend.cc,v 1.7 2002/12/19 20:15:55 ahu Exp $ +// $Id: ueberbackend.cc,v 1.8 2003/01/02 15:43:00 ahu Exp $ /* (C) Copyright 2002 PowerDNS.COM BV */ #include "utility.hh" @@ -371,41 +371,11 @@ bool UeberBackend::get(DNSResourceRecord &rr) bool UeberBackend::list(int domain_id) { - d_cached=d_negcached=false; - d_ancount=0; - if(stale) { - L<list(domain_id) && d_handle.i