/* Ejecutar en prod * /

/* DROP PROCEDURE IF EXISTS nst.NodeAdd;

DELIMITER $$
$$
CREATE DEFINER=`root`@`%` PROCEDURE `nst`.`nodeAdd`(IN `vScheme` VARCHAR(45), IN `vTable` VARCHAR(45), IN `vParentFk` INT, IN `vChild` VARCHAR(100))
BEGIN
	DECLARE vSql TEXT;
	DECLARE vTableClone VARCHAR(45);

	SET vTableClone = CONCAT(vTable, 'Clone');
   
	CALL util.exec(CONCAT('DROP TEMPORARY TABLE IF EXISTS tmp.', vTableClone));
	CALL util.exec(CONCAT(
		'CREATE TEMPORARY TABLE tmp.', vTableClone,
		'	ENGINE = MEMORY'
		'	SELECT * FROM ', vScheme, '.', vTable
  	));

    -- Check parent childs
    SET vSql = sql_printf('
		SELECT COUNT(c.id) INTO @childs
			FROM %t.%t p
				LEFT JOIN %t.%t c ON c.lft BETWEEN p.lft AND p.rgt AND c.id != %v
			WHERE p.id = %v', 
		vScheme, vTable, 'tmp', vTableClone, vParentFk, vParentFk);
    SET @qrySql := vSql;
    
    PREPARE stmt FROM @qrySql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    -- Select left from last child
    IF @childs = 0 THEN
		SET vSql = sql_printf('SELECT lft INTO @vLeft FROM %t.%t WHERE id = %v', vScheme, vTable, vParentFk);
		SET @qrySql := vSql;
    ELSE
        SET vSql = sql_printf('
			SELECT c.rgt INTO @vLeft
				FROM %t.%t p 
					JOIN %t.%t c ON c.lft BETWEEN p.lft AND p.rgt 
				WHERE p.id = %v 
				ORDER BY c.lft
				DESC LIMIT 1', 
			vScheme, vTable, 'tmp', vTableClone, vParentFk);
		SET @qrySql := vSql;
    END IF;
    
    PREPARE stmt FROM @qrySql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    -- Update right
	SET vSql = sql_printf('UPDATE %t.%t SET rgt = rgt + 2 WHERE rgt > %v ORDER BY rgt DESC', vScheme, vTable, @vLeft);
    SET @qrySql := vSql;
    
    PREPARE stmt FROM @qrySql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    SET vSql = sql_printf('UPDATE %t.%t SET lft = lft + 2 WHERE lft > %v ORDER BY lft DESC', vScheme, vTable, @vLeft);
    SET @qrySql := vSql;
    
    PREPARE stmt FROM @qrySql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    
    -- Escape character
    SET vChild = REPLACE(vChild, "'", "\\'");
    
    -- Add child
    SET vSql = sql_printf('INSERT INTO %t.%t (name, lft, rgt) VALUES (%v, %v, %v)', vScheme, vTable, vChild, @vLeft + 1, @vLeft + 2);
    SET @qrySql := vSql;
    
    PREPARE stmt FROM @qrySql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
   
	SELECT id, name, lft, rgt, depth, sons FROM vn.department 
		WHERE id = LAST_INSERT_ID();
  
   CALL util.exec(CONCAT('DROP TEMPORARY TABLE tmp.', vTableClone));
END$$
DELIMITER ;
 */