diff --git a/database_info.c b/database_info.c index 4f7deb51dc..92039b3b92 100644 --- a/database_info.c +++ b/database_info.c @@ -58,57 +58,56 @@ static int zlib_compare_crc32(const char *name, const char *valid_exts, } #endif -database_info_rdl_handle_t *database_info_write_rdl_init(const char *dir) +database_info_handle_t *database_info_init(const char *dir, enum database_type type) { const char *exts = ""; global_t *global = global_get_ptr(); - database_info_rdl_handle_t *dbl = (database_info_rdl_handle_t*)calloc(1, sizeof(*dbl)); + database_info_handle_t *db = (database_info_handle_t*)calloc(1, sizeof(*db)); - if (!dbl) + if (!db) return NULL; if (global->core_info) exts = core_info_list_get_all_extensions(global->core_info); - dbl->list = dir_list_new(dir, exts, false); + db->list = dir_list_new(dir, exts, false); - if (!dbl->list) + if (!db->list) goto error; - dbl->list_ptr = 0; - dbl->status = DATABASE_RDL_ITERATE; + db->list_ptr = 0; + db->status = DATABASE_STATUS_ITERATE; + db->type = type; - return dbl; + return db; error: - if (dbl) - free(dbl); + if (db) + free(db); return NULL; } -void database_info_write_rdl_free(database_info_rdl_handle_t *dbl) +void database_info_free(database_info_handle_t *db) { - if (!dbl) + if (!db) return; - string_list_free(dbl->list); - free(dbl); - - rarch_main_msg_queue_push("Scanning of directory finished.\n", 1, 180, true); + string_list_free(db->list); + free(db); } -int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl) +static int database_info_iterate_rdl_write( + database_info_handle_t *db, const char *name) { char parent_dir[PATH_MAX_LENGTH]; - const char *name = NULL; + bool to_continue = (db->list_ptr < db->list->size); - if (!dbl || !dbl->list) + if (!to_continue) + { + rarch_main_msg_queue_push("Scanning of directory finished.\n", 1, 180, true); + db->status = DATABASE_STATUS_FREE; return -1; - - name = dbl->list->elems[dbl->list_ptr].data; - - if (!name) - return 0; + } path_parent_dir(parent_dir); @@ -138,7 +137,7 @@ int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl) return 0; snprintf(msg, sizeof(msg), "%zu/%zu: Scanning %s...\n", - dbl->list_ptr, dbl->list->size, name); + db->list_ptr, db->list->size, name); rarch_main_msg_queue_push(msg, 1, 180, true); @@ -150,7 +149,32 @@ int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl) free(ret_buf); } - dbl->list_ptr++; + db->list_ptr++; + + return 0; +} + +int database_info_iterate(database_info_handle_t *db) +{ + const char *name = NULL; + + if (!db || !db->list) + return -1; + + name = db->list->elems[db->list_ptr].data; + + if (!name) + return 0; + + switch (db->type) + { + case DATABASE_TYPE_NONE: + break; + case DATABASE_TYPE_RDL_WRITE: + if (database_info_iterate_rdl_write(db, name) != 0) + return -1; + break; + } return 0; } diff --git a/database_info.h b/database_info.h index bfc8f1b61f..398ec4679e 100644 --- a/database_info.h +++ b/database_info.h @@ -27,19 +27,26 @@ extern "C" { #endif -enum database_rdl_action_type +enum database_status { - DATABASE_RDL_NONE = 0, - DATABASE_RDL_ITERATE, - DATABASE_RDL_FREE, + DATABASE_STATUS_NONE = 0, + DATABASE_STATUS_ITERATE, + DATABASE_STATUS_FREE, +}; + +enum database_type +{ + DATABASE_TYPE_NONE = 0, + DATABASE_TYPE_RDL_WRITE, }; typedef struct { - enum database_rdl_action_type status; + enum database_status status; + enum database_type type; size_t list_ptr; struct string_list *list; -} database_info_rdl_handle_t; +} database_info_handle_t; typedef struct { @@ -76,18 +83,20 @@ typedef struct size_t count; } database_info_list_t; -database_info_list_t *database_info_list_new(const char *rdb_path, const char *query); +database_info_list_t *database_info_list_new(const char *rdb_path, + const char *query); void database_info_list_free(database_info_list_t *list); int database_open_cursor(libretrodb_t *db, libretrodb_cursor_t *cur, const char *query); -database_info_rdl_handle_t *database_info_write_rdl_init(const char *dir); +database_info_handle_t *database_info_init(const char *dir, + enum database_type type); -void database_info_write_rdl_free(database_info_rdl_handle_t *dbl); +void database_info_free(database_info_handle_t *dbl); -int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl); +int database_info_iterate(database_info_handle_t *dbl); #ifdef __cplusplus } diff --git a/menu/menu_driver.h b/menu/menu_driver.h index f902bdb3a4..ff5ea8ba35 100644 --- a/menu/menu_driver.h +++ b/menu/menu_driver.h @@ -199,7 +199,7 @@ typedef struct content_playlist_t *db_playlist; char db_playlist_file[PATH_MAX_LENGTH]; - database_info_rdl_handle_t *rdl; + database_info_handle_t *db; } menu_handle_t; typedef struct menu_file_list_cbs diff --git a/menu/menu_entries_cbs_iterate.c b/menu/menu_entries_cbs_iterate.c index 05e5d8a98f..2bce56e227 100644 --- a/menu/menu_entries_cbs_iterate.c +++ b/menu/menu_entries_cbs_iterate.c @@ -595,9 +595,9 @@ static int action_iterate_main(const char *label, unsigned action) case MENU_ACTION_TEST: #if 0 - menu->rdl = database_info_write_rdl_init("/home/squarepusher/roms"); + menu->db = database_info_init("/home/squarepusher/roms", DATABASE_TYPE_RDL_WRITE); - if (!menu->rdl) + if (!menu->db) return -1; #endif break; diff --git a/runloop_data.c b/runloop_data.c index ba51c699d3..19c618eaef 100644 --- a/runloop_data.c +++ b/runloop_data.c @@ -653,24 +653,21 @@ static void rarch_main_data_db_iterate(bool is_thread, { driver_t *driver = driver_get_ptr(); menu_handle_t *menu = menu_driver_get_ptr(); - database_info_rdl_handle_t *dbl = menu ? menu->rdl : NULL; + database_info_handle_t *db = menu ? menu->db : NULL; - if (!dbl) + if (!db) return; - switch (dbl->status) + switch (db->status) { - case DATABASE_RDL_NONE: + case DATABASE_STATUS_NONE: break; - case DATABASE_RDL_ITERATE: - if (dbl->list_ptr < dbl->list->size) - database_info_write_rdl_iterate(dbl); - else - dbl->status = DATABASE_RDL_FREE; + case DATABASE_STATUS_ITERATE: + database_info_iterate(db); break; - case DATABASE_RDL_FREE: - database_info_write_rdl_free(dbl); - dbl = NULL; + case DATABASE_STATUS_FREE: + database_info_free(db); + db = NULL; break; } }