diff --git a/src/feature/sqlite3/no-intro.c b/src/feature/sqlite3/no-intro.c index 649364de6..076aeadaf 100644 --- a/src/feature/sqlite3/no-intro.c +++ b/src/feature/sqlite3/no-intro.c @@ -70,6 +70,7 @@ bool NoIntroDBLoadClrMamePro(struct NoIntroDB* db, struct VFile* vf) { sqlite3_stmt* gamedbTable = NULL; sqlite3_stmt* gamedbDrop = NULL; + sqlite3_stmt* gamedbSelect = NULL; sqlite3_stmt* gameTable = NULL; sqlite3_stmt* romTable = NULL; char* fieldName = NULL; @@ -89,6 +90,11 @@ bool NoIntroDBLoadClrMamePro(struct NoIntroDB* db, struct VFile* vf) { return false; } + static const char selectGamedb[] = "SELECT * FROM gamedb WHERE name = ? AND version >= ?;"; + if (sqlite3_prepare_v2(db->db, selectGamedb, -1, &gamedbSelect, NULL)) { + return false; + } + static const char insertGame[] = "INSERT INTO games (dbid, name) VALUES (?, ?);"; if (sqlite3_prepare_v2(db->db, insertGame, -1, &gameTable, NULL)) { return false; @@ -159,18 +165,24 @@ bool NoIntroDBLoadClrMamePro(struct NoIntroDB* db, struct VFile* vf) { break; case ')': if (currentDb < 0 && dbType && dbVersion) { - sqlite3_clear_bindings(gamedbDrop); - sqlite3_reset(gamedbDrop); - sqlite3_bind_text(gamedbDrop, 1, dbType, -1, SQLITE_TRANSIENT); - sqlite3_bind_text(gamedbDrop, 2, dbVersion, -1, SQLITE_TRANSIENT); - sqlite3_step(gamedbDrop); + sqlite3_clear_bindings(gamedbSelect); + sqlite3_reset(gamedbSelect); + sqlite3_bind_text(gamedbSelect, 1, dbType, -1, SQLITE_TRANSIENT); + sqlite3_bind_text(gamedbSelect, 2, dbVersion, -1, SQLITE_TRANSIENT); + if (sqlite3_step(gamedbSelect) != SQLITE_ROW) { + sqlite3_clear_bindings(gamedbDrop); + sqlite3_reset(gamedbDrop); + sqlite3_bind_text(gamedbDrop, 1, dbType, -1, SQLITE_TRANSIENT); + sqlite3_bind_text(gamedbDrop, 2, dbVersion, -1, SQLITE_TRANSIENT); + sqlite3_step(gamedbDrop); - sqlite3_clear_bindings(gamedbTable); - sqlite3_reset(gamedbTable); - sqlite3_bind_text(gamedbTable, 1, dbType, -1, SQLITE_TRANSIENT); - sqlite3_bind_text(gamedbTable, 2, dbVersion, -1, SQLITE_TRANSIENT); - if (sqlite3_step(gamedbTable) == SQLITE_DONE) { - currentDb = sqlite3_last_insert_rowid(db->db); + sqlite3_clear_bindings(gamedbTable); + sqlite3_reset(gamedbTable); + sqlite3_bind_text(gamedbTable, 1, dbType, -1, SQLITE_TRANSIENT); + sqlite3_bind_text(gamedbTable, 2, dbVersion, -1, SQLITE_TRANSIENT); + if (sqlite3_step(gamedbTable) == SQLITE_DONE) { + currentDb = sqlite3_last_insert_rowid(db->db); + } } free((void*) dbType); free((void*) dbVersion); @@ -270,6 +282,7 @@ bool NoIntroDBLoadClrMamePro(struct NoIntroDB* db, struct VFile* vf) { sqlite3_finalize(gamedbTable); sqlite3_finalize(gamedbDrop); + sqlite3_finalize(gamedbSelect); sqlite3_finalize(gameTable); sqlite3_finalize(romTable);