#include "global.h"
extern const char sql_schema[];
/*
* mqtt_rtlm_log() Log database connection message
*
* @fmt = format string
* @... = argument list
* return: none
*/
static void
mqtt_rtlm_log(const char *fmt, ...)
{
va_list lst;
va_start(lst, fmt);
vsyslog(LOG_ERR, fmt, lst);
va_end(lst);
}
#define MQTT_RTLM_LOG(_sql) (assert((_sql)), mqtt_rtlm_log("Error:: %s(%d) SQL #%d - %s", \
__func__, __LINE__, \
sqlite3_errcode((_sql)), sqlite3_errmsg((_sql))))
/* library pre-loaded actions */
void
_init()
{
sqlite3_initialize();
}
void
_fini()
{
sqlite3_shutdown();
}
/*
* mqtt_rtlm_open() Open database connection
*
* @cfg = loaded config
* return: NULL error or SQL handle
*/
sqlite3 *
mqtt_rtlm_open(cfg_root_t *cfg)
{
sqlite3 *sql = NULL;
const char *str = NULL;
if (!cfg)
return NULL;
str = (const char*) cfg_getAttribute(cfg, "mqtt_acc", "name");
if (!str) {
mqtt_rtlm_log("Error:: Unknown database name ...\n");
return NULL;
}
if (sqlite3_open_v2(str, &sql, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL)) {
MQTT_RTLM_LOG(sql);
sqlite3_close(sql);
return NULL;
}
if (sqlite3_exec(sql, sql_schema, NULL, NULL, NULL)) {
MQTT_RTLM_LOG(sql);
sqlite3_close(sql);
return NULL;
}
return sql;
}
/*
* mqtt_rtlm_close() Close database connection
*
* @sql = SQL handle
* return: none
*/
void
mqtt_rtlm_close(sqlite3 *sql)
{
sqlite3_close(sql);
}
/*
* mqtt_rtlm_login() Verify login account
*
* @cfg = loaded config
* @sql = SQL handle
* @user = username
* @pass = password
* return: -1 error, 0 ALLOW and 1 REJECT
*/
int
mqtt_rtlm_login(cfg_root_t *cfg, sqlite3 *sql, const char *user, const char *pass)
{
/* insert into Users values (NULL, "", "", 1, strftime('%s','now')); */
int ret = 0;
sqlite3_stmt *stmt;
char *str, szStmt[BUFSIZ] = { 0 };
if (!sql)
return -1;
str = (char*) cfg_getAttribute(cfg, "mqtt_acc", "tbl_users");
if (!str) {
mqtt_rtlm_log("Error:: not found users table name");
return -1;
}
snprintf(szStmt, sizeof szStmt, "SELECT DISTINCT Username, Password, Access FROM %s "
"WHERE Username = '%s' AND Password = '%s' AND Access > 0;", str, user, pass);
if (sqlite3_prepare_v2(sql, szStmt, strlen(szStmt), &stmt, NULL)) {
MQTT_RTLM_LOG(sql);
return -1;
}
while (sqlite3_step(stmt) == SQLITE_ROW) {
if (sqlite3_data_count(stmt) < 1)
ret = 0;
else
ret = 1;
break;
}
sqlite3_finalize(stmt);
return ret;
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>