GUIDs (Globally Unique Identifiers)

GUIDs internal procedures
DROP   PROCEDURE _Base_GUIDs_Create;
DELIMITER //
CREATE PROCEDURE _Base_GUIDs_Create
(
    $guid_type  CHAR(50),
    $REF_ID     INT,
OUT $guid       CHAR(36)
)
SQL SECURITY INVOKER
BEGIN

    DECLARE $GUID_ID      INT   DEFAULT  1;
    DECLARE $LOCK_STRING  TEXT  DEFAULT "";

    SET $guid = "";

    IF $REF_ID THEN

        SELECT   guid
        INTO    $guid
        FROM     base_guids
        WHERE    guid_type = $guid_type
        AND      REF_ID    = $REF_ID
        ORDER BY REF_ID
        LIMIT  1;

    END IF;

    IF '' = $guid THEN

        SET $LOCK_STRING = CONCAT( DATABASE(), ":", "Base_GUIDs_Create" );
        SET $guid        = "";

        REPEAT

            SET @msg  = NULL;
            SET @lock = GET_LOCK( $LOCK_STRING, 10 );

            IF ISNULL( @lock ) THEN

                SET @msg = 'GET_LOCK: returned NULL';

            ELSEIF 0 = @lock THEN

                SET @msg = 'GET_LOCK: returned zero';

            ELSEIF 1 != @lock THEN

                SET @msg = 'GET_LOCK: returned unknown';

            END IF;

            IF NOT ISNULL( @msg ) THEN

                CALL Base_Exceptions_Log( "Base_GUIDs_Create", @msg );

            END IF;

        UNTIL 1 = @lock END REPEAT;

        SET @MAX_GUID = NULL;
        SELECT MAX( GUID_ID ) + 1 INTO @MAX_GUID FROM base_guids;
        IF NOT ISNULL( @MAX_GUID ) THEN
            SET $GUID_ID = @MAX_GUID;
        END IF;

        SET $guid = UUID();
        WHILE EXISTS( SELECT * FROM base_guids WHERE guid = $guid ) DO

            SET $guid = UUID();

        END WHILE;

        REPLACE INTO base_guids
        (  GUID_ID,  guid,  guid_created,  guid_type,  REF_ID )
        VALUES
        ( $GUID_ID, $guid,         NOW(), $guid_type, $REF_ID );

        WHILE NOT RELEASE_LOCK( $LOCK_STRING ) DO
            SET @nop = 0;
        END WHILE;

    END IF;

    SET @LAST_INSERT_GUID = $guid;

END
//
DELIMITER ;
DROP   PROCEDURE _Base_GUIDs_Update;
DELIMITER //
CREATE PROCEDURE _Base_GUIDs_Update
(
    $guid       CHAR(36),
    $REF_ID     INT
)
SQL SECURITY INVOKER
BEGIN

    UPDATE base_guids
    SET    REF_ID = $REF_ID
    WHERE  guid   = $guid;

END
//
DELIMITER ;