-- Repara la rutina requerida por las vistas de conclusiones y hace portables
-- todas las vistas al usuario real de cada instalacion (XAMPP o hosting).

SET NAMES utf8mb4;

DROP FUNCTION IF EXISTS fn_limitar_texto_250;

DELIMITER $$
CREATE DEFINER=CURRENT_USER FUNCTION fn_limitar_texto_250(p_texto TEXT)
RETURNS VARCHAR(250)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
  DECLARE v_texto TEXT;
  DECLARE v_corte VARCHAR(250);

  SET v_texto = TRIM(REPLACE(REPLACE(REPLACE(IFNULL(p_texto, ''), CHAR(13), ' '), CHAR(10), ' '), '  ', ' '));

  WHILE LOCATE('  ', v_texto) > 0 DO
    SET v_texto = REPLACE(v_texto, '  ', ' ');
  END WHILE;

  IF CHAR_LENGTH(v_texto) <= 250 THEN
    RETURN v_texto;
  END IF;

  SET v_corte = LEFT(v_texto, 250);
  IF LOCATE(' ', REVERSE(v_corte)) > 0 THEN
    SET v_corte = LEFT(v_corte, 250 - LOCATE(' ', REVERSE(v_corte)));
  END IF;

  RETURN TRIM(v_corte);
END$$
DELIMITER ;

DROP PROCEDURE IF EXISTS sp_comano_vistas_security_invoker;

DELIMITER $$
CREATE DEFINER=CURRENT_USER PROCEDURE sp_comano_vistas_security_invoker()
SQL SECURITY INVOKER
BEGIN
  DECLARE v_fin TINYINT DEFAULT 0;
  DECLARE v_vista VARCHAR(64);
  DECLARE v_definicion LONGTEXT;
  DECLARE cur_vistas CURSOR FOR
    SELECT TABLE_NAME, VIEW_DEFINITION
    FROM information_schema.VIEWS
    WHERE TABLE_SCHEMA = DATABASE()
    ORDER BY TABLE_NAME;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_fin = 1;

  OPEN cur_vistas;
  bucle_vistas: LOOP
    FETCH cur_vistas INTO v_vista, v_definicion;
    IF v_fin = 1 THEN
      LEAVE bucle_vistas;
    END IF;

    SET @comano_sql_vista = CONCAT(
      'CREATE OR REPLACE ALGORITHM=UNDEFINED DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW `',
      REPLACE(v_vista, '`', '``'),
      '` AS ',
      v_definicion
    );
    PREPARE comano_stmt_vista FROM @comano_sql_vista;
    EXECUTE comano_stmt_vista;
    DEALLOCATE PREPARE comano_stmt_vista;
  END LOOP;
  CLOSE cur_vistas;
END$$
DELIMITER ;

CALL sp_comano_vistas_security_invoker();
DROP PROCEDURE IF EXISTS sp_comano_vistas_security_invoker;

