Страница 2 из 2
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Чт дек 20, 2018 11:46 pm
Lerych
А ещё можно пользоваться штатной функцией removeLinkedProperty($object, $property, $module)
А как бы эту функцию запихать, например, в сценарий
systemMaintenance. Поможет избываться от пустых линков в дальнейшем? Как думаете?
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Чт дек 20, 2018 11:55 pm
Lerych
Или прямо в 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);
}
}
}
}
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 12:03 am
xor
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;
}
}
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 3:41 pm
skysilver
Lerych писал(а): Чт дек 20, 2018 10:11 pm
Ну так значит это баг системы, если при удалении записи в MQTT остаются связи с объектом? Так?
Баг. Но не системы, а конкретных модулей. Модуль обязан следить за привязкой/отвязкой свойств и проставлять/удалять этот флаг линка.
Мои модули таким не страдают. По остальным нужно отписывать авторам.
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 6:24 pm
Lerych
Хотите сказать модуль MQTT от Сергея обладает таким багом?

Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 6:25 pm
tarasfrompir
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 6:34 pm
Lerych
Не буду, верю. Подскажи лучше, как вывести эти линки. Xor писал про removeLinkedProperty, как её использовать? Или прямо в startup_maintenance.php вставить то, что выше писал
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 7:02 pm
skysilver
Lerych писал(а): Пт дек 21, 2018 6:24 pm
Хотите сказать модуль MQTT от Сергея обладает таким багом?
Все идет именно к этому. )
Re: Как подчистить базу от линков (linked to) в свойствах объекта
Добавлено: Пт дек 21, 2018 7:07 pm
skysilver
Lerych писал(а): Пт дек 21, 2018 6:34 pm
Не буду, верю. Подскажи лучше, как вывести эти линки. Xor писал про removeLinkedProperty, как её использовать? Или прямо в startup_maintenance.php вставить то, что выше писал
Вызывается с параметрами - Имя объекта, Имя свойства, Системное имя модуля, от которого нужно отвязать.
Код: Выделить всё
removeLinkedProperty('Имя_объекта', 'Имя_свойства', 'Системное_имя_модуля');
Вызывать столько раз, сколько свойств нужно отвязать от конкретного модуля. Одной строчкой ни в startup_maintenance, ни где либо еще тут не отделаться.