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 ;