powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Pointer page
25 сообщений из 29, страница 1 из 2
Pointer page
    #38463953
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Решил поизучать структуры таблиц птицы.

Если я правильно понял, то Header_page.hdr_pages содержит ссылку на первую страницу rdb$pages.

А эта таблица соответственно содержит список всех страниц базы и rdb$relation_id.

Возник вопрос. А как собственно понять какой таблице принадлежит этот самый rdb$relation_id?
Его можно получить на уровне sql из rdb$relations.

А вот как на уровне страниц файла базы?

Спасибо
...
Рейтинг: 0 / 0
Pointer page
    #38463979
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на уровне страниц файла базы нет такого понятия, как имена таблиц. Есть только ID.
...
Рейтинг: 0 / 0
Pointer page
    #38463994
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

Догадывался)

Как тогда на уровне страниц соотнести ID и названия страниц?
...
Рейтинг: 0 / 0
Pointer page
    #38464005
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvКак тогда на уровне страниц соотнести ID и названия страниц?

У страниц нет названий.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38464057
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,


Ну пардон названия таблиц, соответствующих relation_id
...
Рейтинг: 0 / 0
Pointer page
    #38464061
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv,

читай вот тут
http://www.ibphoenix.com/resources/documents/design
например с
Firebird for the Database Expert: Episode 2 - Page Types

там все написано.
...
Рейтинг: 0 / 0
Pointer page
    #38464064
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvНу пардон названия таблиц, соответствующих relation_id
Никак. На уровне страниц названия таблиц глубоко пофиг.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38464115
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём проблема вытащить эти названия из rdb$relations по ID ?
Тем более в коде сервера уже есть весь нужный код, наверное.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38468577
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спрошу еще.

добрался я до данных самой записи.
Получил декомпрессированные данные.

Далее нашел в инете такое описание


Once the compression of the data in a column has been expanded, the data consists of three parts - a field header, the actual data and, if necessary, some padding bytes.

Возник вопрос - как в этих данных найти значения полей?

Посмотрел через Эксперт.
Заметил, что для не системных таблиц в начале этого массива идут 4 байта, а потом уже данные полей. Что за 4 байта?
У не системных таблиц перед началом данных полей 8 байт. Что за байты?
В поле VARCHAR перед данными стоят 2 байта.Что это за байты?
В поле VARCHAR которое NULL стоят 10 байт 0х00.


Где можно про это почитать?
Или может кто может пояснить?

Спасибо
...
Рейтинг: 0 / 0
Pointer page
    #38468590
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv,

я тебе уже вроде давал ссылку, где читать. кроме того, первоисточником тут является ods.hpp (или ods.h), где все структуры описаны.
запись состоит из заголовка, и данных столбцов. столбцы нумеруются. Форматы записи лежат в rdb$formats.
...
Рейтинг: 0 / 0
Pointer page
    #38468608
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvЗаметил, что для не системных таблиц в начале этого массива идут 4 байта, а
потом уже данные полей. Что за 4 байта?
Массив битовых NULL-флагов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38468626
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvЗаметил, что для не системных таблиц в начале этого массива идут 4 байта, а потом уже данные полей. Что за 4 байта?
У не системных таблиц перед началом данных полей 8 байт. Что за байты?
определись, о чем именно спрашиваешь. Число байт NULL-маски зависит от числа столбцов таблицы.

SwvВ поле VARCHAR перед данными стоят 2 байта.Что это за байты?
длина строки

SwvВ поле VARCHAR которое NULL стоят 10 байт 0х00.
два байта - длина строки, остальное выравнивание до следующего поля (bigint или double precision, судя по всему)

Тебе надо научиться понимать формат записи (rdb$formats), тогда декодирование записи в отдельные поля становится тривиальным.
...
Рейтинг: 0 / 0
Pointer page
    #38468628
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще вот это имеет смысл прочитать, как минимум про NULL-битмапы там разжевано
...
Рейтинг: 0 / 0
Pointer page
    #38468641
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrЧисло байт NULL-маски зависит от числа столбцов таблицы.

Оффтопик, конечно, но что там с моим предложением не включать в маску биты под ведомые NOT
NULL поля? Оно проигнорировано или просто руки не доходят?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38468653
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

позабыто, наверное. Впрочем, оно мне все равно не нравится. Ибо, во-первых, потребует включать признак nullability столбцов в формат таблицы. А во-вторых, я не вижу чтобы оно дало какой-либо эффект при менее чем 32 ведомых NOT NULL полях (ибо вся экономия сожрется padding-ом до выравнивания первого поля).
...
Рейтинг: 0 / 0
Pointer page
    #38468681
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrво-первых, потребует включать признак nullability столбцов в формат таблицы.
А во-вторых, я не вижу чтобы оно дало какой-либо эффект при менее чем 32 ведомых NOT NULL
полях (ибо вся экономия сожрется padding-ом до выравнивания первого поля).
Во-первых, в формат можно включить уже посчитанную длину маски. Дальше при проверке если
поле NULL или нет, будет достаточно ещё одного сравнения его номера с 8*<размер маски из
формата>.
Во-вторых, если в таблице два поля и оба NOT NULL - маска будет нулевого размера и в
записи будет сэкономлено 4 байта, поскольку паддинг пойдёт лесом.
В-третьих, это позволит иметь обратно-совместимые внешние файлы с поддержкой NULL-ов, но
это уже отдельный тикет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38468702
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВо-первых, в формат можно включить уже посчитанную длину маски. Дальше при проверке если поле NULL или нет, будет достаточно ещё одного сравнения его номера с 8*<размер маски из формата>.
Во-вторых, если в таблице два поля и оба NOT NULL - маска будет нулевого размера и в
записи будет сэкономлено 4 байта, поскольку паддинг пойдёт лесом.
В-третьих, это позволит иметь обратно-совместимые внешние файлы с поддержкой NULL-ов, но
это уже отдельный тикет.
1) можно и так. Хотя инкрементировать номер формата (весьма ограниченный ресурс) на каждый чих NULL <-> NOT NULL мне не кажется очень удачной мыслью, даже если это в основном и коснется "таблиц из двух полей".
2) после компрессии экономия будет уже 2 байта
3) IMHO, это единственный повод вообще рассматривать эту идею
...
Рейтинг: 0 / 0
Pointer page
    #38468709
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr(весьма ограниченный ресурс)
Кто-то, кажется, уже предлагал при свипе помечать использованные форматы и удалять
неиспользуемые.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Pointer page
    #38468715
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

вот когда этот кто-то (или кто-либо другой) это сделает, тогда и вернемся к этом разговору
...
Рейтинг: 0 / 0
Pointer page
    #38470175
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrЧисло байт NULL-маски зависит от числа столбцов таблицы.


Тебе надо научиться понимать формат записи (rdb$formats), тогда декодирование записи в отдельные поля становится тривиальным.

По NULL маске вопрос.

Вот смотрю я страницу данных RDB$RELATIONS
В таблице 17 полей. Исходя из того, что написано в описании - 4 байта на каждые 32 поля.
И далее кратно 4 байт.
На странице данных по таблице RDB$RELATIONS данных полей начинаются с 9 байта.
т.е. на маску ушло 8.
Почему?

И вопросик по поводу формата записи. Где почитать?


Спасибо
...
Рейтинг: 0 / 0
Pointer page
    #38470195
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SwvВот смотрю я страницу данных RDB$RELATIONS
В таблице 17 полей. Исходя из того, что написано в описании - 4 байта на каждые 32 поля.
И далее кратно 4 байт.
На странице данных по таблице RDB$RELATIONS данных полей начинаются с 9 байта.
т.е. на маску ушло 8.
на маску ушло 4 байта, еще 4 ушло на паддинг для выравнивания (ибо первое поле таблицы - 8-байтный blob id)

SwvИ вопросик по поводу формата записи. Где почитать?
только в исходниках, наверное. В ods.h есть структура Ods::Descriptor. В dsc_offset лежит смещение поля в буфере записи, в dsc_length - длина поля, в dsc_dtype - тип данных и т.п. По rhd_format записи читаешь формат из rdb$formats, там блоб = массиву структур Ods::Descriptor, по одной на поле таблицы.
...
Рейтинг: 0 / 0
Pointer page
    #38470212
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrтолько в исходниках, наверное. В ods.h есть структура Ods::Descriptor. В dsc_offset лежит смещение поля в буфере записи, в dsc_length - длина поля, в dsc_dtype - тип данных и т.п. По rhd_format записи читаешь формат из rdb$formats, там блоб = массиву структур Ods::Descriptor, по одной на поле таблицы.

в RDB$Formats есть записи только на НЕ системные relations.
Как быть с системными?
...
Рейтинг: 0 / 0
Pointer page
    #38470214
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv,

у них структура фиксированная. это вопрос курицы и яйца.
...
Рейтинг: 0 / 0
Pointer page
    #38470215
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitrна маску ушло 4 байта, еще 4 ушло на паддинг для выравнивания (ибо первое поле таблицы - 8-байтный blob id)


Т.е. если первое поле таблицы BLOB, то будет выравнивание до 8 байт?
...
Рейтинг: 0 / 0
Pointer page
    #38470234
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swvв RDB$Formats есть записи только на НЕ системные relations.
Как быть с системными?
прошивать их структуру в своей программе. См. /jrd/relations.h, /jrd/ini.epp.

SwvТ.е. если первое поле таблицы BLOB, то будет выравнивание до 8 байт?
да, насколько я помню
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Pointer page
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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