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.
* Fixed a regression in the RDFeed service that caused detection
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\
cart.txt\
cartslots.txt\
cast_downloads.txt\
clipboard.txt\
clock_lines.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
*/
#define RD_VERSION_DATABASE 293
#define RD_VERSION_DATABASE 294
#endif // DBVERSION_H

View File

@ -22,45 +22,27 @@
#include <rdapplication.h>
#include <rddb.h>
#include <rdescape_string.h>
#include <rdweb.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)
{
keyname.replace(" ","_");
rda->dropTable(keyname+"_FLG");
QString sql=QString("delete from CAST_DOWNLOADS where ")+
"FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\"";
RDSqlQuery::apply(sql);
}
void RDDeleteCastCount(QString keyname,unsigned cast_id)
{
QString sql;
RDSqlQuery *q;
keyname.replace(" ","_");
sql=QString().sprintf("delete from %s_FLG where CAST_ID=%u",
(const char *)keyname,cast_id);
q=new RDSqlQuery(sql);
delete q;
sql=QString("delete from CAST_DOWNLOADS where ")+
"FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
QString().sprintf("CAST_ID=%u",cast_id);
RDSqlQuery::apply(sql);
}
@ -88,45 +70,25 @@ void RDIncrementCastCount(QString keyname,unsigned cast_id)
{
QString sql;
RDSqlQuery *q;
QDate current_date=QDate::currentDate();
QDate now=QDate::currentDate();
keyname.replace(" ","_");
/*
FIXME: Table locking kills updates. Why?
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"));
sql=QString("select ACCESS_COUNT from CAST_DOWNLOADS where ")+
"FEED_KEY_NAME=\""+RDEscapeString(keyname)+"\" && "+
QString().sprintf("(CAST_ID=%u)&&",cast_id)+
"(ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\")";
q=new RDSqlQuery(sql);
if(q->first()) {
sql=QString().sprintf("update %s_FLG set ACCESS_COUNT=%u where \
(CAST_ID=%u)&&(ACCESS_DATE=\"%s\")",
(const char *)keyname,
q->value(0).toUInt()+1,cast_id,
(const char *)current_date.toString("yyyy-MM-dd"));
sql=QString("update CAST_DOWNLOADS set ")+
QString().sprintf("ACCESS_COUNT=%u where ",q->value(0).toUInt()+1)+
QString().sprintf("(CAST_ID=%u)&&",cast_id)+
"(ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\")";
}
else {
sql=QString().sprintf("insert into %s_FLG set \
CAST_ID=%u,\
ACCESS_DATE=\"%s\",\
ACCESS_COUNT=1",
(const char *)keyname,
cast_id,
(const char *)current_date.toString("yyyy-MM-dd"));
sql=QString("insert into CAST_DOWNLOADS set ")+
QString().sprintf("CAST_ID=%u,",cast_id)+
"ACCESS_DATE=\""+RDEscapeString(now.toString("yyyy-MM-dd"))+"\","+
"ACCESS_COUNT=1";
}
RDSqlQuery::apply(sql);
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.
//
// (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
// it under the terms of the GNU General Public License version 2 as
@ -23,7 +23,6 @@
#include <qstring.h>
void RDCreateFeedLog(QString keyname);
void RDDeleteFeedLog(QString keyname);
void RDDeleteCastCount(QString keyname,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)+"\"";
q=new RDSqlQuery(sql);
delete q;
RDCreateFeedLog(feed_keyname_edit->text());
RDCreateAuxFieldsTable(feed_keyname_edit->text(),rda->config());
sql=QString("select ID from FEEDS where ")+
"KEY_NAME=\""+RDEscapeString(feed_keyname_edit->text())+"\"";

View File

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

View File

@ -132,7 +132,7 @@ void MainObject::InitializeSchemaMap() {
global_version_map["2.17"]=268;
global_version_map["2.18"]=272;
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);
}
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;
}
else {
QString keyname=q->value(2).toString();
keyname.replace(" ","_");
sql=QString().sprintf("delete from %s_FLG where CAST_ID=%d",
(const char *)keyname,id);
sql=QString("delete from CAST_DOWNLOADS where ")+
"FEED_KEY_NAME=\""+RDEscapeString(q->value(2).toString())+"\" && "+
QString().sprintf("CAST_ID=%d",id);
q1=new RDSqlQuery(sql);
delete q1;

View File

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