diff --git a/libretrodb/rarchdb.c b/libretrodb/rarchdb.c index 2c756167ab..2e0dc11c5c 100644 --- a/libretrodb/rarchdb.c +++ b/libretrodb/rarchdb.c @@ -297,7 +297,16 @@ int rarchdb_find_entry( return rv; } -int rarchdb_cursor_reset(struct rarchdb_cursor * cursor) { +/** + * rarchdb_cursor_reset: + * @cursor : Handle to database cursor. + * + * Resets cursor. + * + * Returns: ???. + **/ +int rarchdb_cursor_reset(struct rarchdb_cursor * cursor) +{ cursor->eof = 0; return lseek( cursor->fd, @@ -333,41 +342,58 @@ retry: return 0; } -void rarchdb_cursor_close(struct rarchdb_cursor * cursor) { +/** + * rarchdb_cursor_close: + * @cursor : Handle to database cursor. + * + * Closes cursor and frees up allocated memory. + **/ +void rarchdb_cursor_close(struct rarchdb_cursor * cursor) +{ close(cursor->fd); cursor->is_valid = 0; cursor->fd = -1; cursor->eof = 1; cursor->db = NULL; - if (cursor->query) { + if (cursor->query) rarchdb_query_free(cursor->query); - } cursor->query = NULL; } +/** + * rarchdb_cursor_open: + * @db : Handle to database. + * @cursor : Handle to database cursor. + * @q : Query to execute. + * + * Opens cursor to database based on query @q. + * + * Returns: 0 if successful, otherwise negative. + **/ int rarchdb_cursor_open( struct rarchdb * db, struct rarchdb_cursor * cursor, rarchdb_query * q -) { +) +{ cursor->fd = dup(db->fd); - if (cursor->fd == -1) { + + if (cursor->fd == -1) return -errno; - } + cursor->db = db; cursor->is_valid = 1; rarchdb_cursor_reset(cursor); cursor->query = q; - if (q) { + + if (q) rarchdb_query_inc_ref(q); - } + return 0; } -static int node_iter( - void * value, - void * ctx -){ +static int node_iter(void * value, void * ctx) +{ struct node_iter_ctx * nictx = (struct node_iter_ctx *)ctx; if (write(nictx->db->fd, value, nictx->idx->key_size + sizeof(uint64_t)) > 0) @@ -376,7 +402,8 @@ static int node_iter( return -1; } -static uint64_t rarchdb_tell(struct rarchdb * db) { +static uint64_t rarchdb_tell(struct rarchdb * db) +{ return lseek(db->fd, 0, SEEK_CUR); } diff --git a/libretrodb/rarchdb.h b/libretrodb/rarchdb.h index 02622831dd..021634fdfb 100644 --- a/libretrodb/rarchdb.h +++ b/libretrodb/rarchdb.h @@ -11,14 +11,16 @@ typedef void rarchdb_query; -struct rarchdb { +struct rarchdb +{ int fd; uint64_t root; uint64_t count; uint64_t first_index_offset; }; -struct rarchdb_cursor { +struct rarchdb_cursor +{ int is_valid; int fd; int eof; @@ -38,6 +40,7 @@ int rarchdb_create( ); void rarchdb_close(struct rarchdb * db); + int rarchdb_open( const char * path, struct rarchdb * db @@ -55,14 +58,38 @@ int rarchdb_find_entry( struct rmsgpack_dom_value * out ); +/** + * rarchdb_cursor_open: + * @db : Handle to database. + * @cursor : Handle to database cursor. + * @q : Query to execute. + * + * Opens cursor to database based on query @q. + * + * Returns: 0 if successful, otherwise negative. + **/ int rarchdb_cursor_open( struct rarchdb * db, struct rarchdb_cursor * cursor, rarchdb_query * query ); +/** + * rarchdb_cursor_reset: + * @cursor : Handle to database cursor. + * + * Resets cursor. + * + * Returns: ???. + **/ int rarchdb_cursor_reset(struct rarchdb_cursor * cursor); +/** + * rarchdb_cursor_close: + * @cursor : Handle to database cursor. + * + * Closes cursor and frees up allocated memory. + **/ void rarchdb_cursor_close(struct rarchdb_cursor * cursor); rarchdb_query * rarchdb_query_compile( diff --git a/menu/drivers_display/shared.h b/menu/drivers_display/shared.h index 4880526daa..d8cf6197c7 100644 --- a/menu/drivers_display/shared.h +++ b/menu/drivers_display/shared.h @@ -26,6 +26,8 @@ static void get_title(const char *label, const char *dir, snprintf(title, sizeof_title, "CORE SELECTION %s", dir); if (!strcmp(label, "core_manager_list")) snprintf(title, sizeof_title, "CORE MANAGER %s", dir); + if (!strcmp(label, "database_manager_list")) + snprintf(title, sizeof_title, "DATABASE SELECTION %s", dir); else if (!strcmp(label, "deferred_core_list")) snprintf(title, sizeof_title, "DETECTED CORES %s", dir); else if (!strcmp(label, "configurations")) diff --git a/menu/menu.h b/menu/menu.h index 7e4f0c94b2..5597264b6b 100644 --- a/menu/menu.h +++ b/menu/menu.h @@ -78,6 +78,7 @@ typedef enum MENU_FILE_REMAP, MENU_FILE_DOWNLOAD_CORE, MENU_FILE_DOWNLOAD_CORE_INFO, + MENU_FILE_RDB, MENU_SETTINGS, MENU_SETTING_DRIVER, MENU_SETTING_ACTION, diff --git a/menu/menu_entries_cbs.c b/menu/menu_entries_cbs.c index c46d293af2..c5b65cd367 100644 --- a/menu/menu_entries_cbs.c +++ b/menu/menu_entries_cbs.c @@ -2346,6 +2346,13 @@ static int generic_deferred_push(void *data, void *userdata, return 0; } +static int deferred_push_database_manager_list(void *data, void *userdata, + const char *path, const char *label, unsigned type) +{ + return generic_deferred_push(data, userdata, g_settings.content_database, label, type, + MENU_FILE_RDB, "rdb"); +} + static int deferred_push_core_list(void *data, void *userdata, const char *path, const char *label, unsigned type) { @@ -2558,6 +2565,8 @@ static int menu_entries_cbs_init_bind_ok_first(menu_file_list_cbs_t *cbs, break; case MENU_FILE_DOWNLOAD_CORE_INFO: break; + case MENU_FILE_RDB: + break; case MENU_FILE_FONT: case MENU_FILE_OVERLAY: case MENU_FILE_AUDIOFILTER: @@ -2708,6 +2717,7 @@ static void menu_entries_cbs_init_bind_ok(menu_file_list_cbs_t *cbs, cbs->action_ok = action_ok_push_content_list; else if (!strcmp(label, "history_list") || !strcmp(label, "core_manager_list") || + !strcmp(label, "database_manager_list") || (setting && setting->browser_selection_type == ST_DIR) ) cbs->action_ok = action_ok_push_generic_list; @@ -2809,6 +2819,8 @@ static void menu_entries_cbs_init_bind_deferred_push(menu_file_list_cbs_t *cbs, cbs->action_deferred_push = deferred_push_core_manager_list; else if (!strcmp(label, "history_list")) cbs->action_deferred_push = deferred_push_history_list; + else if (!strcmp(label, "database_manager_list")) + cbs->action_deferred_push = deferred_push_database_manager_list; else if (!strcmp(label, "cheat_file_load")) cbs->action_deferred_push = deferred_push_cheat_file_load; else if (!strcmp(label, "remap_file_load")) diff --git a/settings_data.c b/settings_data.c index 61a5dc69de..f33ffb1857 100644 --- a/settings_data.c +++ b/settings_data.c @@ -3330,7 +3330,7 @@ static bool setting_data_append_list_main_menu_options( #if defined(HAVE_DYNAMIC) || defined(HAVE_LIBRETRO_MANAGEMENT) CONFIG_ACTION( "core_list", - "Core", + "Core Selection", group_info.name, subgroup_info.name); (*list)[list_info->index - 1].size = sizeof(g_settings.libretro); @@ -3353,6 +3353,12 @@ static bool setting_data_append_list_main_menu_options( subgroup_info.name); #endif + CONFIG_ACTION( + "database_manager_list", + "Database Manager", + group_info.name, + subgroup_info.name); + if (g_settings.history_list_enable) { CONFIG_ACTION(