Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}