OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 01:41

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Четверг, 11 Июль, 2013 16:08 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Я тут решил реализовать один инструмент, использующий 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. Проблема в том, что ни тот ни другой модуль нельзя просто так выкинуть и заменить на новый.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Пятница, 12 Июль, 2013 07:10 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Пятница, 12 Июль, 2013 09:14 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Maybe, it does, but the question is "Is LookupPath limited by design, or it's just inconsistent?"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Суббота, 13 Июль, 2013 12:14 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Пётр Кушнир писал(а):
... доказательство предположения о неполноте процедуры 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, придётся по-идее поддержать и приведение типа. Есть в мета средства для приведения типа (сам не увидел)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Суббота, 13 Июль, 2013 12:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Или Deref от anyPtrTyp получает сразу запись конкретного, по факту имеющегося, типа? (т.е. приведение получается неявное, как и разыменовывание)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Суббота, 13 Июль, 2013 12:36 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Если rec: ANYPTR не NIL, то Deref возвращает Meta.Item конкретного экземпляра записи по указателю, и как я успел проверить, поле id находит корректно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Недоработка связки SqlDB и Meta.
СообщениеДобавлено: Суббота, 13 Июль, 2013 12:39 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
Документация устарела, как мне кажется, дополнение условия ассерта про поддерживаемые типы Deref говорит об этом вполне определённо.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB