2020-11-23 Fred Gleason <fredg@paravelsystems.com>

* Fixed a bug in rdimport(1) that could cause generation of
	mail reports to be bypassed.

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2020-11-23 13:04:38 -05:00
parent 0a0e73771a
commit 1932e277df
3 changed files with 66 additions and 50 deletions

View File

@ -20627,3 +20627,6 @@
methods.
* Added a 'Send e-mail reports' checkbox to the 'Dropbox
Configuration' dialog in rdadmin(1).
2020-11-23 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rdimport(1) that could cause generation of
mail reports to be bypassed.

View File

@ -35,7 +35,6 @@
#include <qstringlist.h>
#include <rd.h>
#include <rdapplication.h>
#include <rdaudioimport.h>
#include <rdconfig.h>
#include <rdconf.h>
@ -101,6 +100,7 @@ MainObject::MainObject(QObject *parent)
import_failed_imports=0;
import_send_mail=false;
import_mail_per_file=false;
import_journal=NULL;
//
// Open the Database
@ -108,7 +108,7 @@ MainObject::MainObject(QObject *parent)
rda=new RDApplication("rdimport","rdimport",RDIMPORT_USAGE,this);
if(!rda->open(&err_msg)) {
fprintf(stderr,"rdimport: %s\n",(const char *)err_msg);
exit(RDApplication::ExitNoDb);
ErrorExit(RDApplication::ExitNoDb);
}
//
@ -116,7 +116,7 @@ MainObject::MainObject(QObject *parent)
//
if(rda->cmdSwitch()->keys()<2) {
Log(LOG_ERR,QString().sprintf("\n%s\n",RDIMPORT_USAGE));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
for(unsigned i=0;i<rda->cmdSwitch()->keys()-2;i++) {
if(rda->cmdSwitch()->key(i)=="--verbose") {
@ -135,11 +135,11 @@ MainObject::MainObject(QObject *parent)
import_cart_number=rda->cmdSwitch()->value(i).toUInt(&ok);
if((!ok)||(import_cart_number<1)||(import_cart_number>999999)) {
Log(LOG_ERR,QString("rdimport: invalid cart number\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
if(import_use_cartchunk_cutid) {
Log(LOG_ERR,QString("rdimport: '--to-cart' and '--use-cartchunk-cutid' are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_single_cart=true;
rda->cmdSwitch()->setProcessed(i,true);
@ -147,7 +147,7 @@ MainObject::MainObject(QObject *parent)
if(rda->cmdSwitch()->key(i)=="--use-cartchunk-cutid") {
if(import_cart_number!=0) {
Log(LOG_ERR,QString("rdimport: '--to-cart' and '--use-cartchunk-cutid' are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_use_cartchunk_cutid=true;
rda->cmdSwitch()->setProcessed(i,true);
@ -156,7 +156,7 @@ MainObject::MainObject(QObject *parent)
import_cart_number_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid --cart-number-offset\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -176,7 +176,7 @@ MainObject::MainObject(QObject *parent)
import_startdate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid startdate-offset\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -184,7 +184,7 @@ MainObject::MainObject(QObject *parent)
import_enddate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid enddate-offset\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -196,42 +196,42 @@ MainObject::MainObject(QObject *parent)
QStringList f0=rda->cmdSwitch()->value(i).split(",");
if(f0.size()!=2) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
for(unsigned j=0;j<2;j++) {
if((f0[j].length()!=15)||(f0[j].mid(8,1)!="-")) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned year=f0[j].left(4).toUInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid year argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned month=f0[j].mid(4,2).toUInt(&ok);
if((!ok)||(month>12)) {
Log(LOG_ERR,QString("rdimport: invalid month argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned day=f0[j].mid(6,2).toUInt(&ok);
if((!ok)||(day>31)) {
Log(LOG_ERR,QString("rdimport: invalid day argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned hour=f0[j].mid(9,2).toUInt(&ok);
if((!ok)||(hour>23)) {
Log(LOG_ERR,QString("rdimport: invalid hour argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned min=f0[j].mid(11,2).toUInt(&ok);
if((!ok)||(min>59)) {
Log(LOG_ERR,QString("rdimport: invalid minute argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned sec=f0[j].right(2).toUInt(&ok);
if((!ok)||(sec>59)) {
Log(LOG_ERR,QString("rdimport: invalid seconds argument to --set-datetimes\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_datetimes[j]=QDateTime(QDate(year,month,day),
QTime(hour,min,sec));
@ -241,7 +241,7 @@ MainObject::MainObject(QObject *parent)
}
if(import_datetimes[0]>=import_datetimes[1]) {
Log(LOG_ERR,QString("rdimport: datetime cannot end before it begins\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -249,33 +249,33 @@ MainObject::MainObject(QObject *parent)
QStringList f0=rda->cmdSwitch()->value(i).split(",");
if(f0.size()!=2) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-daypart-times\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
for(unsigned j=0;j<2;j++) {
if(f0[j].length()!=6) {
Log(LOG_ERR,QString("rdimport: invalid argument to --set-daypart-times\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned hour=f0[j].left(2).toUInt(&ok);
if((!ok)||(hour>23)) {
Log(LOG_ERR,QString("rdimport: invalid hour argument to --set-daypart-times\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned min=f0[j].mid(2,2).toUInt(&ok);
if((!ok)||(min>59)) {
Log(LOG_ERR,QString("rdimport: invalid minute argument to --set-daypart-times\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
unsigned sec=f0[j].right(2).toUInt(&ok);
if((!ok)||(sec>59)) {
Log(LOG_ERR,QString("rdimport: invalid seconds argument to --set-daypart-times\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_dayparts[j].setHMS(hour,min,sec);
}
if(import_dayparts[0]>=import_dayparts[1]) {
Log(LOG_ERR,QString("rdimport: daypart cannot end before it begins\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -306,7 +306,7 @@ MainObject::MainObject(QObject *parent)
import_metadata_pattern=rda->cmdSwitch()->value(i);
if(!VerifyPattern(import_metadata_pattern)) {
Log(LOG_ERR,QString("rdimport: invalid --metadata-pattern\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -314,7 +314,7 @@ MainObject::MainObject(QObject *parent)
import_output_pattern=rda->cmdSwitch()->value(i);
if(!VerifyPattern(import_output_pattern)) {
Log(LOG_ERR,QString("rdimport: invalid --output-pattern\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -326,7 +326,7 @@ MainObject::MainObject(QObject *parent)
import_persistent_dropbox_id=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid persistent dropbox id\n"));
exit(RDApplication::ExitNoDropbox);
ErrorExit(RDApplication::ExitNoDropbox);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -334,7 +334,7 @@ MainObject::MainObject(QObject *parent)
import_create_startdate_offset=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid create-startddate-offset\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_create_dates=true;
rda->cmdSwitch()->setProcessed(i,true);
@ -344,7 +344,7 @@ MainObject::MainObject(QObject *parent)
if((!ok) ||
(import_create_startdate_offset > import_create_enddate_offset )) {
Log(LOG_ERR,QString("rdimport: invalid create-enddate-offset\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_create_dates=true;
rda->cmdSwitch()->setProcessed(i,true);
@ -365,7 +365,7 @@ MainObject::MainObject(QObject *parent)
import_string_bpm=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid value for --set-string-bpm\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -404,7 +404,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,"invalid ISRC \""+rda->cmdSwitch()->value(i)+"\"\n");
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
}
if(rda->cmdSwitch()->key(i)=="--set-string-recording-mbid") {
@ -426,7 +426,7 @@ MainObject::MainObject(QObject *parent)
if(rda->cmdSwitch()->key(i)=="--set-string-title") {
if(rda->cmdSwitch()->value(i).isEmpty()) {
Log(LOG_ERR,QString("rdimport: title field cannot be empty\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_string_title=rda->cmdSwitch()->value(i);
rda->cmdSwitch()->setProcessed(i,true);
@ -439,7 +439,7 @@ MainObject::MainObject(QObject *parent)
import_string_year=rda->cmdSwitch()->value(i).toInt(&ok);
if(!ok) {
Log(LOG_ERR,QString("rdimport: invalid value for --set-string-year\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -463,19 +463,19 @@ MainObject::MainObject(QObject *parent)
//
if(import_datetimes[0].isValid()&&import_clear_datetimes) {
Log(LOG_ERR,QString("rdimport: --set-datetimes and --clear-datetimes are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
if((!import_dayparts[1].isNull())&&import_clear_dayparts) {
Log(LOG_ERR,QString("rdimport: --set-daypart-times and --clear-daypart-times are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
if((!import_metadata_pattern.isEmpty())&&import_xml) {
Log(LOG_ERR,QString().sprintf("rdimport: --metadata-pattern and --xml are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
if((!import_log_filename.isEmpty())&&import_log_syslog) {
Log(LOG_ERR,QString().sprintf("rdimport: --log-filename and --log-syslog are mutually exclusive\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
import_cut_markers=new MarkerSet();
@ -507,7 +507,7 @@ MainObject::MainObject(QObject *parent)
if(!import_group->exists()) {
Log(LOG_ERR,QString().sprintf("rdimport: invalid group specified\n"));
delete import_group;
exit(RDApplication::ExitNoGroup);
ErrorExit(RDApplication::ExitNoGroup);
}
import_file_key=i+1;
i=rda->cmdSwitch()->keys();
@ -515,13 +515,13 @@ MainObject::MainObject(QObject *parent)
}
if(import_group==NULL) {
Log(LOG_ERR,QString().sprintf("rdimport: invalid group specified\n"));
exit(RDApplication::ExitNoGroup);
ErrorExit(RDApplication::ExitNoGroup);
}
if(import_cart_number>0) {
if(!import_group->cartNumberValid(import_cart_number)) {
Log(LOG_ERR,QString().sprintf("rdimport: invalid cart number for group\n"));
delete import_group;
exit(RDApplication::ExitInvalidCart);
ErrorExit(RDApplication::ExitInvalidCart);
}
}
@ -532,7 +532,7 @@ MainObject::MainObject(QObject *parent)
if(!SchedulerCodeExists(import_add_scheduler_codes[i])) {
Log(LOG_ERR,QString().sprintf("rdimport: scheduler code \"%s\" does not exist\n",
(const char *)import_add_scheduler_codes[i].toUtf8()));
exit(RDApplication::ExitNoSchedCode);
ErrorExit(RDApplication::ExitNoSchedCode);
}
}
@ -557,7 +557,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid normalization level\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -568,7 +568,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid autotrim level\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -579,7 +579,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid segue level\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -590,7 +590,7 @@ MainObject::MainObject(QObject *parent)
}
else {
Log(LOG_ERR,QString("rdimport: invalid segue length\n"));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
rda->cmdSwitch()->setProcessed(i,true);
}
@ -602,7 +602,7 @@ MainObject::MainObject(QObject *parent)
(rda->cmdSwitch()->key(i).left(2)=="--")) {
Log(LOG_ERR,QString().sprintf("rdimport: unknown command option \"%s\"\n",
(const char *)rda->cmdSwitch()->key(i)));
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
}
if(import_to_mono) {
@ -850,7 +850,7 @@ void MainObject::userData()
Log(LOG_ERR,
QString().sprintf("rdimport: user \"%s\" has no edit audio permission\n",
(const char *)rda->user()->name()));
exit(RDApplication::ExitNoPerms);
ErrorExit(RDApplication::ExitNoPerms);
}
//
@ -1104,7 +1104,7 @@ MainObject::Result MainObject::ImportFile(const QString &filename,
delete effective_group;
return MainObject::NoCart;
}
exit(RDApplication::ExitImportFailed);
ErrorExit(RDApplication::ExitImportFailed);
}
if(import_delete_cuts) {
DeleteCuts(import_cart_number);
@ -1889,7 +1889,7 @@ bool MainObject::RunPattern(const QString &pattern,const QString &filename,
}
else {
Log(LOG_ERR,"invalid ISRC \""+value+"\"\n");
exit(RDApplication::ExitInvalidOption);
ErrorExit(RDApplication::ExitInvalidOption);
}
break;
@ -2217,7 +2217,9 @@ void MainObject::Log(int prio,const QString &msg) const
void MainObject::NormalExit() const
{
import_journal->sendAll();
if(import_journal!=NULL) {
import_journal->sendAll();
}
if(import_failed_imports>0) {
exit(RDApplication::ExitImportFailed);
}
@ -2225,6 +2227,15 @@ void MainObject::NormalExit() const
}
void MainObject::ErrorExit(RDApplication::ExitCode code) const
{
if(import_journal!=NULL) {
import_journal->sendAll();
}
exit(code);
}
int main(int argc,char *argv[])
{
QApplication a(argc,argv,false);

View File

@ -31,6 +31,7 @@
#include <QList>
#include <QStringList>
#include <rdapplication.h>
#include <rdcart.h>
#include <rdcut.h>
#include <rdgroup.h>
@ -78,6 +79,7 @@ class MainObject : public QObject
void Log(int prio,const QString &msg) const;
void SendNotification(RDNotification::Action action,unsigned cartnum);
void NormalExit() const;
void ErrorExit(RDApplication::ExitCode code) const;
unsigned import_file_key;
RDGroup *import_group;
bool import_verbose;