<?php 
     
namespace JLaso\SimpleStats; 
 
use JLaso\SimpleStats\Model\DB; 
use JLaso\SimpleStats\Model\StatsModel; 
use Symfony\Component\Filesystem\Exception\FileNotFoundException; 
use Symfony\Component\Yaml\Yaml; 
 
class StatsBase 
{ 
    /** @var  array */ 
    protected $config; 
    /** @var  string */ 
    protected $dataBaseFile; 
    /** @var string  */ 
    protected $projectDir; 
    /** @var  \SQLite3 */ 
    protected $conn; 
    /** @var  StatsModel[] */ 
    protected $models; 
    /** @var DB  */ 
    protected $db; 
     
    public function __construct($projectDir = null) 
    { 
                            // vendor/jlaso/simple-stats/src 
        $this->projectDir = $projectDir ? $projectDir : realpath(__DIR__.'/../../../../'); 
        $this->readConfig(); 
        if($this->existsDataBaseFile()) { 
            $this->conn = new \SQLite3($this->dataBaseFile); 
        }else{ 
            @mkdir(dirname($this->getDataBaseFile()), 0777, true); 
            $this->conn = new \SQLite3($this->dataBaseFile); 
            $this->startDatabase(); 
        } 
        $this->db = new DB($this->conn); 
    } 
 
    /** 
     * @return DB 
     */ 
    public function getDb() 
    { 
        return $this->db; 
    } 
 
    /** 
     * @param string $event 
     * @param string $data 
     * @return int 
     * @throws \Exception 
     */ 
    public function getCountByData($event, $data) 
    { 
        if (!$model = $this->getModel($event)) { 
            throw new \Exception("Event {$event} does not have a model associated !"); 
        } 
        return $this->db->fetchCountByData($model, $data); 
    } 
 
    // found in http://stackoverflow.com/questions/13646690/how-to-get-real-ip-from-visitor 
    function getUserIP() 
    { 
        $client  = @$_SERVER['HTTP_CLIENT_IP']; 
        $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; 
        $remote  = $_SERVER['REMOTE_ADDR']; 
 
        if(filter_var($client, FILTER_VALIDATE_IP)) 
        { 
            $ip = $client; 
        } 
        elseif(filter_var($forward, FILTER_VALIDATE_IP)) 
        { 
            $ip = $forward; 
        } 
        else 
        { 
            $ip = $remote; 
        } 
 
        return $ip; 
    } 
 
    /** 
     * @return array 
     */ 
    public function getConfig() 
    { 
        return $this->config; 
    } 
 
    /** 
     * @return string 
     */ 
    public function getDataBaseFile() 
    { 
        return $this->dataBaseFile; 
    } 
 
    /** 
     * @return string 
     */ 
    public function getProjectDir() 
    { 
        return $this->projectDir; 
    } 
 
    /** 
     * @return \SQLite3 
     */ 
    public function getConn() 
    { 
        return $this->conn; 
    } 
 
    /** 
     * @return StatsModel[] 
     */ 
    public function getModels() 
    { 
        return $this->models; 
    } 
 
    /** 
     * @param $model 
     * @return StatsModel|null 
     */ 
    public function getModel($model) 
    { 
        return isset($this->models[$model]) ? $this->models[$model] : null; 
    } 
 
    protected function readConfig() 
    { 
        $this->config = array_merge( 
            array( 
                'database' => array( 
                    'driver' => 'pdo_sqlite', 
                    'path' => '%project_dir%/app/cache/simple_stats.sqlite', 
                    'charset' => 'UTF8', 
                ), 
                'models' => array( 
                    'clicks' , 
                ), 
            ), 
            Yaml::parse(file_get_contents($this->getConfigFile())) 
        ); 
        $this->dataBaseFile = str_replace('%project_dir%', $this->projectDir, $this->config['database']['path']); 
 
        foreach($this->config['models'] as $model){ 
            $this->models[$model] = new StatsModel($model); 
        } 
    } 
 
    public function getConfigFile() 
    { 
        $configFile = $this->projectDir.'/config-stats-base.yml'; 
        if(!file_exists($configFile)) { 
            $configFile = dirname(__DIR__) . '/config-stats-base.yml.dist'; 
            if (!file_exists($configFile)) { 
                throw new \Exception("Configuration file {$configFile} not found"); 
            } 
        } 
        if(!is_readable($configFile)){ 
            throw new \Exception("File {$configFile} is not readable!"); 
        } 
 
        return $configFile; 
    } 
 
    protected function existsDataBaseFile() 
    { 
        return file_exists($this->dataBaseFile); 
    } 
 
    protected function startDatabase() 
    { 
        foreach($this->models as $model){ 
            $sql = $model->getCreateTableSentence(); 
            $this->conn->exec($sql); 
        } 
    } 
}
 
 |