Как подчистить базу от линков (linked to) в свойствах объекта

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение Lerych » Чт дек 20, 2018 11:46 pm

А ещё можно пользоваться штатной функцией removeLinkedProperty($object, $property, $module)
А как бы эту функцию запихать, например, в сценарий systemMaintenance. Поможет избываться от пустых линков в дальнейшем? Как думаете?
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение Lerych » Чт дек 20, 2018 11:55 pm

Или прямо в startup_maintenance.php вставить:

Код: Выделить всё

// CHECKING DATA
$tables = array('commands' => 'commands', 'owproperties' => 'onewire', 'snmpproperties' => 'snmpdevices', 'zwave_properties' => 'zwave', 'mqtt' => 'mqtt', 'modbusdevices' => 'modbus');
$value_ids = array();
foreach ($tables as $k => $v) {
    $sqlQuery = "SELECT *\n                  FROM {$k}\n                 WHERE LINKED_OBJECT   != ''\n                   AND LINKED_PROPERTY != ''";
    $data = SQLSelect($sqlQuery);
    $total = count($data);
    for ($i = 0; $i < $total; $i++) {
        $module = $v;
        $property = $data[$i]['LINKED_OBJECT'] . '.' . $data[$i]['LINKED_PROPERTY'];
        if (!$value_ids[$property]) {
            $value_ids[$property] = getValueIdByName($data[$i]['LINKED_OBJECT'], $data[$i]['LINKED_PROPERTY']);
        }
        if ($value_ids[$property]) {
            $sqlQuery = "SELECT *\n                        FROM pvalues\n                       WHERE ID = " . (int) $value_ids[$property];
            $value = SQLSelectOne($sqlQuery);
            if (!$value['LINKED_MODULES']) {
                $tmp = array();
            } else {
                $tmp = explode(',', $value['LINKED_MODULES']);
            }
            if (!in_array($v, $tmp)) {
                echo "{$property} adding linked" . PHP_EOL;
                $tmp[] = $v;
                $value['LINKED_MODULES'] = implode(',', $tmp);
                SQLUpdate('pvalues', $value);
            }
		}
	}
}
Аватара пользователя
xor
Сообщения: 2039
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 286 раз
Поблагодарили: 629 раз

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение xor » Пт дек 21, 2018 12:03 am

c:\_majordomo\htdocs\lib\objects.class.php

Код: Выделить всё

/**
 * Summary of removeLinkedProperty
 * @param mixed $object   Object
 * @param mixed $property Property
 * @param mixed $module   Module
 * @return int
 */
function removeLinkedProperty($object, $property, $module)
{
   $sqlQuery = "SELECT *
                  FROM pvalues
                 WHERE ID = '" . getValueIdByName($object, $property) . "'";

   $value = SQLSelectOne($sqlQuery);

   if ($value['ID'])
   {
      if (!$value['LINKED_MODULES'])
      {
         $tmp = array();
      }
      else
      {
         $tmp = explode(',', $value['LINKED_MODULES']);
      }

      if (in_array($module, $tmp))
      {
         $total = count($tmp);
         $res   = array();
         
         for ($i = 0; $i < $total; $i++)
         {
            if ($tmp[$i] != $module)
            {
               $res[] = $tmp[$i];
            }
         }

         $tmp = $res;

         $value['LINKED_MODULES'] = implode(',', $tmp);
         
         SQLUpdate('pvalues', $value);
      }
   }
   else
   {
      return 0;
   }
}
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение skysilver » Пт дек 21, 2018 3:41 pm

Lerych писал(а):
Чт дек 20, 2018 10:11 pm
Ну так значит это баг системы, если при удалении записи в MQTT остаются связи с объектом? Так?
Баг. Но не системы, а конкретных модулей. Модуль обязан следить за привязкой/отвязкой свойств и проставлять/удалять этот флаг линка.

Мои модули таким не страдают. По остальным нужно отписывать авторам.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение Lerych » Пт дек 21, 2018 6:24 pm

Хотите сказать модуль MQTT от Сергея обладает таким багом? ;)
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение tarasfrompir » Пт дек 21, 2018 6:25 pm

Lerych писал(а):
Пт дек 21, 2018 6:24 pm
Хотите сказать модуль MQTT от Сергея обладает таким багом? ;)
Ты поройся и будеш удивлен.... :!: :!: :!:
Спасибо нам ПОМОЖЕТ..!
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение Lerych » Пт дек 21, 2018 6:34 pm

Не буду, верю. Подскажи лучше, как вывести эти линки. Xor писал про removeLinkedProperty, как её использовать? Или прямо в startup_maintenance.php вставить то, что выше писал
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение skysilver » Пт дек 21, 2018 7:02 pm

Lerych писал(а):
Пт дек 21, 2018 6:24 pm
Хотите сказать модуль MQTT от Сергея обладает таким багом? ;)
Все идет именно к этому. )
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

Re: Как подчистить базу от линков (linked to) в свойствах объекта

Сообщение skysilver » Пт дек 21, 2018 7:07 pm

Lerych писал(а):
Пт дек 21, 2018 6:34 pm
Не буду, верю. Подскажи лучше, как вывести эти линки. Xor писал про removeLinkedProperty, как её использовать? Или прямо в startup_maintenance.php вставить то, что выше писал
Вызывается с параметрами - Имя объекта, Имя свойства, Системное имя модуля, от которого нужно отвязать.

Код: Выделить всё

removeLinkedProperty('Имя_объекта', 'Имя_свойства', 'Системное_имя_модуля');
Вызывать столько раз, сколько свойств нужно отвязать от конкретного модуля. Одной строчкой ни в startup_maintenance, ни где либо еще тут не отделаться.
За это сообщение автора skysilver поблагодарили (всего 2):
Lerych (Пт дек 21, 2018 7:46 pm) • Afeck (Пн сен 14, 2020 4:35 am)
Рейтинг: 2.33%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Ответить