<?php

/**
 * 20190806
 * no_consulta_sql actions.
 *
 * @package    nomina
 * @subpackage no_consulta_sql
 * @author     Your name here
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class no_consulta_sqlActions extends sfActions {

    /**
     * Ejecutar sentencia select
     * 
     * @param sfWebRequest $request
     */
    public function executeList(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");


        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql
        $sql = <<<EOD
ALTER SESSION SET NLS_DATE_FORMAT = "YYYY-MM-DD" 
EOD;
        //Ejecutar SQL
        CN_TABLE::executeSQL($sql);


        try {

            $delimitador = ';';
            $salto_linea = "\r\n"; //variable global para manejo del salto de linea

            $record_text = 'CONSULTA SELECT SQL';

            /*
             * Variables de filtro
             */
            $sql_text = $request['consulta'];

            $format = 'CSV';
            if (isset($request['format'])) {
                $format = $request['format'];
            }

            //Valida si es select
            if (strpos($sql_text, 'select') === false) {

                /*
                 * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                 */
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = "[no_consulta_sql] Ocurrio un error. Valida si es select-SQL: " . $sql_text;
                $this->list_data = array();
                $this->logMessage("[no_consulta_sql] ERROR! Valida si es select");
            } else {

                //SQL
                $sql = <<<EOD

$sql_text 
    
EOD;

                //ejecutar sql
                $record = CN_TABLE::executeSQL($sql);

                if ($format == 'JSON') {
                    $this->logMessage("---END method JSON" . count($record));
                    $this->status = 0;
                    $this->totalRows = count($record);
                    $this->startRow = 0;
                    $this->endRow = count($record);
                    $this->list_data = $record;
                    $this->logMessage("[no_consulta_sql] Consulta exitosa");
                } else {
                    $this->logMessage("---END method" . count($record));

                    $scarpeta = "uploads"; //carpeta donde guardar el archivo.

                    $sfile = $scarpeta . "/tmp/ConsultaSQL_" . date("d") . date("m") . date("Y") . ".txt"; //ruta del archivo a generar
                    $fp = fopen($sfile, "w+");

                    $j = 0;
                    $record_text .= $salto_linea;
                    foreach ($record as $key => $rec) {

                        foreach ($rec as $key => $value) {//Columnas
                            if ($j != 0) {
                                $record_text .= $delimitador;
                            }
                            $record_text .= $value;
                            $j++;
                        }
                        //salto de linea para separar totales
                        $record_text .= $salto_linea;
                        $j = 0;
                    }

                    $this->logMessage("[no_consulta_sql] Consulta exitosa");

                    /*
                     * guardar y cerrar archivo
                     */
                    fwrite($fp, $record_text);
                    fclose($fp);

                    echo "<script>window.location='" . "/nomina/web/" . $sfile . "'</script>";
                    //echo $record_text;
                    die();
                }
            }
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[no_consulta_sql] Ocurrio un error. SQL: " . $sql_text;
            $this->list_data = array();
            $this->logMessage("[no_consulta_sql] ERROR!");
            $this->logMessage($exc->getMessage());
        }
    }

    /**
     * Ejecutar sentencias update, delete  o insert, PL/SQL
     * 
     * @param sfWebRequest $request
     */
    public function executeUpdate(sfWebRequest $request) {

        //Revisar que sea post
        //$this->forward404Unless($request->isMethod('post'));
        //Guardar los parametros del request en el log
        $this->logMessage("---BEGIN Logging request");
        foreach ($request->getPostParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("--------------------------------------------------* Ip: " . $_SERVER['REMOTE_ADDR']);
        foreach ($request->getGetParameters() as $key => $value) {
            $this->logMessage("request[$key] = $value");
        }
        $this->logMessage("---END Logging request");

        /**
         * Abrir nueva conexion con la Base de Datos
         */
        $this->conn = Doctrine_Manager::getInstance()->getCurrentConnection();
        $this->conn->beginTransaction();

        /*
         * Formato de fecha
         */
        //Sql

        try {

            /*
             * Variables de filtro
             */
            $sql_text = $request['consulta'];

            //Valida tenga sentencia where
            if (strpos($sql_text, 'where') === false && strpos($sql_text, 'insert') === false) {

                /*
                 * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
                 */
                $this->conn->rollback();
                $this->status = 1;
                $this->mensajeError = "[no_consulta_sql] Ocurrio un error. Valida tenga sentencia where o insert -SQL: " . $sql_text;
                $this->list_data = array();
                $this->logMessage("[no_consulta_sql] ERROR! Valida tenga sentencia where o insert");
            } else {

                if ($request['caracter'] == 'P') {

                    $sql_textt = str_replace(";", " ", $request['consulta']);

                    //SQL
                    $sql = <<<EOD

$sql_text 
    
EOD;

                    //ejecutar sql
                    $this->conn->execute($sql);
                } elseif ($request['caracter'] == 'S') {

                    $sql_totales = explode(";", $request['consulta']);

                    foreach ($sql_totales as $valor) {

                        $sql_textt = str_replace(";", " ", $valor);

                        //SQL
                        $sql = <<<EOD
                    $sql_textt 
EOD;

                        $this->conn->execute($sql);
                    }
                }

                /**
                 * COMMIT DE TODAS LAS TRANSACCIONES 
                 */
                $this->conn->commit();

                $this->status = 0;
                $this->list_data = array();
                $this->logMessage("[no_consulta_sql] Consulta exitosa");
                $errors['mensaje'] = "Exitosa..!";
            }
        } catch (Exception $exc) {
            echo $exc->getTraceAsString();

            /*
             * ROLLBACK DE TODAS LAS TRANSACCIONES EN CASO DE QUE OCURRA ALGUN ERROR
             */
            $this->conn->rollback();
            $this->status = 1;
            $this->mensajeError = "[no_consulta_sql] Ocurrio un error.";
            $this->list_data = array();
            $this->logMessage("[no_consulta_sql] ERROR!");
            $this->logMessage($exc->getMessage());
            $errors['mensaje'] = "Error SQL -> $exc->getTraceAsString()";
            $errors['servicio'] = "no_consulta_sql";
        }
    }

}
