mirror of
https://github.com/libretro/RetroArch
synced 2025-01-13 06:43:07 +00:00
Graceful fallback to readonly mode if RDB can't be opened readwrite (#15569)
* Graceful fallback to readonly mode if RDB can't be opened readwrite * let RA open db readonly
This commit is contained in:
parent
d0d1321ac1
commit
679083a08b
@ -717,7 +717,7 @@ static int database_cursor_open(libretrodb_t *db,
|
||||
const char *error = NULL;
|
||||
libretrodb_query_t *q = NULL;
|
||||
|
||||
if ((libretrodb_open(path, db)) != 0)
|
||||
if ((libretrodb_open(path, db, false)) != 0)
|
||||
return -1;
|
||||
|
||||
if (query)
|
||||
|
@ -46,45 +46,46 @@
|
||||
|
||||
struct node_iter_ctx
|
||||
{
|
||||
libretrodb_t *db;
|
||||
libretrodb_index_t *idx;
|
||||
libretrodb_t *db;
|
||||
libretrodb_index_t *idx;
|
||||
};
|
||||
|
||||
struct libretrodb
|
||||
{
|
||||
RFILE *fd;
|
||||
RFILE *fd;
|
||||
char *path;
|
||||
uint64_t root;
|
||||
uint64_t count;
|
||||
uint64_t first_index_offset;
|
||||
bool can_write;
|
||||
uint64_t root;
|
||||
uint64_t count;
|
||||
uint64_t first_index_offset;
|
||||
};
|
||||
|
||||
struct libretrodb_index
|
||||
{
|
||||
char name[50];
|
||||
uint64_t key_size;
|
||||
uint64_t next;
|
||||
uint64_t count;
|
||||
char name[50];
|
||||
uint64_t key_size;
|
||||
uint64_t next;
|
||||
uint64_t count;
|
||||
};
|
||||
|
||||
typedef struct libretrodb_metadata
|
||||
{
|
||||
uint64_t count;
|
||||
uint64_t count;
|
||||
} libretrodb_metadata_t;
|
||||
|
||||
typedef struct libretrodb_header
|
||||
{
|
||||
char magic_number[sizeof(MAGIC_NUMBER)];
|
||||
uint64_t metadata_offset;
|
||||
char magic_number[sizeof(MAGIC_NUMBER)];
|
||||
uint64_t metadata_offset;
|
||||
} libretrodb_header_t;
|
||||
|
||||
struct libretrodb_cursor
|
||||
{
|
||||
RFILE *fd;
|
||||
libretrodb_query_t *query;
|
||||
libretrodb_t *db;
|
||||
int is_valid;
|
||||
int eof;
|
||||
libretrodb_query_t *query;
|
||||
libretrodb_t *db;
|
||||
int is_valid;
|
||||
int eof;
|
||||
};
|
||||
|
||||
static int libretrodb_validate_document(const struct rmsgpack_dom_value *doc)
|
||||
@ -180,16 +181,16 @@ void libretrodb_close(libretrodb_t *db)
|
||||
db->fd = NULL;
|
||||
}
|
||||
|
||||
int libretrodb_open(const char *path, libretrodb_t *db)
|
||||
int libretrodb_open(const char *path, libretrodb_t *db, bool write)
|
||||
{
|
||||
libretrodb_header_t header;
|
||||
libretrodb_metadata_t md;
|
||||
RFILE *fd = filestream_open(path,
|
||||
RETRO_VFS_FILE_ACCESS_READ_WRITE | RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING,
|
||||
write ? RETRO_VFS_FILE_ACCESS_READ_WRITE | RETRO_VFS_FILE_ACCESS_UPDATE_EXISTING : RETRO_VFS_FILE_ACCESS_READ,
|
||||
RETRO_VFS_FILE_ACCESS_HINT_NONE);
|
||||
|
||||
db->can_write = write;
|
||||
if (!fd)
|
||||
return -1;
|
||||
return -1;
|
||||
|
||||
if (!string_is_empty(db->path))
|
||||
free(db->path);
|
||||
@ -456,9 +457,14 @@ int libretrodb_create_index(libretrodb_t *db,
|
||||
uint64_t item_count = 0;
|
||||
int rval = -1;
|
||||
|
||||
if (libretrodb_find_index(db, name, &idx) >= 0) {
|
||||
if (libretrodb_find_index(db, name, &idx) >= 0)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if (!db->can_write)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
tree = bintree_new(node_compare, &field_size);
|
||||
|
||||
|
@ -49,7 +49,7 @@ int libretrodb_create(RFILE *fd, libretrodb_value_provider value_provider, void
|
||||
|
||||
void libretrodb_close(libretrodb_t *db);
|
||||
|
||||
int libretrodb_open(const char *path, libretrodb_t *db);
|
||||
int libretrodb_open(const char *path, libretrodb_t *db, bool write);
|
||||
|
||||
int libretrodb_create_index(libretrodb_t *db, const char *name,
|
||||
const char *field_name);
|
||||
|
@ -60,7 +60,7 @@ int main(int argc, char ** argv)
|
||||
if (!db || !cur)
|
||||
goto error;
|
||||
|
||||
if ((rv = libretrodb_open(path, db)) != 0)
|
||||
if ((rv = libretrodb_open(path, db, true)) != 0)
|
||||
{
|
||||
printf("Could not open db file '%s'\n", path);
|
||||
goto error;
|
||||
|
@ -583,7 +583,7 @@ explore_state_t *menu_explore_build_list(const char *directory_playlist,
|
||||
ext_path[3] = 'b';
|
||||
}
|
||||
|
||||
if (libretrodb_open(tmp, newrdb.handle) != 0)
|
||||
if (libretrodb_open(tmp, newrdb.handle, false) != 0)
|
||||
{
|
||||
/* Invalid RDB file */
|
||||
libretrodb_free(newrdb.handle);
|
||||
|
Loading…
Reference in New Issue
Block a user