Ukladanie komentárov v stored procedúrach

gvim-MySQL-procedure

Píšete stored procedúru pre MySQL na spracovanie nejakých dát. Používate na to svoj obľúbený editor a túto procedúru udržiavate ako súbor na disku. Commitnete svoj výtvor do verzionovacieho nástroja a naimportujete svoju procedúru do MySQL:

DELIMITER ;;
DROP PROCEDURE IF EXISTS `calc_daily_counters` ;;
CREATE PROCEDURE `calc_daily_counters` ()
BEGIN
    -- Declare '_val' variables to read in each record from the cursor
    DECLARE tablename_val VARCHAR(32);
    DECLARE paramname_val VARCHAR(32);

    -- Declare variables used just for cursor and loop control
    DECLARE no_more_rows BOOLEAN;
    DECLARE loop_cntr INT DEFAULT 0;
    DECLARE num_rows INT DEFAULT 0;

    -- Declare the cursor
    DECLARE daily_counters_cur CURSOR FOR
    SELECT tablename, paramname FROM conf_daily_counters;

    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        -- ERROR
        ROLLBACK;
    END;

    DECLARE EXIT HANDLER FOR SQLWARNING
    BEGIN
        -- WARNING
        ROLLBACK;
    END;

    -- Declare 'handlers' for exceptions
    DECLARE CONTINUE HANDLER FOR NOT FOUND
    SET no_more_rows = TRUE;

    OPEN daily_counters_cur;
    SELECT FOUND_ROWS() INTO num_rows;
    the_loop: LOOP

        FETCH  daily_counters_cur
        INTO   tablename_val, paramname_val;

        -- break out of the loop if
        -- 1) there were no records, or
              -- 2) we've processed them all
        IF no_more_rows THEN
            CLOSE daily_counters_cur;
            LEAVE the_loop;
        END IF;

        SET @sql = CONCAT('INSERT INTO trend_daily_counters (date, value, counter) ',
            'SELECT CURDATE(), "', paramname_val, '", COUNT(*) FROM `', tablename_val, '`;');
        SELECT @sql;
        PREPARE STMT FROM @sql;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;

        -- count the number of times looped
        SET loop_cntr = loop_cntr + 1;

    END LOOP the_loop;

END ;;
DELIMITER ;

$ mysql vasadatabaza < calc_daily_counters.sql

A tu je zrada! Štandardný MySQL klient zahodí pri importe do DB všetky vaše komentáre. Existuje ale riešenie, ako si tieto komentáre zachovať. Vytvorte pre MySQL klienta nasledovný konfiguračný súbor ~/.my.cnf:

[client]
default-character-set = utf8
user = vasemeno
database = vasadatabaza
password = ake_mate_radi_heslo?
[mysql]
comments = 1
prompt=(\\u@\\h) [\\d]>\\_

A takto si overíme, že všetkých našich desať komentárov sa zachovalo pri importe do databázy:

$ grep -e '^\s*--' calc_daily_counters.sql | wc -l 
10
$ mysql --comments=0 < calc_daily_counters.sql 
$ echo 'SHOW CREATE PROCEDURE calc_daily_counters \\G' | mysql | grep -e '^\s*--' | wc -l
0
$ mysql --comments=1 < calc_daily_counters.sql                                          
$ echo 'SHOW CREATE PROCEDURE calc_daily_counters \\G' | mysql | grep -e '^\s*--' | wc -l
10
$ mysql < calc_daily_counters.sql                                           
$ echo 'SHOW CREATE PROCEDURE calc_daily_counters \\G' | mysql | grep -e '^\s*--' | wc -l
10