Artifact 176d496b6ef4a6923a3577e9b908796bdd202b25:
File
src/rss.c
part of check-in
[07eaead5dc]
- Added RSS feed. You can set the RSS title, description in Setup. Added header to style to include title and pointer to the new RSS feed. The new RSS feed is BaseURL/timeline.rss
by
jnc on
2007-09-23 18:24:21.
0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 37 20 44 2e 20 52 69 63 68 (c) 2007 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 GNU General Pub
00a0: 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 76 lic.** License v
00b0: 65 72 73 69 6f 6e 20 32 20 61 73 20 70 75 62 6c ersion 2 as publ
00c0: 69 73 68 65 64 20 62 79 20 74 68 65 20 46 72 65 ished by the Fre
00d0: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
00e0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ation..**.** Thi
00f0: 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 s program is dis
0100: 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 tributed in the
0110: 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c hope that it wil
0120: 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 l be useful,.**
0130: 62 75 74 20 57 49 54 48 4f 55 54 20 41 4e 59 20 but WITHOUT ANY
0140: 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 WARRANTY; withou
0150: 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 t even the impli
0160: 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a ed warranty of.*
0170: 2a 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 * MERCHANTABILIT
0180: 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 Y or FITNESS FOR
0190: 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50 55 A PARTICULAR PU
01a0: 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65 20 RPOSE. See the
01b0: 47 4e 55 0a 2a 2a 20 47 65 6e 65 72 61 6c 20 50 GNU.** General P
01c0: 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f ublic License fo
01d0: 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a r more details..
01e0: 2a 2a 20 0a 2a 2a 20 59 6f 75 20 73 68 6f 75 6c ** .** You shoul
01f0: 64 20 68 61 76 65 20 72 65 63 65 69 76 65 64 20 d have received
0200: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 47 4e a copy of the GN
0210: 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 U General Public
0220: 0a 2a 2a 20 4c 69 63 65 6e 73 65 20 61 6c 6f 6e .** License alon
0230: 67 20 77 69 74 68 20 74 68 69 73 20 6c 69 62 72 g with this libr
0240: 61 72 79 3b 20 69 66 20 6e 6f 74 2c 20 77 72 69 ary; if not, wri
0250: 74 65 20 74 6f 20 74 68 65 0a 2a 2a 20 46 72 65 te to the.** Fre
0260: 65 20 53 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 e Software Found
0270: 61 74 69 6f 6e 2c 20 49 6e 63 2e 2c 20 35 39 20 ation, Inc., 59
0280: 54 65 6d 70 6c 65 20 50 6c 61 63 65 20 2d 20 53 Temple Place - S
0290: 75 69 74 65 20 33 33 30 2c 0a 2a 2a 20 42 6f 73 uite 330,.** Bos
02a0: 74 6f 6e 2c 20 4d 41 20 20 30 32 31 31 31 2d 31 ton, MA 02111-1
02b0: 33 30 37 2c 20 55 53 41 2e 0a 2a 2a 0a 2a 2a 20 307, USA..**.**
02c0: 41 75 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 Author contact i
02d0: 6e 66 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 nformation:.**
02e0: 20 64 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a drh@hwaci.com.*
02f0: 2a 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 * http://www.h
0300: 77 61 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a waci.com/drh/.**
0310: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .***************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 .**.** This file
0370: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 contains code u
0380: 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 sed to create a
0390: 52 53 53 20 66 65 65 64 20 66 6f 72 20 74 68 65 RSS feed for the
03a0: 20 43 47 49 20 69 6e 74 65 72 66 61 63 65 2e 0a CGI interface..
03b0: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 63 6f 6e */.#include "con
03c0: 66 69 67 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 fig.h".#include
03d0: 22 72 73 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 "rss.h".#include
03e0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 74 69 6d <assert.h>..tim
03f0: 65 5f 74 20 72 73 73 5f 64 61 74 65 74 69 6d 65 e_t rss_datetime
0400: 5f 74 6f 5f 74 69 6d 65 5f 74 28 63 68 61 72 20 _to_time_t(char
0410: 2a 64 74 29 7b 0a 20 20 73 74 72 75 63 74 20 74 *dt){. struct t
0420: 6d 20 74 68 65 5f 74 6d 3b 0a 20 20 0a 20 20 74 m the_tm;. . t
0430: 68 65 5f 74 6d 2e 74 6d 5f 79 65 61 72 20 3d 20 he_tm.tm_year =
0440: 61 74 6f 69 28 64 74 29 2d 31 39 30 30 3b 0a 20 atoi(dt)-1900;.
0450: 20 74 68 65 5f 74 6d 2e 74 6d 5f 6d 6f 6e 20 20 the_tm.tm_mon
0460: 3d 20 61 74 6f 69 28 26 64 74 5b 35 5d 29 2d 31 = atoi(&dt[5])-1
0470: 3b 0a 20 20 74 68 65 5f 74 6d 2e 74 6d 5f 6d 64 ;. the_tm.tm_md
0480: 61 79 20 3d 20 61 74 6f 69 28 26 64 74 5b 38 5d ay = atoi(&dt[8]
0490: 29 3b 0a 20 20 74 68 65 5f 74 6d 2e 74 6d 5f 68 );. the_tm.tm_h
04a0: 6f 75 72 20 3d 20 61 74 6f 69 28 26 64 74 5b 31 our = atoi(&dt[1
04b0: 31 5d 29 3b 0a 20 20 74 68 65 5f 74 6d 2e 74 6d 1]);. the_tm.tm
04c0: 5f 6d 69 6e 20 20 3d 20 61 74 6f 69 28 26 64 74 _min = atoi(&dt
04d0: 5b 31 34 5d 29 3b 0a 20 20 74 68 65 5f 74 6d 2e [14]);. the_tm.
04e0: 74 6d 5f 73 65 63 20 20 3d 20 61 74 6f 69 28 26 tm_sec = atoi(&
04f0: 64 74 5b 31 37 5d 29 3b 0a 20 20 0a 20 20 72 65 dt[17]);. . re
0500: 74 75 72 6e 20 6d 6b 74 69 6d 65 28 26 74 68 65 turn mktime(&the
0510: 5f 74 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 _tm);.}../*.** W
0520: 45 42 50 41 47 45 3a 20 74 69 6d 65 6c 69 6e 65 EBPAGE: timeline
0530: 2e 72 73 73 0a 2a 2f 0a 0a 76 6f 69 64 20 70 61 .rss.*/..void pa
0540: 67 65 5f 74 69 6d 65 6c 69 6e 65 5f 72 73 73 28 ge_timeline_rss(
0550: 76 6f 69 64 29 7b 0a 20 20 53 74 6d 74 20 71 3b void){. Stmt q;
0560: 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 3d 30 3b 0a . int nLine=0;.
0570: 20 20 63 68 61 72 20 2a 7a 50 75 62 44 61 74 65 char *zPubDate
0580: 2c 20 2a 7a 52 53 53 54 69 74 6c 65 2c 20 2a 7a , *zRSSTitle, *z
0590: 52 53 53 44 65 73 63 72 2c 20 2a 7a 46 72 65 65 RSSDescr, *zFree
05a0: 52 53 53 54 69 74 6c 65 3d 30 3b 0a 20 20 63 6f RSSTitle=0;. co
05b0: 6e 73 74 20 63 68 61 72 20 7a 53 51 4c 5b 5d 20 nst char zSQL[]
05c0: 3d 0a 20 20 20 20 40 20 53 45 4c 45 43 54 0a 20 =. @ SELECT.
05d0: 20 20 20 40 20 20 20 62 6c 6f 62 2e 72 69 64 2c @ blob.rid,
05e0: 0a 20 20 20 20 40 20 20 20 75 75 69 64 2c 0a 20 . @ uuid,.
05f0: 20 20 20 40 20 20 20 64 61 74 65 74 69 6d 65 28 @ datetime(
0600: 65 76 65 6e 74 2e 6d 74 69 6d 65 29 2c 0a 20 20 event.mtime),.
0610: 20 20 40 20 20 20 63 6f 61 6c 65 73 63 65 28 65 @ coalesce(e
0620: 63 6f 6d 6d 65 6e 74 2c 63 6f 6d 6d 65 6e 74 29 comment,comment)
0630: 2c 0a 20 20 20 20 40 20 20 20 63 6f 61 6c 65 73 ,. @ coales
0640: 63 65 28 65 75 73 65 72 2c 75 73 65 72 29 2c 0a ce(euser,user),.
0650: 20 20 20 20 40 20 20 20 28 53 45 4c 45 43 54 20 @ (SELECT
0660: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 70 6c count(*) FROM pl
0670: 69 6e 6b 20 57 48 45 52 45 20 70 69 64 3d 62 6c ink WHERE pid=bl
0680: 6f 62 2e 72 69 64 20 41 4e 44 20 69 73 70 72 69 ob.rid AND ispri
0690: 6d 29 2c 0a 20 20 20 20 40 20 20 20 28 53 45 4c m),. @ (SEL
06a0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f ECT count(*) FRO
06b0: 4d 20 70 6c 69 6e 6b 20 57 48 45 52 45 20 63 69 M plink WHERE ci
06c0: 64 3d 62 6c 6f 62 2e 72 69 64 29 0a 20 20 20 20 d=blob.rid).
06d0: 40 20 46 52 4f 4d 20 65 76 65 6e 74 2c 20 62 6c @ FROM event, bl
06e0: 6f 62 0a 20 20 20 20 40 20 57 48 45 52 45 20 62 ob. @ WHERE b
06f0: 6c 6f 62 2e 72 69 64 3d 65 76 65 6e 74 2e 6f 62 lob.rid=event.ob
0700: 6a 69 64 0a 20 20 20 20 40 20 4f 52 44 45 52 20 jid. @ ORDER
0710: 42 59 20 65 76 65 6e 74 2e 6d 74 69 6d 65 20 44 BY event.mtime D
0720: 45 53 43 0a 20 20 3b 0a 20 20 0a 20 20 63 67 69 ESC. ;. . cgi
0730: 5f 73 65 74 5f 63 6f 6e 74 65 6e 74 5f 74 79 70 _set_content_typ
0740: 65 28 22 61 70 70 6c 69 63 61 74 69 6f 6e 2f 72 e("application/r
0750: 73 73 2b 78 6d 6c 22 29 3b 0a 20 20 0a 20 20 7a ss+xml");. . z
0760: 52 53 53 54 69 74 6c 65 20 3d 20 64 62 5f 67 65 RSSTitle = db_ge
0770: 74 28 22 72 73 73 2d 74 69 74 6c 65 22 2c 20 30 t("rss-title", 0
0780: 29 3b 0a 20 20 69 66 28 20 7a 52 53 53 54 69 74 );. if( zRSSTit
0790: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 46 72 le==0 ){. zFr
07a0: 65 65 52 53 53 54 69 74 6c 65 20 3d 20 7a 52 53 eeRSSTitle = zRS
07b0: 53 54 69 74 6c 65 20 3d 20 6d 70 72 69 6e 74 66 STitle = mprintf
07c0: 28 22 46 6f 73 73 69 6c 20 73 6f 75 72 63 65 20 ("Fossil source
07d0: 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 3a 20 repository for:
07e0: 25 73 22 2c 0a 20 20 20 20 20 20 67 2e 7a 42 61 %s",. g.zBa
07f0: 73 65 55 52 4c 29 3b 0a 20 20 7d 0a 20 20 7a 52 seURL);. }. zR
0800: 53 53 44 65 73 63 72 20 3d 20 64 62 5f 67 65 74 SSDescr = db_get
0810: 28 22 72 73 73 2d 64 65 73 63 72 69 70 74 69 6f ("rss-descriptio
0820: 6e 22 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 52 n", 0);. if( zR
0830: 53 53 44 65 73 63 72 3d 3d 30 20 29 7b 0a 20 20 SSDescr==0 ){.
0840: 20 20 7a 52 53 53 44 65 73 63 72 20 3d 20 7a 52 zRSSDescr = zR
0850: 53 53 54 69 74 6c 65 3b 0a 20 20 7d 0a 20 20 0a SSTitle;. }. .
0860: 20 20 7a 50 75 62 44 61 74 65 20 3d 20 63 67 69 zPubDate = cgi
0870: 5f 72 66 63 38 32 32 5f 64 61 74 65 73 74 61 6d _rfc822_datestam
0880: 70 28 74 69 6d 65 28 4e 55 4c 4c 29 29 3b 0a 20 p(time(NULL));.
0890: 20 0a 20 20 40 20 3c 3f 78 6d 6c 20 76 65 72 73 . @ <?xml vers
08a0: 69 6f 6e 3d 22 31 2e 30 22 3f 3e 0a 20 20 40 20 ion="1.0"?>. @
08b0: 3c 72 73 73 20 76 65 72 73 69 6f 6e 3d 22 32 2e <rss version="2.
08c0: 30 22 3e 0a 20 20 40 20 20 20 3c 63 68 61 6e 6e 0">. @ <chann
08d0: 65 6c 3e 0a 20 20 40 20 20 20 20 20 3c 74 69 74 el>. @ <tit
08e0: 6c 65 3e 25 73 28 7a 52 53 53 54 69 74 6c 65 29 le>%s(zRSSTitle)
08f0: 3c 2f 74 69 74 6c 65 3e 0a 20 20 40 20 20 20 20 </title>. @
0900: 20 3c 6c 69 6e 6b 3e 25 73 28 67 2e 7a 42 61 73 <link>%s(g.zBas
0910: 65 55 52 4c 29 3c 2f 6c 69 6e 6b 3e 0a 20 20 40 eURL)</link>. @
0920: 20 20 20 20 20 3c 64 65 73 63 72 69 70 74 69 6f <descriptio
0930: 6e 3e 25 73 28 7a 52 53 53 44 65 73 63 72 29 3c n>%s(zRSSDescr)<
0940: 2f 64 65 73 63 72 69 70 74 69 6f 6e 3e 0a 20 20 /description>.
0950: 40 20 20 20 20 20 3c 70 75 62 44 61 74 65 3e 25 @ <pubDate>%
0960: 73 28 7a 50 75 62 44 61 74 65 29 3c 2f 70 75 62 s(zPubDate)</pub
0970: 44 61 74 65 3e 0a 20 20 40 20 20 20 20 20 3c 67 Date>. @ <g
0980: 65 6e 65 72 61 74 6f 72 3e 46 6f 73 73 69 6c 20 enerator>Fossil
0990: 76 65 72 73 69 6f 6e 20 25 73 28 4d 41 4e 49 46 version %s(MANIF
09a0: 45 53 54 5f 56 45 52 53 49 4f 4e 29 20 25 73 28 EST_VERSION) %s(
09b0: 4d 41 4e 49 46 45 53 54 5f 44 41 54 45 29 3c 2f MANIFEST_DATE)</
09c0: 67 65 6e 65 72 61 74 6f 72 3e 0a 20 20 64 62 5f generator>. db_
09d0: 70 72 65 70 61 72 65 28 26 71 2c 20 7a 53 51 4c prepare(&q, zSQL
09e0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 64 62 5f 73 );. while( db_s
09f0: 74 65 70 28 26 71 29 3d 3d 53 51 4c 49 54 45 5f tep(&q)==SQLITE_
0a00: 52 4f 57 20 26 26 20 6e 4c 69 6e 65 3c 3d 32 30 ROW && nLine<=20
0a10: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ){. const ch
0a20: 61 72 20 2a 7a 49 64 20 3d 20 64 62 5f 63 6f 6c ar *zId = db_col
0a30: 75 6d 6e 5f 74 65 78 74 28 26 71 2c 20 31 29 3b umn_text(&q, 1);
0a40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
0a50: 2a 7a 44 61 74 65 20 3d 20 64 62 5f 63 6f 6c 75 *zDate = db_colu
0a60: 6d 6e 5f 74 65 78 74 28 26 71 2c 20 32 29 3b 0a mn_text(&q, 2);.
0a70: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
0a80: 7a 43 6f 6d 20 3d 20 64 62 5f 63 6f 6c 75 6d 6e zCom = db_column
0a90: 5f 74 65 78 74 28 26 71 2c 20 33 29 3b 0a 20 20 _text(&q, 3);.
0aa0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 const char *zA
0ab0: 75 74 68 6f 72 20 3d 20 64 62 5f 63 6f 6c 75 6d uthor = db_colum
0ac0: 6e 5f 74 65 78 74 28 26 71 2c 20 34 29 3b 0a 20 n_text(&q, 4);.
0ad0: 20 20 20 63 68 61 72 20 2a 7a 50 72 65 66 69 78 char *zPrefix
0ae0: 20 3d 20 22 22 3b 0a 20 20 20 20 69 6e 74 20 6e = "";. int n
0af0: 43 68 69 6c 64 20 3d 20 64 62 5f 63 6f 6c 75 6d Child = db_colum
0b00: 6e 5f 69 6e 74 28 26 71 2c 20 35 29 3b 0a 20 20 n_int(&q, 5);.
0b10: 20 20 69 6e 74 20 6e 50 61 72 65 6e 74 20 3d 20 int nParent =
0b20: 64 62 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 26 71 db_column_int(&q
0b30: 2c 20 36 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a , 6);. . z
0b40: 44 61 74 65 20 3d 20 63 67 69 5f 72 66 63 38 32 Date = cgi_rfc82
0b50: 32 5f 64 61 74 65 73 74 61 6d 70 28 72 73 73 5f 2_datestamp(rss_
0b60: 64 61 74 65 74 69 6d 65 5f 74 6f 5f 74 69 6d 65 datetime_to_time
0b70: 5f 74 28 7a 44 61 74 65 29 29 3b 0a 20 20 20 20 _t(zDate));.
0b80: 0a 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 74 . if( nParent
0b90: 3e 31 20 26 26 20 6e 43 68 69 6c 64 3e 31 20 29 >1 && nChild>1 )
0ba0: 7b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 78 20 {. zPrefix
0bb0: 3d 20 22 2a 4d 45 52 47 45 2f 46 4f 52 4b 2a 20 = "*MERGE/FORK*
0bc0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 ";. }else if(
0bd0: 20 6e 50 61 72 65 6e 74 3e 31 20 29 7b 0a 20 20 nParent>1 ){.
0be0: 20 20 20 20 7a 50 72 65 66 69 78 20 3d 20 22 2a zPrefix = "*
0bf0: 4d 45 52 47 45 2a 20 22 3b 0a 20 20 20 20 7d 65 MERGE* ";. }e
0c00: 6c 73 65 20 69 66 28 20 6e 43 68 69 6c 64 3e 31 lse if( nChild>1
0c10: 20 29 7b 0a 20 20 20 20 20 20 7a 50 72 65 66 69 ){. zPrefi
0c20: 78 20 3d 20 22 2a 46 4f 52 4b 2a 20 22 3b 0a 20 x = "*FORK* ";.
0c30: 20 20 20 7d 0a 0a 20 20 20 20 40 20 20 20 20 20 }.. @
0c40: 3c 69 74 65 6d 3e 0a 20 20 20 20 40 20 20 20 20 <item>. @
0c50: 20 20 20 3c 74 69 74 6c 65 3e 25 73 28 7a 50 72 <title>%s(zPr
0c60: 65 66 69 78 29 25 73 28 7a 43 6f 6d 29 3c 2f 74 efix)%s(zCom)</t
0c70: 69 74 6c 65 3e 0a 20 20 20 20 40 20 20 20 20 20 itle>. @
0c80: 20 20 3c 6c 69 6e 6b 3e 25 73 28 67 2e 7a 42 61 <link>%s(g.zBa
0c90: 73 65 55 52 4c 29 2f 76 69 6e 66 6f 2f 25 73 28 seURL)/vinfo/%s(
0ca0: 7a 49 64 29 3c 2f 6c 69 6e 6b 3e 0a 20 20 20 20 zId)</link>.
0cb0: 40 20 20 20 20 20 20 20 3c 64 65 73 63 72 69 70 @ <descrip
0cc0: 74 69 6f 6e 3e 25 73 28 7a 50 72 65 66 69 78 29 tion>%s(zPrefix)
0cd0: 25 73 28 7a 43 6f 6d 29 3c 2f 64 65 73 63 72 69 %s(zCom)</descri
0ce0: 70 74 69 6f 6e 3e 0a 20 20 20 20 40 20 20 20 20 ption>. @
0cf0: 20 20 20 3c 70 75 62 44 61 74 65 3e 25 73 28 7a <pubDate>%s(z
0d00: 44 61 74 65 29 3c 2f 70 75 62 44 61 74 65 3e 0a Date)</pubDate>.
0d10: 20 20 20 20 40 20 20 20 20 20 20 20 3c 61 75 74 @ <aut
0d20: 68 6f 72 3e 25 73 28 7a 41 75 74 68 6f 72 29 3c hor>%s(zAuthor)<
0d30: 2f 61 75 74 68 6f 72 3e 0a 20 20 20 20 40 20 20 /author>. @
0d40: 20 20 20 20 20 3c 67 75 69 64 3e 25 73 28 67 2e <guid>%s(g.
0d50: 7a 42 61 73 65 55 52 4c 29 2f 76 69 6e 66 6f 2f zBaseURL)/vinfo/
0d60: 25 73 28 7a 49 64 29 3c 2f 67 75 69 64 3e 0a 20 %s(zId)</guid>.
0d70: 20 20 20 40 20 20 20 20 20 3c 2f 69 74 65 6d 3e @ </item>
0d80: 0a 20 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 . nLine++;.
0d90: 7d 0a 0a 20 20 64 62 5f 66 69 6e 61 6c 69 7a 65 }.. db_finalize
0da0: 28 26 71 29 3b 0a 20 20 40 20 20 20 3c 2f 63 68 (&q);. @ </ch
0db0: 61 6e 6e 65 6c 3e 0a 20 20 40 20 3c 2f 72 73 73 annel>. @ </rss
0dc0: 3e 0a 7d 0a >.}.