1 #ifndef _det_VSQLManager_MySQL_h_
2 #define _det_VSQLManager_MySQL_h_
12 #include <boost/tuple/tuple.hpp>
13 #include <boost/lexical_cast.hpp>
15 #include <mysql/mysql.h>
17 #include <det/VManager.h>
18 #include <utl/RealTimeStopwatch.h>
22 #define VSQLMANAGER_GETDATA_GETDBDATA(_T_...) VMANAGER_GETDATA_CALL(GetDBData, _T_)
56 virtual void Init(
const std::string& configLink);
61 Status Query(
const std::ostringstream& os,
const std::string& what =
"")
const
62 {
return Query(os.str(), what); }
64 Status Query(
const std::string& query,
const std::string& what =
"")
const;
66 Status Query(
const std::ostringstream& os,
const std::ostringstream& what)
const
67 {
return Query(os.str(), what.str()); }
78 result = boost::lexical_cast<T>(row[0]);
79 }
catch (boost::bad_lexical_cast&) {
80 BadLexicalCast<T>(row[0],
"preserving original value");
93 FetchRow(std::vector<T>& result,
const bool free =
true)
100 for (
int i = 0; i < n; ++i) {
103 result[i] = boost::lexical_cast<T>(
"");
104 ERROR(
"Empty field returned from sql-query!");
106 result[i] = boost::lexical_cast<T>(row[i]);
108 }
catch (boost::bad_lexical_cast&) {
109 BadLexicalCast<T>(row[i],
"preserving original value");
121 template<
typename TH,
typename TT>
123 FetchRowMany(boost::tuples::cons<TH, TT>& tuple,
const bool free =
true)
147 result.push_back(boost::lexical_cast<T>(row[0]));
148 }
catch (boost::bad_lexical_cast&) {
149 BadLexicalCast<T>(row[0],
"some rows will be missing");
164 template<
typename TH,
typename TT>
170 {
return mysql_num_fields(NeedsResult()); }
174 {
return mysql_num_rows(NeedsResult()); }
183 const std::string& tableName,
184 const std::string& columnName,
203 const std::string& tableName,
204 const std::string& columnName,
235 const std::string
err =
"Empty MySQL result queue.";
241 MYSQL_ROW
FetchRow()
const {
return mysql_fetch_row(NeedsResult()); }
249 template<
typename TH,
typename TT>
257 tuple.get_head() = boost::lexical_cast<TH>(row[index]);
258 }
catch (boost::bad_lexical_cast&) {
259 BadLexicalCast<TH>(row[index],
"some columns will be missing");
271 std::ostringstream
err;
272 err <<
"Bad lexical cast from '";
274 for (
int j = 0; i > 0 && row[j]; ++j) {
275 err << (isprint(row[j]) ? row[j] :
'.');
279 err <<
"[truncated]";
283 err << abi::__cxa_demangle(
typeid(T).name(), 0, 0, &status);
285 err <<
typeid(T).name();
287 err <<
"; " << action <<
'.';
Status GetDBData(T &returnData, const std::string &tableName, const std::string &columnName, const IndexMap &componentIndex) const
virtual Status GetDBResVector(const std::string &, const std::string &, const IndexMap &) const
overload this in all derived managers that need it
Status GetDBData(std::vector< T > &returnData, const std::string &tableName, const std::string &columnName, const IndexMap &componentIndex) const
Status FetchRowTuple(const MYSQL_ROW, const boost::tuples::null_type &, const int) const
stop taking tuples
std::ofstream * fLogQueryStream
Status FetchRowMany(boost::tuples::cons< TH, TT > &tuple, const bool freeResult=true) const
Get a tuple of values from the first row of an SQLite query result.
Status FetchNextRow(T &result) const
Fetch first item (may be a tuple) from current row.
static void BadLexicalCast(const char *const row, const std::string &action)
VSQLManager & operator=(const VSQLManager &)
size_t NumRows() const
Total number of rows in the current query result.
std::string fDatabaseSoftwareVersion
std::string fDatabasePassword
Interface for detector managers.
std::string fDatabaseUserName
std::string fDatabaseServer
Status Query(const std::ostringstream &os, const std::ostringstream &what) const
Base class to report exceptions in IO.
virtual void Init(const std::string &configLink)
Manager Initialization. configLink is the CentralConfig hook for the configuration file...
Interface for detector managers that use MySQL.
static int fgGlobalLogQueries
std::string fDatabaseName
Database filename.
Status FetchColumn(std::vector< T > &data) const
Get the first item from many rows of an SQLite query result.
static void SetGlobalLogQueries(const int q)
MYSQL_ROW FetchRow() const
Status FetchNextRowMany(boost::tuples::cons< TH, TT > &result) const
workaround
Status FetchRowTuple(const MYSQL_ROW row, boost::tuples::cons< TH, TT > &tuple, const int index=0) const
virtual Status GetDBResFundamental(const std::string &, const std::string &, const IndexMap &) const
overload this in all derived managers that need it
std::map< std::string, std::string > IndexMap
Status Query(const std::ostringstream &os, const std::string &what="") const
query MySQL
static std::string MergeIndexMap(const IndexMap &componentIndex)
utl::RealTimeStopwatch fTime
Status
Specifies success or (eventually) various possible failure modes.
unsigned int NumFields() const
Number of fields (columns) in the current query result.