+/* +------------------------------------+
+ * | Inspire Internet Relay Chat Daemon |
+ * +------------------------------------+
+ *
+ * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * See: http://www.inspircd.org/wiki/index.php/Credits
+ *
+ * This program is free but copyrighted software; see
+ * the file COPYING for details.
+ *
+ * ---------------------------------------------------
+ */
+
#ifndef INSPIRCD_SQLAPI_2
#define INSPIRCD_SQLAPI_2
*/
class SQLexception : public ModuleException
{
+ public:
+ SQLexception(const std::string &reason) : ModuleException(reason)
+ {
+ }
+
+ SQLexception() : ModuleException("SQLv2: Undefined exception")
+ {
+ }
};
/** An exception thrown when a bad column or row name or id is requested
class SQLbadColName : public SQLexception
{
public:
- SQLbadColName() { }
+ SQLbadColName() : SQLexception("SQLv2: Bad column name")
+ {
+ }
};
/** SQLerror holds the error state of any SQLrequest or SQLresult.
SQLquery(const std::string &query)
: q(query)
{
- log(DEBUG, "SQLquery constructor: %s", q.c_str());
}
/** Initialize an SQLquery with a format string and parameters.
SQLquery(const std::string &query, const ParamL ¶ms)
: q(query), p(params)
{
- log(DEBUG, "SQLquery constructor with %d params: %s", p.size(), q.c_str());
}
/** An overloaded operator for pushing parameters onto the parameter list
*/
- SQLquery& operator,(const std::string &foo)
+ template<typename T> SQLquery& operator,(const T &foo)
{
- p.push_back(foo);
+ p.push_back(ConvToStr(foo));
return *this;
}
/** An overloaded operator for pushing parameters onto the parameter list.
* This has higher precedence than 'operator,' and can save on parenthesis.
*/
- SQLquery& operator%(const std::string &foo)
+ template<typename T> SQLquery& operator%(const T &foo)
{
- p.push_back(foo);
+ p.push_back(ConvToStr(foo));
return *this;
}
};
* @param q A properly initialized SQLquery object.
*/
SQLrequest(Module* s, Module* d, const std::string &databaseid, const SQLquery &q)
- : Request(SQLREQID, s, d), query(q), dbid(databaseid), pri(false), id(0)
+ : Request(s, d, SQLREQID), query(q), dbid(databaseid), pri(false), id(0)
{
}
/** Initialize an SQLfield
*/
- SQLfield(const std::string &data, bool n)
+ SQLfield(const std::string &data = "", bool n = false)
: d(data), null(n)
{
/** Used by the SQL API to instantiate an SQLrequest
*/
SQLresult(Module* s, Module* d, unsigned long i)
- : Request(SQLRESID, s, d), id(i)
+ : Request(s, d, SQLRESID), id(i)
{
}
* Return the number of rows in the result
* Note that if you have perfomed an INSERT
* or UPDATE query or other query which will
- * not return rows, this value will NOT be
- * the number of affected rows, as this would
- * then indicate there are rows in the set,
- * which there are not.
+ * not return rows, this will return the
+ * number of affected rows, and SQLresult::Cols()
+ * will contain 0. In this case you SHOULD NEVER
+ * access any of the result set rows, as there arent any!
* @returns Number of rows in the result set.
*/
virtual int Rows() = 0;
/**
- * Return the number of columns in the result
+ * Return the number of columns in the result.
+ * If you performed an UPDATE or INSERT which
+ * does not return a dataset, this value will
+ * be 0.
* @returns Number of columns in the result set.
*/
virtual int Cols() = 0;
virtual void Free(SQLfieldList* fl) = 0;
};
+
+/** SQLHost represents a <database> config line and is useful
+ * for storing in a map and iterating on rehash to see which
+ * <database> tags was added/removed/unchanged.
+ */
+class SQLhost
+{
+ public:
+ std::string id; /* Database handle id */
+ std::string host; /* Database server hostname */
+ std::string ip; /* resolved IP, needed for at least pgsql.so */
+ unsigned int port; /* Database server port */
+ std::string name; /* Database name */
+ std::string user; /* Database username */
+ std::string pass; /* Database password */
+ bool ssl; /* If we should require SSL */
+
+ SQLhost()
+ {
+ }
+
+ SQLhost(const std::string& i, const std::string& h, unsigned int p, const std::string& n, const std::string& u, const std::string& pa, bool s)
+ : id(i), host(h), port(p), name(n), user(u), pass(pa), ssl(s)
+ {
+ }
+
+ /** Overload this to return a correct Data source Name (DSN) for
+ * the current SQL module.
+ */
+ std::string GetDSN();
+};
+
+/** Overload operator== for two SQLhost objects for easy comparison.
+ */
+bool operator== (const SQLhost& l, const SQLhost& r)
+{
+ return (l.id == r.id && l.host == r.host && l.port == r.port && l.name == r.name && l.user == l.user && l.pass == r.pass && l.ssl == r.ssl);
+}
+
#endif