Per un baco presente in SubText i feed Rss non sono formattati correttamente in quanto i link alle immagini sono assoluti (con link del tipo "/aaa/bbb.ccc") mentre i feed Rss permettono l'utilizzo esclusivamente di url complete (con link del tipo "http://hostname.domain/aaa/bbb.ccc").
Ho 2 scelte: modificare la base dati e le relative sp di inserimento in modo che vi siano solo url complete, oppure modificare la stored procedure di estrazione dei dati per la creazione dei feed.
Da un punto di vista di performance sarebbe preferibile modificare la parte di inserimento dei dati in quanto questi vengono modificati poche volte, ma la potenziale molteplicità di punti di ingresso e il risultato di non avere più url assolute (che da un punto di vista web sono preferibili a quelle complete non fosse altro nel caso si volesse modificare il dominio...) mi ha convinto a modificare la SP di estrazione.
Il problema si è complicato quando ho notato che la Stored Procedure in questione viene utilizzata sia per creare il feed in questione sia per la visualizzazione dei contenuti. Inoltre il campo contente l'articolo è di tipo ntext il che non permette di utilizzare la funzione replace necessaria per correggere il contenuto del db. Per utilizzare tale funzione è necessario convertire il campo in un nvarchar la cui lunghezza massima è di 4000 caratteri e quindi potenzialmente si possono troncare gli articoli più lunghi cosa accettabile per un feed Rss mano per il blog.
Il risultato della reingenierizzazione della SP subtext_GetConditionalEntries è il seguente:
"
CREATE PROC [dbo].[subtext_GetConditionalEntries]
(
@ItemCount int
, @PostType int
, @PostConfig int
, @BlogId int = NULL
, @IncludeCategories bit = 0
)
AS
CREATE Table #IDs
(
TempId int IDENTITY (0, 1) NOT NULL,
Id int not NULL
)
INSERT #IDs (Id)
SELECT [Id]
FROM [dbo].[subtext_Content]
WHERE PostType = @PostType
AND BlogId = COALESCE(@BlogId, BlogId)
AND PostConfig & @PostConfig = @PostConfig
ORDER BY ISNULL([DateSyndicated], [DateAdded]) DESC
IF @IncludeCategories = 0
BEGIN
SET ROWCOUNT @ItemCount
SELECT BlogId
, [dbo].[subtext_Content].[Id]
, Title
, DateAdded
-- Fix Complete URL for Rss Feed (make absolute url complete)
, [Text]
-- End Fix
, [Description]
, PostType
, Author
, Email
, DateUpdated
, FeedbackCount = ISNULL(FeedbackCount, 0)
, PostConfig
, EntryName
, DateSyndicated
FROM [dbo].[subtext_Content]
INNER JOIN #IDs ON #IDs.[Id] = [dbo].[subtext_Content].[Id]
ORDER BY #IDs.TempId
END
ELSE -- @IncludeCategories =1 (mostly used for RSS Feed)
BEGIN
-- Fix Complete URL for Rss Feed (find out the hostname)
DECLARE @CompleteURL varchar(100)
SELECT @CompleteURL = '="http://' + host + '/' FROM Subtext_Config WHERE blogid=@blogID
-- End Fix
SET ROWCOUNT @ItemCount
SELECT BlogId
, [dbo].[subtext_Content].[Id]
, Title
, DateAdded
-- Fix Complete URL for Rss Feed (make absolute url complete)
, replace(convert(nvarchar(4000), [Text]), '="/', @CompleteURL) AS [Text]
-- End Fix
, [Description]
, PostType
, Author
, Email
, DateUpdated
, FeedbackCount = ISNULL(FeedbackCount, 0)
, PostConfig
, EntryName
, DateSyndicated
FROM [dbo].[subtext_Content]
INNER JOIN #IDs ON #IDs.[Id] = [dbo].[subtext_Content].[Id]
ORDER BY #IDs.TempId
SELECT c.Title
, p.[Id]
FROM [dbo].[subtext_Links] l
INNER JOIN #IDs p ON l.[PostID] = p.[ID]
INNER JOIN [dbo].[subtext_LinkCategories] c ON l.CategoryID = c.CategoryID
ORDER BY p.[TempID] DESC
END
DROP TABLE #IDs
GO
"
Ora è tutto OK
Michele