powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / структура blobID
15 сообщений из 15, страница 1 из 1
структура blobID
    #39033517
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

смотрю экспертом страницы базы. blobID определяется как 16.332.61884.13
откидываем relationid. Далее идут 4 байта. $85 64 8C 03
Если их прочитать как два слова получится если все правильно путаю: $64 85 и $03 8C

Первый вопрос возник что есть 61884?

В бинарном виде это будет так : 01100100 10000101 00000011 10001100
если блоб ид (16.332.61884.13) представить в бинарном виде: 10000 101001100 1111000110111100 1101
Ни одной бинарной последовательности blobID (16.332.61884.13) не нашел в ее 16ричном представлении.
А может плохо искал.
Как прочитать блобИД? Чтобы представить в виде НомерРР.Номер слота на РР.Номер записи на странице

вот тут вот есть на 12 странице описание db_key.
http://www.firebirdsql.org/file/community/conference-2014/pdf/22_tips_firebird_system_tables.pdf

Но вот относительно 61884 ничего не нашел. В описании db_key трехкомпонентный. Эксперт же показывает 4 числа.
...
Рейтинг: 0 / 0
структура blobID
    #39033532
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqсмотрю экспертом страницы базы. blobID определяется как 16.332.61884.13
о каком эксперте речь? Если IBE, то спроси в соответствующем подфоруме что за хитрый вывод такой.

sergqоткидываем relationid. Далее идут 4 байта.
всего 8 байт, relationid двухбайтовый. Должно остаться 6 байт, а не 4.
...
Рейтинг: 0 / 0
структура blobID
    #39033545
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

хорошо. пусть будет 6 байт
нашел такую структуру

public:
USHORT bid_relation_id; /* Relation id (or null) */

private:
UCHAR bid_reserved_for_relation; /* Reserved for future expansion of relation space. */
UCHAR bid_number_up; // Upper byte of 40-bit record number
ULONG bid_number; // Lower bytes of 40-bit record number
// or 32-bit temporary ID of blob or array

те получается у нас вот так: $00 00 85 64 8C 03
Первый ноль - Reserved for future expansion of relation space.
второй - Upper byte of 40-bit record number
все остальное Lower bytes of 40-bit record number

как ни крутил не получил из этого набора байт ни номер PP равным 16, ни номер слота равный 332, ни номер записи равный 13
...
Рейтинг: 0 / 0
структура blobID
    #39033549
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq,

в том же RecordNumber.h найди метод decompose() - он превращает номер записи в ppseq/slot/line
records_per_page и data_pages_per_pointer_page для заданной базы константы, вычисляются через размер страницы (см. maxRecsPerDP и dataPagesPerPP в ods.cpp)
...
Рейтинг: 0 / 0
структура blobID
    #39033582
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,


не силен в С )

Код: plaintext
1.
line = static_cast<USHORT>(value % records_per_page);



это я так понимаю остаток от деления.

для вот этого вот blobid $81 00 00 00 85 64 8C 03 line равно 13. судя по тому, что показывает IBE.


Но что есть VALUE? подозреваю, что тип его SINT64. Но точно не последние 4 байта. слишком большое число для данной формулы)
...
Рейтинг: 0 / 0
структура blobID
    #39033598
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что показывает эксперт:

Код: pascal
1.
2.
3.
4.
Result := 'DB_KEY = ' + IntToStr(RecNum.PointerPageSequence) + '.' + 
                                    IntToStr(RecNum.Slot) + '.' + 
                                    IntToStr(RecNum.Sequence) + '.' + 
                                    IntToStr(RecNum.Line);
...
Рейтинг: 0 / 0
структура blobID
    #39033601
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqНо что есть VALUE? подозреваю, что тип его SINT64. Но точно не последние 4 байта. слишком большое число для данной формулы)

Это последние 5 байт - они и есть value. 5-й байт окажется задействованным только в очень больших базах, так что в экспериментах с обычными базами достаточно взять 4 последние байта.
...
Рейтинг: 0 / 0
структура blobID
    #39034209
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

с maxRecsPerDP вроде разобрался.

а вот с dataPagesPerPP

Код: plaintext
1.
2.
	ULONG ret = static_cast<ULONG>((page_size - offsetof(pointer_page, ppg_page[0])) * 8 / (BITS_PER_LONG + PPG_DP_BITS_NUM));
        return ret & (~7);



для 16к страницы получается так
Код: plaintext
1.
2.
	ULONG ret = static_cast<ULONG>((16384 - 32) * 8 / (32 + 8));     //
        return ret & (~7);



по первой строке получается 3270. Это чего? судя по умножению на 8 это биты
Последнюю строчку не допонял. Тильда это вроде как NOT. & - AND
Если переписать как 3270 and (not 7) - тоже маловато. да и ересь вроде как написана.
правильный ответ (то, что показывает IBE) - 3847

И такой вопрос. ЗАчем на PP в конце порядка 960 байт забито $55? Почему целый килобайт не используется?
...
Рейтинг: 0 / 0
структура blobID
    #39034214
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqЕсли переписать как 3270 and (not 7) - тоже маловато. да и ересь вроде как написана.
правильный ответ (то, что показывает IBE) - 3847
правильный ответ - 3264

sergqЗАчем на PP в конце порядка 960 байт забито $55? Почему целый килобайт не используется?
в конце PP флаги для каждой DP лежат, они очень даже используются
...
Рейтинг: 0 / 0
структура blobID
    #39034218
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrsergqЕсли переписать как 3270 and (not 7) - тоже маловато. да и ересь вроде как написана.
правильный ответ (то, что показывает IBE) - 3847
правильный ответ - 3264

sergqЗАчем на PP в конце порядка 960 байт забито $55? Почему целый килобайт не используется?
в конце PP флаги для каждой DP лежат, они очень даже используются


это как раз 3270 and (not 7) ))
но ведь dataPagesPerPP - сколько указателей на DP умещается на одной PP? IBE показывает , что записей на странице -3847
И active slots на PP - 3847. почему тогда 3264?

флаги это из оперы and a 8 bit control field (PPG_DP_BITS_NUM) ?
какая структура отвечает за флаги? и как их найти (смещение)?
...
Рейтинг: 0 / 0
структура blobID
    #39034298
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqно ведь dataPagesPerPP - сколько указателей на DP умещается на одной PP? IBE показывает , что записей на странице -3847
И active slots на PP - 3847. почему тогда 3264?


А ты какую базу ковыряешь, каким сервером созданную? Раньше для каждой DP нужно было 32+2 бита флагов. Видимо, тройка уже 8 бит под флаги выделяет, как dimitr говорит. Это в Database Inside еще не учтено.
...
Рейтинг: 0 / 0
структура blobID
    #39034318
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergqфлаги это из оперы and a 8 bit control field (PPG_DP_BITS_NUM) ?
какая структура отвечает за флаги? и как их найти (смещение)?
у тебя же код на руках, быстрее найти чем спрашивать. Сразу за массивом номеров DP (ppg_page) идет массив флагов. В старых ODS было геморройно их вычленять (каждый байт содержал флаги четырех DP), в ODS 12 проще - там ровно один байт на DP:
Код: plaintext
1.
UCHAR* flagsByte = (UCHAR*) &ppage->ppg_page[dbb->dbb_dp_per_pp] + slot;
...
Рейтинг: 0 / 0
структура blobID
    #39034394
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertsergqно ведь dataPagesPerPP - сколько указателей на DP умещается на одной PP? IBE показывает , что записей на странице -3847
И active slots на PP - 3847. почему тогда 3264?


А ты какую базу ковыряешь, каким сервером созданную? Раньше для каждой DP нужно было 32+2 бита флагов. Видимо, тройка уже 8 бит под флаги выделяет, как dimitr говорит. Это в Database Inside еще не учтено.

ODS 11.2.

страница 16k, pp.active slots = 3847. никак не 3264 ) и все данные, на которые ссылаются слоты выше 3264 отображаются в Database Inside
...
Рейтинг: 0 / 0
структура blobID
    #39034397
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sergq,

дык тогда смотри исходники ФБ 2.5, а не тройки
...
Рейтинг: 0 / 0
структура blobID
    #39034400
sergq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

упс ) точно. Спасибо )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / структура blobID
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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