|
|
| version 1.1.2.8, 2011/11/25 15:29:30 | version 1.1.2.12, 2011/11/28 22:28:08 |
|---|---|
| Line 1 | Line 1 |
| #include "global.h" | #include "global.h" |
| extern const char sql_schema[]; | |
| /* | /* |
| * mqtt_db_log() Log database connection message | * mqtt_db_log() Log database connection message |
| * | * |
| Line 36 mqtt_rtlm_open(sl_config *cfg) | Line 39 mqtt_rtlm_open(sl_config *cfg) |
| if (!cfg) | if (!cfg) |
| return NULL; | return NULL; |
| sqlite3_config(SQLITE_CONFIG_SERIALIZED); | |
| str = (const char*) cfg_GetAttribute(cfg, CFG("mqtt_pub"), CFG("name")); | str = (const char*) cfg_GetAttribute(cfg, CFG("mqtt_pub"), CFG("name")); |
| if (!str) { | if (!str) { |
| mqtt_rtlm_log("Error:: Unknown database name ...\n"); | mqtt_rtlm_log("Error:: Unknown database name ...\n"); |
| Line 48 mqtt_rtlm_open(sl_config *cfg) | Line 53 mqtt_rtlm_open(sl_config *cfg) |
| return NULL; | return NULL; |
| } | } |
| if (sqlite3_exec(sql, sql_schema, NULL, NULL, NULL)) { | |
| MQTT_RTLM_LOG(sql); | |
| sqlite3_close(sql); | |
| return NULL; | |
| } | |
| return sql; | return sql; |
| } | } |
| Line 294 mqtt_rtlm_delete_topic(sl_config *cfg, sqlite3 *sql, c | Line 304 mqtt_rtlm_delete_topic(sl_config *cfg, sqlite3 *sql, c |
| sqlite3_finalize(stmt); | sqlite3_finalize(stmt); |
| return ret; | return ret; |
| } | |
| /* | |
| * mqtt_rtlm_read_topic() Get topic | |
| * | |
| * @cfg = loaded config | |
| * @sql = SQL handle | |
| * @topic = topic | |
| * @retain = retain 0 get only dynamic, >0 get only retained and -1 no matter | |
| * return: NULL error or not found and !=NULL allocated subscribe topics | |
| */ | |
| mqtt_subscr_t * | |
| mqtt_rtlm_read_topic(sl_config *cfg, sqlite3 *sql, const char *topic, char retain) | |
| { | |
| int rowz = 0; | |
| char *str, szStr[STRSIZ], szStmt[BUFSIZ] = { 0 }; | |
| sqlite3_stmt *stmt; | |
| register int j; | |
| mqtt_subscr_t *s = NULL; | |
| if (!cfg || !sql || !topic) | |
| return NULL; | |
| switch (retain) { | |
| case -1: | |
| memset(szStr, 0, sizeof szStr); | |
| break; | |
| case 0: | |
| snprintf(szStr, sizeof szStr, "AND Retain = 0"); | |
| break; | |
| default: | |
| snprintf(szStr, sizeof szStr, "AND Retain > 0"); | |
| break; | |
| } | |
| str = (char*) cfg_GetAttribute(cfg, CFG("mqtt_pub"), CFG("tbl_topics")); | |
| if (!str) { | |
| mqtt_rtlm_log("Error:: not found topics table name"); | |
| return NULL; | |
| } | |
| snprintf(szStmt, sizeof szStmt, "SELECT Retain, Topic, Value FROM %s WHERE Topic LIKE '%s' %s;", | |
| str, topic, szStr); | |
| if (sqlite3_prepare_v2(sql, szStmt, strlen(szStmt), &stmt, NULL)) { | |
| MQTT_RTLM_LOG(sql); | |
| return NULL; | |
| } | |
| /* calculate count of rows and allocate subscribe items */ | |
| while (sqlite3_step(stmt) == SQLITE_ROW) | |
| rowz++; | |
| if (!(s = malloc((rowz + 1) * sizeof(mqtt_subscr_t)))) { | |
| mqtt_rtlm_log("Error:: System #%d - %s", errno, strerror(errno)); | |
| goto end; | |
| } else | |
| memset(s, 0, (rowz + 1) * sizeof(mqtt_subscr_t)); | |
| sqlite3_reset(stmt); | |
| /* fill with data */ | |
| for (j = 0; j < rowz && sqlite3_step(stmt) == SQLITE_ROW; j++) { | |
| s[j].sub_ret = (char) sqlite3_column_int(stmt, 0); | |
| s[j].sub_topic._base = strdup(sqlite3_column_text(stmt, 1)); | |
| s[j].sub_topic._size = strlen(s[j].sub_topic._base); | |
| s[j].sub_value._base = strdup(sqlite3_column_text(stmt, 2)); | |
| s[j].sub_value._size = strlen(s[j].sub_value._base); | |
| } | |
| end: | |
| sqlite3_finalize(stmt); | |
| return s; | |
| } | } |