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/