<?
include_once('c_db.php') ;
function DB_MSSQL($options=array())
{ if (!isset($GLOBALS['db_mssql'])) $GLOBALS['db_mssql']=new db_mssql($options);
  elseif (isset($options['db_name']) and $options['db_name']!=$GLOBALS['db_mssql']->db_name) $GLOBALS['db_mssql']=new db_mssql($options) ;
  return($GLOBALS['db_mssql']);
}
class db_mssql extends c_db
{ public $class_name = 'mssql' ;
  public $win1251fields = array() ;

 function connect()
 {   //trace() ;
     $GLOBALS['MSSQL_LINK'] = mssql_connect($this->host, $this->username, $this->password);
    //mssql_query('SET CHARSET '.$this->charset);
    //mssql_query('SET NAMES '._DB_CHARSET);
    $text_debug=($this->debug)? 'Параметры подключения:<br>host='.$this->host.'<br>db_name='.$this->db_name.'<br>user_name='.$this->username.'<br>':'' ;
    if (!$GLOBALS['MSSQL_LINK']) die("<hr><strong>Невозможно подключиться к серверу MySQL<hr></strong>".$text_debug);
    if (!(mssql_select_db($this->db_name,$GLOBALS['MSSQL_LINK']))) die("<hr><div style='text-align:center;font-weight:bold;'>Не найдена БД '$this->db_name'</div><hr>");
    set_time_point('Подключили базу') ;


    $this->win1251fields=array('name_dr','LastName','FirstName','ImagePath','DoorGroupName','Custom01','Custom03','Custom02','Custom03','Custom04','Custom05','Custom08','DeviceName','GroupName','UniqueField','TenantName','CustomTitle01','CustomTitle02','CustomTitle03','GroupName') ;
 }



    // возвращается массив кодов объектов сгруппированый по классам
      //  - debug: режим отладки, 1 - вывод текста запроса, количества записей и временных параметров
      //						  2 - еще вывод дампа
      //  - no_indx=0 : в качестве индексов массива использовать поле 'pkey', если данное определено
      //  - no_indx=1 : в качестве индексов массива использовать номера строк
      // ВНИМАНИЕ! начиная с версии 4.56 применять во всех вызовах опцию  'no_indx'=1, так как в будущем функция будет подставлять поле в индекс только по требованию
      function execSQL($sql,$options=array(),$no_indx=0,$use_fname_indx='') // запрос к БД
      { global $debug_db,$debug_db_log,$__debug_sql_cnt,$__debug_sql_time ;
        $arr=array() ; $debug=0 ; $tkey=0 ;
        // новая фишка - для передачи параметров через массив
    	if (!is_array($options))   { $debug=$options ; $options=array() ; }
        if ($options['debug'])              $debug=$options['debug'] ;
        if ($options['no_indx'])            $no_indx=$options['no_indx'] ;
        if ($options['use_fname_indx'])     $use_fname_indx=$options['use_fname_indx'] ;
        if ($options['indx'])               $use_fname_indx=$options['indx'] ;

    	$querytime_before=fixed_time() ;
        //$debug=2 ;

        if ($debug or $debug_db) print_SQL_debug_begin($sql) ;

        $sql=iconv('UTF-8','windows-1251',$sql) ;

         if (!$result = mssql_query($sql)) SQL_error_message($sql) ;
          else
    	  {	 if ($debug or $debug_db) { echo '<strong>Получено '.mssql_num_rows($result).' записей : </strong>' ;fixed_time($querytime_before,'запрос к БД занял - ','') ;}
             //damp_array(_DOT($tkey)) ;
    	     $fname_indx=($use_fname_indx)? $use_fname_indx:mssql_fetch_field($result)->name ;
             try
             {
    		   while (($new_res=mssql_fetch_array($result,MSSQL_ASSOC))!==false)
    		   { if (_sizeof($new_res)) foreach($new_res as $fname=>$fvalue)
                   if (array_search($fname,$this->win1251fields)!==false) $new_res[$fname]=iconv('windows-1251','UTF-8',$fvalue) ;
                   //else if (array_search($fname,$this->win1251fields)!==false) $new_res[$fname]=$fvalue ;
                 if ($new_res[$fname_indx] and !$no_indx) $arr[$new_res[$fname_indx]]=$new_res ; else $arr[]=$new_res ;
    	        }
             }
             catch(Exception $ex)
             	{
             		//$ex - экземпляр класса Exception
             		// или его наследника
             	}
    		 if ($debug==2 or $debug_db==2 or $debug_db==3) print_2x_arr($arr,$sql) ;
    		 if ($debug==3) damp_array($arr,$sql) ;
             $res_time=fixed_time($querytime_before) ;
    		 if ($debug or $debug_db) {fixed_time($querytime_before,', суммарное время получения и обработки - ','') ;}
    		 $__debug_sql_time+=$res_time ;
             if ($debug_db_log)
             { //debug_db_logging($sql,$options,$res_time,_sizeof($arr)) ;
             }

    		 $__debug_sql_cnt++ ;
    	  }
    	 if ($debug or $debug_db) print_SQL_debug_end() ;
    	 return($arr) ;
      }

    // функция для выполнения запросов update,delete и т.д.
     function execSQL_update($sql,$options=array())
      { global $debug_db,$__debug_sql_cnt,$__debug_sql_time ;
        $debug=0 ; $count=0 ;
        if (!is_array($options)) { $debug=$options ; $options=array() ; }
        if ($options['debug'])     $debug=$options['debug'] ;

    	$querytime_before=fixed_time() ;

    	if ($debug or $debug_db) print_SQL_debug_begin($sql) ;

          $sql=iconv('UTF-8','windows-1251',$sql) ;

         if (!$result=mssql_query($sql)) SQL_error_message($sql) ;
         else
    	  {	 $count=mssql_rows_affected($GLOBALS['MSSQL_LINK']) ;
             if ($debug or $debug_db or $options['log_result'])
    		  { //echo '<span class=blau>'.mysql_info().'</span><br>' ; - не работает
                echo '<br><strong>Затронуто '.$count.' записей : </strong>' ; ;
    		    fixed_time($querytime_before,'запрос к БД занял - ','') ;
                fixed_time($querytime_before,', суммарное время получения и обработки - ','') ;
    		 }
    		 $__debug_sql_time+=fixed_time($querytime_before) ;
    		 $__debug_sql_cnt++ ;
    	  }
    	 if ($debug or $debug_db) print_SQL_debug_end() ;
         return($count) ;
      }

    // добавляет строку в таблицу - без проверки наличия добавляемого поля в таблице БД
     // строка должна быть описана в формате массива, где перечисляются поля, значения по которым необходимо добавить, например
     // $finfo=array(	'parent'		=>	$pkey,
     //    				'clss'			=>	104,
     //    				'enabled'		=>	1,
     //   				'obj_name'		=>	$adding_object,
     //   				'indx'			=>	$next_indx[max_indx]+1
     //   			) ;
     // $options['no_return_id'] 	- не возвращать id добавленной записи
     // $options['no_auto_indx'] 	- не генерировать значение indx

     function adding_rec_to_table($table_name,$finfo,$options=array())
     { global $debug_db,$__debug_sql_cnt,$__debug_sql_time  ;

       $_fields=array() ; $_values=array() ; $res=0 ;
       //damp_array($options) ;
       if ($options['debug']) echo 'Добавляем запись в таблицу '.$table_name.'<br>' ;

       $querytime_before=fixed_time() ;

       foreach ($finfo as $fname=>$fvalue) { $_fields[]=$fname ; if (!is_array($fvalue)) $_values[]="'".addcslashes(iconv('UTF-8','windows-1251',$fvalue),"'")."'" ; }

       $str_fields=(_sizeof($_fields))? implode(',',$_fields):'' ;
       $str_values=(_sizeof($_values))? implode(',',$_values):'' ;
       $mode=($options['use_replace'])? 'replace':'insert' ;
       $sql=$mode." into $table_name (".$str_fields.") values (".$str_values.")" ;

       if ($sql)
        {   if ($options['debug']) echo $sql.'<br>' ;
            if ($debug_db) print_SQL_debug_begin($sql) ;
            if (!mssql_query($sql)) { if (!$options['no_show_error']) SQL_error_message($sql,'Не удалось добавить запись в таблицу : ',1) ; }
            if ($debug_db) fixed_time($querytime_before,', суммарное время получения и обработки - ','') ;
            if ($debug_db) print_SQL_debug_end() ;
       }

       $__debug_sql_time+=fixed_time($querytime_before) ;
       $__debug_sql_cnt++ ;
       return($res) ;
     }

    function update_rec_in_table($table_name,$finfo,$usl_update,$options=array())
    { $_fields=array() ;
      $sql='' ;

      if (!$table_name) return(array()) ;

      foreach ($finfo as $fname=>$fvalue)
      {   if ($fvalue=='NULL') $_fields[]=$fname."=NULL" ;
          else                   $_fields[]=$fname."='".prepare_slashes($fvalue,$options)."'" ;
      }

      if (_sizeof($_fields)) $sql="update $table_name set ".implode(',',$_fields)." where ".$usl_update;

      if ($options['debug']) echo $sql.'<br>' ;
      if (!mssql_query($sql)) { SQL_error_message($sql,'Не удалось обновить запись в таблице',1) ; return(array()) ; }

    }



}
?>
