Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3639 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Mapper\Common;

use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Db\Adapter\Driver\ResultInterface;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
use Laminas\Db\Sql\Sql;
use Laminas\Db\Sql\Select;
use Laminas\Db\Sql\Insert;
use Laminas\Db\Sql\Update;
use Laminas\Db\Sql\Delete;

class MapperCommon
{
    const SQL_DUPLICATE_RECORD                      = 1062;
    const SQL_CANNOT_ADD_OR_UPDATE_A_CHILD          = 1452;
    const SQL_CANNOT_DELETE_OR_UPDATE_A_PARENT_ROW  = 1451; 
    
    

    /**
     * 
     * @var AdapterInterface
     */
    protected $adapter;
    
    
    
    /**
     *
     * @var Sql
     */
    protected $sql;
    
    /**
     * 
     * @var integer
     */
    protected $affectedRows;
    
    /**
     * 
     * @var integer
     */
    protected $lastInsertId;
    
    /**
     * 
     * @var integer
     */
    protected $errno;
    
    /**
     * 
     * @var String
     */
    protected $error;
    
    
    
    /**
     * 
     * @var MapperCommon
     */
    private static $_instance;
    
    /**
     * 
     * @param AdapterInterface $adapter
     */
    public function __construct($adapter)
    {
        $this->sql      = new Sql($adapter);
        $this->adapter  = $adapter;
    }
    
    /**
     * 
     * @param AdapterInterface $adapter
     * @return MapperCommon
     */
    public static function getInstance($adapter)
    {
        if(self::$_instance == null) {
            self::$_instance = new MapperCommon($adapter);
        }
        return self::$_instance;
    }
    
    /**
     * 
     * @return Sql
     */
    public function getSql()
    {
        return $this->sql;
    }
    
    /**
     * 
     * @return integer
     */
    public function getAffectedRows()
    {
        return $this->affectedRows;
    }
    
    /**
     * 
     * @return integer
     */
    public function getErrno()
    {
        return $this->errno;
    }
    
    /**
     * 
     * @return string
     */
    public function getError()
    {
        return $this->error;
    }
    
    /**
     * 
     * @return integer
     */
    public function getLastInsertId()
    {
        return $this->lastInsertId;
    }
   
    private function initRespose()
    {
        $this->errno = 0;
        $this->error = '';
        $this->affectedRows = 0; 
        $this->lastInsertId = 0;
    }
    
    /**
     * 
     * @param Insert $insert
     * @return boolean
     */
    protected function executeInsert($insert)
    {
        $this->initRespose();
        try
        {
            
            $stmt = $this->sql->prepareStatementForSqlObject($insert);
            $result = $stmt->execute();
            if ($result) {
                $this->lastInsertId = $result->getGeneratedValue();
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($insert->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }
        
        return false;
    }

    /**
     * 
     * @param Update $update
     * @return boolean
     */
    protected function executeUpdate($update)
    {
        $this->initRespose();
        try
        {
            
            $stmt = $this->sql->prepareStatementForSqlObject($update);
            $result = $stmt->execute();
            
            if($result) {
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($update->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }
        
        
        return false;
    }
    
    /**
     * 
     * @param Delete $delete
     * @return boolean
     */
    protected function executeDelete($delete)
    {
        $this->initRespose();
        try
        {
            $stmt = $this->sql->prepareStatementForSqlObject($delete);
            $result = $stmt->execute();
            if($result) {
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($delete->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }
        
        
        return false;
    }
    
    protected function executeDeleteUsingSentenceWithParameters($sql, $parameters = [])
    {
        $this->initRespose();
        
        try {
            
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result) {
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }
        
        return false;
    }
    
    /**
     * 
     * @param Select $select
     * @param Object $prototype
     * @return array
     */
    protected function executeFetchAllObject($select, $prototype)
    {
       
        $this->initRespose();
        try {
            $stmt = $this->sql->prepareStatementForSqlObject($select);
            $result = $stmt->execute();
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                $hydrator = new ObjectPropertyHydrator();
                
                $records = [];
                foreach($result as $row)
                {
                    $record = clone $prototype;
                    $hydrator->hydrate($row, $record);
                    
                    array_push($records, $record);
                }
                
                return $records;
            }
        }
        catch(\Exception $e) 
        { 
            error_log($select->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }
        
        return [];
    }
    
    /**
     * 
     * @param Select $select
     * @return array
     */
    protected function executeFetchAllArray($select)
    {
        
        $this->initRespose();
        
        try {
            $stmt = $this->sql->prepareStatementForSqlObject($select);
            $result = $stmt->execute();
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                $records = [];
                foreach($result as $record)
                {
                    array_push($records, $record);
                }
                return $records;
            }
        }
        catch(\Exception $e)
        {
            error_log($select->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return [];
    }
    
    /**
     * 
     * @param Select $select
     * @param Object $prototype
     * @return void|Object
     */
    protected function executeFetchOneObject($select, $prototype)
    {
        $this->initRespose();
        
        try {
            $select->limit(1);
            
            $stmt = $this->sql->prepareStatementForSqlObject($select);
            $result = $stmt->execute();
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($result->current(), $prototype);
                
                return $prototype;
            }
        }
        catch(\Exception $e) 
        {
            error_log($select->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return;
    }
    
    /**
     * 
     * @param Select $select
     * @return void|array
     */
    protected function executeFetchOneArray($select)
    {
        $this->initRespose();
        
        try {
            $select->limit(1);
            
            $stmt = $this->sql->prepareStatementForSqlObject($select);
            $result = $stmt->execute();
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                return $result->current();
            }
        }
        catch(\Exception $e) 
        {
            error_log($select->getSqlString($this->adapter->platform) . ' ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return;
    }
    
    /**
     * 
     * @param string $sql
     * @param array $parameters
     * @return boolean
     */
    protected function executeInsertUsingSentenceWithParameters($sql, $parameters = [])
    {
        $this->initRespose();
        
        try {
            
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result) {
                $this->lastInsertId = $result->getGeneratedValue();
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }

        return false;
    }
    
    
    /**
     * 
     * @param string $sql
     * @param array $parameters
     * @return boolean
     */
    protected function executeSentenceWithParameters($sql, $parameters = [])
    {
        $this->initRespose();
        try
        {
            
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            
            if($result) {
                $this->affectedRows = $result->getAffectedRows();
                return true;
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }
        
        return false;
    }
    
    /**
     * 
     * @param Object $prototype
     * @param string $sql
     * @param array $parameters
     * @return array
     */
    protected function executeFetchAllObjectUsingParameters($prototype, $sql, $parameters = [])
    {
        $this->initRespose();
        try {
            
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                    $hydrator = new ObjectPropertyHydrator();
                    
                    $records = [];
                    foreach($result as $row)
                    {
                        $record = clone $prototype;
                        $hydrator->hydrate($row, $record);
                        
                        array_push($records, $record);
                    }
                    
                    return $records;
                }
            }
        }
        catch(\Exception $e) 
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return [];
    }
    
    /**
     * 
     * @param string $sql
     * @param array $parameters
     * @return array
     */
   protected function executeFetchAllArrayUsingParameters($sql, $parameters = [] )
    {
        $this->initRespose();
        
        try {
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                $records = [];
                foreach($result as $row)
                {
                    array_push($records, $row);
                }
                
                return $records;;
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return [];
    }
    
    /**
     * 
     * @param Object $prototype
     * @param string $sql
     * @param array $parameters
     * @return void|Object
     */
    protected function executeFetchOneObjectUsingParameters($prototype, $sql, $parameters = [])
    {
        $this->initRespose();
        
        try {
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($result->current(), $prototype);
                
                return $prototype;
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return;
    }
    
    /**
     * 
     * @param string $sql
     * @param array $parameters
     * @return void|array
     */
    protected function executeFetchOneArrayUsingParameters($sql, $parameters = [])
    {
        $this->initRespose();
        
        try {
            $stmt = $this->adapter->createStatement($sql);
            $stmt->prepare();
            $result = $stmt->execute($parameters);
            
            if ($result instanceof ResultInterface && $result->isQueryResult() && $result->count()) {
                
                return $result->current();
            }
        }
        catch(\Exception $e)
        {
            error_log($sql  .  ' (' . implode(',', $parameters) .  ') ' .  $e->getMessage());
            $this->processError($e);
        }

        
        return;
    }
    
    private function processError($e)
    {
        
        $message = $e->getMessage();
        if (strpos($message, strval(self::SQL_DUPLICATE_RECORD) ) !== false) {
            
            $this->errno = self::SQL_DUPLICATE_RECORD;
            $this->error = 'ERROR_SQL_DUPLICATE_RECORD';
            
        } 
        else if (strpos($message, strval(self::SQL_CANNOT_ADD_OR_UPDATE_A_CHILD)  ) !== false) {
            
            $this->errno = self::SQL_CANNOT_ADD_OR_UPDATE_A_CHILD ;
            $this->error = 'ERROR_SQL_CANNOT_ADD_OR_UPDATE_A_CHILD';
            
        } 
        else if (strpos($message, strval(self::SQL_CANNOT_DELETE_OR_UPDATE_A_PARENT_ROW) ) !== false) {
            
            $this->errno = self::SQL_CANNOT_DELETE_OR_UPDATE_A_PARENT_ROW;
            $this->error = 'ERROR_SQL_CANNOT_DELETE_OR_UPDATE_A_PARENT_ROW';
            
        } else {
            
            $this->errno = 0;
            $this->error = 'ERROR_THERE_WAS_AN_ERROR';
            
        }
        
    }

    
    /**
     *
     * @param array $values
     * @param boolean $onlyNull
     * @return array
     */
    protected function removeEmpty($values, $onlyNull = false)
    {
        if($onlyNull) {
            $values = array_filter($values, function($v) {
                return !is_null($v);
            });
        } else {
            $values = array_filter($values, function($v) {
               return !empty($v); 
            });
        }
        
        unset($values['added_on']);
        unset($values['updated_on']);
        
        return $values;
    }
    
    /**
     *
     * @return string
     */
    public function getDatebaseNow()
    {
        $record = $this->executeFetchOneArrayUsingParameters('SELECT now() AS now');
        return $record['now'];
        
    }
}