На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Диагностика ошибок приработе с RSC API

Поиск  Пользователи  Правила  Войти
Форум » Серверные приложения » GIS WebService
Страницы: 1
RSS
Диагностика ошибок приработе с RSC API, После ошибки функция mapGetRscError возвращает 0
 
Здравствуйте.

В RSC API  в подавляющем большинстве случаев функции в случае ошибки возвращают 0. В комментарияк к некоторым из них указано, что в этом случае код ошибки, которая произошла, можно узнать, вызвав функцию mapGetRscError непосредственно за вызовом API, в котором произошла ошибка. Я предположил, что это верно вообще для всех функция API, когда они возвращают 0 при ошибке, и таким образом пытаюсь ошибки диагностировать. Но в некоторых случаях mapGetRscError, вызванная в описанных случаях, также возвращает 0. Такого кода ошибки в файле maperr.rh нет. Пытался воспользоваться функцией mapGetAccessError (это уж от безысходности) - и она возвращает 0.
Вопрос - как правильно осуществлять диагностику ошибок?
 
Не могли бы Вы привести примеры функций, для которых нужно найти причину ошибки?
Основная причина ошибок - неверные параметры. Нулевые идентификаторы или указатели.
Вторая часть ошибок связана с нехваткой оперативной памяти для выполнения задачи.
 
Цитата
Oleg Belenkov написал:
Не могли бы Вы привести примеры функций, для которых нужно найти причину ошибки?
Из последнего - mapSeriaAppendObject. Серия создана на основе объекта классификатора, имеющего характер локализации - подпись, две видовых семантики (подобно тому, как у вас сделано в классификаторе 200t5g).
Другой случай - mapAppendRscSemanticObject, когда семантика добавлялась первому объекту в серии, успешно созданному функцией mapSeriaCreate. Эта семантика - не видовая.

Были и другие ситуации, я уж не вспомню. Удалось по косвенным признакам вычислить, в чём были ошибка, и устранить их.

Нулевые указатели и ид - это всё исключено, детских ошибок нет. Насчёт памяти - навряд ли, классификаторы небольшие, карты тоже. Вероятно что-то неправильно делаю с точки зрения ваших библиотек - но как догадаться, как правильно? Документация-то, сами знаете...
Может, конечно, и в библиотеках у вас ошибка, но это хотелось бы предполагать в самую последнюю очередь.

P.S. Причём, понимаете, вызовы-то функций в циклах идут, последовательно создаются объекты классификатора, в т.ч. и серии. И вот на очередном объекте - ошибка. Кто его знает, может не в этом именно объекте дело, а в следах каких-то от предыдущих вызовов. Без диагностики не разобраться.
Изменено: Сергей Гамов - 18.08.2021 17:40:19
 
Это самая сложная группа функций.
Мы добавим диагностику в новых версиях.

Исходный код:
Код
 // Добавить объект в существующую серию
 // hRsc - идентификатор классификатора карты
 // RSCOBJECT -  описание объекта (см. maptype.h)
 // SERIAPLACE - место объекта в серии
 // При ошибке возвращает 0, иначе - внутренний код объекта

_MAPIMP long int _MAPAPI mapSeriaAppendObject(HRSC hrsc, RSCOBJECT * object, SERIAPLACE * place)
 {
   if ((hrsc == 0) || (object == 0) || (place == 0))
     return 0;

   // внутренний код первого объекта серии
   int incode =  mapGetRscObjectCodeByNumber(hrsc, object->Code, object->Local);
   if (incode == 0)     // Нет такой серии
     return 0;

   TMapRsc * rsc = (TMapRsc *)hrsc;

   // Найдем серию, если есть
   TABLIM * limitId = rsc->GetTabLim(incode);
   if (limitId == 0)
     return 0;

   TSeriaEdit seria;
   seria.Load((RSCSERIA *)limitId);
   int check = 0;

   // Проверим, что семантики соответствует серии
   if (place->FirstCode)
   {
     if ((place->FirstCode == seria.SemanticCode(0)) || (place->FirstCode == seria.SemanticCode(1)))
       check = 1;
   }

   if (check == 0)
     return 0;

   if (place->SecondCode)
   {
     check = 0;
     if (place->SecondCode != place->FirstCode)
     {
       if ((place->SecondCode == seria.SemanticCode(0)) || (place->SecondCode == seria.SemanticCode(1)))
         check = 1;
     }

     if (check == 0)
       return 0;
   }

   int extend = mapGetRscObjectsCount(hrsc, object->Code, object->Local) + 1;

   int number = 0;
   if (place->SecondCode != 0)
     number = place->SecondNumber - 1;

   // Установить номер расширения
   if (seria.SetExtend(place->FirstNumber - 1, number, extend) == 0)
     return 0;

   TABPOS * possemId = rsc->GetTabPos(incode);
   if (possemId == 0)
     return 0;

   // Создали объект для серии
   RSCOBJ robj;
   memset(&robj, 0, sizeof(robj));
   robj.Code    = (unsigned int)object->Code;
   robj.Local   = (unsigned short int)object->Local;
   robj.Segment = (unsigned short int)object->Segment;
   StrCopy(robj.Name, object->Name, sizeof(robj.Name));

   incode = rsc->AppendObject(&robj, 0);
   if (incode == 0)
     return 0;

   // обновить  расширения
   limitId = rsc->UpdateExtendSeria(limitId, seria.GetExtendCount(), (char *)seria.GetFirstExtend());

   // обновить объект с учетом сделанных изменений
   rsc->UpdateSeriaObject(incode, extend, limitId, possemId);

   RSCDEF defsem;
   // обновить умолчания на объект по 1 семантике
   seria.FillDefault(0,&(defsem.MinValue),&(defsem.DefValue), &(defsem.MaxValue));
   mapUpdateRscDef(hrsc, incode, seria.SemanticCode(0), defsem.MinValue, defsem.DefValue, defsem.MaxValue);
   if (seria.SemanticCount() == 2)
   {
     seria.FillDefault(1,&(defsem.MinValue),&(defsem.DefValue), &(defsem.MaxValue));
     mapUpdateRscDef(hrsc, incode, seria.SemanticCode(1), defsem.MinValue, defsem.DefValue, defsem.MaxValue);
   }

   return incode;
}

Весь код работы с RSC приведен в SDK14.zip -
https://gisinfo.ru/download/?id=279

Новая функция будет иметь такой вид:
Код
 // Добавить объект в существующую серию
 // hRsc   - идентификатор классификатора карты
 // object -  описание объекта (см. maptype.h)
 // place  - место объекта в серии
 // error  - код ошибки выполнения функции (1 - ошибка входных параметров, 2 - объект не найден, 3 - серия не найдена, 
 //          4 - первая семантика не соответствует серии, 5 - вторая семантика не соответствует серии, 6 - ошибка в описании серии,
 //          7 - ошибка в таблице семантики, 8 - ошибка при добавлении объекта
 // При ошибке возвращает 0, иначе - внутренний код объекта

  _MAPIMP long int _MAPAPI mapSeriaAppendObjectEx(HRSC hrsc, RSCOBJECT* object, SERIAPLACE* place, long int* error)
  {
    if ((hrsc == 0) || (object == 0) || (place == 0))
    {
      if (error) *error = 1; // ошибка входных параметров
      return 0;
    }

    // Внутренний код первого объекта серии
    int incode = mapGetRscObjectCodeByNumber(hrsc, object->Code, object->Local);
    if (incode == 0)     // Нет такого объекта
    {
      if (error) *error = 2;  // объект не найден
      return 0;
    }

    TMapRsc* rsc = (TMapRsc*)hrsc;

    // Найдем серию, если есть
    TABLIM* limitId = rsc->GetTabLim(incode);
    if (limitId == 0)
    {
      if (error) *error = 3;  // серия не найдена
      return 0;
    }

    TSeriaEdit seria;
    seria.Load((RSCSERIA*)limitId);
    int check = 0;

    // Проверим, что семантики соответствуют серии
    if (place->FirstCode)
    {
      if ((place->FirstCode == seria.SemanticCode(0)) || (place->FirstCode == seria.SemanticCode(1)))
        check = 1;
    }

    if (check == 0)
    {
      if (error) *error = 4;  // первая семантика не соответствует серии
      return 0;
    }

    if (place->SecondCode)
    {
      check = 0;
      if (place->SecondCode != place->FirstCode)
      {
        if ((place->SecondCode == seria.SemanticCode(0)) || (place->SecondCode == seria.SemanticCode(1)))
          check = 1;
      }

      if (check == 0)
      {
        if (error) *error = 5;  // вторая семантика не соответствует серии
        return 0;
      }
    }

    int extend = mapGetRscObjectsCount(hrsc, object->Code, object->Local) + 1;

    int number = 0;
    if (place->SecondCode != 0)
      number = place->SecondNumber - 1;

    // Установить номер расширения
    if (seria.SetExtend(place->FirstNumber - 1, number, extend) == 0)
    {
      if (error) *error = 6;  // ошибка в описании серии
      return 0;
    }

    TABPOS* possemId = rsc->GetTabPos(incode);
    if (possemId == 0)
    {
      if (error) *error = 7;  // ошибка в таблице семантики
      return 0;
    }

    // Создали объект для серии
    RSCOBJ robj;
    memset(&robj, 0, sizeof(robj));
    robj.Code = (unsigned int)object->Code;
    robj.Local = (unsigned short int)object->Local;
    robj.Segment = (unsigned short int)object->Segment;
    StrCopy(robj.Name, object->Name, sizeof(robj.Name));

    incode = rsc->AppendObject(&robj, 0);
    if (incode == 0)
    {
      if (error) *error = 8;  // ошибка при добавлении объекта
      return 0;
    }

    // Обновить  расширения
    limitId = rsc->UpdateExtendSeria(limitId, seria.GetExtendCount(), (char*)seria.GetFirstExtend());

    // обновить объект с учетом сделанных изменений
    rsc->UpdateSeriaObject(incode, extend, limitId, possemId);

    RSCDEF defsem;
    // обновить умолчания на объект по 1 семантике
    seria.FillDefault(0, &(defsem.MinValue), &(defsem.DefValue), &(defsem.MaxValue));
    mapUpdateRscDef(hrsc, incode, seria.SemanticCode(0), defsem.MinValue, defsem.DefValue, defsem.MaxValue);
    if (seria.SemanticCount() == 2)
    {
      seria.FillDefault(1, &(defsem.MinValue), &(defsem.DefValue), &(defsem.MaxValue));
      mapUpdateRscDef(hrsc, incode, seria.SemanticCode(1), defsem.MinValue, defsem.DefValue, defsem.MaxValue);
    }

    return incode;
  }
 
Так, конечно, лучше. Что нужно будет предпринять пользователям сертифицированной версии, чтобы получить эти полезные изменения?
 
Цитата
Сергей Гамов написал:
Так, конечно, лучше. Что нужно будет предпринять пользователям сертифицированной версии, чтобы получить эти полезные изменения?
В сертифицированную версию изменения не входят. Все изменения вносятся в актуальные версии, которые представлены на нашем сайте (раздел Скачать).
Ответ  на форуме https://www.gisweb.ru/forum/messages/forum27/topic11420/message87281/11420-sozdanie-seriy-obektov#me...
Изменено: Елена Кузнецова - 23.08.2021 10:26:21
 
Цитата
Елена Кузнецова написал:
В сертифицированную версию изменения не входят.
И что же нам теперь делать?
 
Цитата
Сергей Гамов написал:
И что же нам теперь делать?
Работать в сертифицированной версии. Или обновить версию, но на данный момент она не сертифицирована.
 
Цитата
Елена Кузнецова написал:
Цитата
Сергей Гамов написал:
И что же нам теперь делать?
Работать в сертифицированной версии. Или обновить версию, но на данный момент она не сертифицирована.
Замечательно. Работать в сертифицированной версии нельзя по причине того, что она недоработана и не будет. Обновить версию нельзя, потому что она не сертифицирована. Зато пользователи сертифицированной версии проводят, фактически, тестирование, по результатам которого можно выпустить очередную несертифицированную версию.

Хорошая бизнес-модель.
 
К сожалению, невозможно проанализировать все варианты развития событий при использовании тех или иных компонентов.
При разработке новых версий функционал будет расширяться.
С уважением, Демиденко Р.А.
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности