USE gaia
GO
DECLARE
@galenicaQueueID UNIQUEIDENTIFIER,
@storageAccountName VARCHAR(MAX) = 'sttpsuntestphaqueues',
@queue VARCHAR(63) = 'sun004-triafin',
@payload VARCHAR(MAX)= '70612151215GSU004136552GSU0041500090004GSU004150170489782312025-12-032022-04-0248.4BASSET JOSE - YUGRRP Hsnü - 1789 LUGNORREZahlung ohne QRRExcel253062025-12-05T10:34:24',
@headers VARCHAR(MAX),
@headersBlob VARCHAR(MAX),
@oldConversationID UNIQUEIDENTIFIER,
@blobID UNIQUEIDENTIFIER,
@messageTypeName VARCHAR(255) = 'CeresSenderMessageType',
@statusCode INT,
@statusText NVARCHAR(4000),
@conversationID UNIQUEIDENTIFIER,
@messageID UNIQUEIDENTIFIER,
@insertionTime DATETIME
BEGIN
SET NOCOUNT ON;
/* -------------------- VALIDATION -------------------- */
/* -------------------- VARIABLES -------------------- */
DECLARE @token VARCHAR(MAX),
@credentialName VARCHAR(256) = NULL,
@timeoutSeconds INT = 30,
@response VARCHAR(MAX),
@rawResponse XML,
@finalURL VARCHAR(MAX),
@ttl CHAR(13) = 'messagettl=-1',
@source VARBINARY(MAX),
@originalPayload VARCHAR(MAX) = @payload,
@url VARCHAR(MAX),
@urlblob VARCHAR(MAX),
@returnValue INT = 0,
@payloadBytes INT,
@createURL VARCHAR(MAX),
@retryCount INT,
@maxRetries INT,
@retryDelaySeconds INT,
@waitTime CHAR(8),
@postURL VARCHAR(MAX);
/* -------------------- GET TOKEN -------------------- */
IF @credentialName IS NULL
BEGIN
EXEC @returnValue = sp_get_Bearer_token
@Token = @token OUTPUT,
@statusCode = @statusCode OUTPUT,
@statusText = @statusText OUTPUT;
IF @returnValue <> 0 OR @statusCode <> 200
RAISERROR('Error: Get token failed! statusCode: %d statusText: %s',16,1,@statusCode,@statusText);
END
/* -------------------- HEADERS -------------------- */
IF @headers IS NULL
SET @headers = CONCAT(
'Content-Type: application/xml',CHAR(10),
'x-ms-version: 2025-07-05',CHAR(10),
'Authorization: Bearer ',@token,CHAR(10)
);
IF @headersBlob IS NULL
SET @headersBlob = CONCAT(
'x-ms-blob-type: BlockBlob',CHAR(10),
'x-ms-version: 2025-07-05',CHAR(10),
'Authorization: Bearer ',@token,CHAR(10)
);
/* -------------------- PREPARE -------------------- */
EXEC sp_manage_GalenicaQueue;
SELECT @conversationID = ISNULL(@oldConversationID,NEWID());
SET @url = CONCAT('https://',@storageAccountName,'.queue.core.windows.net/');
SET @urlblob = CONCAT('https://',@storageAccountName,'.blob.core.windows.net/');
IF RIGHT(@queue,1) <> '/' SET @queue = CONCAT(@queue,'/');
SET @queue = LOWER(@queue);
/* -------------------- INSERT MONITORING -------------------- */
IF @galenicaQueueID IS NULL
BEGIN
SET @galenicaQueueID = NEWID();
INSERT INTO GalenicaQueue(
galenicaQueueID, conversationID, messageID,
storageAccountName, queueName, headers,
headersBlob, blobID, messageTypeName, payload
) VALUES (
@galenicaQueueID, @conversationID, @messageID,
@storageAccountName, REPLACE(@queue,'/',''), @headers,
@headersBlob, @blobID, @messageTypeName, @originalPayload
);
END
/* -------------------- BLOB UPLOAD IF NEEDED -------------------- */
SET @payloadBytes = DATALENGTH(@originalPayload);
IF @payloadBytes > 49152
BEGIN
IF @blobID IS NULL
BEGIN
EXEC @returnValue = sp_put_message_into_blob
@url = @urlblob,
@payload = @originalPayload,
@headers = @headersBlob,
@response = @response OUTPUT,
@statusCode = @statusCode OUTPUT,
@statusText = @statusText OUTPUT,
@blobID = @blobID OUTPUT;
IF @returnValue <> 0 RETURN;
END
END
ELSE
SET @blobID = NULL;
/* -------------------- BUILD MESSAGE -------------------- */
SET @postURL = CONCAT(@url,@queue,'messages?',CONCAT_WS('&',@ttl,NULLIF(@token,'')));
IF @blobID IS NULL
SET @payload = CONCAT(
'',CONVERT(VARCHAR(255),@conversationID),
'',@messageTypeName,
''
);
ELSE
SET @payload = CONCAT(
'',CONVERT(VARCHAR(255),@conversationID),
'',CONVERT(VARCHAR(255),@blobID),
'',@messageTypeName,
''
);
--cast the payload to xml first to enforce a utf-16le bytes encoding
SET @source = CONVERT(VARBINARY(MAX), CONVERT(XML, @payload));
SET @payload =
CAST('' AS XML).value('xs:base64Binary(sql:variable("@source"))','varchar(max)');
SET @payload = CONCAT('', @payload, '');
print @payload
/* -------------------- SEND MESSAGE FIRST TRY -------------------- */
BEGIN TRY
EXEC @returnValue = sp_Make_Restful_Call
@url = @postURL,
@method = 'POST',
@payload = @payload,
@headers = @headers,
@credentialName = @credentialName,
@timeoutSeconds = @timeoutSeconds,
@response = @response OUTPUT,
@statusText = @statusText OUTPUT,
@statusCode = @statusCode OUTPUT,
@raiseError = 0 ;
IF @statusCode BETWEEN 400 AND 499
RAISERROR('Error in make restfull call',16,10);
END TRY
BEGIN CATCH
/* -------------------- QUEUE MISSING → CREATE IT -------------------- */
IF @statusCode = 404
BEGIN
SET @createURL = CONCAT(@url,@queue,'?',@token);
EXEC @returnValue = sp_Make_Restful_Call
@url = @createURL,
@method = 'PUT',
@payload = NULL,
@headers = @headers,
@credentialName = @credentialName,
@timeoutSeconds = @timeoutSeconds,
@response = @response OUTPUT,
@statusText = @statusText OUTPUT,
@statusCode = @statusCode OUTPUT;
/* -------------------- 409 CONFLICT → RETRY + CLEANUP -------------------- */
IF @statusCode = 409
BEGIN
SET @retryCount = 0;
SET @maxRetries = 10;
SET @retryDelaySeconds = 10;
WHILE @retryCount < @maxRetries
BEGIN
EXEC @returnValue = sp_Make_Restful_Call
@url = @createURL,
@method = 'PUT',
@payload = NULL,
@headers = @headers,
@credentialName = @credentialName,
@timeoutSeconds = @timeoutSeconds,
@response = @response OUTPUT,
@statusText = @statusText OUTPUT,
@statusCode = @statusCode OUTPUT;
IF @statusCode IN (201,204)
BREAK;
/* Cleanup blob if needed */
IF @blobID IS NOT NULL
BEGIN
EXEC @returnValue = sp_delete_message_from_blob
@storageAccountName = @storageAccountName,
@headers = @headersBlob,
@blobID = @blobID,
@response = @response OUTPUT,
@statusCode = @statusCode OUTPUT,
@statusText = @statusText OUTPUT;
END
/* Wait */
SET @waitTime = CONCAT('00:00:', RIGHT('0'+CAST(@retryDelaySeconds AS VARCHAR(2)),2));
WAITFOR DELAY @waitTime;
SET @retryCount += 1;
END
IF @statusCode NOT IN (201,204)
RAISERROR(
'Error: Create the queue failed after %d retries! statusCode: %d statusText: %s',
16,1,@retryCount,@statusCode,@statusText
);
END
/* Retry sending */
EXEC @returnValue = sp_Make_Restful_Call
@url = @postURL,
@method = 'POST',
@payload = @payload,
@headers = @headers,
@credentialName = @credentialName,
@timeoutSeconds = @timeoutSeconds,
@response = @response OUTPUT,
@statusText = @statusText OUTPUT,
@statusCode = @statusCode OUTPUT;
END
END CATCH
return
/* -------------------- UPDATE MONITORING -------------------- */
UPDATE GalenicaQueue
SET blobID = @blobID,
statusCode = @statusCode,
statusText = @statusText,
response = @response
WHERE galenicaQueueID = @galenicaQueueID;
/* -------------------- FINAL VALIDATION -------------------- */
IF @returnValue <> 0 OR @statusCode NOT BETWEEN 200 and 299
RAISERROR('Error: Create the message into the queue failed! statusCode: %d statusText: %s',
16,1,@statusCode,@statusText);
/* -------------------- PARSE RESPONSE -------------------- */
SET @rawResponse = CAST(@response AS XML);
SELECT @messageID = msg.value('(MessageId)[1]','UNIQUEIDENTIFIER'),
@insertionTime =
CONVERT(DATETIME,
CAST(
LTRIM(RTRIM(
REPLACE(
SUBSTRING(
msg.value('(InsertionTime)[1]','VARCHAR(MAX)'),
CHARINDEX(',',msg.value('(InsertionTime)[1]','VARCHAR(MAX)'))+1,
LEN(msg.value('(InsertionTime)[1]','VARCHAR(MAX)'))
),
'GMT',''
)
))
AS DATETIMEOFFSET)
AT TIME ZONE 'UTC'
AT TIME ZONE 'Central European Standard Time')
FROM @rawResponse.nodes('/QueueMessagesList/QueueMessage') AS T(msg);
UPDATE GalenicaQueue
SET messageID = @messageID,
blobID = @blobID,
statusCode = @statusCode,
statusText = @statusText,
response = @response,
insertionTime = @insertionTime
WHERE galenicaQueueID = @galenicaQueueID;
END
GO