Биллинговая система Nodeny

Главная категория => Nodeny 50 => Тема начата: whix от 14 Октября 2012, 21:01:41



Название: Как добавить вручную мак через sql?
Отправлено: whix от 14 Октября 2012, 21:01:41
Пдскажите плиз, как через sql добавить вручную мак адрес в доп поле?
Через dopdata или dopvalues лучше?
И откуда взять значение ревизии
Скрипт на баше


Название: Re: Как добавить вручную мак через sql?
Отправлено: stix от 14 Октября 2012, 21:06:41
через dopvalues
dopdata это view

50.33, от 50.32 вроде как отличается как раз свойствами ревизий.


Название: Re: Как добавить вручную мак через sql?
Отправлено: stix от 15 Октября 2012, 14:21:03
вот кстати нашел by Efendy

Цитировать
Ревизия должна быть уникальна не только в пределах одного юзера, а для всех клиентов. В самом NoDeny номер ревизии формируется таким образом: в dopvalues вставляется пустая запись (parent_id=0). Mysql после вставки возвращает last_insert_id, который берется из поля line_id - это и есть номер ревизии. С этим номером вставляются все данные для текущего клиента, удаляется пустая запись. Такая схема используется для того, чтобы гарантировать уникальность ревизии т.к. если сделать select max(revision)+1, а потом делать Insert, то если параллельно какой-либо админ сделает ту же самую операцию, то с некоторой вероятностью мог бы возникнуть конфликт ревизий.

Если же переносить данные из другого биллинга, то можно завести переменную "номер ревизии" и инкрементить ее после вставки блока данных для каждого юзера.

Важно. Схема с ревизиями замедляет работу, поэтому в 49.33 и 50.33 ревизий нет в dopvalues, т.е в этой таблице всегда актуальные значения. А ревизии хранятся в другой таблице, которая нужна чисто для  history. 50.32 и 50.33 практически только этим и отличаются


Название: Re: Как добавить вручную мак через sql?
Отправлено: whix от 17 Октября 2012, 09:26:48
Спасибо, но так мне понял, как ревизию сделать
Версия 50.19 еще


Название: Re: Как добавить вручную мак через sql?
Отправлено: 0xbad0c0d3 от 17 Октября 2012, 11:15:52
Код:
sub insert_dd{
        my %dopdata = %{$_[0]};
        &sql_do($dbh,"INSERT INTO dopvalues SET parent_id=0,time=0") > 0 && do{
                $rev = $dbh->{'mysql_insertid'};
                &sql_do($dbh,"DELETE FROM dopvalues WHERE line_id=$rev AND parent_id=0 AND time=0");
        };
        $rev or return 0;
        &sql_do($dbh,"INSERT INTO dopvalues VALUES ".join(',',map{
                "(NULL,$nd_id,$_,$dopdata{$_},0,unix_timestamp(),$rev)";
        } keys %dopdata));
}
пример использования:
Код:
&insert_dd({
        4 => '00:11:22:33:44:55'
});
4 - ID поля допданных с алиасом '_mac' по умолчанию.
Данная ф-я вставляет данные в допполя, и если во входных параметрах будет только поле 4, то, в результате, все остальные данные шаблона, в котором находится поле 4 уйдут в историю, т.е. станут неактуальными.


Название: Re: Как добавить вручную мак через sql?
Отправлено: stix от 17 Октября 2012, 11:48:08
на PHP я делал так:
$id и $mac передаются как локальные переменные в функцию
правда adminid не учитывается

Код:
mysql_query("INSERT INTO dopvalues SET parent_id=0");
$new_rev=mysql_insert_id();
mysql_query("INSERT INTO dopvalues SELECT NULL,'$uid',id,'$mac',0,UNIX_TIMESTAMP(),'$new_rev' FROM dopfields WHERE field_alias='_mac' LIMIT 1");
mysql_query("DELETE FROM dopvalues WHERE line_id=$new_rev AND parent_id=0");


Название: Re: Как добавить вручную мак через sql?
Отправлено: whix от 17 Октября 2012, 14:09:09
Спасибо, получилось!


Название: Re: Как добавить вручную мак через sql?
Отправлено: stix от 27 Февраля 2013, 11:32:54
на всякий случай напишу.
при такой вставке в новую ревизию добавится только мак, если были старые значения, они в новую ревизию не перейдут. а останутся в старой.