/**
  * Constructor
  * Si el paramero es null o no esta definido se tomara el rl aactive_group
  * definido en database.php
  *
  * @param type $idDb String que identifica a la db en database.php
  */
 public function __construct($idDb = null)
 {
     $defaultDB = TSLUtilsHelper::getDefaultDatabase();
     // Si el parametros es null o no esta seteado tratamos de usar el active group.
     if (isset($idDb) == FALSE and isset($defaultDB)) {
         $this->m_idDb = $defaultDB;
     } else {
         // De lo contrario tomamos como cierto el parametro.
         $this->m_idDb = $idDb;
     }
 }
 public function &getTrxManager($idDb = null)
 {
     $defaultDB = TSLUtilsHelper::getDefaultDatabase();
     // Si el parametros es null o no esta seteado tratamos de usar el active group.
     if (isset($idDb) == FALSE and isset($defaultDB)) {
         $idDb = $defaultDB;
     }
     if (!array_key_exists($idDb, $this->m_trxManagers)) {
         $this->m_trxManagers[$idDb] = new TSLTransactionManager($idDb);
     }
     return $this->m_trxManagers[$idDb];
 }
 /**
  * Busca en la definicion de la base de datos (database.php)
  * si se ha definido una default , de ser asi retorna su
  * identificador.
  *
  * @return string el driver default o null
  */
 public static function getDefaultDatabase()
 {
     if (!isset(self::$defaultDb)) {
         require APPPATH . '/config/database.php';
         // Si se ha definido el active_group
         // o base de datos default y asi mismo se ha definido que driver usas la misma , se
         // retorna su valor , de lo contrario null
         if (isset($active_group) and empty($active_group) == FALSE and isset($db[$active_group]['dbdriver'])) {
             self::$defaultDb = $active_group;
         }
     }
     return self::$defaultDb;
 }
 /**
  * Genera la salida en JSON.
  *
  * @param TSLIDataTransferObj con el Data Transfer Object a procesar
  * @return un String con el DTO en formato JSON
  */
 public function &process(TSLIDataTransferObj &$DTO)
 {
     if (isset($DTO)) {
         /* @var $outMessage TSLOutMessage */
         $outMessage =& $DTO->getOutMessage();
         $out = '"success":' . ($outMessage->isSuccess() == FALSE ? '"false"' : '"true"');
         if (strlen($outMessage->getAnswerMesage()) > 0) {
             $out .= ',"am":[{"msg": "' . $outMessage->getAnswerMesage() . '","ce":"' . $outMessage->getErrorCode() . '"}]';
         }
         if ($outMessage->isSuccess() == FALSE) {
             if ($outMessage->hasFieldErrors()) {
                 $fldErrors =& $outMessage->getFieldErrors();
                 // Si ya tiene longitud , ponemos una coma para indicar
                 // un nuevo elemento.
                 if (isset($out) and strlen($out) > 0) {
                     $out .= ',';
                 }
                 // la lista de field errors.
                 $out .= '"errors":{';
                 $count = count($fldErrors);
                 for ($i = 0; $i < $count; $i++) {
                     $out .= $fldErrors[$i]->getField() . ':"' . $fldErrors[$i]->getErrorMessage() . '"';
                     if ($i < $count - 1) {
                         $out .= ',';
                     }
                 }
                 $out .= '}';
             } else {
                 if ($outMessage->hasProcessErrors()) {
                     $processErrors =& $outMessage->getProcessErrors();
                     // Si ya tiene longitud , ponemos una coma para indicar
                     // un nuevo elemento.
                     if (isset($out) and strlen($out) > 0) {
                         $out .= ',';
                     }
                     // la lista de process errors.
                     $out .= '"pe":[';
                     $count = count($processErrors);
                     for ($i = 0; $i < $count; $i++) {
                         $perr = str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $processErrors[$i]->getErrorMessage());
                         // Si tiene excepcion procesamos.
                         $ex = $processErrors[$i]->getException();
                         if (isset($ex)) {
                             if (isset($perr)) {
                                 $out .= '{"msg":"' . $perr . ' - ' . str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $ex->getMessage()) . '","ce":"' . $processErrors[$i]->getErrorCode() . '"';
                             } else {
                                 $out .= '{"msg":"' . str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $ex->getMessage()) . '","ce":"' . $processErrors[$i]->getErrorCode() . '"';
                             }
                         } else {
                             $out .= '{"msg":"' . $perr . '","ce":"' . $processErrors[$i]->getErrorCode() . '"';
                         }
                         $out .= '}';
                         if ($i < $count - 1) {
                             $out .= ',';
                         }
                     }
                     $out .= ']';
                 }
             }
         }
         // Si tiene parametros de salida los agregamos  antres de la data.
         $outParams =& $outMessage->getOutputparameters();
         if (is_array($outParams)) {
             foreach ($outParams as $i => $value) {
                 $out .= ',' . $i . ':' . $value;
             }
         }
         // Procesamos la data
         $data = $outMessage->getResultData();
         if (isset($data)) {
             $out .= ',"data":';
             $this->_processExtraData($outMessage->getResultData());
             $out .= json_encode(TSLUtilsHelper::array_ut8_encode_recursive($outMessage->getResultData()));
         }
         $out = '{' . $out . '}';
         return $out;
     } else {
         $out = '?????????????????';
         return $out;
     }
 }
 /**
  * Carga un DAO para la base de datos indicada , de no indicarse ningna buscara un
  * DAO para la base de datos default en uso , previamente tratara de ver s hay
  * un DAO generico .
  *
  * Osea de no indicarse el tipo de base de datos , tratara primero con la generica
  * (osea sin base de datos especificada) , luego tratara con la default de no encontrarla
  * indicara error.
  *
  * De especificarse el tipo de base de datos solo tratara de cargar la especifica.
  *
  * Las bases de datos permitidas son:
  * 'pgsql', 'mysql','mssql','oci8','sqllite' or 'odbc'.
  *
  * IMPORTANTE :
  * Las siguientes condiciones previas deben cumplirse :
  * 1) La constante APPPATH debe estar definida
  * 2) El arreglo global G_DAOPATHS con la lista de directorios absolutos a los DAO
  * del sistema debe estar definida , esta lista sera la base de busqueda para encontrar
  * el archivo que contiene la clase basada en el parametro dao_basename
  *
  * 3) LEER !!! , el parametro dao base name debera tener indicado el namespace en el caso
  * que su namespace  no sea el default
  *
  * @param dao_basename , El nombre base del DAO , por ejemplo "Login" e incluira el namespace de
  * tenerlo.
  *
  * @param db_id , el identificador de la base de datos,los valores permitidos son : 'postgre',
  * 'mysql','mssql','oci8','sqllite' or 'odbc'. De no indicarse se tratara de cargar
  * la generica , luego la default.
  *
  * @return una referencia al DAO o una excepcion de programacion si se ha solicitado
  * un tipo de base de datos no soportada o alguna precondicion no se cumple.
  *
  *
  *
  */
 public static function loadDAO($dao_basename, $db_id = null)
 {
     global $G_DAOPATHS;
     $found = false;
     $dao_class = $dao_basename;
     /******************************************************************************
      * VALIDACIONES REQUISITOS PREVIOS
      */
     // Si no es una base de datos soportada enviamos excepcion.
     if (isset($db_id) and in_array($db_id, self::$supported_dbs) == FALSE) {
         $backtrace = debug_backtrace();
         throw new TSLProgrammingException($db_id . ' its not a supported Database , Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
     }
     // La variable G_DAOPATHS con los paths validos para los DAOs debe existir en las globalses
     if (!isset($G_DAOPATHS) || !is_array($G_DAOPATHS)) {
         $backtrace = debug_backtrace();
         throw new TSLProgrammingException('No se han definido los paths para los DAO o no se ha definido como array, Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
     }
     // La constante APPPATH tambien debe estar definida
     if (!defined('APPPATH')) {
         $backtrace = debug_backtrace();
         throw new TSLProgrammingException('Debe definirse la constante APPPATH, Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
     }
     /***********************************************************************
      *  Proceso
      */
     $dao_basename_stripped = substr(($t = strrchr($dao_basename, '\\')) !== false ? $t : '', 1);
     if (!$dao_basename_stripped) {
         $dao_basename_stripped = $dao_basename;
     }
     $defaultDBDriver = TSLUtilsHelper::getDefaultDatabaseDriver();
     $dao = '';
     // Si esta seteada el tipo de base de datos buscamos exclusimanente un DAO basado
     // en dicha base de datos
     if (isset($db_id)) {
         $dao = $dao_basename_stripped . '_' . $db_id;
         $dao_class .= '_' . $db_id;
     } else {
         // Si no se ha definido una tratamos con el default driver si esta definido
         if (isset($defaultDBDriver)) {
             $dao = $dao_basename_stripped . '_' . $defaultDBDriver;
             $dao_class .= '_' . $defaultDBDriver;
         }
     }
     $daoFileName = '';
     // Si existe una db definida ya sea por parametro o default
     // buscamos si el dao existe para esa condicion.
     if ($dao !== '') {
         foreach ($G_DAOPATHS as $value) {
             if ($value != '') {
                 $daoFileName = APPPATH . $value . '/' . $dao . EXT;
             } else {
                 $daoFileName = APPPATH . $dao . EXT;
             }
             if (file_exists($daoFileName)) {
                 $found = TRUE;
                 break;
             }
         }
     }
     // Buscamos el default de no haberse encontrado ninguno en el paso anterior
     if ($found === FALSE) {
         $dao = $dao_basename_stripped;
         foreach ($G_DAOPATHS as $value) {
             if ($value != '') {
                 $daoFileName = APPPATH . $value . '/' . $dao . EXT;
             } else {
                 $daoFileName = APPPATH . $dao . EXT;
             }
             if (file_exists($daoFileName)) {
                 $found = TRUE;
                 break;
             }
         }
     }
     // Si se encontro efectuamos el include
     if ($found) {
         $ret = (include_once $daoFileName);
         if ($ret !== 1) {
             $found = false;
         }
     }
     if ($found == false) {
         $backtrace = debug_backtrace();
         throw new TSLProgrammingException('DAO : ' . $dao_basename . ' No se encuentra en una ruta esperada , Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
     } else {
         // instancamos la clase
         return new $dao_class();
     }
 }
 /**
  * Genera la salida en JSON.
  *
  * @param TSLIDataTransferObj con el Data Transfer Object a procesar
  * @return un String con el DTO en formato JSON
  */
 public function &process(TSLIDataTransferObj &$DTO)
 {
     $out = NULL;
     if (isset($DTO)) {
         /* @var $outMessage TSLOutMessage */
         $outMessage =& $DTO->getOutMessage();
         if (strlen($outMessage->getAnswerMesage()) > 0) {
             // STATUS_OK = 0
             $out = 'status:-1';
             $out .= ',data:"' . $outMessage->getAnswerMesage() . '- Cod.Error: ' . $outMessage->getErrorCode() . '"';
         }
         if ($outMessage->isSuccess() == FALSE) {
             if ($outMessage->hasFieldErrors()) {
                 // VALIDATION ERRORS
                 $out = 'status:"-4"';
                 $fldErrors =& $outMessage->getFieldErrors();
                 // Si ya tiene longitud , ponemos una coma para indicar
                 // un nuevo elemento.
                 if (isset($out) and strlen($out) > 0) {
                     $out .= ',';
                 }
                 // la lista de field errors.
                 $out .= '"errors":{';
                 $count = count($fldErrors);
                 for ($i = 0; $i < $count; $i++) {
                     $out .= $fldErrors[$i]->getField() . ':"' . $fldErrors[$i]->getErrorMessage() . '"';
                     if ($i < $count - 1) {
                         $out .= ',';
                     }
                 }
                 $out .= '}';
             } else {
                 if ($outMessage->hasProcessErrors()) {
                     // STATUS_FAILURE = -1
                     $out = 'status:-1';
                     $processErrors =& $outMessage->getProcessErrors();
                     // Si ya tiene longitud , ponemos una coma para indicar
                     // un nuevo elemento.
                     if (isset($out) and strlen($out) > 0) {
                         $out .= ',';
                     }
                     // la lista de process errors.
                     $out .= 'data:';
                     $count = count($processErrors);
                     for ($i = 0; $i < $count; $i++) {
                         if ($i > 0) {
                             $out .= '\\n';
                         }
                         $out .= '"';
                         $perr = str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $processErrors[$i]->getErrorMessage());
                         // Si tiene excepcion procesamos.
                         $ex = $processErrors[$i]->getException();
                         if (isset($ex)) {
                             if (isset($perr)) {
                                 $out .= $perr . ' - ' . str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $ex->getMessage()) . ' ** CodError = ' . $processErrors[$i]->getErrorCode();
                             } else {
                                 $out .= str_replace(array("\"", "\r", "\n", "\r\n"), ' ', $ex->getMessage()) . ' ** CodError =' . $processErrors[$i]->getErrorCode();
                             }
                         } else {
                             $out .= $perr . ' ** CodError =' . $processErrors[$i]->getErrorCode();
                         }
                         $out .= '"';
                         if ($i < $count - 1) {
                             $out .= ',';
                         }
                     }
                     $out .= '';
                 }
             }
         } else {
             // STATUS_OK = 0
             $out = 'status:0';
         }
         // Si tiene parametros de salida los agregamos  antres de la data.
         $outParams =& $outMessage->getOutputparameters();
         if (is_array($outParams)) {
             foreach ($outParams as $i => $value) {
                 $out .= ',' . $i . ':' . $value;
             }
         }
         // Si no hay errores de proceso evaluamos la data
         if ($outMessage->hasProcessErrors() == FALSE && strlen($outMessage->getAnswerMesage()) == 0) {
             $oneRecord = false;
             // Procesamos la data
             $data = $outMessage->getResultData();
             if (isset($data)) {
                 // Si no es un arreglo solo posee un registro
                 if (!is_array($data)) {
                     $oneRecord = true;
                 }
                 $out .= ',data:';
                 $this->_processExtraData($outMessage->getResultData());
                 $dataResults = TSLUtilsHelper::array_ut8_encode_recursive($outMessage->getResultData());
                 $out .= json_encode($dataResults);
                 // Numero de registros = al numero de registros leidos + la posicion inicial en el set
                 // siempre que haya mas de una respuesta
                 $constraints =& $DTO->getConstraints();
                 if ($oneRecord === FALSE) {
                     $numRecords = $constraints->getStartRow() + count($dataResults);
                 } else {
                     $numRecords = 1;
                 }
                 // SE hace de tal forma que si no es el ultimo registro osea numRecords es menor a la ultima fila solicitada
                 // Ponemos como el total de registros una pagina mas (esto para evitar hacer un count)
                 $out .= ',endRow : "' . $numRecords . '"';
                 $out .= ',totalRows: "' . ($numRecords < $constraints->getEndRow() || $constraints->getEndRow() == 0 ? $numRecords : $constraints->getEndRow() + ($constraints->getEndRow() - $constraints->getStartRow())) . '"';
                 //                   $out .= ',totalRows: "'. ( $numRecords < 1000 ? ($numRecords)  :  1000 + (1000 - $constraints->getStartRow())) .'"';
             } else {
                 if ($out == NULL) {
                     // STATUS_OK = 0
                     $out = 'status:-1';
                     $out .= ',data:"Error Desconocido"';
                 }
             }
         }
         $out = '{response:{' . $out . '}}';
         return $out;
     } else {
         $out = '?????????????????';
         return $out;
     }
 }
 /**
  * Carga un DAO para la base de datos indicada , de no indicarse ningna buscara un
  * DAO para la base de datos default en uso , previamente tratara de ver s hay
  * un DAO generico .
  *
  * Osea de no indicarse el tipo de base de datos , tratara primero con la generica
  * (osea sin base de datos especificada) , luego tratara con la default de no encontrarla
  * indicara error.
  *
  * De especificarse el tipo de base de datos solo tratara de cargar la especifica.
  *
  * Las bases de datos permitidas son:
  * 'pgsql', 'mysql','mssql','oci8','sqllite' or 'odbc'.
  *
  * @param dao_basename , El nombre base del DAO , por ejemplo "Login"
  *
  * @param db_id , el identificador de la base de datos,los valores permitidos son : 'postgre',
  * 'mysql','mssql','oci8','sqllite' or 'odbc'. De no indicarse se tratara de cargar
  * la generica , luego la default.
  *
  * @return una referencia al DAO o una excepcion de programacion si se ha solicitado
  * un tipo de base de datos no soportada
  *
  *
  *
  */
 public static function loadDAO($dao_basename, $db_id = null)
 {
     // Los daos seran buscados en el APPPATH o en el equivalente a APPPATH_shared
     $applpath = substr(APPPATH, 0, strpos(APPPATH, '_')) . '/';
     $apppath_touse = $applpath;
     $applpath_alt = substr($applpath, 0, -1) . '_shared/';
     // Libreria base como ultimo recurrso
     $libdaopath = 'application/framework/techsoft/fw/app/dao/impl/';
     $applpath_exist = false;
     $applpath_alt_exist = false;
     // el calss base por si se usa un namespace
     $daoclass = '';
     $defaultDBDriver = TSLUtilsHelper::getDefaultDatabaseDriver();
     // Si el identificador de base de datos no esta definido y si se ha definido el default
     // db driver :
     // 1: Buscamops si existe un dao para la base de datos default.
     // 2: de lo contrario buscaremos el generico
     if (isset($db_id) == FALSE and isset($defaultDBDriver)) {
         if (file_exists($applpath . 'dao/' . $dao_basename . EXT)) {
             $applpath_exist = true;
         } else {
             if (file_exists($applpath_alt . 'dao/' . $dao_basename . EXT)) {
                 $applpath_alt_exist = true;
                 $apppath_touse = $applpath_alt;
                 $daoclass = 'shared\\dao\\';
             } else {
                 if (file_exists($libdaopath . $dao_basename . EXT)) {
                     $daoclass = 'app\\common\\dao\\impl\\';
                     $applpath_alt_exist = true;
                 }
             }
         }
         // Vemos si existe un DAO generico
         // de no existir cambio el id de la db a tartar de cargar al default
         // definido.
         if (!$applpath_exist && !$applpath_alt_exist) {
             $db_id = $defaultDBDriver;
             // Verificamos si existe en el directorio shared de la aplicacion
             // sino se asume en la misma aplicacion
             if (file_exists($applpath_alt . 'dao/' . $dao_basename . '_' . $db_id . EXT)) {
                 $apppath_touse = $applpath_alt . 'dao/';
                 $daoclass = 'shared\\dao\\';
             } else {
                 if (file_exists($libdaopath . $dao_basename . '_' . $db_id . EXT)) {
                     $apppath_touse = $libdaopath;
                     $daoclass = 'app\\common\\dao\\impl\\';
                 }
             }
         } else {
             unset($db_id);
         }
     }
     // Si se ha indicado tipo de base de datos vemos si esta permitida.
     if (isset($db_id) and in_array($db_id, self::$supported_dbs) == FALSE) {
         $backtrace = debug_backtrace();
         throw new TSLProgrammingException($db_id . ' its not a supported Database , Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
     } else {
         if ($daoclass === '') {
             $backtrace = debug_backtrace();
             throw new TSLProgrammingException('DAO : ' . $dao_basename . ' No se encuentra en una ruta esperada , Source= ' . $backtrace[0]['file'] . '-(' . $backtrace[0]['line'] . ')');
         } else {
             $daoclass .= $dao_basename;
             // Trato de cargar uno especifico o un generico.
             if (isset($db_id)) {
                 $daoclass .= '_' . $db_id;
                 require_once $apppath_touse . $dao_basename . '_' . $db_id . EXT;
                 return new $daoclass();
             } else {
                 require_once $apppath_touse . $dao_basename . EXT;
                 return new $daoclass();
             }
         }
     }
 }