| 
<?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);
 }
 }
 }
 |