only scan the content databases that support the file's extension

This commit is contained in:
Brad Parker 2016-10-03 16:08:55 -04:00
parent 49e54356f4
commit fc1f2cdcf4
3 changed files with 66 additions and 6 deletions

View File

@ -688,6 +688,52 @@ size_t core_info_list_num_info_files(core_info_list_t *core_info_list)
return num; return num;
} }
bool core_info_unsupported_content_path(const char *path)
{
size_t i;
if (!core_info_curr_list)
return false;
for (i = 0; i < core_info_curr_list->count; i++)
{
const core_info_t *info = &core_info_curr_list->list[i];
if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path)))
return false;
}
return true;
}
bool core_info_database_supports_content_path(const char *database_path, const char *path)
{
size_t i;
char *database = NULL;
if (!core_info_curr_list)
return false;
database = strdup(path_basename(database_path));
path_remove_extension(database);
for (i = 0; i < core_info_curr_list->count; i++)
{
const core_info_t *info = &core_info_curr_list->list[i];
if (string_list_find_elem(info->supported_extensions_list, path_get_extension(path)))
if (string_list_find_elem(info->databases_list, database))
{
free(database);
return true;
}
}
free(database);
return false;
}
bool core_info_list_get_display_name(core_info_list_t *core_info_list, bool core_info_list_get_display_name(core_info_list_t *core_info_list,
const char *path, char *s, size_t len) const char *path, char *s, size_t len)
{ {

View File

@ -119,6 +119,10 @@ bool core_info_find(core_info_ctx_find_t *info, const char *name);
bool core_info_load(core_info_ctx_find_t *info); bool core_info_load(core_info_ctx_find_t *info);
bool core_info_database_supports_content_path(const char *database_path, const char *path);
bool core_info_unsupported_content_path(const char *path);
RETRO_END_DECLS RETRO_END_DECLS
#endif /* CORE_INFO_H_ */ #endif /* CORE_INFO_H_ */

View File

@ -23,7 +23,6 @@
#include <queues/message_queue.h> #include <queues/message_queue.h>
#include <encodings/crc32.h> #include <encodings/crc32.h>
#include <streams/file_stream.h> #include <streams/file_stream.h>
#include "tasks_internal.h" #include "tasks_internal.h"
#include "../database_info.h" #include "../database_info.h"
@ -35,6 +34,7 @@
#include "../playlist.h" #include "../playlist.h"
#include "../runloop.h" #include "../runloop.h"
#include "../verbosity.h" #include "../verbosity.h"
#include "../core_info.h"
#ifndef COLLECTION_SIZE #ifndef COLLECTION_SIZE
#define COLLECTION_SIZE 99999 #define COLLECTION_SIZE 99999
@ -206,6 +206,7 @@ static int database_info_list_iterate_new(database_state_handle_t *db_state,
const char *query) const char *query)
{ {
const char *new_database = database_info_get_current_name(db_state); const char *new_database = database_info_get_current_name(db_state);
#if 0 #if 0
RARCH_LOG("Check database [%d/%d] : %s\n", (unsigned)db_state->list_index, RARCH_LOG("Check database [%d/%d] : %s\n", (unsigned)db_state->list_index,
(unsigned)db_state->list->size, new_database); (unsigned)db_state->list->size, new_database);
@ -311,6 +312,7 @@ static int database_info_list_iterate_next(
static int task_database_iterate_crc_lookup( static int task_database_iterate_crc_lookup(
database_state_handle_t *db_state, database_state_handle_t *db_state,
database_info_handle_t *db, database_info_handle_t *db,
const char *name,
const char *archive_entry) const char *archive_entry)
{ {
@ -321,6 +323,11 @@ static int task_database_iterate_crc_lookup(
if (db_state->entry_index == 0) if (db_state->entry_index == 0)
{ {
char query[50] = {0}; char query[50] = {0};
if (!core_info_database_supports_content_path(db_state->list->elems[db_state->list_index].data, name) &&
!core_info_unsupported_content_path(name))
return database_info_list_iterate_next(db_state);
snprintf(query, sizeof(query), snprintf(query, sizeof(query),
"{crc:or(b\"%08X\",b\"%08X\")}", "{crc:or(b\"%08X\",b\"%08X\")}",
swap_if_big32(db_state->crc), swap_if_big32(db_state->archive_crc)); swap_if_big32(db_state->crc), swap_if_big32(db_state->archive_crc));
@ -362,7 +369,10 @@ static int task_database_iterate_crc_lookup(
return 1; return 1;
database_info_list_free(db_state->info); database_info_list_free(db_state->info);
free(db_state->info);
if (db_state->info)
free(db_state->info);
return 0; return 0;
} }
@ -373,7 +383,7 @@ static int task_database_iterate_playlist_archive(
#ifdef HAVE_COMPRESSION #ifdef HAVE_COMPRESSION
if (db_state->crc != 0) if (db_state->crc != 0)
return task_database_iterate_crc_lookup( return task_database_iterate_crc_lookup(
db_state, db, db_state->archive_name); db_state, db, name, db_state->archive_name);
db_state->crc = file_archive_get_file_crc32(name); db_state->crc = file_archive_get_file_crc32(name);
#endif #endif
@ -500,7 +510,7 @@ static int task_database_iterate(database_state_handle_t *db_state,
case DATABASE_TYPE_SERIAL_LOOKUP: case DATABASE_TYPE_SERIAL_LOOKUP:
return task_database_iterate_serial_lookup(db_state, db, name); return task_database_iterate_serial_lookup(db_state, db, name);
case DATABASE_TYPE_CRC_LOOKUP: case DATABASE_TYPE_CRC_LOOKUP:
return task_database_iterate_crc_lookup(db_state, db, NULL); return task_database_iterate_crc_lookup(db_state, db, name, NULL);
case DATABASE_TYPE_NONE: case DATABASE_TYPE_NONE:
default: default:
break; break;
@ -561,7 +571,7 @@ static void task_database_handler(retro_task_t *task)
task_database_iterate_start(dbinfo, name); task_database_iterate_start(dbinfo, name);
break; break;
case DATABASE_STATUS_ITERATE: case DATABASE_STATUS_ITERATE:
if (dbstate && task_database_iterate(dbstate, dbinfo) == 0) if (task_database_iterate(dbstate, dbinfo) == 0)
{ {
dbinfo->status = DATABASE_STATUS_ITERATE_NEXT; dbinfo->status = DATABASE_STATUS_ITERATE_NEXT;
dbinfo->type = DATABASE_TYPE_ITERATE; dbinfo->type = DATABASE_TYPE_ITERATE;