OberonCore https://forum.oberoncore.ru/ |
|
Недоработка связки SqlDB и Meta. https://forum.oberoncore.ru/viewtopic.php?f=23&t=4400 |
Страница 1 из 1 |
Автор: | Пётр Кушнир [ Четверг, 11 Июль, 2013 16:08 ] |
Заголовок сообщения: | Недоработка связки SqlDB и Meta. |
Я тут решил реализовать один инструмент, использующий SqlDB, в частности, функции подстановки значения переменной в запрос, который содержит путь к переменной после символа :. Например: Код: delete from divisions where id = :PrivMod.rec.id При этом, я подставлял значение в rec типа ANYPTR свой конкретный объект. Однако процедура SqlDB.Compile использует Meta.LookupPath, которая не поддерживает проход по таким абстрактным записям. Как одно из решений можно предложить такой патч. В процедуре Meta.LookupPath заменить: Код: IF i.typ = recTyp THEN i.Lookup(name, i) ELSE SetUndef(i) END наКод: CASE i.typ OF recTyp: i.Lookup(name, i) |ptrTyp, anyPtrTyp: i.Deref(i); ASSERT(i.obj=varObj, 40); i.Lookup(name, i) ELSE SetUndef(i) END Нехорошо это, конечно, патчить такие важные модули. Возможно, выгоднее будет пропатчить SqlDB, тогда данный патч можно рассматривать, как доказательство предположения о неполноте процедуры LookupPath. Проблема в том, что ни тот ни другой модуль нельзя просто так выкинуть и заменить на новый. |
Автор: | maliya [ Пятница, 12 Июль, 2013 07:10 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
does changing this line is more proper? Код: (*IF item.typ = ptrTyp THEN item.Deref(item) END;*)
IF (item.typ = ptrTyp)OR(item.typ =anyPtrTyp) THEN item.Deref(item) END; |
Автор: | Пётр Кушнир [ Пятница, 12 Июль, 2013 09:14 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
Maybe, it does, but the question is "Is LookupPath limited by design, or it's just inconsistent?" |
Автор: | Евгений Темиргалеев [ Суббота, 13 Июль, 2013 12:14 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
Пётр Кушнир писал(а): ... доказательство предположения о неполноте процедуры LookupPath... Некоторые соображения на тему.1) Lookup работает только с записями конкретного типа, как и Deref (по документации). И если "|ptrTyp, anyPtrTyp: i.Deref(i);" у Вас вопреки документации отработает (где нестыковка --- не ясно), то Lookup не пройдёт. Meta Docu писал(а): PROCEDURE (VAR ptr: Item) Deref (VAR ref: Item) NEW Dereference pointer ptr and assign the result to ref. Pre ptr.typ = ptrTyp 21 ... PROCEDURE (VAR in: Item) Lookup (IN name: ARRAY OF CHAR; VAR i: Item) NEW Lookup an item in a module or a field in a record. Pre in.Valid() 20 in.obj = modObj OR in.typ = recTyp 21 Код: PROCEDURE (VAR ptr: Item) Deref* (VAR ref: Item), NEW; BEGIN IF ptr.ext # NIL THEN ptr.ext.Deref(ref); RETURN END; ASSERT(ptr.ptr # NIL, 20); ASSERT(ptr.typ IN {sysPtrTyp, anyPtrTyp, ptrTyp}, 21); ... PROCEDURE (VAR in: Item) Lookup* (IN name: ARRAY OF CHAR; VAR i: Item), NEW; ... BEGIN IF in.ext # NIL THEN in.ext.Lookup(name, i); RETURN END; ASSERT(in.ptr # NIL, 20); IF LegalName(name) THEN IF in.obj = modObj THEN ... ELSIF in.typ = recTyp THEN ... ELSE HALT(21) 2) С другой стороны: Meta Docu писал(а): PROCEDURE LookupPath (IN path: ARRAY OF CHAR; OUT i: Item) Lookup an item via a whole designator, starting with a module name. Appendix B: Syntax of Component Pascal писал(а): Designator = Qualident {"." ident | "[" ExprList "]" | " ^ " | "(" Qualident ")" | "(" [ExprList] ")"} [ "$" ]. Если хотите поддержать ANYREC, придётся по-идее поддержать и приведение типа. Есть в мета средства для приведения типа (сам не увидел)?
|
Автор: | Евгений Темиргалеев [ Суббота, 13 Июль, 2013 12:26 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
Или Deref от anyPtrTyp получает сразу запись конкретного, по факту имеющегося, типа? (т.е. приведение получается неявное, как и разыменовывание) |
Автор: | Пётр Кушнир [ Суббота, 13 Июль, 2013 12:36 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
Если rec: ANYPTR не NIL, то Deref возвращает Meta.Item конкретного экземпляра записи по указателю, и как я успел проверить, поле id находит корректно. |
Автор: | Пётр Кушнир [ Суббота, 13 Июль, 2013 12:39 ] |
Заголовок сообщения: | Re: Недоработка связки SqlDB и Meta. |
Документация устарела, как мне кажется, дополнение условия ассерта про поддерживаемые типы Deref говорит об этом вполне определённо. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |