diff --git a/database_info.c b/database_info.c index 564aeeac1f..7a462801ce 100644 --- a/database_info.c +++ b/database_info.c @@ -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) diff --git a/libretro-db/libretrodb.c b/libretro-db/libretrodb.c index 3113959d37..43122c42e3 100644 --- a/libretro-db/libretrodb.c +++ b/libretro-db/libretrodb.c @@ -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); diff --git a/libretro-db/libretrodb.h b/libretro-db/libretrodb.h index 5b8775e33a..a2c8619f8c 100644 --- a/libretro-db/libretrodb.h +++ b/libretro-db/libretrodb.h @@ -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); diff --git a/libretro-db/libretrodb_tool.c b/libretro-db/libretrodb_tool.c index 95738065eb..a90d66d4a9 100644 --- a/libretro-db/libretrodb_tool.c +++ b/libretro-db/libretrodb_tool.c @@ -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; diff --git a/menu/menu_explore.c b/menu/menu_explore.c index 507cb01ee7..07da868369 100644 --- a/menu/menu_explore.c +++ b/menu/menu_explore.c @@ -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);