1
0
mirror of https://github.com/libretro/RetroArch synced 2024-07-03 08:48:42 +00:00

Refactor database runloop code

This commit is contained in:
twinaphex 2015-04-14 09:27:55 +02:00
parent 8e3b63e2e9
commit bb6331874a
5 changed files with 81 additions and 51 deletions

View File

@ -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;
}

View File

@ -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
}

View File

@ -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

View File

@ -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;

View File

@ -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;
}
}