Перейти к публикации
  • UUID для предметов


    Electr0
    • Сделано

    В рамках обсуждения того что нужно для реализации: 

     

    Поднялся вопрос об идентификации предметов как в базе, так и на сервере одним ID.

     

    Нельзя создать отдельное поле с auto_increment параметром, в таком случае главный вопрос как это сделать?, obj_id как ид строки всегда меняется т.к. при сохранении мы удаляем предмет из базы данных и сохраняем вновь

     

    остается только вариант,  при создании предмета выдавать ему в качестве UID применять что-то похожее на стандарт UUIDv4



    Отзывы пользователей

    Рекомендованные комментарии

    в качестве UID применен UUIDv4 пример из С, посмотреть можно тут: https://onlinegdb.com/SkWPfXa5Q

    В SourcePawn аналог алгоритма сделал так:

    char szHex[17] = "0123456789abcdef", sUID[37];
    for (int i = 0; i < 36; i++)
    {
    	int r = GetRandomInt(0,15);
    	switch (i)
    	{
    		case 8,13,18,23:{ 	sUID[i] = '-'; 				}
    		case 14: 	{ 	sUID[i] = '4'; 				}
    		case 19: 	{ 	sUID[i] = szHex[r & 0x03 | 0x08]; 	}
    		default:	{ 	sUID[i] = szHex[r];			}
    	}
    }

    В самой базе буду выполнять запрос:

    UPDATE table set uid = (SELECT UUID());

    чтобы сгенерировать uuid для уже сохраненных предметов в базу данных.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    UUID предмета должен быть обновлен в случаях: копирование, сохранение в другой слот при этом зная что объект уже находится в каком-то слоте.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    UPDATE alliance_fort_system.fs_obj_storage set uuid = (SELECT UUID())
    > Affected rows: 1484011
    > Time: 10,4s


    1484011 предметов в базе получили идентификаторы

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    в первой версии выдавало 37 символов, а нужно 36. пересгенерировал uuid для всех предметов в базе.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    как оказалось есть куча проблем с обеспечением уникальности UUID, в самых разных вариациях, их нужно решить до запуска кнопок.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    Запрос теста уникальности:

    SELECT obj_id, time, uuid, slot, count(uuid) as bug FROM alliance_fort_system.fs_obj_storage
    GROUP BY uuid HAVING bug > 1

     

    Уязвимости:

    При сохранении слота в таблицу fs_obj_storage нужно рефрешить UUID загружаемых слотов игроков, и слотов игроков под курсором, при сохранении построек игрока под указанным STEAMID

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    сделан рефреш UUID во всех случаях кроме тех в которых идет сохранение из снимков напрямую, и пересохранение.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    1. После рефреша нужно сделать очистку кеша от тех uuid которые больше не используются. 

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    2. код рефрешера нужно взять из библиотеки, под нее сделан самый оптимизированный вариант.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    3. те предметы что не вошли сохранку не должны попасть в кеш кнопки, нужно четко проконтролировать чтобы мусор не попадал в кеш!

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    рефрешер и очиститель от мусора объединены и выполняют все поставленые перед ними задачи, ура епта, сколько мучений.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    есть баг с порчей структуры кеша при попытке сохранения из снимка платных предметов с кнопками в другой слот

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    обнаружен и уничтожен, надо оставить как можно меньше багов космосу, поскольку, тот еще жук по багам

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    обнаружен очередной баг в поддержании уникальности UUID, при двух и более шаблонов подряд мы не генерируем новые UUID, в следствии чего образуется дубли UUID. Шаблоны же не имеют контролируемого кол-ва загрузок.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах

    как оказалось игрок загрузил шаблон сохраненный в аккурат до релиза, шаблоны в старой версии не сохраняли UUID, что привело к засорению данных, т.к. в пустой ключ UUID новые UUID сохранялись два раза т.к. они все пустые были в итоге все предметы из шаблона получили один UUID, и как следствие, появление вот такого бажульки, защита от такого исключения конечно отсутствовала т.к. нет смысла в ней если по всем путям сохранения у предмета уже есть идентификатор. По сценарию перед тем как релизить кнопки я должен был выполнить полную регенерацию UUID в базе, но вот проблема, я столкнулся с тем что у меня уже было много настроенных кнопок и мне было жалко делать регенерацию и я не сделал ее, попутно забыв про шаблоны и библиотеку.

    Поделиться комментарием


    Ссылка на комментарий
    Поделиться на других сайтах


    Создайте аккаунт или войдите в него для комментирования

    Вы должны быть пользователем, чтобы оставить комментарий

    Создать аккаунт

    Зарегистрируйтесь для получения аккаунта. Это просто!

    Зарегистрировать аккаунт

    Войти

    Уже зарегистрированы? Войдите здесь.

    Войти сейчас

  • Обозначения статусов

    В обработке = Мы работаем над вашим отзывом.

    Будет сделано = Ваша идея добавлена к плану будущих изменений.

    Тестируется = Изменения внесены, но требуют тестирования.

    Сделано = Ваша идея реализована!

    Отклонено = Отзыв некорректный, бред, либо уже реализовано. Если у вас есть дополнительная информация напишите комментарий и мы снова откроем этот вопрос.

×