From 6c8b19f4fa7e27fab4328d79aca2a5be78b5f856 Mon Sep 17 00:00:00 2001 From: Twinaphex Date: Sat, 24 Jan 2015 08:17:04 +0100 Subject: [PATCH] (Menu database) Refactor code in menu_database.c and add 'query' function --- libretrodb/libretrodb_tool.c | 2 +- menu/menu_database.c | 87 +++++++++++++++++++++++++----------- menu/menu_database.h | 3 ++ 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/libretrodb/libretrodb_tool.c b/libretrodb/libretrodb_tool.c index 442ccb6240..8eaf9f96e5 100644 --- a/libretrodb/libretrodb_tool.c +++ b/libretrodb/libretrodb_tool.c @@ -100,7 +100,7 @@ int main(int argc, char ** argv) } else { - printf("Unkonwn command %s\n", argv[2]); + printf("Unknown command %s\n", argv[2]); return 1; } libretrodb_close(&db); diff --git a/menu/menu_database.c b/menu/menu_database.c index 37f25a9047..93016d70d6 100644 --- a/menu/menu_database.c +++ b/menu/menu_database.c @@ -18,38 +18,75 @@ #include "menu_list.h" #include +#ifdef HAVE_LIBRETRODB +static int menu_database_fetch_from_query(libretrodb_t *db, + libretrodb_cursor_t *cur, libretrodb_query_t *query, + file_list_t *list) +{ + int i; + struct rmsgpack_dom_value item; + + if ((libretrodb_cursor_open(db, cur, query)) != 0) + return -1; + + while (libretrodb_cursor_read_item(cur, &item) == 0) + { + if (item.type != RDT_MAP) + continue; + + for (i = 0; i < item.map.len; i++) + { + struct rmsgpack_dom_value *key = &item.map.items[i].key; + struct rmsgpack_dom_value *val = &item.map.items[i].value; + + if (!strcmp(key->string.buff, "description")) + { + menu_list_push(list, val->string.buff, "", + MENU_FILE_RDB_ENTRY, 0); + break; + } + } + } + + return 0; +} +#endif + +int menu_database_populate_query(file_list_t *list, const char *path, + const char *query) +{ + libretrodb_t db; + libretrodb_cursor_t cur; + libretrodb_query_t *q; + const char *error = NULL; + + if ((libretrodb_open(path, &db)) != 0) + return -1; + + q = libretrodb_query_compile(&db, query, strlen(query), &error); + + if (error) + return -1; + + if ((menu_database_fetch_from_query(&db, &cur, q, list)) != 0) + return -1; + + libretrodb_cursor_close(&cur); + libretrodb_close(&db); + return 0; +} + int menu_database_populate_list(file_list_t *list, const char *path) { #ifdef HAVE_LIBRETRODB - int rv = 1, i; libretrodb_t db; libretrodb_cursor_t cur; - struct rmsgpack_dom_value item; - if ((rv = libretrodb_open(path, &db)) != 0) + if ((libretrodb_open(path, &db)) != 0) return -1; - - if ((rv = libretrodb_cursor_open(&db, &cur, NULL)) != 0) - return -1; - - while (libretrodb_cursor_read_item(&cur, &item) == 0) - { - if (item.type != RDT_MAP) - continue; - - for (i = 0; i < item.map.len; i++) - { - struct rmsgpack_dom_value *key = &item.map.items[i].key; - struct rmsgpack_dom_value *val = &item.map.items[i].value; - - if (!strcmp(key->string.buff, "description")) - { - menu_list_push(list, val->string.buff, "", - MENU_FILE_RDB_ENTRY, 0); - break; - } - } - } + + if ((menu_database_fetch_from_query(&db, &cur, NULL, list)) != 0) + return -1; libretrodb_cursor_close(&cur); libretrodb_close(&db); diff --git a/menu/menu_database.h b/menu/menu_database.h index 8103313c6a..b23dd3c6af 100644 --- a/menu/menu_database.h +++ b/menu/menu_database.h @@ -27,6 +27,9 @@ extern "C" { #endif int menu_database_populate_list(file_list_t *list, const char *path); + +int menu_database_populate_query(file_list_t *list, const char *path, + const char *query); #ifdef __cplusplus }