getArgAsNum("timeout")));
}
-void gMySQLBackend::reconnectIfNeeded()
-{
- if (!isConnectionUsable()) {
- reconnect();
- }
-}
-
class gMySQLFactory : public BackendFactory
{
public:
public:
gMySQLBackend(const string &mode, const string &suffix); //!< Makes our connection to the database. Throws an exception if it fails.
protected:
- void reconnectIfNeeded() override;
- void reconnect();
+ void reconnect() override;
};
#endif /* PDNS_GMYSQLBACKEND_HH */
L<<Logger::Info<<mode<<" Connection successful. Connected to database '"<<getArg("dbname")<<"' on '"<<getArg("host")<<"'."<<endl;
}
+void gPgSQLBackend::reconnect()
+{
+ if (d_db) {
+ d_db->reconnect();
+ }
+}
+
+bool gPgSQLBackend::inTransaction()
+{
+ const auto* db = dynamic_cast<SPgSQL*>(d_db);
+ if (db) {
+ return db->in_trx();
+ }
+ return false;
+}
+
class gPgSQLFactory : public BackendFactory
{
public:
{
public:
gPgSQLBackend(const string &mode, const string &suffix); //!< Makes our connection to the database. Throws an exception if it fails.
+protected:
+ void reconnect() override;
+ bool inTransaction() override;
};
#endif /* PDNS_GPGSQLBACKEND_HH */
void reconnect() override;
PGconn* db() { return d_db; }
- bool in_trx() { return d_in_trx; }
+ bool in_trx() const { return d_in_trx; }
private:
PGconn* d_db;
reconnectIfNeeded();
d_db->startTransaction();
+ d_inTransaction = true;
if(domain_id >= 0) {
d_DeleteZoneQuery_stmt->
bind("domain_id", domain_id)->
}
}
catch (SSqlException &e) {
+ d_inTransaction = false;
throw PDNSException("Database failed to start transaction: "+e.txtReason());
}
{
try {
d_db->commit();
+ d_inTransaction = false;
}
catch (SSqlException &e) {
+ d_inTransaction = false;
throw PDNSException("Database failed to commit transaction: "+e.txtReason());
}
return true;
{
try {
d_db->rollback();
+ d_inTransaction = false;
}
catch(SSqlException &e) {
+ d_inTransaction = false;
throw PDNSException("Database failed to abort transaction: "+string(e.txtReason()));
}
return true;
}
return false;
}
- virtual void reconnectIfNeeded()
+ void reconnectIfNeeded()
{
- if (isConnectionUsable()) {
+ if (isConnectionUsable() || inTransaction()) {
return;
}
- if (d_db) {
- d_db->reconnect();
- }
+ reconnect();
+ }
+ virtual void reconnect() { }
+ virtual bool inTransaction()
+ {
+ return d_inTransaction;
}
private:
string d_query_name;
DNSName d_qname;
- SSql *d_db;
SSqlStatement::result_t d_result;
string d_NoIdQuery;
SSqlStatement* d_SearchCommentsQuery_stmt;
protected:
+ SSql *d_db{nullptr};
bool d_dnssecQueries;
+ bool d_inTransaction{false};
};
#endif /* PDNS_GSQLBACKEND_HH */