Diana Software
QDb.hh
Go to the documentation of this file.
1 
2 #ifndef _QDB_HH_
3 #define _QDB_HH_
4 
5 #include <string>
6 #include <vector>
7 #include <map>
8 
9 // SDD FIXME -- 2018-01-05 -- replace with fwddecl (currently breaks cint)
10 #include "QVdt.hh"
11 #include "QError.hh"
12 
13 #include "libpq-fe.h"
14 
16 class QWatchdogTimer;
17 
18 namespace boost { class mutex; }
19 
27 class QDb
28 {
29 public:
30 
31  virtual ~QDb();
32 
33  typedef std::vector<QVdt> column;
34  typedef std::map<std::string, column> QDbTable;
35 
37  double DoQueryDouble(const std::string& query);
39  int DoQueryInt(const std::string& query);
41  bool DoQueryBool(const std::string& query);
43  std::string DoQueryString(const std::string& query);
45  std::vector<int> DoQueryVectorInt( const std::string& query);
47  std::vector<double> DoQueryVectorDouble( const std::string& query);
49  std::vector<std::string> DoQueryVectorString( const std::string& query);
50 
51  /*
52  * This is (and must be) the only method that actually performs the
53  * database queries (although it does so by exploiting other private
54  * methods).
55  * All other methods performing queries are wrappers around this method.
56  * This is to ensure that all the connection mechanisms and error handling
57  * is performed properly and always by the same code.
58  */
59  QError DoQuery(const std::string& query, QDbTable& table);
60 
61  /*
62  * Simpler interface to DoQuery(), without error checking.
63  * Throws a QError if something goes wrong.
64  */
65  QDbTable DoQuery(const std::string& query);
66 
68  QError DoSQLNoReturn(const std::string& query);
73  int DoExec(const std::string& Query);
74 
75  int Insert(const std::string& tableName, const column& fields, const column & values);
76 
82  void SetConnectAttemptTimeoutSec(int timeout)
83  { fConnectAttemptTimeoutSec = timeout; }
84 
85  /*
86  * Set a range of values in seconds for extracting a random delay to
87  * wait before opening a database connection.
88  *
89  * By default no delay is added when the connection is open.
90  * The delay is only added if both minDelaySec and maxDelaySec have non
91  * negative values and if maxDelaySec is larger than or equal to minDelaySec.
92  * (if minDelaySec and maxDelaySec have the same value, the delay will be
93  * exactly minDelaySec).
94  * The purpose of this delay is to avoid that a large number of analysis
95  * jobs starting at the same time will also try to open the connection and
96  * access the database at the same time, thus causing an overload of the
97  * server.
98  * Note that the random sleep is called once in Connect(), therefore it
99  * would be repeated in case of multiple calls to Connect().
100  */
101  void SetConnectRandomDelaySec(double minDelaySec, double maxDelaySec)
102  { fMinConnectDelaySec = minDelaySec; fMaxConnectDelaySec = maxDelaySec; }
103 
110  void SetDisconnectTimeoutSec(double timeout)
111  { fDisconnectTimeoutSec = timeout; }
112 
113  /* Lock the mutex and call UnlockedDisconnect() */
114  bool Disconnect();
115 
116 protected:
117 
118  QDb(const std::string& dbHost,
119  const std::string& dbPort,
120  const std::string& dbUsr,
121  const std::string& dbPwd,
122  const std::string& dbName);
123 
124  bool IsConnected() const;
125  inline const char* DataBase() const { return fDbName.c_str(); }
126 
127  // Friendship granted to allow the call to the protected method Disconnect()
128  friend class QDbWatchdogThread;
129 
130 private:
131 
132  PGconn *fConnection;
133 
134  const std::string fDbHost;
135  const std::string fDbPort;
136  const std::string fDbUser;
137  const std::string fDbPwd;
138  const std::string fDbName;
139 
140  // timeout for attempting db connection (defaults to 0)
142 
144  /*
145  These variables define the range for extracting a delay to wait
146  before opening a database connection, set by SetConnectRandomDelaySec()
147  and used by RandomWaitBeforeConnect();
148  */
152 
153  /* timeout for disconnecting after a certain period of inactivity */
155 
158  boost::mutex* fMutex;
159 
168  QError Connect();
169 
170  /*
171  * Perform a disconnect without locking the mutex, used for the cases
172  * when the mutex is already locked at a higher level (e.g. in Query()).
173  */
174  bool UnlockedDisconnect();
175 
184  QError Query(const std::string& query, PGresult** result);
190  QError BasicQuery(const std::string& query, PGresult** result) const;
191 
193  QError CheckSingleResult(const QDbTable& table,
194  const std::string& query,
195  const std::string& funcName,
196  const std::string& file,
197  int line) const;
198 
200 
201  void RandomWaitBeforeConnect() const;
202 
205 };
206 #endif
thread responsible for closing the database connection after it remains idle for a certain amount of ...
base class for db interface
Definition: QDb.hh:28
std::vector< std::string > DoQueryVectorString(const std::string &query)
Definition: QDb.cc:276
PGconn * fConnection
Definition: QDb.hh:132
double fMinConnectDelaySec
Definition: QDb.hh:149
QWatchdogTimer * fWatchdogTimer
Definition: QDb.hh:157
std::vector< QVdt > column
Definition: QDb.hh:33
std::vector< double > DoQueryVectorDouble(const std::string &query)
Definition: QDb.cc:260
double fMaxConnectDelaySec
Definition: QDb.hh:150
double fDisconnectTimeoutSec
Definition: QDb.hh:154
QDbWatchdogThreadHandler * fThreadHandler
Definition: QDb.hh:156
QError UpdateWatchdogTimer()
Definition: QDb.cc:551
std::vector< int > DoQueryVectorInt(const std::string &query)
Definition: QDb.cc:245
const std::string fDbPort
Definition: QDb.hh:135
QError Connect()
Definition: QDb.cc:73
bool DoQueryBool(const std::string &query)
Definition: QDb.cc:213
QError DoQuery(const std::string &query, QDbTable &table)
Definition: QDb.cc:409
QError CheckSingleResult(const QDbTable &table, const std::string &query, const std::string &funcName, const std::string &file, int line) const
Definition: QDb.cc:456
boost::mutex * fMutex
Definition: QDb.hh:158
const std::string fDbHost
Definition: QDb.hh:134
QError ConnectBase()
Definition: QDb.cc:115
void SetDisconnectTimeoutSec(double timeout)
Definition: QDb.hh:110
std::map< std::string, column > QDbTable
Definition: QDb.hh:34
int DoQueryInt(const std::string &query)
Definition: QDb.cc:197
const char * DataBase() const
Definition: QDb.hh:125
const std::string fDbPwd
Definition: QDb.hh:137
bool Disconnect()
Definition: QDb.cc:151
double DoQueryDouble(const std::string &query)
Definition: QDb.cc:181
int DoExec(const std::string &Query)
Execute an INSERT, UPDATE, DELETE, FETCH, or MOVE statement.
Definition: QDb.cc:305
void SetConnectAttemptTimeoutSec(int timeout)
Definition: QDb.hh:82
std::string DoQueryString(const std::string &query)
Definition: QDb.cc:229
QDb(const std::string &dbHost, const std::string &dbPort, const std::string &dbUsr, const std::string &dbPwd, const std::string &dbName)
Definition: QDb.cc:27
void RandomWaitBeforeConnect() const
Definition: QDb.cc:498
QError BasicQuery(const std::string &query, PGresult **result) const
Definition: QDb.cc:376
QError DoSQLNoReturn(const std::string &query)
Definition: QDb.cc:292
int fConnectAttemptTimeoutSec
Definition: QDb.hh:141
const std::string fDbUser
Definition: QDb.hh:136
void SetConnectRandomDelaySec(double minDelaySec, double maxDelaySec)
Definition: QDb.hh:101
QError Query(const std::string &query, PGresult **result)
Definition: QDb.cc:352
virtual ~QDb()
Definition: QDb.cc:51
int Insert(const std::string &tableName, const column &fields, const column &values)
Definition: QDb.cc:320
bool UnlockedDisconnect()
Definition: QDb.cc:158
QError InitWatchdogThread()
Definition: QDb.cc:523
bool IsConnected() const
Definition: QDb.cc:66
const std::string fDbName
Definition: QDb.hh:138
error class with error type and description
Definition: QError.hh:115
thread-safe timer class
Definition: QDb.hh:18