static int task_database_iterate_serial_lookup( database_state_handle_t *db_state, database_info_handle_t *db, const char *name) { if (!db_state->list || (unsigned)db_state->list_index == (unsigned)db_state->list->size) return database_info_list_iterate_end_no_match(db_state); if (db_state->entry_index == 0) { char query[50]; char *serial_buf = bin_to_hex_alloc((uint8_t*)db_state->serial, 10 * sizeof(uint8_t)); if (!serial_buf) return 1; query[0] = '\0'; snprintf(query, sizeof(query), "{'serial': b'%s'}", serial_buf); database_info_list_iterate_new(db_state, query); free(serial_buf); } if (db_state->info) { database_info_t *db_info_entry = &db_state->info->list[ db_state->entry_index]; if (db_info_entry && db_info_entry->serial) { #if 0 RARCH_LOG("serial: %s , entry serial: %s (%s).\n", db_state->serial, db_info_entry->serial, db_info_entry->name); #endif if (string_is_equal(db_state->serial, db_info_entry->serial)) return database_info_list_iterate_found_match(db_state, db, NULL); } } db_state->entry_index++; if (db_state->info) { if (db_state->entry_index >= db_state->info->count) return database_info_list_iterate_next(db_state); } /* If we haven't reached the end of the database list yet, * continue iterating. */ if (db_state->list_index < db_state->list->size) return 1; database_info_list_free(db_state->info); free(db_state->info); return 0; }
static int database_cursor_iterate(libretrodb_cursor_t *cur, database_info_t *db_info) { unsigned i; struct rmsgpack_dom_value item; const char* str = NULL; if (libretrodb_cursor_read_item(cur, &item) != 0) return -1; if (item.type != RDT_MAP) { rmsgpack_dom_value_free(&item); return 1; } db_info->analog_supported = -1; db_info->rumble_supported = -1; db_info->coop_supported = -1; for (i = 0; i < item.val.map.len; i++) { struct rmsgpack_dom_value *key = &item.val.map.items[i].key; struct rmsgpack_dom_value *val = &item.val.map.items[i].value; const char *val_string = NULL; if (!key || !val) continue; val_string = val->val.string.buff; str = key->val.string.buff; if (string_is_equal(str, "publisher")) { if (!string_is_empty(val_string)) db_info->publisher = strdup(val_string); } else if (string_is_equal(str, "developer")) { if (!string_is_empty(val_string)) db_info->developer = string_split(val_string, "|"); } else if (string_is_equal(str, "serial")) { if (!string_is_empty(val_string)) db_info->serial = strdup(val_string); } else if (string_is_equal(str, "rom_name")) { if (!string_is_empty(val_string)) db_info->rom_name = strdup(val_string); } else if (string_is_equal(str, "name")) { if (!string_is_empty(val_string)) db_info->name = strdup(val_string); } else if (string_is_equal(str, "description")) { if (!string_is_empty(val_string)) db_info->description = strdup(val_string); } else if (string_is_equal(str, "genre")) { if (!string_is_empty(val_string)) db_info->genre = strdup(val_string); } else if (string_is_equal(str, "origin")) { if (!string_is_empty(val_string)) db_info->origin = strdup(val_string); } else if (string_is_equal(str, "franchise")) { if (!string_is_empty(val_string)) db_info->franchise = strdup(val_string); } else if (string_is_equal(str, "bbfc_rating")) { if (!string_is_empty(val_string)) db_info->bbfc_rating = strdup(val_string); } else if (string_is_equal(str, "esrb_rating")) { if (!string_is_empty(val_string)) db_info->esrb_rating = strdup(val_string); } else if (string_is_equal(str, "elspa_rating")) { if (!string_is_empty(val_string)) db_info->elspa_rating = strdup(val_string); } else if (string_is_equal(str, "cero_rating")) { if (!string_is_empty(val_string)) db_info->cero_rating = strdup(val_string); } else if (string_is_equal(str, "pegi_rating")) { if (!string_is_empty(val_string)) db_info->pegi_rating = strdup(val_string); } else if (string_is_equal(str, "enhancement_hw")) { if (!string_is_empty(val_string)) db_info->enhancement_hw = strdup(val_string); } else if (string_is_equal(str, "edge_review")) { if (!string_is_empty(val_string)) db_info->edge_magazine_review = strdup(val_string); } else if (string_is_equal(str, "edge_rating")) db_info->edge_magazine_rating = (unsigned)val->val.uint_; else if (string_is_equal(str, "edge_issue")) db_info->edge_magazine_issue = (unsigned)val->val.uint_; else if (string_is_equal(str, "famitsu_rating")) db_info->famitsu_magazine_rating = (unsigned)val->val.uint_; else if (string_is_equal(str, "tgdb_rating")) db_info->tgdb_rating = (unsigned)val->val.uint_; else if (string_is_equal(str, "users")) db_info->max_users = (unsigned)val->val.uint_; else if (string_is_equal(str, "releasemonth")) db_info->releasemonth = (unsigned)val->val.uint_; else if (string_is_equal(str, "releaseyear")) db_info->releaseyear = (unsigned)val->val.uint_; else if (string_is_equal(str, "rumble")) db_info->rumble_supported = (int)val->val.uint_; else if (string_is_equal(str, "coop")) db_info->coop_supported = (int)val->val.uint_; else if (string_is_equal(str, "analog")) db_info->analog_supported = (int)val->val.uint_; else if (string_is_equal(str, "size")) db_info->size = (unsigned)val->val.uint_; else if (string_is_equal(str, "crc")) db_info->crc32 = swap_if_little32( *(uint32_t*)val->val.binary.buff); else if (string_is_equal(str, "sha1")) db_info->sha1 = bin_to_hex_alloc( (uint8_t*)val->val.binary.buff, val->val.binary.len); else if (string_is_equal(str, "md5")) db_info->md5 = bin_to_hex_alloc( (uint8_t*)val->val.binary.buff, val->val.binary.len); else { RARCH_LOG("Unknown key: %s\n", str); } } rmsgpack_dom_value_free(&item); return 0; }
static int database_cursor_iterate(libretrodb_cursor_t *cur, database_info_t *db_info) { unsigned i; struct rmsgpack_dom_value item; const char* str = NULL; if (libretrodb_cursor_read_item(cur, &item) != 0) return -1; if (item.type != RDT_MAP) { rmsgpack_dom_value_free(&item); return 1; } db_info->analog_supported = -1; db_info->rumble_supported = -1; db_info->coop_supported = -1; for (i = 0; i < item.val.map.len; i++) { uint32_t value = 0; struct rmsgpack_dom_value *key = &item.val.map.items[i].key; struct rmsgpack_dom_value *val = &item.val.map.items[i].value; if (!key || !val) continue; str = key->val.string.buff; value = msg_hash_calculate(str); switch (value) { case DB_CURSOR_SERIAL: db_info->serial = strdup(val->val.string.buff); break; case DB_CURSOR_ROM_NAME: db_info->rom_name = strdup(val->val.string.buff); break; case DB_CURSOR_NAME: db_info->name = strdup(val->val.string.buff); break; case DB_CURSOR_DESCRIPTION: db_info->description = strdup(val->val.string.buff); break; case DB_CURSOR_GENRE: db_info->genre = strdup(val->val.string.buff); break; case DB_CURSOR_PUBLISHER: db_info->publisher = strdup(val->val.string.buff); break; case DB_CURSOR_DEVELOPER: db_info->developer = string_split(val->val.string.buff, "|"); break; case DB_CURSOR_ORIGIN: db_info->origin = strdup(val->val.string.buff); break; case DB_CURSOR_FRANCHISE: db_info->franchise = strdup(val->val.string.buff); break; case DB_CURSOR_BBFC_RATING: db_info->bbfc_rating = strdup(val->val.string.buff); break; case DB_CURSOR_ESRB_RATING: db_info->esrb_rating = strdup(val->val.string.buff); break; case DB_CURSOR_ELSPA_RATING: db_info->elspa_rating = strdup(val->val.string.buff); break; case DB_CURSOR_CERO_RATING: db_info->cero_rating = strdup(val->val.string.buff); break; case DB_CURSOR_PEGI_RATING: db_info->pegi_rating = strdup(val->val.string.buff); break; case DB_CURSOR_ENHANCEMENT_HW: db_info->enhancement_hw = strdup(val->val.string.buff); break; case DB_CURSOR_EDGE_MAGAZINE_REVIEW: db_info->edge_magazine_review = strdup(val->val.string.buff); break; case DB_CURSOR_EDGE_MAGAZINE_RATING: db_info->edge_magazine_rating = val->val.uint_; break; case DB_CURSOR_EDGE_MAGAZINE_ISSUE: db_info->edge_magazine_issue = val->val.uint_; break; case DB_CURSOR_FAMITSU_MAGAZINE_RATING: db_info->famitsu_magazine_rating = val->val.uint_; break; case DB_CURSOR_TGDB_RATING: db_info->tgdb_rating = val->val.uint_; break; case DB_CURSOR_MAX_USERS: db_info->max_users = val->val.uint_; break; case DB_CURSOR_RELEASEDATE_MONTH: db_info->releasemonth = val->val.uint_; break; case DB_CURSOR_RELEASEDATE_YEAR: db_info->releaseyear = val->val.uint_; break; case DB_CURSOR_RUMBLE_SUPPORTED: db_info->rumble_supported = val->val.uint_; break; case DB_CURSOR_COOP_SUPPORTED: db_info->coop_supported = val->val.uint_; break; case DB_CURSOR_ANALOG_SUPPORTED: db_info->analog_supported = val->val.uint_; break; case DB_CURSOR_SIZE: db_info->size = val->val.uint_; break; case DB_CURSOR_CHECKSUM_CRC32: db_info->crc32 = swap_if_little32(*(uint32_t*)val->val.binary.buff); break; case DB_CURSOR_CHECKSUM_SHA1: db_info->sha1 = bin_to_hex_alloc((uint8_t*)val->val.binary.buff, val->val.binary.len); break; case DB_CURSOR_CHECKSUM_MD5: db_info->md5 = bin_to_hex_alloc((uint8_t*)val->val.binary.buff, val->val.binary.len); break; default: RARCH_LOG("Unknown key: %s\n", str); break; } } rmsgpack_dom_value_free(&item); return 0; }