diff options
Diffstat (limited to 'src/modules/UserBackendMysql.cpp')
-rw-r--r-- | src/modules/UserBackendMysql.cpp | 96 |
1 files changed, 95 insertions, 1 deletions
diff --git a/src/modules/UserBackendMysql.cpp b/src/modules/UserBackendMysql.cpp index e5818c6..886f345 100644 --- a/src/modules/UserBackendMysql.cpp +++ b/src/modules/UserBackendMysql.cpp @@ -18,7 +18,13 @@ */ #include "UserBackendMysql.h" +#include <Common/ActionManager.h> #include <Common/ConfigEntry.h> +#include <Common/Logger.h> + +#include <sigc++/bind.h> + +#include <cstdlib> #define init UserBackendMysql_LTX_init #define deinit UserBackendMysql_LTX_deinit @@ -44,12 +50,29 @@ bool UserBackendMysql::handleConfigEntry(const Common::ConfigEntry &entry, bool } else if(entry[1].getKey().matches("Password")) { if(entry[2].empty()) - password = entry[1][0]; + passwd = entry[1][0]; } else if(entry[1].getKey().matches("Database")) { if(entry[2].empty()) db = entry[1][0]; } + else if(entry[1].getKey().matches("Port")) { + if(entry[2].empty()) { + char *endptr; + long val; + + val = std::strtol(entry[1][0].c_str(), &endptr, 10); + + if(endptr != 0 || val < 0 || val > 65535) + Common::Logger::log(Common::Logger::WARNING, "UserBackendMysql: Invalid port"); + else + port = val; + } + } + else if(entry[1].getKey().matches("UnixSocket")) { + if(entry[2].empty()) + unixSocket = entry[1][0]; + } else if(entry[1].getKey().matches("Queries")) { if(entry[2].getKey().matches("ListUsers")) { if(entry[3].empty()) @@ -83,14 +106,85 @@ bool UserBackendMysql::handleConfigEntry(const Common::ConfigEntry &entry, bool if(entry[3].empty()) queryGroupByName = entry[2][0]; } + else if(!entry[2].empty()) + return false; } + else if(!entry[1].empty()) + return false; + + return true; } + + return false; } void UserBackendMysql::configFinished() { + if(db.empty()) { + Common::Logger::log(Common::Logger::ERROR, "UserBackendMysql: No database name given"); + return; + } + + mysql = mysql_init(0); + mysql_real_connect(mysql, host.c_str(), username.c_str(), passwd.c_str(), db.c_str(), port, unixSocket.empty() ? 0 : unixSocket.c_str(), 0); + UserBackend::registerBackend(backend); } + +bool UserBackendMysql::userList(const sigc::slot<void, const std::map<unsigned long, Common::UserInfo>& > &callback) { + mysql_ping(mysql); + + mysql_real_query(mysql, queryListUsers.c_str(), queryListUsers.length()); + MYSQL_RES *result = mysql_use_result(mysql); + + if(mysql_num_fields(result) < 4) + return true; // TODO Error + + std::map<unsigned long, Common::UserInfo> users; + + MYSQL_ROW row; + while(MYSQL_ROW row = mysql_fetch_row(result)) { + Common::UserInfo user(std::strtoul(row[0], 0, 10), row[2]); + + user.setGid(std::strtoul(row[1], 0, 10)); + user.setFullName(row[3]); + + users.insert(std::make_pair(user.getUid(), user)); + } + + Common::ActionManager::get()->add(sigc::bind(callback, users)); + + return true; +} + +bool UserBackendMysql::userInfo(unsigned long uid, const sigc::slot<void, const Common::UserInfo&> &callback) { + return false; +} + +bool UserBackendMysql::password(unsigned long uid, const std::string &password, const sigc::slot<void, bool> &callback) { + return false; +} + + +void UserBackendMysql::registerBackend() { + if(backend) + return; + + backend = new UserBackendMysql(); + Common::ConfigManager::get()->registerConfigurable(backend); +} + +void UserBackendMysql::unregisterBackend() { + if(!backend) + return; + + Common::ConfigManager::get()->unregisterConfigurable(backend); + UserBackend::unregisterBackend(backend); + + delete backend; + backend = 0; +} + } } |