From 66a2924c6b915e72b0a82569bf1be636115b2165 Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sun, 17 May 2020 17:29:51 -0400 Subject: [PATCH] 2020-05-17 Fred Gleason * Dropped the 'RSS_SCHEMAS' table from the database. * Incremented the database version to 325. * Moved RSS template definitions to 'lib/rdfeed.h'. Signed-off-by: Fred Gleason --- ChangeLog | 4 ++ docs/tables/Makefile.am | 1 - docs/tables/feeds.txt | 2 +- docs/tables/rss_schemas.txt | 11 ---- lib/dbversion.h | 2 +- lib/rdfeed.cpp | 110 +++++++++++++++++---------------- lib/rdfeed.h | 22 ++++++- rdadmin/edit_feed.cpp | 15 +---- utils/rddbmgr/rddbmgr.h | 16 +---- utils/rddbmgr/revertschema.cpp | 18 ++++++ utils/rddbmgr/schemamap.cpp | 2 +- utils/rddbmgr/updateschema.cpp | 6 ++ 12 files changed, 113 insertions(+), 96 deletions(-) delete mode 100644 docs/tables/rss_schemas.txt diff --git a/ChangeLog b/ChangeLog index 9234bbea..b4dd940a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19935,3 +19935,7 @@ * Incremented the database version to 324. * Added an 'Image Manager' dialog to rdadmin(1). * Added an 'Image Viewer' dialog on rdadmin(1). +2020-05-17 Fred Gleason + * Dropped the 'RSS_SCHEMAS' table from the database. + * Incremented the database version to 325. + * Moved RSS template definitions to 'lib/rdfeed.h'. diff --git a/docs/tables/Makefile.am b/docs/tables/Makefile.am index ceeff0e9..2ede8dbb 100644 --- a/docs/tables/Makefile.am +++ b/docs/tables/Makefile.am @@ -92,7 +92,6 @@ EXTRA_DIST = audio_cards.txt\ report_services.txt\ report_stations.txt\ reports.txt\ - rss_schemas.txt\ rule_lines.txt\ service_clocks.txt\ service_perms.txt\ diff --git a/docs/tables/feeds.txt b/docs/tables/feeds.txt index 2fc1621a..b9b3537f 100644 --- a/docs/tables/feeds.txt +++ b/docs/tables/feeds.txt @@ -22,7 +22,7 @@ BASE_PREAMBLE varchar(191) PURGE_URL varchar(191) PURGE_USERNAME varchar(64) PURGE_PASSWORD varchar(64) -RSS_SCHEMA int(10) unsigned From RSS_SCHEMAS.ID +RSS_SCHEMA int(10) unsigned 0=Custom, 1=RSS-2.0.2 HEADER_XML text CHANNEL_XML text ITEM_XML text diff --git a/docs/tables/rss_schemas.txt b/docs/tables/rss_schemas.txt deleted file mode 100644 index bb22a0c9..00000000 --- a/docs/tables/rss_schemas.txt +++ /dev/null @@ -1,11 +0,0 @@ - RSS_SCHEMAS Table Layout for Rivendell - -The RSS_SCHEMAS table holds template data for various RSS schemas. - -FIELD NAME TYPE REMARKS ---------------------------------------------------------------- -ID int(10) unsigned Primary Key -NAME varchar(64) -HEADER_XML text From FEEDS.HEADER_XML -CHANNEL_XML text From FEEDS.CHANNEL_XML -ITEM_XML text From FEEDS.ITEM_XML diff --git a/lib/dbversion.h b/lib/dbversion.h index 48247344..d1ee3c65 100644 --- a/lib/dbversion.h +++ b/lib/dbversion.h @@ -24,7 +24,7 @@ /* * Current Database Version */ -#define RD_VERSION_DATABASE 324 +#define RD_VERSION_DATABASE 325 #endif // DBVERSION_H diff --git a/lib/rdfeed.cpp b/lib/rdfeed.cpp index dff31f98..e249d0ee 100644 --- a/lib/rdfeed.cpp +++ b/lib/rdfeed.cpp @@ -47,12 +47,13 @@ // // Default XML Templates // +/* #define DEFAULT_HEADER_XML "\n" #define DEFAULT_CHANNEL_XML "%TITLE%\n%DESCRIPTION%\n%CATEGORY%\n%LINK%\n%LANGUAGE%\n%COPYRIGHT%\n%BUILD_DATE%\n%PUBLISH_DATE%\n%EDITOR%\n%WEBMASTER%\n%GENERATOR%\n" #define DEFAULT_ITEM_XML "%ITEM_TITLE%\n%ITEM_LINK%\n%ITEM_GUID%\n%ITEM_DESCRIPTION%\n%ITEM_AUTHOR%\n%ITEM_COMMENTS%\n%ITEM_SOURCE_TEXT%\n\n%ITEM_CATEGORY%\n%ITEM_PUBLISH_DATE%" - +*/ size_t __RDFeed_Readfunction_Callback(char *buffer,size_t size,size_t nitems, void *userdata) { @@ -1139,15 +1140,14 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) QString sql; RDSqlQuery *q; RDSqlQuery *q1; - RDFeed::RssSchema rss_schema=rssSchema(); - QString schema_table="RSS_SCHEMAS"; + + QString header_template; + QString channel_template; + QString item_template; if(ok!=NULL) { *ok=false; } - if(rss_schema==RDFeed::CustomSchema) { - schema_table="FEEDS"; - } sql=QString("select ")+ "FEEDS.CHANNEL_TITLE,"+ // 00 "FEEDS.CHANNEL_DESCRIPTION,"+ // 01 @@ -1159,9 +1159,9 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) "FEEDS.CHANNEL_LANGUAGE,"+ // 07 "FEEDS.LAST_BUILD_DATETIME,"+ // 08 "FEEDS.ORIGIN_DATETIME,"+ // 09 - schema_table+".HEADER_XML,"+ // 10 - schema_table+".CHANNEL_XML,"+ // 11 - schema_table+".ITEM_XML,"+ // 12 + "FEEDS.HEADER_XML,"+ // 10 + "FEEDS.CHANNEL_XML,"+ // 11 + "FEEDS.ITEM_XML,"+ // 12 "FEEDS.BASE_URL,"+ // 13 "FEEDS.ID,"+ // 14 "FEEDS.UPLOAD_EXTENSION,"+ // 15 @@ -1169,14 +1169,16 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) "FEEDS.REDIRECT_PATH,"+ // 17 "FEEDS.BASE_PREAMBLE,"+ // 18 "FEEDS.AUDIENCE_METRICS,"+ // 19 - "FEEDS.IS_SUPERFEED "; // 20 - if(rss_schema==RDFeed::CustomSchema) { - sql+="from FEEDS where "; - } - else { - sql+=QString("from FEEDS left join RSS_SCHEMAS ")+ - "on FEEDS.RSS_SCHEMA=RSS_SCHEMAS.ID where "; - } + "FEEDS.IS_SUPERFEED,"+ // 20 + "FEED_IMAGES.ID,"+ // 21 + "FEED_IMAGES.WIDTH,"+ // 22 + "FEED_IMAGES.HEIGHT,"+ // 23 + "FEED_IMAGES.DESCRIPTION,"+ // 24 + "FEED_IMAGES.FILE_EXTENSION "+ // 25 + "from FEEDS "; + sql+="left join FEED_IMAGES "; + sql+="on FEEDS.CHANNEL_IMAGE_ID=FEED_IMAGES.ID "; + sql+="where "; sql+="FEEDS.KEY_NAME=\""+RDEscapeString(keyName())+"\""; q=new RDSqlQuery(sql); if(!q->first()) { @@ -1184,16 +1186,33 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) return QString(); } + switch(rssSchema()) { + case RDFeed::CustomSchema: + header_template=q->value(10).toString(); + channel_template=q->value(11).toString(); + item_template=q->value(12).toString(); + break; + + case RDFeed::Rss202Schema: + header_template=RSS_2_0_2_HEADER_XML; + channel_template= RSS_2_0_2_CHANNEL_XML; + item_template=RSS_2_0_2_ITEM_XML; + break; + + case RDFeed::LastSchema: + break; + } + // // Render Header XML // - ret+=q->value(10).toString()+"\r\n"; + ret+=header_template+"\r\n"; // // Render Channel XML // ret+=" \n"; - ret+=ResolveChannelWildcards(q)+"\r\n"; + ret+=ResolveChannelWildcards(channel_template,q)+"\r\n"; // // Render Item XML @@ -1240,7 +1259,7 @@ QString RDFeed::rssXml(QString *err_msg,bool *ok) q1=new RDSqlQuery(sql); while(q1->next()) { ret+=" \r\n"; - ret+=ResolveItemWildcards(q1,q); + ret+=ResolveItemWildcards(item_template,q1,q); ret+="\r\n"; ret+=" \r\n"; } @@ -1287,9 +1306,9 @@ unsigned RDFeed::create(const QString &keyname,bool enable_users, sql=QString("insert into FEEDS set ")+ "KEY_NAME=\""+RDEscapeString(keyname)+"\","+ "ORIGIN_DATETIME=now(),"+ - "HEADER_XML=\""+RDEscapeString(DEFAULT_HEADER_XML)+"\","+ - "CHANNEL_XML=\""+RDEscapeString(DEFAULT_CHANNEL_XML)+"\","+ - "ITEM_XML=\""+RDEscapeString(DEFAULT_ITEM_XML)+"\""; + "HEADER_XML=\""+RDEscapeString(RSS_2_0_2_HEADER_XML)+"\","+ + "CHANNEL_XML=\""+RDEscapeString(RSS_2_0_2_CHANNEL_XML)+"\","+ + "ITEM_XML=\""+RDEscapeString(RSS_2_0_2_ITEM_XML)+"\""; q=new RDSqlQuery(sql); feed_id=q->lastInsertId().toUInt(); delete q; @@ -1482,8 +1501,7 @@ QString RDFeed::rssHeaderTemplate(RDFeed::RssSchema schema) switch(schema) { case RDFeed::Rss202Schema: - ret=QString("")+"\n"+ - "\n"; + ret=RSS_2_0_2_HEADER_XML; break; case RDFeed::CustomSchema: @@ -1501,19 +1519,7 @@ QString RDFeed::rssChannelTemplate(RDFeed::RssSchema schema) switch(schema) { case RDFeed::Rss202Schema: - ret=QString("%TITLE%\n")+ - "%DESCRIPTION%\n"+ - "%CATEGORY%\n"+ - "%LINK%\n"+ - "%LANGUAGE%\n"+ - "%COPYRIGHT%\n"+ - "%BUILD_DATE%\n"+ - "%PUBLISH_DATE%\n"+ - "%EDITOR%\n"+ - "%WEBMASTER%\n"+ - "%GENERATOR%\n"+ - "%IMAGE%\n"+ - "\n"; + ret=RSS_2_0_2_CHANNEL_XML; break; case RDFeed::CustomSchema: @@ -1531,16 +1537,7 @@ QString RDFeed::rssItemTemplate(RDFeed::RssSchema schema) switch(schema) { case RDFeed::Rss202Schema: - ret=QString("%ITEM_TITLE%\n")+ - "%ITEM_LINK%\n"+ - "%ITEM_GUID%\n"+ - "%ITEM_DESCRIPTION%\n"+ - "%ITEM_AUTHOR%\n"+ - "%ITEM_COMMENTS%\n"+ - "%ITEM_SOURCE_TEXT%\n"+ - "\n"+ - "%ITEM_CATEGORY%\n"+ - "%ITEM_PUBLISH_DATE%\n"; + ret=RSS_2_0_2_ITEM_XML; break; case RDFeed::CustomSchema: @@ -1624,9 +1621,9 @@ unsigned RDFeed::CreateCast(QString *filename,int bytes,int msecs) const } -QString RDFeed::ResolveChannelWildcards(RDSqlQuery *chan_q) +QString RDFeed::ResolveChannelWildcards(const QString &tmplt,RDSqlQuery *chan_q) { - QString ret=" "+chan_q->value(11).toString(); + QString ret=" "+tmplt; ret.replace("\n","\r\n "); ret.replace("%TITLE%",RDXmlEscape(chan_q->value(0).toString())); @@ -1644,14 +1641,23 @@ QString RDFeed::ResolveChannelWildcards(RDSqlQuery *chan_q) ret.replace("%GENERATOR%",QString("Rivendell ")+VERSION); ret.replace("%FEED_URL%",RDXmlEscape(chan_q->value(13).toString())+"/"+ RDXmlEscape(keyName()+"."+RD_RSS_XML_FILE_EXTENSION)); + ret.replace("%IMAGE_URL%",chan_q->value(13).toString()+"/"+ + RDFeed::imageFilename(id(),chan_q->value(21).toInt(), + chan_q->value(25).toString())); + ret.replace("%IMAGE_WIDTH%", + QString().sprintf("%d",chan_q->value(22).toInt())); + ret.replace("%IMAGE_HEIGHT%", + QString().sprintf("%d",chan_q->value(23).toInt())); + ret.replace("%IMAGE_DESCRIPTION%",chan_q->value(24).toString()); return ret; } -QString RDFeed::ResolveItemWildcards(RDSqlQuery *item_q,RDSqlQuery *chan_q) +QString RDFeed::ResolveItemWildcards(const QString &tmplt,RDSqlQuery *item_q, + RDSqlQuery *chan_q) { - QString ret=" "+chan_q->value(12).toString(); + QString ret=" "+tmplt; ret.replace("\n","\r\n "); ret.replace("%ITEM_TITLE%",RDXmlEscape(item_q->value(0).toString())); diff --git a/lib/rdfeed.h b/lib/rdfeed.h index 207e4715..6668489d 100644 --- a/lib/rdfeed.h +++ b/lib/rdfeed.h @@ -30,6 +30,23 @@ #include #include +// +// RSS-2.0.2 Templates +// +#define RSS_2_0_2_NAME "RSS 2.0.2" + +#define RSS_2_0_2_IMAGE_MIN_SIZE QSize(88,31) +#define RSS_2_0_2_IMAGE_MAX_SIZE QSize(144,400) +#define RSS_2_0_2_IMAGE_IN_ITEM false + +#define RSS_2_0_2_HEADER_XML "\n" + +#define RSS_2_0_2_CHANNEL_XML "%TITLE%\n%DESCRIPTION%\n%CATEGORY%\n%LINK%\n%LANGUAGE%\n%COPYRIGHT%\n%BUILD_DATE%\n%PUBLISH_DATE%\n%EDITOR%\n%WEBMASTER%\n%GENERATOR%\n\n %IMAGE_URL%\n %TITLE%\n %LINK%\n %IMAGE_WIDTH%\n %IMAGE_HEIGHT%\n %IMAGE_DESCRIPTION%\n\n" + +#define RSS_2_0_2_ITEM_XML "%ITEM_TITLE%\n%ITEM_LINK%\n%ITEM_GUID%\n%ITEM_DESCRIPTION%\n%ITEM_AUTHOR%\n%ITEM_COMMENTS%\n%ITEM_SOURCE_TEXT%\n\n%ITEM_CATEGORY%\n%ITEM_PUBLISH_DATE%" + + + #define RDFEED_TOTAL_POST_STEPS 4 class RDFeed : public QObject @@ -152,8 +169,9 @@ class RDFeed : public QObject private: unsigned CreateCast(QString *filename,int bytes,int msecs) const; - QString ResolveChannelWildcards(RDSqlQuery *chan_q); - QString ResolveItemWildcards(RDSqlQuery *item_q,RDSqlQuery *chan_q); + QString ResolveChannelWildcards(const QString &tmplt,RDSqlQuery *chan_q); + QString ResolveItemWildcards(const QString &tmplt,RDSqlQuery *item_q, + RDSqlQuery *chan_q); QString GetTempFilename() const; void SetRow(const QString ¶m,int value) const; void SetRow(const QString ¶m,const QString &value) const; diff --git a/rdadmin/edit_feed.cpp b/rdadmin/edit_feed.cpp index bede1ea7..9cade257 100644 --- a/rdadmin/edit_feed.cpp +++ b/rdadmin/edit_feed.cpp @@ -39,9 +39,6 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) : RDDialog(parent) { - QString sql; - RDSqlQuery *q=NULL; - // // Fix the Window Size // @@ -385,17 +382,11 @@ EditFeed::EditFeed(const QString &feed,QWidget *parent) // RSS Schema // feed_rss_schema_box=new QComboBox(this); - sql=QString("select ")+ - "ID,"+ // 00 - "NAME "+ // 01 - "from RSS_SCHEMAS order by NAME"; - q=new RDSqlQuery(sql); - while(q->next()) { + for(int i=0;i - insertItem(feed_rss_schema_box->count(),q->value(1).toString(), - q->value(0).toUInt()); + insertItem(feed_rss_schema_box->count(), + RDFeed::rssSchemaString((RDFeed::RssSchema)i),i); } - delete q; connect(feed_rss_schema_box,SIGNAL(activated(int)), this,SLOT(comboboxActivatedData(int))); feed_rss_schema_label=new QLabel(tr("RSS Schema")+":",this); diff --git a/utils/rddbmgr/rddbmgr.h b/utils/rddbmgr/rddbmgr.h index ecc711e7..4a837c5f 100644 --- a/utils/rddbmgr/rddbmgr.h +++ b/utils/rddbmgr/rddbmgr.h @@ -24,25 +24,11 @@ #include #include +#include #include #define RDDBMGR_USAGE "[options]\n" -// -// RSS Templates -// -// -// RSS XML Templates (for the 'RSS_SCHEMAS' table) -// -#define RSS_2_0_2_NAME "RSS 2.0.2" - -#define RSS_2_0_2_HEADER_XML "\n" - -#define RSS_2_0_2_CHANNEL_XML "%TITLE%\n%DESCRIPTION%\n%CATEGORY%\n%LINK%\n%LANGUAGE%\n%COPYRIGHT%\n%BUILD_DATE%\n%PUBLISH_DATE%\n%EDITOR%\n%WEBMASTER%\n%GENERATOR%\n%IMAGE%\n" - -#define RSS_2_0_2_ITEM_XML "%ITEM_TITLE%\n%ITEM_LINK%\n%ITEM_GUID%\n%ITEM_DESCRIPTION%\n%ITEM_AUTHOR%\n%ITEM_COMMENTS%\n%ITEM_SOURCE_TEXT%\n\n%ITEM_CATEGORY%\n%ITEM_PUBLISH_DATE%" - - class MainObject : public QObject { public: diff --git a/utils/rddbmgr/revertschema.cpp b/utils/rddbmgr/revertschema.cpp index 20b7dce8..84536cdb 100644 --- a/utils/rddbmgr/revertschema.cpp +++ b/utils/rddbmgr/revertschema.cpp @@ -41,6 +41,24 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) + // + // Revert 325 + // + if((cur_schema==325)&&(set_schemacur_schema)) { + DropTable("RSS_SCHEMAS"); + + WriteSchemaVersion(++cur_schema); + } + // NEW SCHEMA UPDATES GO HERE...