PHP Classes

File: .ApplicationComposer/apps/frdl/webfan/ApplicationComposer/Repos/Fetch.php

Recommend this page to a friend!
  Classes of Till Wehowski   Package Fetcher   .ApplicationComposer/apps/frdl/webfan/ApplicationComposer/Repos/Fetch.php   Download  
File: .ApplicationComposer/apps/frdl/webfan/ApplicationComposer/Repos/Fetch.php
Role: Class source
Content type: text/plain
Description: Class source
Class: Package Fetcher
Fetch packages from several Composer repositories
Author: By
Last change: removed SQL dependency
Date: 7 years ago
Size: 5,566 bytes
 

Contents

Class file image Download
<?php
/**
 * Copyright (c) 2015, Till Wehowski
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 3. Neither the name of frdl/webfan nor the
 * names of its contributors may be used to endorse or promote products
 * derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY frdl/webfan ''AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL frdl/webfan BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */
namespace frdl\ApplicationComposer\Repos;
use
frdl\ApplicationComposer;

class
Fetch
{
   protected
$o; //options
  
protected $r; //result
  
  
protected $repos = null;
   protected
$db;
   
   function
__construct($options = array()){
        
$this->o = array_merge($this->defaultOptions(), $options);
 
   }

 
   public function
__call($name, $args){
         
$method = '_q_'.$name;
          if(
is_callable(array($this, $method))){
             return
call_user_func_array(array($this,$method), $args);
       }
      
     
$trace = debug_backtrace();
      
trigger_error(
                   
'Undefined method call: ' . $name . '('.$method.')' .
                  
' in ' . $trace[0]['file'] .
                  
' on line ' . $trace[0]['line'],
                  
E_USER_WARNING);
        return
$this;
   }
    
    
  public function
getActiveRepositories($refresh = false){
      if(
true !== $refresh && is_array($this->repos))return $this->repos;

  
$this->repos = array();
   foreach(
$this->o['REPOSITORIES'] as $num => $repos){
         if(
1===intval($repos['_use']))$this->repos[]=$repos;
   }
   
   
    return
$this->repos;
  }
    

   public function
defaultOptions(){
         return array(
              
'cache_time' => 60 * 60,
              
'save' => false,
              
'debug' => false,
              
'cachekey' => '~pmfetch'.sha1(get_class($this)),
         );
   }
  
  
   protected function
cachefile($sub){
       
$dir = (isset($this->o['DIRS']['cache']) && '' !== $this->o['DIRS']['cache']) ? $this->o['DIRS']['cache'] : '.ApplicationComposer/cache/';
        return
$dir . $this->o['cachekey'].'.'.sha1($sub).'.'.strlen($sub).'.php';
   }
  
   protected function
cache($sub, $value = null){
        
$file = $this->cachefile($sub);
         if(
null === $value && (!file_exists($file) || filemtime($file) < time() - $this->o['cache_time']))return null;
         if(
null === $value){
             try{
                 require
$file;
                 if(
$time < time() - $this->o['cache_time'])return null;
                 return
$value;
        }catch(\
Exception $e){
           
trigger_error($e->getMessage(), E_USER_ERROR);
        }

             }
            
        
$code = "<?php
  \$time = "
.time().";
  \$expires = "
.(time() + intval($this->o['cache_time'])).";
  \$value = "
.str_replace("stdClass::__set_state", "(object)", var_export($value, true)).";
                  
"
;
         
file_put_contents($file, $code);
   }
  
  
   protected function
result(){
        return
$this->r;
   }
      
   protected function
_q_info(){
      
   }
  
   protected function
_q_all(){
      
   }
  
   protected function
_q_search($query){
        
$k = 'search '.$query;
        
$cache = $this->cache($k, null);
         if(
is_array($cache) || is_object($cache)){
            
$this->r =$cache;
            return
$this->r;
        }
      
         
$this->r = array();
          foreach(
$this->getActiveRepositories(false) as $num => $repos){
             
$classname = $repos['fetcher_class'];
              if(
1!==intval($repos['_use']))continue;
             try{
            
$f = new $classname;
            
$f->setConfig($this->o);
            
$r = $f->search($query);
            
$this->r[] = $r;
         }catch(\
Exception $e){
            
trigger_error($e->getMessage(), E_USER_ERROR);
         }

            
       }
      
   
      
$this->cache($k, $this->r);
       return
$this->r;
   }
  
   protected function
_q_package($vendor, $packagename){
          
$k = 'package '.$vendor.'/'.$packagename;
        
$cache = $this->cache($k, null);
         if(
is_array($cache) || is_object($cache)){
            
$this->r =$cache;
            return
$this->r;
        }
      
         
$this->r = array();
          foreach(
$this->getActiveRepositories(false) as $num => $repos){
             
$classname = $repos['fetcher_class'];
              if(
1!==intval($repos['_use']))continue;
             try{
            
$f = new $classname;
            
$f->setConfig($this->o);
            
$r = $f->package($vendor, $packagename);
            
$this->r[] = $r;
         }catch(\
Exception $e){
            
trigger_error($e->getMessage(), E_USER_ERROR);
         }

            
       }
      
   
      
$this->cache($k, $this->r);
       return
$this->r;
   }
 
   protected function
_q_download($vendor, $packagename){
      
   }
}