@@ -1,5 +1,5 @@
---- modules/gmysqlbackend/gmysqlbackend.cc.orig 2013-01-07 11:29:06.321972721 +0100
-+++ modules/gmysqlbackend/gmysqlbackend.cc 2013-01-07 12:04:56.456515547 +0100
+--- pdns-3.2/modules/gmysqlbackend/gmysqlbackend.cc 2013-01-17 10:16:53.000000000 +0100
++++ pdns-3.2.new/modules/gmysqlbackend/gmysqlbackend.cc 2013-05-03 10:51:33.033534080 +0200
@@ -31,6 +31,24 @@
throw AhuException("Unable to launch "+mode+" connection: "+e.txtReason());
}
@@ -8,11 +8,11 @@
+ if(!getArg("slave-socket").empty() || !getArg("slave-host").empty()) {
+ try {
+ setDBReadonly(new SMySQL(getArg("slave-dbname"),
-+ getArg("slave-host"),
-+ getArgAsNum("slave-port"),
-+ getArg("slave-socket"),
-+ getArg("slave-user"),
-+ getArg("slave-password")));
++ getArg("slave-host"),
++ getArgAsNum("slave-port"),
++ getArg("slave-socket"),
++ getArg("slave-user"),
++ getArg("slave-password")));
+ L<<Logger::Warning<<mode<<" Slave connection successful."<<endl;
+ } catch(ArgException &e) {
+ // Ignore exception, slave not
@@ -39,3 +39,139 @@
declare(suffix,"basic-query","Basic query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name='%s'");
declare(suffix,"id-query","Basic with ID query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name='%s' and domain_id=%d");
declare(suffix,"wildcard-query","Wildcard query","select content,ttl,prio,type,domain_id,name from records where type='%s' and name like '%s'");
+--- pdns-3.2/pdns/backends/gsql/gsqlbackend.cc 2013-01-17 10:16:52.000000000 +0100
++++ pdns-3.2.new/pdns/backends/gsql/gsqlbackend.cc 2013-05-03 10:46:20.135360708 +0200
+@@ -78,7 +78,7 @@
+ d_MasterOfDomainsZoneQuery.c_str(),
+ sqlEscape(domain).c_str());
+ try {
+- d_db->doQuery(output, d_result);
++ getDBReadonly()->doQuery(output, d_result);
+ }
+ catch (SSqlException &e) {
+ throw AhuException("GSQLBackend unable to retrieve list of master domains: "+e.txtReason());
+@@ -111,7 +111,7 @@
+ snprintf(output,sizeof(output)-1,d_InfoOfDomainsZoneQuery.c_str(),
+ sqlEscape(domain).c_str());
+ try {
+- d_db->doQuery(output,d_result);
++ getDBReadonly()->doQuery(output,d_result);
+ }
+ catch(SSqlException &e) {
+ throw AhuException("GSQLBackend unable to retrieve information about a domain: "+e.txtReason());
+@@ -156,7 +156,7 @@
+ /* list all domains that need refreshing for which we are slave, and insert into SlaveDomain:
+ id,name,master IP,serial */
+ try {
+- d_db->doQuery(d_InfoOfAllSlaveDomainsQuery, d_result);
++ getDBReadonly()->doQuery(d_InfoOfAllSlaveDomainsQuery, d_result);
+ }
+ catch (SSqlException &e) {
+ throw AhuException("GSQLBackend unable to retrieve list of slave domains: "+e.txtReason());
+@@ -192,7 +192,7 @@
+ /* list all domains that need notifications for which we are master, and insert into updatedDomains
+ id,name,master IP,serial */
+ try {
+- d_db->doQuery(d_InfoOfAllMasterDomainsQuery,d_result);
++ getDBReadonly()->doQuery(d_InfoOfAllMasterDomainsQuery,d_result);
+ }
+ catch(SSqlException &e) {
+ throw AhuException("GSQLBackend unable to retrieve list of master domains: "+e.txtReason());
+@@ -243,6 +243,7 @@
+ {
+ setArgPrefix(mode+suffix);
+ d_db=0;
++ d_db_slave=NULL;
+ d_logprefix="["+mode+"Backend"+suffix+"] ";
+
+ try
+@@ -643,7 +644,7 @@
+ snprintf(output,sizeof(output)-1,d_GetDomainMetadataQuery.c_str(), sqlEscape(name).c_str(), sqlEscape(kind).c_str());
+
+ try {
+- d_db->doQuery(output);
++ getDBReadonly()->doQuery(output);
+ }
+ catch (SSqlException &e) {
+ throw AhuException("GSQLBackend unable to list metadata: "+e.txtReason());
+@@ -732,7 +733,7 @@
+ }
+
+ try {
+- d_db->doQuery(output);
++ getDBReadonly()->doQuery(output);
+ }
+ catch(SSqlException &e) {
+ throw AhuException(e.txtReason());
+@@ -750,7 +751,7 @@
+ char output[1024];
+ snprintf(output,sizeof(output)-1,d_listQuery.c_str(),domain_id);
+ try {
+- d_db->doQuery(output);
++ getDBReadonly()->doQuery(output);
+ }
+ catch(SSqlException &e) {
+ throw AhuException("GSQLBackend list query: "+e.txtReason());
+@@ -770,7 +771,7 @@
+ for(vector<DNSResourceRecord>::const_iterator i=nsset.begin();i!=nsset.end();++i) {
+ try {
+ snprintf(output,sizeof(output)-1,format.c_str(),sqlEscape(ip).c_str(),sqlEscape(i->content).c_str());
+- d_db->doQuery(output, d_result);
++ getDBReadonly()->doQuery(output, d_result);
+ }
+ catch (SSqlException &e) {
+ throw AhuException("GSQLBackend unable to search for a domain: "+e.txtReason());
+@@ -847,7 +848,7 @@
+ {
+ // L << "GSQLBackend get() was called for "<<qtype.getName() << " record: ";
+ SSql::row_t row;
+- if(d_db->getRow(row)) {
++ if(getDBReadonly()->getRow(row)) {
+ r.content=row[0];
+ if (row[1].empty())
+ r.ttl = ::arg().asNum( "default-ttl" );
+@@ -955,7 +956,7 @@
+ sd.domain_id);
+
+ try {
+- d_db->doQuery(output, d_result);
++ getDBReadonly()->doQuery(output, d_result);
+ }
+ catch (const SSqlException& e) {
+ //DLOG(L<<"GSQLBackend unable to calculate SOA serial: " << e.txtReason()<<endl);
+diff -ru pdns-3.2/pdns/backends/gsql/gsqlbackend.hh pdns-3.2.new/pdns/backends/gsql/gsqlbackend.hh
+--- pdns-3.2/pdns/backends/gsql/gsqlbackend.hh 2013-01-17 10:16:52.000000000 +0100
++++ pdns-3.2.new/pdns/backends/gsql/gsqlbackend.hh 2013-05-03 10:46:20.135360708 +0200
+@@ -15,12 +15,24 @@
+ {
+ if(d_db)
+ delete d_db;
++ if(d_db_slave)
++ delete d_db_slave;
+ }
+
+ void setDB(SSql *db)
+ {
+ d_db=db;
+ }
++
++ void setDBReadonly(SSql *db)
++ {
++ d_db_slave=db;
++ }
++
++ SSql *getDBReadonly()
++ {
++ return d_db_slave != NULL ? d_db_slave : d_db;
++ }
+
+ virtual string sqlEscape(const string &name);
+ void lookup(const QType &, const string &qdomain, DNSPacket *p=0, int zoneId=-1);
+@@ -67,6 +79,7 @@
+ QType d_qtype;
+ int d_count;
+ SSql *d_db;
++ SSql *d_db_slave;
+ SSql::result_t d_result;
+
+ string d_wildCardNoIDQuery;
|