diff options
author | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-03-06 16:58:13 +0000 |
---|---|---|
committer | danieldg <danieldg@e03df62e-2008-0410-955e-edbf42e46eb7> | 2010-03-06 16:58:13 +0000 |
commit | 410de52634ddeabfe9a57aa15131311d16abb42c (patch) | |
tree | b774062ae69631585835f206210a7d82b5a356d5 /src/modules/sql.h | |
parent | a1fab90c8040280a6a812a9454f085c062990708 (diff) |
SQL API v3, drop all the ugly complexity
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@12602 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/sql.h')
-rw-r--r-- | src/modules/sql.h | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/modules/sql.h b/src/modules/sql.h new file mode 100644 index 000000000..2d44584fa --- /dev/null +++ b/src/modules/sql.h @@ -0,0 +1,154 @@ +/* +------------------------------------+ + * | Inspire Internet Relay Chat Daemon | + * +------------------------------------+ + * + * InspIRCd: (C) 2002-2010 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits + * + * This program is free but copyrighted software; see + * the file COPYING for details. + * + * --------------------------------------------------- + */ + +#ifndef INSPIRCD_SQLAPI_3 +#define INSPIRCD_SQLAPI_3 + +/** Defines the error types which SQLerror may be set to + */ +enum SQLerrorNum { SQL_BAD_DBID, SQL_BAD_CONN, SQL_QSEND_FAIL, SQL_QREPLY_FAIL }; + +/** A list of format parameters for an SQLquery object. + */ +typedef std::vector<std::string> ParamL; + +typedef std::map<std::string, std::string> ParamM; + +/** + * Result of an SQL query. Only valid inside OnResult + */ +class SQLResult : public interfacebase +{ + public: + /** + * 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 will return the number of + * affected rows. In this case you SHOULD NEVER access any of the result + * set rows, as there aren't any! + * @returns Number of rows in the result set. + */ + virtual int Rows() = 0; + + /** + * Return a single row (result of the query). The internal row counter + * is incremented by one. + * + * @param result Storage for the result data. + * @returns true if there was a row, false if no row exists (end of + * iteration) + */ + virtual bool GetRow(std::vector<std::string>& result) = 0; +}; + +/** SQLerror holds the error state of a request. + * The error string varies from database software to database software + * and should be used to display informational error messages to users. + */ +class SQLerror +{ + public: + /** The error id + */ + SQLerrorNum id; + + /** The error string + */ + std::string str; + + /** Initialize an SQLerror + * @param i The error ID to set + * @param s The (optional) error string to set + */ + SQLerror(SQLerrorNum i, const std::string &s = "") + : id(i), str(s) + { + } + + /** Return the error string for an error + */ + const char* Str() + { + if(str.length()) + return str.c_str(); + + switch(id) + { + case SQL_BAD_DBID: + return "Invalid database ID"; + case SQL_BAD_CONN: + return "Invalid connection"; + case SQL_QSEND_FAIL: + return "Sending query failed"; + case SQL_QREPLY_FAIL: + return "Getting query result failed"; + default: + return "Unknown error"; + } + } +}; + +/** + * Object representing an SQL query. This should be allocated on the heap and + * passed to an SQLProvider, which will free it when the query is complete or + * when the querying module is unloaded. + * + * You should store whatever information is needed to have the callbacks work in + * this object (UID of user, channel name, etc). + */ +class SQLQuery : public classbase +{ + public: + ModuleRef creator; + const std::string dbid; + const std::string query; + + SQLQuery(Module* Creator, const std::string& db, const std::string& q) + : creator(Creator), dbid(db), query(q) {} + virtual ~SQLQuery() {} + + virtual void OnResult(SQLResult& result) = 0; + /** + * Called when the query fails + */ + virtual void OnError(SQLerror& error) { } +}; + +/** + * Provider object for SQL servers + */ +class SQLProvider : public DataProvider +{ + public: + /** Submit an asynchronous SQL request + * @param dbid The database ID to apply the request to + * @param query The query string + * @param callback The callback that the result is sent to + */ + virtual void submit(SQLQuery* query) = 0; + + /** Format a parameterized query string using proper SQL escaping. + * @param q The query string, with '?' parameters + * @param p The parameters to fill in in the '?' slots + */ + virtual std::string FormatQuery(std::string q, ParamL p); + + /** Format a parameterized query string using proper SQL escaping. + * @param q The query string, with '$foo' parameters + * @param p The map to look up parameters in + */ + virtual std::string FormatQuery(std::string q, ParamM p); +}; + +#endif |