<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet id="1" author="cheydt">
        <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
          USE art_relations;;

          DROP PROCEDURE IF EXISTS `sp_add_track`;;

          CREATE DEFINER='theorchard'@'10.10.%' PROCEDURE `sp_add_track`(IN the_upc BIGINT, IN the_cd INT)
          BEGIN
              DECLARE new_track_id INT DEFAULT 0;
              DECLARE the_release_id INT DEFAULT 0;
              DECLARE lock_name VARCHAR(100);
              DECLARE temp_select_out INT DEFAULT 0;
              DECLARE EXIT HANDLER FOR SQLEXCEPTION 
                  BEGIN
                      SELECT 0 AS success;
                      ROLLBACK;
                  END;
              START TRANSACTION;                
                  SET lock_name = CONCAT('sp_add_track-', the_upc, '_', the_cd);
                  IF (GET_LOCK(lock_name, 5)) THEN
                      SELECT MAX(track_id) + 1, release_id INTO new_track_id, the_release_id FROM track WHERE upc = the_upc AND cd = the_cd;
                      IF (new_track_id IS NULL) THEN
                          SELECT 1 INTO new_track_id;
                          SELECT release_id INTO the_release_id FROM releases WHERE upc = the_upc;
                      END IF;
                      IF (the_release_id IS NULL) THEN
                          SELECT -1 AS success;
                          ROLLBACK;
                      ELSE
                          INSERT INTO track (upc, cd, release_id, track_id) VALUES (the_upc, the_cd, the_release_id, new_track_id);
                          IF ROW_COUNT() > 0 THEN
                              SELECT LAST_INSERT_ID() AS success;
                          ELSE
                              SELECT -4 AS success;
                              ROLLBACK;
                          END IF;
                      END IF;
                      SELECT RELEASE_LOCK(lock_name) INTO temp_select_out;
                  ELSE
                      SELECT -3 AS success;
                      ROLLBACK;
                  END IF;
              COMMIT;                
          END;;
        </sql>
        <rollback>
          <sql dbms="mysql" endDelimiter=";;" splitStatements="true" stripComments="true">
            USE art_relations;;            

            DROP PROCEDURE IF EXISTS `sp_add_track`;;
            
            CREATE DEFINER='theorchard'@'10.10.%' PROCEDURE `sp_add_track`(IN the_upc BIGINT, IN the_cd INT)
            BEGIN
                DECLARE newTrack INT DEFAULT 0;
                DECLARE the_release_id INT DEFAULT 0;
                DECLARE lock_name VARCHAR(100);
                DECLARE temp_select_out INT DEFAULT 0;
                DECLARE EXIT HANDLER FOR SQLEXCEPTION 
                BEGIN
                    SELECT 0 AS success;
                    ROLLBACK;
                END;
                START TRANSACTION;                
                    SELECT MAX(track_id) + 1, release_id INTO newTrack, the_release_id FROM track WHERE upc = the_upc AND cd = the_cd;
                    IF (newTrack IS NULL) THEN
                        SELECT 1 INTO newTrack;
                        SELECT release_id INTO the_release_id FROM releases WHERE upc = the_upc;
                    END IF;
                    IF (the_release_id IS NULL) THEN
                        SELECT -1 AS success;
                        ROLLBACK;
                    END IF;
                    SET lock_name = CONCAT(the_upc, '_', the_cd, '_', newTrack);
                    IF (IS_FREE_LOCK(lock_name)) THEN
                        IF (GET_LOCK(lock_name, 5)) THEN
                            INSERT INTO track (upc, cd, release_id, track_id) VALUES (the_upc, the_cd, the_release_id, newTrack);
                            IF ROW_COUNT() > 0 THEN
                                SELECT LAST_INSERT_ID() AS success;
                            ELSE
                                SELECT -4 AS success;
                                ROLLBACK;
                            END IF;
                            SELECT RELEASE_LOCK(lock_name) INTO temp_select_out;
                        ELSE
                            SELECT -3 AS success;
                            ROLLBACK;
                        END IF;
                    ELSE                        
                        SELECT -2 AS success;
                        ROLLBACK;
                    END IF;
                COMMIT;                
            END;;
          </sql>
        </rollback>
    </changeSet>
</databaseChangeLog>
