powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод UUID
39 сообщений из 39, показаны все 2 страниц
Вывод UUID
    #40031236
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WinAPI UuidToString: 6eac0df7-46d2-11eb-8287-2c44fdb89adb
Firebird gstat: 0DF76EAC-46D2-11EB-8782-442CB8FDDB9A
Firebird UUID_TO_CHAR: F70DAC6E-D246-EB11-8287-2C44FDB89ADB

Забавный зоопарк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031351
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и храню прилетающие из всяких ЭДО, црпт, своих сайтов и т.п. ууид-ы прямо в строках, как есть, иначе потом концов хрен сыщешь.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031361
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
firebird>gstat -h Z:\TEMP\MEM40.FDB

Database "Z:\TEMP\MEM40.FDB"
Gstat execution time Sat Dec 26 12:07:52 2020

...
    Variable header data:
        Database GUID:   {D60E1149-EB9E-415D-C3BE-4035451D3C9D} 

firebird>isql Z:\TEMP\MEM40.FDB
Database: Z:\TEMP\MEM40.FDB, User: SYSDBA
SQL> set list;
SQL> select * from mon$database;
...
MON$GUID                         {D60E1149-EB9E-415D-C3BE-4035451D3C9D} 
...
Рейтинг: 0 / 0
Вывод UUID
    #40031365
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladMON$GUID {D60E1149-EB9E-415D-C3BE-4035451D3C9D}
Код: plaintext
1.
2.
	GuidToString(guidBuffer, &dbb->dbb_guid);
	record.storeString(f_mon_db_guid, string(guidBuffer));


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
// Warning: they are BROKEN in little-endian and should not be used on new code.

inline void GuidToString(char* buffer, const Guid* guid)
{
	sprintf(buffer, GUID_LEGACY_FORMAT,
		guid->data[0], guid->data[1], guid->data[2], guid->data[3],
		guid->data[4], guid->data[5], guid->data[6], guid->data[7]);
}
...
Рейтинг: 0 / 0
Вывод UUID
    #40031380
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тот, кто фиксил UUID_TO_CHAR, забил на все остальные места где юзаются GUIDы. А дальше всё шло по накатанной :-)
...
Рейтинг: 0 / 0
Вывод UUID
    #40031383
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr> забил на все остальные места где юзаются GUIDы

Это может чем-то аукнуться конечным пользователям?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031384
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот поэтому хотя бы fb_info_db_guid стоило отдавать в честном двоичном виде...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031385
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

про это я думал. Но нафига, если во всех остальных местах оно юзается как строки. Кто это будет конвертить? А если сконвертит не так, как движок? Щаз пусть и неправильно, но хоть единообразно и совместимо во все стороны :-)

ЗЫ. хотя конечно в мажорном релизе все это можно было бы перепахать по-правильному. Ладно 2.5.2, там в rdb$backup_history могли лежать записи и ломать nbackup не стоило. Но вот почему мы на это забили в 3.0 - надо копать архивы.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrНо нафига, если во всех остальных местах оно юзается как строки.

А я в FireSwarm собираюсь использовать БД UID как часть глобального идентификатора
транзакции везде, включая хранилище и сетевой протокол. Поэтому хочется его иметь размером
в 16 байт, а не 36. Придётся копипастить код из движка и надеяться, что вам и дальше будет
лень этот зоопарк вычищать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031407
ggreggory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простой вариант без перепахивания - добавить другую функцию. Назвать, например, UUID_TO_STR. И пусть она повторяет поведение WinAPI. А UUID_TO_CHAR пусть останется для совместимости со старыми базами и приложениями.

Ivan_Pisarevsky
Вот и храню прилетающие из всяких ЭДО, црпт, своих сайтов и т.п. ууид-ы прямо в строках, как есть, иначе потом концов хрен сыщешь.


Они жрут много места, не сжимаются, но OCTETS хотя бы раза в 2 меньше.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031442
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А я в FireSwarm собираюсь использовать БД UID как часть глобального идентификатора
транзакции везде, включая хранилище и сетевой протокол. Поэтому хочется его иметь размером
в 16 байт, а не 36.

и это правильно
Придётся копипастить код из движка и надеяться, что вам и дальше будет
лень этот зоопарк вычищать.
PR бы лучше замутил, чем многослойные грабли строить...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrPR бы лучше замутил, чем многослойные грабли строить...

На ещё один info item?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031448
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на замену GUID_LEGACY_FORMAT на GUID_NEW_FORMAT внутри Guid* функций (и выкидывание GUID_LEGACY_FORMAT к чертовой бабушке). Или я слишком категоричен? ГУИДы у нас через бекап не передаются, так что проблем с совместимостью быть не должно вроде.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031466
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrна замену GUID_LEGACY_FORMAT на GUID_NEW_FORMAT внутри Guid* функций (и выкидывание
GUID_LEGACY_FORMAT к чертовой бабушке). Или я слишком категоричен? ГУИДы у нас через бекап
не передаются, так что проблем с совместимостью быть не должно вроде.

Там, видишь ли, проблема несколько более комплексная, чем преобразование. По уму надо бы
перепахивать всё, начиная с генерации. Потому что есть такой RFC 4122, который
специфицирует платформо-зависимый двоичный формат UUID и его преобразование в строку. В
первом посте первая строчка - как раз по этому RFC.

И хотя генерация-то UUID в Firebird этому RFC соответствует (по крайней мере на Windows),
но вот его преобразование - нет. Ни старое, ни новое.

Ещё одна проблема: база-то у нас подразумевается платформо-независимая, а в заголовке у
неё - внезапно! - платформо-зависимый UUID.

И если всё это разруливать, то PR получится опять неприемлемо большим и много чего ломающим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031525
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я вчера поднял переписку в FD по этому поводу, и генерация и преобразование должны работать по этому RFC (за исключением возможно регистра). Нюансы обсуждались еще и в трекере, см. CORE-3238. Но в плане преобразования правильно работают только CHAR_TO_UUID и UUID_TO_CHAR. Ты в них заглядывал? Там отнюдь не тупой printf/scanf как в StringToGuid / GuidToString, код несколько сложнее. Вот я и предлагаю его перенести в StringToGuid / GuidToString, выкинув оттуда поддержку legacy-формата.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031572
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrНо в плане преобразования правильно работают только CHAR_TO_UUID и UUID_TO_CHAR. Ты в них
заглядывал?

Заглядывал. evlUuidToChar:
Код: plaintext
1.
2.
3.
4.
5.
sprintf(buffer, GUID_NEW_FORMAT,
USHORT(data[0]), USHORT(data[1]), USHORT(data[2]), USHORT(data[3]), USHORT(data[4]),
USHORT(data[5]), USHORT(data[6]), USHORT(data[7]), USHORT(data[8]), USHORT(data[9]),
USHORT(data[10]), USHORT(data[11]), USHORT(data[12]), USHORT(data[13]), USHORT(data[14]),
USHORT(data[15]));


То есть тупо выводится 128-ми разрядное число в big endian. Это соответствует тому, что
написано на вики, но не RFC. Хотя я не прослеживал всю цепочку. Возможно, байты где-то тасуются уже после того, как их выдал вызов CoCreateGuid() в guid.cpp.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031575
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS: Нашёл, они тасуются в evlGenUuid, но все прочие места (включая DB UID) используют
результат GenerateGuid "как есть".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031584
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPS: Хотя вывод и идёт как big endian, GenUuid тасует байты так, что time-часть идёт
первыми байтами, что совсем нехорошо для индексов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031585
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovчто time-часть идёт первыми байтами, что совсем нехорошо для индексов.
я еще в 2006 году писал функцию, которая переворачивает штатный виндовый guid (CreateClassID).
Правда, с тех пор вроде CreateClassID стало возвращать guid в более правильном порядке.
Казалось бы, если у вас 36 "случайных" символов, ну сделайте порядок групп нормально сортируемым, что за проблема...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031591
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvПравда, с тех пор вроде CreateClassID стало возвращать guid в более правильном порядке.

Идентификаторы классов это вообще левая вещь, тянущаяся с тёмных веков. Правильные
генераторы это UuidCreateSequential() и UuidCreate().

[quot kdv#22255039Казалось бы, если у вас 36 "случайных" символов, ну сделайте порядок групп нормально сортируемым, что за проблема...[/quot]
Мелкая такая проблема: они вообще не предназначались для сравнений на больше-меньше, только на равенство.
...
Рейтинг: 0 / 0
Вывод UUID
    #40031594
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вообще не понял, в чем проблема.
Ну выдал не в том порядке - ну и фиг
с ним, все равно два сравнения одним
способом (будь-то строка или байты)
дадут один результат.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031595
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для GUID-ов наверное можно было бы сделать трюк, похожий на DBKEY - внутри движка он специальный тип, а при передаче наружу превращается в BINARY(16). Тогда в индексе ключ можно генерить по-другому, в частности меняя порядок байт для оптимального сжатия. Тут правда фигня в том, что оный порядок байт есть только на винде, а на линуксе просто поток случайных байт. Да и вообще ХЗ кто этот GUID генерил (ФБ или снаружи) и на какой платформе, так что в общем смысле это выглядит довольно бессмысленной затеей.

Но пока тут речь вообще не про это :)
...
Рейтинг: 0 / 0
Вывод UUID
    #40031601
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrТут правда фигня в том, что оный порядок байт есть только на винде, а на линуксе просто
поток случайных байт.

Это сейчас в Firebird реализовано так, а вообще-то есть
https://linux.die.net/man/3/libuuid например...

dimitrв общем смысле это выглядит довольно бессмысленной затеей.

Без специального типа, торчащего наружу - да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031778
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНашёл, они тасуются в evlGenUuid

Да, с перетасовкой вывод соответствует RFC:

MS = {5b2c1ba0-48fc-11eb-8287-2c44fdb89adb}
ODBC = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}
gstat = {1BA05B2C-48FC-11EB-8782-442CB8FDDB9A}
UUID_TO_CHAR = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}

Но менять сейчас эту перетасовку для пущей дружелюбности к индексам, наверное, уже поздно...
...
Рейтинг: 0 / 0
Вывод UUID
    #40031779
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RFC регистр не оговаривает что ли ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031786
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНо менять сейчас эту перетасовку для пущей дружелюбности к индексам, наверное, уже поздно...

это ещё почему? Вроде как сама генерация ничего обратно совместимого не сломает
...
Рейтинг: 0 / 0
Вывод UUID
    #40031787
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Допускаются оба, хотя в примерах внутри используется только нижний. Но там примеры
кода мутные, они противоречат остальному тексту. Текст гласит
The fields are encoded as 16 octets, with the sizes and order of the
fields defined above, and with each field encoded with the Most
Significant Byte first
(known as network byte order). Note that the
field names, particularly for multiplexed fields, follow historical
practice.

В коде написано:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
uuid_t NameSpace_DNS = { /* 6ba7b810-9dad-11d1-80b4-00c04fd430c8 */
     0x6ba7b810,
     0x9dad,
     0x11d1,
     0x80, 0xb4, 0x00, 0xc0, 0x4f, 0xd4, 0x30, 0xc8
};

/* puid -- print a UUID */
void puid(uuid_t u)
{
     int i;

     printf("%8.8x-%4.4x-%4.4x-%2.2x%2.2x-", u.time_low, u.time_mid,
     u.time_hi_and_version, u.clock_seq_hi_and_reserved,
     u.clock_seq_low);
     for (i = 0; i < 6; i++)
         printf("%2.2x", u.node[i]);
     printf("\n");
}


то есть код плюёт на MSB раскладку и использует платформенную.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40031794
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисэто ещё почему? Вроде как сама генерация ничего обратно совместимого не сломает

У всех баз, которые хранили UUID в двоичном виде, съедет его текстовое представление.
Учитывая, что сейчас раскладка хотя бы соответствует тексту RFC - лучше не трогать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032085
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrна замену GUID_LEGACY_FORMAT на GUID_NEW_FORMAT внутри Guid* функций (и выкидывание
GUID_LEGACY_FORMAT к чертовой бабушке). Или я слишком категоричен?

Да нет, в самый раз. Так ты даёшь добро на изменение ODS на RC стадии?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032126
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Так ты даёшь добро на изменение ODS на RC стадии?

я не вижу там изменения ОДС
...
Рейтинг: 0 / 0
Вывод UUID
    #40032220
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrя не вижу там изменения ОДС

А изменение формата UID в заголовке базы с платформенного на независимый?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032268
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А изменение формата UID в заголовке базы с платформенного на независимый?

формально ты прав. Но учитывая, что базы у нас все равно между LE/BE непереносимы и что получить бинарный GUID снаружи нельзя, то можно хранить и в нативном формате, а байты тасовать непосредственно перед конвертацией в строку. Или я чего-то упускаю?
...
Рейтинг: 0 / 0
Вывод UUID
    #40032279
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть смысл этого патча будет исключительно исправить вывод GuidToString?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032285
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

То есть смысл этого патча будет исключительно исправить вывод GuidToString?


ну ты же сам показал выше, что сломано только это?

Dimitry Sibiryakov

MS = {5b2c1ba0-48fc-11eb-8287-2c44fdb89adb}
ODBC = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}
gstat = {1BA05B2C-48FC-11EB-8782-442CB8FDDB9A}
UUID_TO_CHAR = {5B2C1BA0-48FC-11EB-8287-2C44FDB89ADB}


Ну и StringToGuid есс-но тоже придется подправить, а то у нас бинарное сравнение сломается.
...
Рейтинг: 0 / 0
Вывод UUID
    #40032295
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrну ты же сам показал выше, что сломано только это?

Ну, в принципе, да. Просто я считал, что у нас база LE/BE независимая. Во всяком случае 15
лет назад Аннушка что-то такое рассказывала на конференции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032307
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это она так мечтала вслух :-) Они сделали под одного клиента динамическую перекодировку endianness на основе единой (LE, насколько я помню) ОДС и она предлагала это засунуть в ФБ. Дело ничем так и не кончилось.
...
Рейтинг: 0 / 0
Вывод UUID
    #40032843
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, запуллил я реквест https://github.com/FirebirdSQL/firebird/pull/305
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод UUID
    #40032846
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тебе там уже понаписал всего :)
...
Рейтинг: 0 / 0
Вывод UUID
    #40032897
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так я этот снял, другой запулил. И, кстати, запрещение каскадной репликации
переориентировал на твой бранч.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод UUID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]