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 #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 = ""; const char *exts = "";
global_t *global = global_get_ptr(); 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; return NULL;
if (global->core_info) if (global->core_info)
exts = core_info_list_get_all_extensions(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; goto error;
dbl->list_ptr = 0; db->list_ptr = 0;
dbl->status = DATABASE_RDL_ITERATE; db->status = DATABASE_STATUS_ITERATE;
db->type = type;
return dbl; return db;
error: error:
if (dbl) if (db)
free(dbl); free(db);
return NULL; 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; return;
string_list_free(dbl->list); string_list_free(db->list);
free(dbl); free(db);
rarch_main_msg_queue_push("Scanning of directory finished.\n", 1, 180, true);
} }
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]; 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; return -1;
}
name = dbl->list->elems[dbl->list_ptr].data;
if (!name)
return 0;
path_parent_dir(parent_dir); path_parent_dir(parent_dir);
@ -138,7 +137,7 @@ int database_info_write_rdl_iterate(database_info_rdl_handle_t *dbl)
return 0; return 0;
snprintf(msg, sizeof(msg), "%zu/%zu: Scanning %s...\n", 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); 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); 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; return 0;
} }

View File

@ -27,19 +27,26 @@
extern "C" { extern "C" {
#endif #endif
enum database_rdl_action_type enum database_status
{ {
DATABASE_RDL_NONE = 0, DATABASE_STATUS_NONE = 0,
DATABASE_RDL_ITERATE, DATABASE_STATUS_ITERATE,
DATABASE_RDL_FREE, DATABASE_STATUS_FREE,
};
enum database_type
{
DATABASE_TYPE_NONE = 0,
DATABASE_TYPE_RDL_WRITE,
}; };
typedef struct typedef struct
{ {
enum database_rdl_action_type status; enum database_status status;
enum database_type type;
size_t list_ptr; size_t list_ptr;
struct string_list *list; struct string_list *list;
} database_info_rdl_handle_t; } database_info_handle_t;
typedef struct typedef struct
{ {
@ -76,18 +83,20 @@ typedef struct
size_t count; size_t count;
} database_info_list_t; } 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); void database_info_list_free(database_info_list_t *list);
int database_open_cursor(libretrodb_t *db, int database_open_cursor(libretrodb_t *db,
libretrodb_cursor_t *cur, const char *query); 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 #ifdef __cplusplus
} }

View File

@ -199,7 +199,7 @@ typedef struct
content_playlist_t *db_playlist; content_playlist_t *db_playlist;
char db_playlist_file[PATH_MAX_LENGTH]; char db_playlist_file[PATH_MAX_LENGTH];
database_info_rdl_handle_t *rdl; database_info_handle_t *db;
} menu_handle_t; } menu_handle_t;
typedef struct menu_file_list_cbs 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: case MENU_ACTION_TEST:
#if 0 #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; return -1;
#endif #endif
break; break;

View File

@ -653,24 +653,21 @@ static void rarch_main_data_db_iterate(bool is_thread,
{ {
driver_t *driver = driver_get_ptr(); driver_t *driver = driver_get_ptr();
menu_handle_t *menu = menu_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; return;
switch (dbl->status) switch (db->status)
{ {
case DATABASE_RDL_NONE: case DATABASE_STATUS_NONE:
break; break;
case DATABASE_RDL_ITERATE: case DATABASE_STATUS_ITERATE:
if (dbl->list_ptr < dbl->list->size) database_info_iterate(db);
database_info_write_rdl_iterate(dbl);
else
dbl->status = DATABASE_RDL_FREE;
break; break;
case DATABASE_RDL_FREE: case DATABASE_STATUS_FREE:
database_info_write_rdl_free(dbl); database_info_free(db);
dbl = NULL; db = NULL;
break; break;
} }
} }