powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / по сорсам вопрос
9 сообщений из 9, страница 1 из 1
по сорсам вопрос
    #39256662
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил в каталог системную таблицу, вроде все работает данные о структурах пишуться, но теперь хочу, что б в ней автоинкрементное поле прямо в ini_format() создавалось.
Так и не нашел доступного материала по этой теме.

GDML по известному файлу изучил неплохо. Но там этого нет.

В порядке бреда - подозреваю,что надо сделать генератор и, дальше, триггер. Могу ошибаться.

Долго-долго втыкал в генераторы (кажется массив generators и есть требуемое) и триггеры, написанные BLR кодами, понял, что без доп.материалов и знаний это выше меня. Но в сети ничего не нашел.

Что это???
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
blr_version5,
	blr_begin,
	blr_if,
	blr_eql,
	blr_field, 1, 15, 'R', 'D', 'B', '$', 'O', 'B', 'J', 'E', 'C', 'T', '_',
		'T', 'Y', 'P', 'E',
	blr_literal, blr_long, 0, 0, 0, 0, 0,
	blr_begin,
	blr_if,
	blr_not,
	blr_any,
	blr_rse, 1,
	blr_relation, 13, 'R', 'D', 'B', '$', 'R', 'E', 'L', 'A', 'T', 'I', 'O',
		'N', 'S', 3,
	blr_boolean
и тд.


Заметил, что в ini_format используется препаред выражения, пытался обмануть систему следующим образом - снял галочку систмная в таблице таблиц, выполнил ALTER TABLE, поставил галочку обратно(см. кусок кода)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
	AutoCacheRequest rrxo(tdbb, drq_m_relations_rxo, DYN_REQUESTS);
	FOR(REQUEST_HANDLE rrxo TRANSACTION_HANDLE transaction)
		REL IN RDB$RELATIONS
		WITH REL.RDB$RELATION_NAME EQ "RDB$RXO_NAMES"

	{
		MODIFY REL USING
			REL.RDB$SYSTEM_FLAG = 0;
		END_MODIFY
	}
	END_FOR

	sql = PreparedStatement::Builder();
	sql << "ALTER TABLE RDB$RxO_NAMES"
		<< "ADD RDB$RXO_NAMEID INT GENERATED BY DEFAULT AS IDENTITY UNIQUE";
	ps.reset(attachment->prepareStatement(tdbb, transaction, sql));
	ps->execute(tdbb, transaction);

	rrxo.reset(tdbb, drq_m_relations_rxo, DYN_REQUESTS);
	FOR(REQUEST_HANDLE rrxo TRANSACTION_HANDLE transaction)
		REL IN RDB$RELATIONS
		WITH REL.RDB$RELATION_NAME EQ "RDB$RXO_NAMES"

	{
		MODIFY REL USING
			REL.RDB$SYSTEM_FLAG = RDB_system;
		END_MODIFY
	}
	END_FOR



Нифига. Код выполняется без ошибок, а столбца нет (если галочку не снимать, пишет, что в системных таблицах ничего менять нельзя). Причем он когда до alterTableNode::execute() доходит , то там все зашибись проходит, но в целом результат - хрен. Подозреваю, препаредстейтменты в какой то альтернативной транзакции работают.

Поможите люди добрые! А то совсем бред в голову лезет. Например, создать такие таблицы руками и потом из системных таблиц вытащить, чего туда наставлялось, и тупо GDML-ем это байтовые строки прописывать... но тоже наверное не вариант, и редкостная морока.

Еще вопрос... gpre ,как я понял, из GDML генерит сишный код . А она тока из GDML генерит?,мне кааца, что я где-то видел, что она вроде из SQL может генерить. По этой утилите есть доки вменяемые? Может там это есть?
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39256738
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneДобавил в каталог системную таблицу

Что ты хочешь сделать? Создать новую таблицу, триггер и генератор?
Зачем тогда gdml? Что мешает сделать это через DDL?
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39256762
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-gene,

если уж лезешь в сорцы и добавляешь системную таблицу, то в чем смысл явно создавать автоинкрементное поле? Добавь свой генератор в массив generators и воткни хук для своей таблицы в VIO_store(), где будешь заполнять поле из генератора.

Что-то наподобие:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
case rel_ugene:
	if (!EVL_field(0, rpb->rpb_record, f_ugene_field, &desc);
	{
		const SINT64 value =
			DPM_gen_id(tdbb, MET_lookup_generator(tdbb, "RDB$UGENE"), false, 1);
		dsc temp_desc;
		temp_desc.makeInt64(0, &value);
		MOV_move(tdbb, &temp_desc, &desc);
		CLEAR_NULL(rpb->rpb_record, f_ugene_field);
	}
	break;

...
Рейтинг: 0 / 0
по сорсам вопрос
    #39256847
Го-стхи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно в порядке общего развития поведать, какова цель? Может, ее и в апстрим не грех добавить :)
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39256959
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

О, и правда, там такого уже немало. Спасибо, буду пробовать.
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39257083
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-gene,

backup\restore сразу проверь
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39257095
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Го-стхи,

В миру очень много приложений, которые в своей памяти из записей разных таблиц приблизительно одинаковым образом собирают сложные структуры данных, и выполняют с этим "сборками" (называя их "объектами", "документами" и т.п.) приблизительно одинаковые операции. Все это можно (и нужно) изобразить внутри СУБД, что я давно пытаюсь сделать .
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39257099
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
U-geneГо-стхи,

В миру очень много приложений, которые в своей памяти из записей разных таблиц приблизительно одинаковым образом собирают сложные структуры данных, и выполняют с этим "сборками" (называя их "объектами", "документами" и т.п.) приблизительно одинаковые операции. Все это можно (и нужно) изобразить внутри СУБД, что я давно пытаюсь сделать .

про это уже давно написаны книжки. data warehouse.
...
Рейтинг: 0 / 0
по сорсам вопрос
    #39257128
Фотография U-gene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pastor,

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


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