mirror of
https://github.com/libretro/RetroArch
synced 2025-02-19 12:41:00 +00:00
Refactor database runloop code
This commit is contained in:
parent
8e3b63e2e9
commit
bb6331874a
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user