2018-07-19 Fred Gleason <fredg@paravelsystems.com>

* Added a 'CAST_DOWNLOADS' table to the database.
	* Incremented the database version to 294.
This commit is contained in:
Fred Gleason 2018-07-19 21:42:11 +00:00
parent 94ff45a4dc
commit c2f11d76be
13 changed files with 166 additions and 96 deletions

View File

@ -17194,3 +17194,6 @@
to be corrupt. to be corrupt.
* Fixed a regression in the RDFeed service that caused detection * Fixed a regression in the RDFeed service that caused detection
of feed names to fail. of feed names to fail.
2018-07-19 Fred Gleason <fredg@paravelsystems.com>
* Added a 'CAST_DOWNLOADS' table to the database.
* Incremented the database version to 294.

View File

@ -26,6 +26,7 @@ EXTRA_DIST = audio_cards.txt\
audio_perms.txt\ audio_perms.txt\
cart.txt\ cart.txt\
cartslots.txt\ cartslots.txt\
cast_downloads.txt\
clipboard.txt\ clipboard.txt\
clock_lines.txt\ clock_lines.txt\
clock_perms.txt\ clock_perms.txt\

View File

@ -0,0 +1,12 @@
CAST_DOWNLOADS Table Layout for Rivendell
The CAST_DOWNLOADS table holds data concerning downloads of podcast episodes.
FIELD NAME TYPE REMARKS
------------------------------------------------------------------------------
ID int(10) unsigned Primary key, Auto Increment
FEED_KEY_NAME char(8) From FEEDS.KEY_NAME
CAST_ID int(10) unsigned From PODCASTS.ID
ACCESS_DATE date
ACCESS_COUNT int(10) unsigned

View File

@ -24,7 +24,7 @@
/* /*
* Current Database Version * Current Database Version
*/ */
#define RD_VERSION_DATABASE 293 #define RD_VERSION_DATABASE 294
#endif // DBVERSION_H #endif // DBVERSION_H

View File

@ -22,45 +22,27 @@
#include <rdapplication.h> #include <rdapplication.h>
#include <rddb.h> #include <rddb.h>
#include <rdescape_string.h>
#include <rdweb.h> #include <rdweb.h>
#include "rdfeedlog.h" #include "rdfeedlog.h"
void RDCreateFeedLog(QString keyname)
{
QString sql;
RDSqlQuery *q;
keyname.replace(" ","_");
sql=QString().sprintf("create table if not exists %s_FLG (\
ID int unsigned primary key auto_increment,\
CAST_ID int unsigned,\
ACCESS_DATE date,\
ACCESS_COUNT int unsigned default 0,\
index CAST_ID_IDX(CAST_ID,ACCESS_DATE))",
(const char *)keyname);
q=new RDSqlQuery(sql);
delete q;
}
void RDDeleteFeedLog(QString keyname) void RDDeleteFeedLog(QString keyname)
{ {
keyname.replace(" ","_"); QString sql=QString("delete from CAST_DOWNLOADS where ")+
rda->dropTable(keyname+"_FLG"); "FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\"";
RDSqlQuery::apply(sql);
} }
void RDDeleteCastCount(QString keyname,unsigned cast_id) void RDDeleteCastCount(QString keyname,unsigned cast_id)
{ {
QString sql; QString sql;
RDSqlQuery *q;
keyname.replace(" ","_"); sql=QString("delete from CAST_DOWNLOADS where ")+
sql=QString().sprintf("delete from %s_FLG where CAST_ID=%u", "FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
(const char *)keyname,cast_id); QString().sprintf("CAST_ID=%u",cast_id);
q=new RDSqlQuery(sql); RDSqlQuery::apply(sql);
delete q;
} }
@ -88,45 +70,25 @@ void RDIncrementCastCount(QString keyname,unsigned cast_id)
{ {
QString sql; QString sql;
RDSqlQuery *q; RDSqlQuery *q;
QDate current_date=QDate::currentDate(); QDate now=QDate::currentDate();
keyname.replace(" ","_"); sql=QString("select ACCESS_COUNT from CAST_DOWNLOADS where ")+
/* "FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
FIXME: Table locking kills updates. Why? QString().sprintf("(CAST_ID=%u)&&",cast_id)+
"(ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\")";
sql=QString().sprintf("lock tables %s_FLG read",(const char *)keyname);
q=new RDSqlQuery(sql);
delete q;
*/
sql=QString().sprintf("select ACCESS_COUNT from %s_FLG where \
(CAST_ID=%u)&&(ACCESS_DATE=\"%s\")",
(const char *)keyname,
cast_id,
(const char *)current_date.toString("yyyy-MM-dd"));
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
if(q->first()) { if(q->first()) {
sql=QString().sprintf("update %s_FLG set ACCESS_COUNT=%u where \ sql=QString("update CAST_DOWNLOADS set ")+
(CAST_ID=%u)&&(ACCESS_DATE=\"%s\")", QString().sprintf("ACCESS_COUNT=%u where ",q->value(0).toUInt()+1)+
(const char *)keyname, QString().sprintf("(CAST_ID=%u)&&",cast_id)+
q->value(0).toUInt()+1,cast_id, "(ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\")";
(const char *)current_date.toString("yyyy-MM-dd"));
} }
else { else {
sql=QString().sprintf("insert into %s_FLG set \ sql=QString("insert into CAST_DOWNLOADS set ")+
CAST_ID=%u,\ QString().sprintf("CAST_ID=%u,",cast_id)+
ACCESS_DATE=\"%s\",\ "ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\","+
ACCESS_COUNT=1", "ACCESS_COUNT=1";
(const char *)keyname,
cast_id,
(const char *)current_date.toString("yyyy-MM-dd"));
} }
RDSqlQuery::apply(sql);
delete q; delete q;
q=new RDSqlQuery(sql);
delete q;
/*
sql="unlock tables";
q=new RDSqlQuery(sql);
delete q;
*/
} }

View File

@ -2,7 +2,7 @@
// //
// Functions for manipulating RSS feed log tables. // Functions for manipulating RSS feed log tables.
// //
// (C) Copyright 2007,2016 Fred Gleason <fredg@paravelsystems.com> // (C) Copyright 2007,2016-2018 Fred Gleason <fredg@paravelsystems.com>
// //
// This program is free software; you can redistribute it and/or modify // This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License version 2 as // it under the terms of the GNU General Public License version 2 as
@ -23,7 +23,6 @@
#include <qstring.h> #include <qstring.h>
void RDCreateFeedLog(QString keyname);
void RDDeleteFeedLog(QString keyname); void RDDeleteFeedLog(QString keyname);
void RDDeleteCastCount(QString keyname,unsigned cast_id); void RDDeleteCastCount(QString keyname,unsigned cast_id);
void RDDeleteCastCount(unsigned feed_id,unsigned cast_id); void RDDeleteCastCount(unsigned feed_id,unsigned cast_id);

View File

@ -173,7 +173,6 @@ void AddFeed::okData()
"ITEM_XML=\""+RDEscapeString(DEFAULT_ITEM_XML)+"\""; "ITEM_XML=\""+RDEscapeString(DEFAULT_ITEM_XML)+"\"";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
delete q; delete q;
RDCreateFeedLog(feed_keyname_edit->text());
RDCreateAuxFieldsTable(feed_keyname_edit->text(),rda->config()); RDCreateAuxFieldsTable(feed_keyname_edit->text(),rda->config());
sql=QString("select ID from FEEDS where ")+ sql=QString("select ID from FEEDS where ")+
"KEY_NAME=\""+RDEscapeString(feed_keyname_edit->text())+"\""; "KEY_NAME=\""+RDEscapeString(feed_keyname_edit->text())+"\"";

View File

@ -215,13 +215,12 @@ void PickReportDates::GenerateSubscriptionReport(const QString &keyname,
// //
// Data Rows // Data Rows
// //
QString keyname_esc=keyname;
keyname_esc.replace(" ","_");
sql=QString("select ")+ sql=QString("select ")+
"ACCESS_DATE,"+ // 00 "ACCESS_DATE,"+ // 00
"ACCESS_COUNT,"+ // 01 "ACCESS_COUNT,"+ // 01
"CAST_ID "+ // 02 "CAST_ID "+ // 02
"from "+keyname_esc+"_FLG where "+ "from CAST_DOWNLOADS where "+
"FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
"(ACCESS_DATE>=\""+RDEscapeString(edit_startdate_edit->date(). "(ACCESS_DATE>=\""+RDEscapeString(edit_startdate_edit->date().
toString("yyyy-MM-dd"))+"\")&&"+ toString("yyyy-MM-dd"))+"\")&&"+
"(ACCESS_DATE<=\""+RDEscapeString(edit_enddate_edit->date(). "(ACCESS_DATE<=\""+RDEscapeString(edit_enddate_edit->date().
@ -288,12 +287,11 @@ void PickReportDates::GenerateEpisodeReport(const QString &keyname,
// Data Rows // Data Rows
// //
unsigned total=0; unsigned total=0;
QString keyname_esc=keyname;
keyname_esc.replace(" ","_");
sql=QString("select ")+ sql=QString("select ")+
"ACCESS_DATE,"+ "ACCESS_DATE,"+ // 00
"ACCESS_COUNT "+ "ACCESS_COUNT "+ // 01
"from "+keyname_esc+"_FLG where "+ "from CAST_DOWNLOADS where "+
"FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
"(ACCESS_DATE>=\""+RDEscapeString(edit_startdate_edit->date(). "(ACCESS_DATE>=\""+RDEscapeString(edit_startdate_edit->date().
toString("yyyy-MM-dd"))+"\")&&"+ toString("yyyy-MM-dd"))+"\")&&"+
"(ACCESS_DATE<=\""+RDEscapeString(edit_enddate_edit->date(). "(ACCESS_DATE<=\""+RDEscapeString(edit_enddate_edit->date().

View File

@ -38,6 +38,53 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg) co
// //
//
// Revert 294
//
if((cur_schema==294)&&(set_schema<cur_schema)) {
sql=QString("select KEY_NAME from FEEDS");
q=new RDSqlQuery(sql);
while(q->next()) {
QString tablename=q->value(0).toString()+"_FLG";
tablename.replace(" ","_");
sql=QString("create table if not exists `")+tablename+"` ("+
"ID int unsigned primary key auto_increment,"+
"CAST_ID int unsigned,"+
"ACCESS_DATE date,"+
"ACCESS_COUNT int unsigned default 0,"+
"index CAST_ID_IDX(CAST_ID,ACCESS_DATE))";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("select ")+
"CAST_ID,"+ // 00
"ACCESS_DATE,"+ // 01
"ACCESS_COUNT "+ // 02
"from CAST_DOWNLOADS where "+
"FEED_KEY_NAME=\""+RDEscapeString(q->value(0).toString())+"\" "+
"order by CAST_ID,ACCESS_DATE";
q1=new RDSqlQuery(sql,false);
while(q1->next()) {
sql=QString("insert into `")+tablename+"` set "+
QString().sprintf("CAST_ID=%u,",q1->value(0).toUInt())+
"ACCESS_DATE=\""+
RDEscapeString(q1->value(1).toDate().toString("yyyy-MM-dd"))+"\","+
QString().sprintf("ACCESS_COUNT=%u",q1->value(2).toUInt());
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q1;
}
if(!DropTable("CAST_DOWNLOADS",err_msg)) {
return false;
}
WriteSchemaVersion(--cur_schema);
}
// //
// Revert 293 // Revert 293
// //

View File

@ -132,7 +132,7 @@ void MainObject::InitializeSchemaMap() {
global_version_map["2.17"]=268; global_version_map["2.17"]=268;
global_version_map["2.18"]=272; global_version_map["2.18"]=272;
global_version_map["2.19"]=275; global_version_map["2.19"]=275;
global_version_map["2.20"]=293; global_version_map["2.20"]=294;
} }

View File

@ -7797,6 +7797,54 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg) co
WriteSchemaVersion(++cur_schema); WriteSchemaVersion(++cur_schema);
} }
if((cur_schema<294)&&(set_schema>cur_schema)) {
sql=QString("create table if not exists CAST_DOWNLOADS (")+
"ID int unsigned not null auto_increment primary key,"+
"FEED_KEY_NAME char(8) not null,"+
"CAST_ID int unsigned not null,"+
"ACCESS_DATE date not null,"+
"ACCESS_COUNT int unsigned not null default 0,"+
"unique index KEY_NAME_CAST_ID_DATE_IDX(FEED_KEY_NAME,CAST_ID,ACCESS_DATE))"+
db_table_create_postfix;
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("select KEY_NAME from FEEDS");
q=new RDSqlQuery(sql,false);
while(q->next()) {
QString tablename=q->value(0).toString()+"_FLG";
tablename.replace(" ","_");
sql=QString("select ")+
"CAST_ID,"+ // 00
"ACCESS_DATE,"+ // 01
"ACCESS_COUNT "+ // 02
"from `"+tablename+"` "+
"order by ACCESS_DATE";
q1=new RDSqlQuery(sql,false);
while(q1->next()) {
sql=QString("insert into CAST_DOWNLOADS set ")+
"FEED_KEY_NAME=\""+RDEscapeString(q->value(0).toString())+"\","+
QString().sprintf("CAST_ID=%u,",q1->value(0).toUInt())+
"ACCESS_DATE=\""+
RDEscapeString(q1->value(1).toDate().toString("yyyy-MM-dd"))+"\","+
QString().sprintf("ACCESS_COUNT=%u",q1->value(2).toUInt());
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
}
delete q1;
if(!DropTable(tablename,err_msg)) {
return false;
}
}
delete q;
WriteSchemaVersion(++cur_schema);
}
// //

View File

@ -143,10 +143,9 @@ void MainObject::PurgeCast(unsigned id)
delete q1; delete q1;
} }
else { else {
QString keyname=q->value(2).toString(); sql=QString("delete from CAST_DOWNLOADS where ")+
keyname.replace(" ","_"); "FEED_KEY_NAME=\""+RDEscapeString(q->value(2).toString())+"\" && "+
sql=QString().sprintf("delete from %s_FLG where CAST_ID=%d", QString().sprintf("CAST_ID=%d",id);
(const char *)keyname,id);
q1=new RDSqlQuery(sql); q1=new RDSqlQuery(sql);
delete q1; delete q1;

View File

@ -1493,15 +1493,16 @@ void MainObject::ServeSubscriptionReport()
line_colors[0]=RD_WEB_LINE_COLOR1; line_colors[0]=RD_WEB_LINE_COLOR1;
line_colors[1]=RD_WEB_LINE_COLOR2; line_colors[1]=RD_WEB_LINE_COLOR2;
int current_color=0; int current_color=0;
QString keyname_esc=cast_key_name; sql=QString("select ")+
keyname_esc.replace(" ","_"); "ACCESS_DATE,"+ // 00
sql=QString().sprintf("select ACCESS_DATE,ACCESS_COUNT,CAST_ID from %s_FLG \ "ACCESS_COUNT,"+ // 01
where (ACCESS_DATE>=\"%s\")&&\ "CAST_ID "+ // 02
(ACCESS_DATE<=\"%s\") \ "from CAST_DOWNLOADS where "+
order by ACCESS_DATE,CAST_ID desc", "(ACCESS_DATE>=\""+
(const char *)keyname_esc, RDEscapeString(cast_start_date.toString("yyyy-MM-dd"))+"\")&&"+
(const char *)cast_start_date.toString("yyyy-MM-dd"), "(ACCESS_DATE<=\""+
(const char *)cast_end_date.toString("yyyy-MM-dd")); RDEscapeString(cast_end_date.toString("yyyy-MM-dd"))+"\" "+
"order by ACCESS_DATE,CAST_ID desc";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
if(q->value(2).toUInt()==0) { if(q->value(2).toUInt()==0) {
@ -1660,16 +1661,17 @@ void MainObject::ServeEpisodeReport()
line_colors[0]=RD_WEB_LINE_COLOR1; line_colors[0]=RD_WEB_LINE_COLOR1;
line_colors[1]=RD_WEB_LINE_COLOR2; line_colors[1]=RD_WEB_LINE_COLOR2;
int current_color=0; int current_color=0;
QString keyname_esc=cast_key_name; sql=QString("select ")+
keyname_esc.replace(" ","_"); "ACCESS_DATE,"+ // 00
sql=QString().sprintf("select ACCESS_DATE,ACCESS_COUNT from %s_FLG \ "ACCESS_COUNT "+ // 01
where (ACCESS_DATE>=\"%s\")&&\ "from CAST_DOWNLOADS where "+
(ACCESS_DATE<=\"%s\")&& \ "FEED_KEY_NAME=\""+RDEscapeString(cast_key_name)+"\" && "+
(CAST_ID=%d) order by ACCESS_DATE", "(ACCESS_DATE>=\""+
(const char *)keyname_esc, RDEscapeString(cast_start_date.toString("yyyy-MM-dd"))+"\")&&"+
(const char *)cast_start_date.toString("yyyy-MM-dd"), "(ACCESS_DATE<=\""+
(const char *)cast_end_date.toString("yyyy-MM-dd"), RDEscapeString(cast_end_date.toString("yyyy-MM-dd"))+"\")&&"+
cast_cast_id); QString().sprintf("(CAST_ID=%d) ",cast_cast_id)+
"order by ACCESS_DATE";
q=new RDSqlQuery(sql); q=new RDSqlQuery(sql);
while(q->next()) { while(q->next()) {
printf("<tr><td align=\"center\" bgcolor=\"%s\">%s</td>\n", printf("<tr><td align=\"center\" bgcolor=\"%s\">%s</td>\n",