<?

function LOGS(){ if (!is_object($GLOBALS['logs'])) $GLOBALS['logs']=new c_logs();return($GLOBALS['logs']);}

// класс для логгирования процессов
// name - название процесса, например mo_session или trip
// reg - логгирует событие
// flush - сбрасывает лог на диск по указанным именем. Возвращает имя лог файла
// LOG_JSON('name')->reg('event_name','event_content',array('data'=>$data)) ;
// LOG_JSON('name')->flush('event_name_22') ;
function LOG_JSON($theme=''){ if (!is_object($GLOBALS['log_json_'.$theme])) $GLOBALS['log_json_'.$theme]=new c_json_logs($theme);return($GLOBALS['log_json_'.$theme]);return(new c_json_logs('aaa'));}

class c_json_logs
{
    var $log_json=array();
    var $theme='';

    public function __construct($theme)
    {
      $this->theme=$theme ;
    }

	function reg($event_name,$text='',$options=array())
    {   $rec['time']=time() ;
        $rec['event']=$event_name ;
        $rec['text']='' ;
        if ($options['data'])
        {   ob_start() ;
            damp_array($options['data'],1,-1) ;
            $rec['text']=ob_get_clean() ;
            //$rec['data']=$options['data'] ;
        }
        $rec['text'].=$text ;
        $this->log_json[]=$rec ;
    }

    function log_file_exists($log_fname)
    {
        $fname=$log_fname.'.json' ;
        $fdir=_DIR_TO_ROOT.'/logs/'.$fname ;
        $result=file_exists($fdir) ;
        return($result) ;
    }

    function flush($log_fname,$options=array())
    {   $fname=$log_fname.'.json' ;
        $fdir=_DIR_TO_ROOT.'/logs/'.$fname ;
        $log_lines=(file_exists($fdir))? json_decode(file_get_contents($fdir),1):array() ;
        if (_sizeof($this->log_json)) foreach($this->log_json as $rec) $log_lines[]=$rec ;
        $cont=json_encode($log_lines,JSON_UNESCAPED_UNICODE) ;
        if (file_exists($fdir)) unlink($fdir) ;
        $res=file_put_contents(_DIR_TO_ROOT.'/logs/'.$fname,$cont) ;
        $this->log_json=array() ;
        //LOGS()->reg_log('json_logs_flush',$log_fname) ;
        $log_fname='/cab/log/[fname='.$fname.']/' ;
        if ($options['reg_log'])
        {   $comment='' ;
            if ($options['comment']) $comment=$options['comment'].'<br>' ;
            $comment.='<a href="'.$log_fname.'" target=_blank>Лог</a>' ;
            LOGS()->reg_log($this->theme,$comment,$options) ;
        }
        return($log_fname) ;
    }

    function view($log_fname)
    {  if (file_exists($log_fname))
        {
            $cont=file_get_contents($log_fname) ;
            $arr=json_decode($cont,1) ;
            $i=0 ;
            ?><table class="basic fz_small full auto">
                <tr>
                    <th>№</th>
                    <th>Дата/Время</th>
                    <th>Событие</th>
                    <th>Содержание</th>
                    <th>Данные</th>
                </tr>
              <? if (_sizeof($arr)) foreach($arr as $rec)
              { $i++ ;
                ?><tr>
                    <td><?echo $i?></td>
                    <td><?echo date('d.m.Y H:i:s',$rec['time'])?></td>
                    <td class="center"><?echo $rec['event']?></td>
                    <td class="left"><?echo $rec['text']?></td>
                    <td><?if (is_array($rec['data'])) damp_array($rec['data'],1,-1)?></td>
                  </tr>
                <?
              }
              ?>
              </table><?
        }
        else echo 'Файл не найден: <strong>'.$log_fname.'</strong><br>' ;

    }

}

class c_logs
{

     var $table_name='obj_site_mo_log' ;

      function __construct()
      {
        $this->table_name=($GLOBALS['LS_log_now_enabled'])? 'obj_site_mo_log_now':'obj_site_mo_log' ;
      }

    //==========================================================================================================================================================================
    // ЖУРНАЛ СОБЫТИЙ
    //==========================================================================================================================================================================

    // добавляем запись по МО в таблицу, возвращает id записи
    function reg_log($name,$comment,$options=array())
      { if ($options['start'])
        {  $t=$options['start'] ;
           $options['time_exec']=fixed_time($t) ;
        } else $t=time() ;
        $rec['c_data']=$t ;
        $rec['с_data2']=date('Y-m-d H:i:s',$t) ;
        $rec['clss']=251 ;
        $rec['obj_name']=$name ;
        $rec['IP']=IP ;
        $rec['indx']=1 ;
        $rec['account_id']=0 ; // default value
        if ($GLOBALS['LS_debug_mode']) $rec['request_uid']=_REQUEST_UID ; // default value
        if ($comment)                       $rec['comment']=$comment ;
        if (isset($options['terminal_id'])) $rec['terminal_id']=$options['terminal_id'] ;
        if (isset($options['terminal_ip'])) $rec['terminal_ip']=$options['terminal_ip'] ;
        if (isset($options['terminal'])) {  $rec['terminal_id']=$options['terminal']['id'] ; $rec['terminal_ip']=$options['terminal']['ip'] ; }
        if (isset($options['time_exec']))   $rec['time_exec']=$options['time_exec'];
        if (isset($options['mo']))          $rec['mo_id']=$options['mo']['pkey'] ;
        if (isset($options['mo_id']))       $rec['mo_id']=$options['mo_id'] ;
        if (isset($options['personal_id'])) $rec['personal_id']=$options['personal_id'] ;
        if (isset($options['member_id']))   $rec['personal_id']=$options['member_id'] ;      // устарело, на удаление
        if (isset($options['member']))      $rec['personal_id']=$options['member']['pkey'] ; // устарело, на удаление
        if (isset($options['personal']))    $rec['personal_id']=$options['personal']['pkey'] ;
        if (isset($options['data']))        $rec['data']=$options['data'] ;
        if (isset($options['account_id']))  $rec['account_id']=$options['account_id'] ;
        elseif (MEMBER()->id)               $rec['account_id']=MEMBER()->id ;
          // сохранение файла лога через опцию save_to_file
          if ($options['save_to_file'])
          {$log_fname=$this->reg_file_log(safe_file_names($name),$options['save_to_file']) ;
           $file_url_download=str_replace(array('[fname=',']'),'',basename($log_fname)) ;
           $file_url_download='<a href="/services/get_log/?fname='.$file_url_download.'" target=_blank>Скачать</a>' ;
           $file_url='<a href="'.$log_fname.'" target=_blank>отчет</a>, '.$file_url_download ;
             $rec['comment'].='<br>'.$file_url ;
          }

        if (is_string($options['reffer']) and $options['reffer']!="") $rec['reffer1']=$options['reffer'] ;
        if (is_string($options['reffers']) and $options['reffers']!="") $rec['reffer1']=$options['reffers'] ;
        if (is_array($options['reffers']) and _sizeof($options['reffers'])) foreach($options['reffers'] as $id=>$reffer) $rec['reffer'.($id+1)]=$reffer ;
        //return_id
        if (!isset($options['no_return_id'])) $options['no_return_id']=1 ;
        $options['no_auto_indx']=1 ;
        $options['no_return_id']=1 ;
        $options['debug']=0 ;
        if ($options['use_multiSQL_insert']) multiSQL_insert($this->table_name)->append($rec) ;
        else  adding_rec_to_table($this->table_name,$rec,$options) ;
        return(1) ;
      }


    // добавляем запись по МО в таблицу, возвращает id записи
    function reg_file_log($name,$cont,$options=array())
      {  $ext=($options['ext'])? $options['ext']:'html' ;
         if (!$options['no_append_time']) $name.='_'.ENGINE()->generate_UID().'.'.$ext ;
         $fname=_DIR_TO_ROOT.'/logs/'.$name ;
         $cont_prev=($options['append_to_file'] and file_exists($fname))? file_get_contents($fname):'' ;
         file_put_contents($fname,$cont_prev.$cont) ;
         if ($options['return_logfname']) return(hide_server_dir($fname)) ;
         else return('/cab/log/[fname='.$name.']/') ;
      }

     // возвражает журнал событий для проекта/задания
         function get_log_events($options=array())
         { $_usl=array('clss=251') ;
           if ($options['mo_id']) $_usl[]='mo_id='.$options['mo_id'] ;
           if ($options['personal_id']) $_usl[]='(user_id='.$options['personal_id'].' or member_id='.$options['personal_id'].')' ;
           if ($options['terminal_id']) $_usl[]='terminal_id='.$options['terminal_id'] ;
           if ($options['reffer']) $_usl[]='(reffer1='.$options['reffer'].' or reffer2='.$options['reffer'].' or reffer3='.$options['reffer'].' or reffer4='.$options['reffer'].' or reffer5='.$options['reffer'].')';
           if ($options['cmd']) $_usl[]='obj_name="'.$options['cmd'].'"' ;
           if ($options['text']) $_usl[]='(comment like "%'.$options['text'].'%" or data like "%'.$options['text'].'%")' ;

           $usl=implode(' and ',$_usl) ;
           $order=($options['order'])? $options['order']:' pkey desc' ;
           $recs=execSQL('select * from '.ENGINE()->table_mo_log.' where '.$usl.' order by '.$order.' limit 500') ;
           return($recs) ;
         }

    //==========================================================================================================================================================================
    // МОНИТОР
    //==========================================================================================================================================================================

     function get_last_monitor_mess_id($group=0)
     {   /*$usl_group=($group and isset(ACCOUNTS()->tree[$group]))? ' and grp in ('.ACCOUNTS()->tree[$group]->get_list_child().')':'' ;
         $last_id=execSQL_value("SELECT max(pkey) as pkey from obj_site_mess where clss=260 ".$usl_group) ;
         return($last_id) ;
        */
     }

     function get_last_monitor_mess_id_HTML($group=0)
     {   $last_id=execSQL_value("SELECT temp  from obj_site_account where pkey=".$group) ;
         return($last_id) ;
     }


    function reg_monitor_mess($group,$arr_mess,$options=array())
         {   //$arr_mess=str_replace('15.25.35.1','dev.kvzrm.ru',$arr_mess) ;
             //adding_rec_to_table('obj_site_mess',array('clss'=>260,'parent'=>$group,'grp'=>$group,'obj_name'=>$arr_mess),array('no_return_id'=>1,'no_auto_indx'=>1)) ;
             // пишем событие для HTML версии

             //$event_id=execSQL_value('select lastEventID from obj_site_skd where pkey='.$group,2) ;
             //$event_id++ ;
             $event_fname='' ;
             if ($options['save_html_file'])
             { //execSQL_update('update obj_site_skd set lastEventID='.$event_id.' where pkey='.$group,array('debug'=>1)) ;
               ob_start() ;
               $event_id=$arr_mess['event_id'] ;
                 //if (!$event_id) trace() ;
               //$event_fname='evt_'.$group.'_'.$event_id.'.json' ;
               //echo '$event_fname='.$event_fname.'<br>' ;
               //$cnt=file_put_contents(_TEMP_DIR.'monitor/'.$event_fname,json_encode($arr_mess)) ;
               $event_fname='evt_'.$group.'_'.$event_id.'.html' ;
               echo '$event_fname='.$event_fname.'<br>' ;
               $cnt=file_put_contents(_TEMP_DIR.'monitor/'.$event_fname,$arr_mess['event_card']) ;
               $text=ob_get_clean() ;
               //LOGS()->reg_log('reg_monitor_mess',$text,array('reg'=>1)) ;
             }

             /*if ($options['save_to_redis_monitor'])
             { try
               {
                   $redis = new Redis();
                   $redis->connect('localhost');
                   $redis->set('mon_'.$group,json_encode($arr_mess),30);
               }
               catch(RedisException $e)
               {
                   //exit('Connect error');
               }
             }  */
             //LOGS()->reg_log('reg_monitor_mess',print_r($options,true),array('reg'=>1,'data'=>$options)) ;
             return($event_fname) ;

         }


     function get_monitor_mess($group,$from_id)
     { /*$recs=array() ;
       if ($group and isset(ACCOUNTS()->tree[$group]))
       { $usl_group=' and grp in ('.ACCOUNTS()->tree[$group]->get_list_child().')' ;
         $recs=execSQL('select pkey,obj_name from obj_site_mess where clss=260 and pkey>'.$from_id.' '.$usl_group,2) ;
         if (_sizeof($recs)) foreach($recs as $i=>$rec) $recs[$i]['_data']=unserialize($rec['obj_name']) ;

       }
       return($recs) ;
       */
     }

    //==========================================================================================================================================================================
     // РАБОТА С ЖУРНАЛОМ ОБМЕНА
     //==========================================================================================================================================================================

     // добавляем запись по звпросу в таблицу, возвращает id записи
     // IP1 - откуда запрос
     // IP2 - куда запрос
     function log_request($IP1,$IP2,$cmd,$mess1='',$mess2='',$options=array())
       { $rec['r_data']=time() ;
         $rec['clss']=253 ;
         $rec['cmd']=$cmd ;
         $rec['IP1']=$IP1 ;
         //$rec['IP1']=substr($IP1,12) ;
         $rec['IP2']=$IP2 ;

         if ($options['terminal_id']) $rec['terminal_id']=$options['terminal_id'] ;
         if ($options['personal_id']) $rec['personal_id']=$options['personal_id'] ;
         if ($options['status'])      $rec['status']=$options['status'] ;
         if ($options['time_exec'])       $rec['time_exec']=$options['time_exec'] ;
         if ($options['size1'])       $rec['size1']=$options['size1'] ;
         if ($options['size2'])       $rec['size2']=$options['size2'] ;
         if ($options['mo_id']) $rec['mo_id']=$options['mo_id'] ;
         if ($options['event_id'])    $rec['evt_id']=$options['event_id'] ;
         if ($options['debug_text']) $rec['debug_text']=$options['debug_text'] ;
         if ($options['req_url']) $rec['req_url']=$options['req_url'] ;
         if ($options['req_type']) $rec['req_type']=$options['req_type'] ;
         if ($options['content_type1']) $rec['content_type1']=$options['content_type1'] ;
         if ($options['content_type2']) $rec['content_type2']=$options['content_type2'] ;
         if ($options['temp']) $rec['temp']=$options['temp'] ;
         $rec['UID']=($options['request_UID'])? $options['request_UID']:ENGINE()->generate_UID() ;


         if (_sizeof($options['reffers'])) foreach($options['reffers'] as $id=>$reffer) $rec['reffer'.($id+1)]=$reffer ;

         //execSQL_update('delete LOW_PRIORITY from '.$this->table_mo_req.' where clss=253)
         //if ($options['req_id']) { update_rec_in_table(ENGINE()->table_mo_req,$rec,'pkey='.$options['req_id']) ; $req_id=$options['req_id'] ; }
         //else
         adding_rec_to_table_fast(ENGINE()->table_mo_req,$rec,array('no_return_id'=>1)) ;

         if ($mess1) LOGS()->reg_file_log($rec['UID'].'_in.html',$mess1,array('no_append_time'=>1)) ;
         if ($mess2) LOGS()->reg_file_log($rec['UID'].'_out.html',$mess2,array('no_append_time'=>1)) ;
         if ($options['request_debug'])
         {  $text=ENGINE()->get_html_doc_content($options['request_debug']) ;
            $trace_fname=$rec['UID'].'_request_debug.html' ;
            LOGS()->reg_file_log($trace_fname,$text,array('no_append_time'=>1,'append_to_file'=>0)) ;
         }

         //return($req_id) ;
       }

       // добавляем запись по звпросу в файл, возвращает id записи
      function logf_request($fname,$IP1,$IP2,$uri,$cmd,$mess1,$mess2)
       { ob_start() ;
           echo "URI:".$uri."\n"  ;
           echo "IP1:".$IP1."\n"  ;
           echo "IP2:".$IP2."\n"  ;
           echo "cmd:".$cmd."\n"  ;
           echo "------------------------------------------------------------------------------------------\n" ;
           print_r($mess1) ;
           echo "------------------------------------------------------------------------------------------\n" ;
           print_r($mess2) ;
         $text=ob_get_clean() ;
         $flog_name='/logs/log_'.$fname.'.txt' ;
         file_put_contents(_DIR_TO_ROOT.$flog_name,$text) ;


         //$id=adding_rec_to_table(ENGINE()->table_mo_req,$rec) ;
         return($flog_name) ;
       }

      // возвражает журнал событий для проекта/задания
      function get_log_request($options=array())
      { $limit=($options['count'])? $options['count']:100 ;
        //damp_array($options) ;
        $_usl[]='clss=253' ;
        if ($options['personal_id']) $_usl[]='personal_id='.$options['personal_id'] ;
        if ($options['personal_reffer']) $_usl[]='(reffer1="'.$options['personal_reffer'].'" or '.
                                                 ' reffer2="'.$options['personal_reffer'].'" or '.
                                                 ' reffer3="'.$options['personal_reffer'].'" or '.
                                                 ' reffer4="'.$options['personal_reffer'].'" or '.
                                                 ' reffer5="'.$options['personal_reffer'].'")' ;
        if ($options['mo_id']) $_usl[]='mo_id='.$options['mo_id'] ;
        if ($options['terminal_id']) $_usl[]='terminal_id='.$options['terminal_id'] ;
        if ($options['cmd']) $_usl[]='cmd="'.$options['cmd'].'"' ;
        if ($options['text']) $_usl[]='(mess1 like "%'.$options['text'].'%" or mess2 like "%'.$options['text'].'%")' ;
        $usl=implode(' and ',$_usl) ;
        //if ($options['mo'])
        $recs=execSQL('select * from '.ENGINE()->table_mo_req.' where '.$usl.' order by pkey desc limit '.$limit) ;
        return($recs) ;
      }


    function clear_jurnals_fast($options=array())
    {
        $this->clear_jurnals(array('fast_clear'=>1)) ;
    }

    function clear_jurnals($options=array())
     {  ob_start() ;
        $stats=array() ;
         $options['fast_clear']=1 ;

        ?><h3>Производим очистку журналов</h3><?
        $now=getdate() ;  $cnt_all=0 ;
        $from_time=mktime(0,0,0,$now['mon'],$now['mday']-1,$now['year']);

        $cnt=execSQL_update('delete LOW_PRIORITY from log_site_pages where c_data<'.$from_time) ; $cnt_all+=$cnt ;
        if ($cnt) echo 'Удалено <strong>'.$cnt.'</strong> записей журнана страниц<br>' ;
        $cnt=execSQL_update('delete LOW_PRIORITY from obj_site_req_log where c_data<'.$from_time) ;  $cnt_all+=$cnt ;
        if ($cnt) echo 'Удалено <strong>'.$cnt.'</strong> записей журнана обмена<br>' ;
        //$cnt=execSQL_update('delete LOW_PRIORITY from obj_site_mess where c_data<'.$from_time) ;     $cnt_all+=$cnt ;
        //if ($cnt) echo 'Удалено <strong>'.$cnt.'</strong> записей журнана событий мониторинга<br>' ;
        // журнал ошибок и журнал долгих SQL запросов должны храниться месяц
        $from_time_month=mktime(0,0,0,$now['mon']-1,$now['mday'],$now['year']);
        $cnt=execSQL_update('delete LOW_PRIORITY from log_site_errors where c_data<'.$from_time_month) ;  $cnt_all+=$cnt ;
        if ($cnt) echo 'Удалено <strong>'.$cnt.'</strong> записей журнана ошибок<br>' ;
        $cnt=execSQL_update('delete LOW_PRIORITY from log_site_sql where c_data<'.$from_time_month) ;    $cnt_all+=$cnt ;
        if ($cnt) echo 'Удалено <strong>'.$cnt.'</strong> записей журнана SQL-запросов<br>' ;

        if (!$cnt_all) echo 'Данных для очистки нет<br>' ;

        if (function_exists('PP')) execSQL_update('update obj_site_narko_data set rightEye=NULL,leftEye=NULL where c_data<'.$from_time) ;

 ?><h3>Производим очистку журнала событий</h3><?
        // очищаем журнал событий
        $arr_events=array() ;
        // события, связанные с терминалами
        $arr_events[1][]='terminal_save' ;
        $arr_events[1][]='Изменение данных терминала' ;
        $arr_events[1][]='Отправлена команда терминалу' ;
        $arr_events[30][]='Включение терминала' ;
        $arr_events[1][]='Асинхронная команда терминалу' ;
        $arr_events[1][]='check_status' ;
        $arr_events[1][]='Команда с интерфейса' ;
        $arr_events[1][]='Пропуск команды терминалу' ;
        $arr_events[30][]='Переход в режим неисправности' ;
        $arr_events[30][]='power_on' ;
        $arr_events[30][]='Проверка терминала при check_access' ;
        $arr_events[1][]='get_greetings_for_terminal' ;
        $arr_events[30][]='terminal_send_data' ;
        $arr_events[30][]='terminal_save_chech_status' ;

        // МО
        $arr_events[1][]='copy_mo_from_now' ;
        $arr_events[2][]='open_mo_session' ;
        $arr_events[2][]='mo_session' ;
        $arr_events[2][]='Оценка результатов по критериям' ;
        $arr_events[2][]='check_access' ;
        $arr_events[2][]='check_therm_value' ;
        $arr_events[2][]='check_personal_access' ;
        $arr_events[2][]='Окончание медосмотра' ;
        $arr_events[2][]='check_doctor' ;
        $arr_events[2][]='Автодопуск сотрудника' ;
        $arr_events[2][]='Автонедопуск сотрудника' ;
        $arr_events[2][]='Начало ручного медосмотра' ;
        $arr_events[2][]='check_osmotr' ;
        $arr_events[7][]='Ручной медосмотр' ;
        $arr_events[7][]='Перевод МО в статус Уклонился' ;
        $arr_events[7][]='on_event_examination_result' ;
        $arr_events[7][]='check_max_DD_count' ;

        // Документы и ЭЦП
        $arr_events[7][]='HTML2PDF' ;
        $arr_events[7][]='Подписание документа' ;
        $arr_events[7][]='crypropo' ;
        $arr_events[7][]='debug_save_signature' ;
        $arr_events[30][]='on_event_save_doc_signature' ;
        $arr_events[30][]='on_event_save_doc_signature2' ;
        $arr_events[7][]='debug_signature' ;
	$arr_events[1][]='scan_capture_end' ;


        // Импорт-Экспорт данных
        $arr_events[7][]='import_pass_from_skud' ;
        $arr_events[7][]='push_mo_async' ;
        $arr_events[7][]='personal_upload_xls' ;
        // Авторизация
        $arr_events[30][]='check_AD_user' ;
        $arr_events[30][]='AD.check_AD_user' ;
        $arr_events[90][]='ACCOUNTS.member_autorize' ;
        $arr_events[90][]='ACCOUNTS/member_autorize' ;
        $arr_events[90][]='AD_autorize' ;
        $arr_events[90][]='Авторизация персонала' ;
        // сотрудник
        $arr_events[30][]='Автодобавление фото персонала' ;
        $arr_events[30][]='Показ сообщения сотруднику' ;
        // персонал
        $arr_events[30][]='Изменение данных персонала' ;
        // система
        $arr_events[1][]='timezone' ;
        $arr_events[1][]='doPut' ;
        $arr_events[1][]='Биллинг' ;
        $arr_events[30][]='Очистка журналов' ;
        $arr_events[1][]='Быстрая очистка журналов' ;
        $arr_events[1][]='event_lister' ;
        $arr_events[1][]='exec_crontab' ;
        $arr_events[1][]='create_viewer' ;


        $result=array() ;
        $limit=($options['fast_clear'] or 1)? ' limit 100000':'' ;
        if (_sizeof($arr_events)) foreach($arr_events as $day=>$arr_names)
        {   $from_time=mktime(0,0,0,$now['mon'],$now['mday']-$day,$now['year']);
            if (_sizeof($arr_names)) foreach($arr_names as $name)
            { //echo 'Удаляем событие "'.$name.'" - ' ;
	      FILE_LOG()->append('Удаляем событие "'.$name.'"') ;
              $res=execSQL_update('delete LOW_PRIORITY from obj_site_mo_log where obj_name="'.$name.'" and c_data<'.$from_time.$limit,array('return_result'=>1,'log_result'=>0,'title'=>'Удаляем событие "'.$name.'" до '.date('d.m.Y',$from_time))) ;
              //damp_array($res,1,-1) ;
              if ($res['count']) $result[]=array('name'=>$name,'from'=>date('d.m.Y',$from_time),'count'=>$res['count'],'time'=>round($res['exec_time'],6)) ;
              //if ($cnt) $result[$name]=$cnt  ;
		//echo $res['count'].' записей<br>' ;
	      FILE_LOG()->append('Удалено событие "'.$name.'", '.$res['count'].' записей<br>') ;
            }
        }
        if (_sizeof($result)) print_2x_arr($result) ;
        else echo 'Данных для очистки нет<br>' ;

        /*if (!$options['fast_clear'])
        { ?><h3>Оптимизация таблиц</h3><?
          $t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  log_site_pages') ; fixed_time($t,'Оптимизация log_site_pages') ;
          $t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  obj_site_req_log') ;  fixed_time($t,'Оптимизация obj_site_req_log') ;
          //$t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  obj_site_mess') ; fixed_time($t,'Оптимизация obj_site_mess') ;
          $t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  log_site_errors') ;  fixed_time($t,'Оптимизация log_site_errors') ;
          $t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  obj_site_narko_data') ;  fixed_time($t,'Оптимизация obj_site_narko_data') ;
          $t=fixed_time() ; execSQL_update('OPTIMIZE TABLE  obj_site_mo_log') ; fixed_time($t,'Оптимизация obj_site_mo_log') ;
        }*/

        if (!$options['fast_clear'])
         {   ?><h3>Статистика по журналам</h3><?
        $stats['Журнал событий']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from obj_site_mo_log')  ;
        $stats['Журнал страниц']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from log_site_pages')  ;
        $stats['Журнал обмена']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from obj_site_req_log')  ;
        $stats['Журнал ошибок']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from  log_site_errors')  ;
        $stats['Журнал SQL']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from  log_site_sql')  ;
        //$stats['Обновление мониторинга']=execSQL_van('select min(c_data) as c_data,max(c_data) as r_data,count(pkey) as cnt from  obj_site_mess')  ;
             print_2x_arr($stats) ;
         }


        $text=ob_get_clean()  ;
        echo $text ;
        $title=($options['fast_clear'])? 'Быстрая очистка журналов':'Очистка журналов' ;
        LOGS()->reg_log($title,$text) ;
     }

    function clear_jurnals2()
     {  $this->clear_jurnals(array('fast_clear'=>1)) ;
     }


    //==========================================================================================================================================================================
    // СОХРАНЕНИЕ И ВЫВОД ТРАССИРОВКИ
    //==========================================================================================================================================================================


    function save_time_trace()
        { global $__debug_sql_time,$__debug_sql_cnt ; ;
          ob_start() ;
          ?><h2><?echo $_SERVER['REQUEST_URI']?></h2><?
          ?><strong>POST</strong><?
          damp_array($_POST,1,-1) ;

          ?><div id=time_trace style="margin-left:50px;"><?
          show_time_line(2) ;

          $time=round($__debug_sql_time,4) ;
          echo '<br>Всего запросов:'.$__debug_sql_cnt.', время выполения: '.$time.'<br>' ;
          print_2x_arr($GLOBALS['sql_stats']) ;

          $list_files=get_included_files() ;
          echo '<br>Все подключенные файлы:'._sizeof($list_files) ;
          damp_array($list_files,1,-1,array('no_short_view'=>1)) ;

          ?></div><?

          ?><h2>SERVER</h2><?
          damp_array($_SERVER,1,-1) ;

          ?><h2>ACCOUNT</h2><?
          damp_array(MEMBER(),1,-1) ;

          $text=ENGINE()->get_html_doc_content(ob_get_clean()) ;
          $trace_fname='page_trace_'._REQUEST_UID.'.html' ;
          $this->reg_file_log($trace_fname,$text,array('no_append_time'=>1)) ;
          return($trace_fname) ;
        }

    // сохранение в базу информации по показанной странице
     function logging_pages_info($options)
       { //global $log_pages_for_system_ip,$log_pages_robots ;
         // статистика не собирается если:
         //if (_IS_SYSTEM_IP and !$log_pages_for_system_ip) return ; // клиент в списке своих - в журнал не сохраняем
         //if (!$GLOBALS['LS_log_pages']) return ;  // выключен сбор статистики
         //if (!$log_pages_robots and $GLOBALS['flags']['is_robot']) return ;  		// выключен сбор статистики по роботам
         if (_ENGINE_MODE=='admin') return ;                  // находясь в админке
         if ($_POST['cmd']=='get_cur_time') return ;   // не логгируем эти страницы
         //if ($options['no_reg_in_log_pages']) return ;        // прямой запрет
         //if ($_SESSION['SES_trace_SQL'])
         $GLOBALS['debug_db']=0 ;

         // делаем расчет числовых параметров генерации страницы
         global $__times,$__memory,$__debug_sql_cnt,$__debug_sql_time,$robot_sess_name ;
         if (_sizeof($__times)) { $start_time=reset($__times) ;  $last_time=end($__times) ; $gen_time=round($last_time-$start_time,6) ;  } else  $gen_time=0 ;
         if (_sizeof($__memory)) $last_mem=end($__memory) ; else $last_mem=0 ;
         if (!$__debug_sql_cnt) $__debug_sql_cnt=0 ;

         $url_from=addslashes(mb_substr(urldecode($_SERVER['HTTP_REFERER']),0,256)) ;
         $reffer_text_find=get_se_query($url_from) ;

         $info=array(		'clss'		    =>	50,
          					'c_data'		=>	time(),
          					'ip'			=>	IP,
      	     				'obj_name'      =>  MEMBER()->name,
      	     				'reffer'		=>	$GLOBALS['obj_info']['_reffer'],
      	     				'session_id'	=>  ($GLOBALS['flags']['is_robot'])? $robot_sess_name:session_id(),
      	     				'url_from'		=>	str_replace("'","&#039",$url_from),
      	     				'search_text'	=>  $reffer_text_find,
      	     				'user_agent'	=>  $_SERVER['HTTP_USER_AGENT'],
      	    				'time_gen'		=>	$gen_time,
      	    				'mem_size'		=>	$last_mem,
      	    				'sql_cnt'		=>  $__debug_sql_cnt,
      	    				'sql_time'		=>  round($__debug_sql_time,4),
      	    				'session_time'	=>  round($GLOBALS['t_open_session'],4),
      	    				'include_time'	=>  round($GLOBALS['t_include_script'],4),
      	    				'script_count'	=>  _sizeof(get_included_files()),
      	    				'is_reboot'		=>	($GLOBALS['flags']['is_reboot'])? 1:0,

      	    				'server_ip'		=>	$_SERVER['SERVER_ADDR'],
      	    				'db_node'		=>	(int)getenv('NODE_ID'),


      	    			) ;

        if (is_object($GLOBALS['cur_page']))
        { $info['url']=$GLOBALS['cur_page']->SEO_url ;
          if (!$info['url']) $info['url']=$_SERVER['REQUEST_URI'] ;
          if ($_POST['ext'] and $_POST['cmd']) $info['url'].=' ['.$_POST['ext'].'/'.$_POST['cmd'].']' ;
          elseif ($_POST['cmd'])            $info['url'].=' ['.$_POST['cmd'].']' ;
         // $info['obj_name']=$GLOBALS['cur_page']->title ;

          //$info['use_cache']=($GLOBALS['cur_page']->result ;
          //$info['page_keywords']=$GLOBALS['cur_page']->keywords ;
          //$info['page_description']=$GLOBALS['cur_page']->description ;
        }

        if ($options['page_trace_fname']) $info['page_trace_fname']=$options['page_trace_fname'] ;

        if ($_COOKIE['GeoIP_info']) {$info['country']=$_COOKIE['GeoIP_country'] ; $info['city']=$_COOKIE['GeoIP_city'] ; }

         global $partners_system,$partner_uid ; if (isset($partners_system) and $partner_uid)  $info['partner_uid']=$partner_uid ;
         ob_start() ;
         adding_rec_to_table_fast(TM_LOG_PAGES,$info,array('no_default_fields'=>1,'no_return_id'=>1)) ;
         $text=ob_get_clean() ;
       }



  //==========================================================================================================================================================================
  // ОПЕРАТИВНАЯ ТАБЛИЦА СОБЫТИЙ
  //==========================================================================================================================================================================

  function log_now_enabled()
      {  ob_start() ;
         ?><strong>Включение оперативной таблицы:</strong><?
         // производим очистку оперативной таблицы
         $this->clear_log_from_now() ;
         // производим копирование данных по глубине ОТ
         $this->copy_log_to_now() ;
         // включаем задание планировщика
         SETUP()->change_cron_status('ENGINE/copy_log_from_now',1) ;
         // включаем использование оперативной таблицы
         SETUP()->update_site_setting('LS_log_now_enabled',1) ;
         // перегружаем систему
         reboot_engine() ;
         //echo 'ESMO.table_mo_sessions_now='.$this->table_mo_sessions_now.'<br>' ;
         //echo 'ESMO.view_mo_session_now='.$this->view_mo_session_now.'<br>' ;
         $text=ob_get_clean() ;
         LOGS()->reg_log('Оперативная таблица лога',$text) ;
         echo $text ;
      }

    function log_now_disabled()
    {  ob_start() ;
       ?><strong>Выключение оперативной таблицы:</strong><?
       // производим копирование данных по глубине ОТ
       $this->copy_log_from_now() ;
       // производим очистку оперативной таблицы
       $this->clear_log_from_now() ;
       // выключаем задание планировщика
       SETUP()->change_cron_status('ENGINE/copy_log_from_now',0) ;
       // включаем использование оперативной таблицы
       SETUP()->update_site_setting('LS_log_now_enabled',0) ;
       // перегружаем систему
       reboot_engine() ;
       $text=ob_get_clean() ;
       LOGS()->reg_log('Оперативная таблица лога',$text) ;
       echo $text ;
    }

  // перенос данных по МО из оперативной таблицы в основную
  // внимаение! требуется исправление в engine - добавлена опция no_reffers
  function copy_log_from_now($show_text=1)
  {

   $stats=execSQL_van('select count(pkey) as cnt,min(c_data) as mo_from,max(c_data) as mo_to from obj_site_mo_log_now') ;
   if (!$stats['cnt']) echo 'Оперативная таблица пуста' ;
   else
      {ob_start() ;
       $t=fixed_time() ;
           echo 'Оперативная таблица <strong>'.$stats['cnt'].'</strong> записей, от <strong>'.date('d.m.Y H:i:s',$stats['mo_from']).'</strong> до <strong>'.date('d.m.Y H:i:s',$stats['mo_to']).'</strong><br>' ;

       $table_descr=execSQL('describe obj_site_mo_log') ;
       $table_descr_now=execSQL('describe obj_site_mo_log_now') ;
       foreach($table_descr as $fname=>$finfo) if (!isset($table_descr_now[$fname])) unset($table_descr[$fname]) ;
    //     unset($table_descr['с_data']) ;
       $cnt=execSQL_update('replace into obj_site_mo_log ('.implode(',',array_keys($table_descr)).') 
                            select '.implode(',',array_keys($table_descr)).' 
                            from obj_site_mo_log_now order by pkey') ;
       //echo 'cnt='.$cnt.'<br>' ;
           fixed_time($t,'Затронуто '.$cnt.'  записей при синхронизации с оперативной таблицей') ;

       if ($cnt and $GLOBALS['LS_setting_log_now_len'])
           { $t2=fixed_time() ;
             // удаляем из оперативной таблицы  записи старше заданной величины
         $now=getdate() ;
         $from=mktime($now['hours']-$GLOBALS['LS_setting_log_now_len'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday'],$now['year']);
         echo 'Удаляем из оперативной таблицы записи старее <strong>'.$GLOBALS['LS_setting_log_now_len'].'</strong> часов - до <strong>'.date('d.m.Y H:i:s',$from).'</strong><br>' ;
         $cnt=execSQL_update('delete from obj_site_mo_log_now where c_data<'.$from) ;
             //echo 'Удалено: <strong>'.$cnt.'</strong> записей<br>' ;
         fixed_time($t2,'Удалено '.$cnt.' записей  из оперативной таблицы') ;
             $stats=execSQL_van('select count(pkey) as cnt,min(c_data) as mo_from,max(c_data) as mo_to from obj_site_mo_log_now') ;
             //damp_array($stats);
             if ($stats['cnt']) echo 'Оперативная таблица <strong>'.$stats['cnt'].'</strong> записей, от <strong>'.date('d.m.Y H:i:s',$stats['mo_from']).'</strong> до <strong>'.date('d.m.Y H:i:s',$stats['mo_to']).'</strong><br>' ;
             else echo 'Оперативная таблица пуста<br>' ;
       }
       $text=ob_get_clean() ;
       if ($show_text) echo $text ;
       LOGS()->reg_log('copy_log_from_now',$text) ;
      }
  }

  // перенос данных по МО из основной таблицы в оперативной
  // внимаение! требуется исправление в engine - добавлена опция no_reffers
  function copy_log_to_now()
  {//ob_start() ;
   $t=fixed_time() ;
   $table_descr=execSQL('describe obj_site_mo_log') ;
   $table_descr_now=execSQL('describe obj_site_mo_log_now') ;
   foreach($table_descr as $fname=>$finfo) if (!isset($table_descr_now[$fname])) unset($table_descr[$fname]) ;

   $now=getdate() ;
   $from=mktime($now['hours']-$GLOBALS['LS_setting_log_now_len'],$now['minutes'],$now['seconds'],$now['mon'],$now['mday'],$now['year']);

   $cnt=execSQL_update('replace into obj_site_mo_log_now ('.implode(',',array_keys($table_descr)).') select '.implode(',',array_keys($table_descr)).' from obj_site_mo_log where c_data>='.$from.' order by pkey') ;
   //echo 'cnt='.$cnt.'<br>' ;
   fixed_time($t,'Перенос '.$cnt.' записей лога из основную таблицы в оперативную') ;

   // ставим auto_increment для pkey в оперативной таблице аналично основной таблице
 $last=execSQL_value('SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA="'.$GLOBALS['_SETTING']['main_db']['db_name'].'" AND TABLE_NAME="obj_site_mo_log"') ;
 execSQL_update('ALTER TABLE obj_site_mo_log_now AUTO_INCREMENT='.$last) ;

   //$text=ob_get_clean() ;
   //if ($show_text) echo $text ;
   //LOGS()->reg_log('copy_mo_to_now',$text) ;
  }

  function clear_log_from_now()
  {   echo 'Удаляем из оперативной таблицы все записи<br>' ;
      $cnt=execSQL_update('delete from obj_site_mo_log_now')  ;
      echo 'Удалено: <strong>'.$cnt.'</strong> записей<br>' ;
  }



}

function FILE_LOG($UID=0){ if (!is_object($GLOBALS['FILE_LOG'])) $GLOBALS['FILE_LOG']=new c_file_log($UID);return($GLOBALS['FILE_LOG']);}
class c_file_log
{
  var $time_start ;
  var $time_last ;
  var $log_fname ;
  var $log_fname_full ;
  var $log_id=0  ;

  function __construct($log_fname='')
  {  $this->log_fname=($log_fname)? '/temp/'.$log_fname.'.txt':'/temp/log_xls_upload_'.date('d_m_Y_H_i_s').'.txt' ;
     $this->log_fname_full=($log_fname)? '/temp/full_'.$log_fname.'.txt':'/temp/full_log_xls_upload_'.date('d_m_Y_H_i_s').'.txt' ;
     //echo 'Имя лога операций: <a target=_blank href="'.$this->log_fname.'">'.basename($this->log_fname).'</a><br>' ;
     //echo 'Имя лога операций: <a target=_blank href="'.$this->log_fname_full.'">'.basename($this->log_fname_full).'</a><br>' ;
     $this->log_id++ ;
     $log_text=date('d.m.Y H:i:s').': init' ;
     // async лог - пишется текущая операция под ID
     file_put_contents(_DIR_TO_ROOT.$this->log_fname,json_encode(array(1=>array('text'=>$log_text))) ) ;
     // общий лог - пишутся все операции
     file_put_contents(_DIR_TO_ROOT.$this->log_fname_full,$log_text."<br>\n",FILE_APPEND) ;
     //file_put_contents(_DIR_TO_ROOT.$this->log_fname,date('d.m.Y H:i:s').': init'."\n") ;
     list($usec, $sec) = explode(' ', microtime());
     $this->time_start=((float)$usec + (float)$sec);
     $this->time_last=((float)$usec + (float)$sec);
  }


  function append($text,$echo_text=0)
  {  //echo '['.$this->log_fname.'] FILE LOG APPEND '.$this->log_fname.'<br>' ;
     list($usec, $sec) = explode(' ', microtime());
     $querytime_now = ((float)$usec + (float)$sec);
     $querytime_delta = $querytime_now - $this->time_start;
     $querytime_delta2 = $querytime_now -$this->time_last;
     $this->log_id++ ;
     $log_text=sprintf('%01.4f',$querytime_delta).' +'.sprintf('%01.6f',$querytime_delta2).' сек: '.strip_tags($text) ;
     // async лог - пишется текущая операция под ID
     if ($text!='END')
     { $result=file_put_contents(_DIR_TO_ROOT.$this->log_fname,json_encode(array($this->log_id=>array('text'=>$log_text))),LOCK_EX) ;
       if ($echo_text) echo $text.'<br>' ;
     }
     else
     { $result=file_put_contents(_DIR_TO_ROOT.$this->log_fname,json_encode(array($this->log_id=>array('text'=>$text))),LOCK_EX) ;

     }
     //if ($result) echo 'Сохранено в '.$this->log_fname.': '.$log_text.' ['.$this->log_id.']<br>' ;
     // общий лог - пишутся все операции
     file_put_contents(_DIR_TO_ROOT.$this->log_fname_full,$log_text."<br>\n",FILE_APPEND) ;
     $this->time_last=((float)$usec + (float)$sec);
  }

}

?>
