diff --git a/ChangeLog b/ChangeLog index 707eab92..8b2a324b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16555,3 +16555,5 @@ 2017-12-27 Fred Gleason * Fixed a bug that broke generation of the 'RULES' table when creating a new clock in rdlogmanager(1). +2018-01-03 Fred Gleason + * Fixed races in creation of new carts. diff --git a/lib/librd_cs.ts b/lib/librd_cs.ts index 8eae3c4f..a81f07ff 100644 --- a/lib/librd_cs.ts +++ b/lib/librd_cs.ts @@ -531,6 +531,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -902,7 +910,7 @@ ze &souboru Unable to get temporary cart number for import! - Nelze získat číslo dočasného vozík pro zavedení! + Nelze získat číslo dočasného vozík pro zavedení! Import Error diff --git a/lib/librd_de.ts b/lib/librd_de.ts index 24608ed4..5e65915a 100644 --- a/lib/librd_de.ts +++ b/lib/librd_de.ts @@ -527,6 +527,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -895,10 +903,6 @@ senden Unable to create temporary cart for import! - - Unable to get temporary cart number for import! - - Import Error Importfehler diff --git a/lib/librd_es.ts b/lib/librd_es.ts index ed782c76..3022a83d 100644 --- a/lib/librd_es.ts +++ b/lib/librd_es.ts @@ -527,6 +527,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -895,10 +903,6 @@ Color Unable to create temporary cart for import! - - Unable to get temporary cart number for import! - - Import Error Error importando diff --git a/lib/librd_fr.ts b/lib/librd_fr.ts index 0c87c518..4c493b2b 100644 --- a/lib/librd_fr.ts +++ b/lib/librd_fr.ts @@ -505,6 +505,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -833,10 +841,6 @@ La Couleur Cart Error - - Unable to get temporary cart number for import! - - Unable to create temporary cart for import! diff --git a/lib/librd_nb.ts b/lib/librd_nb.ts index deb236ec..6ec8a2c8 100644 --- a/lib/librd_nb.ts +++ b/lib/librd_nb.ts @@ -527,6 +527,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -894,10 +902,6 @@ farge Unable to create temporary cart for import! - - Unable to get temporary cart number for import! - - Import Error diff --git a/lib/librd_nn.ts b/lib/librd_nn.ts index deb236ec..6ec8a2c8 100644 --- a/lib/librd_nn.ts +++ b/lib/librd_nn.ts @@ -527,6 +527,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -894,10 +902,6 @@ farge Unable to create temporary cart for import! - - Unable to get temporary cart number for import! - - Import Error diff --git a/lib/librd_pt_BR.ts b/lib/librd_pt_BR.ts index 268518cd..67feb811 100644 --- a/lib/librd_pt_BR.ts +++ b/lib/librd_pt_BR.ts @@ -527,6 +527,14 @@ No such service! + + No such group + + + + No free cart available in group + + RDAddCart @@ -895,10 +903,6 @@ Cor Unable to create temporary cart for import! - - Unable to get temporary cart number for import! - - Import Error diff --git a/lib/rdcart.cpp b/lib/rdcart.cpp index c799e1e0..000aef66 100644 --- a/lib/rdcart.cpp +++ b/lib/rdcart.cpp @@ -35,13 +35,14 @@ #include #include #include -#include #include -#include -#include #include -#include +#include #include +#include +#include +#include +#include // // CURL Callbacks @@ -1271,29 +1272,60 @@ bool RDCart::removeCutAudio(RDStation *station,RDUser *user, } -bool RDCart::create(const QString &groupname,RDCart::Type type) -{ - QString sql=QString().sprintf("insert into CART set NUMBER=%d,TYPE=%d,\ - GROUP_NAME=\"%s\",TITLE=\"%s\"", - cart_number,type, - (const char *)RDEscapeString(groupname), - (const char *) - RDEscapeString(RDCart::uniqueCartTitle(cart_number))); - RDSqlQuery *q=new RDSqlQuery(sql); - bool ret=q->isActive(); - delete q; - metadata_changed=true; - - return ret; -} - - bool RDCart::remove(RDStation *station,RDUser *user,RDConfig *config) const { return RDCart::removeCart(cart_number,station,user,config); } +unsigned RDCart::create(const QString &groupname,RDCart::Type type, + QString *err_msg,unsigned cartnum) +{ + bool ok=false; + + RDGroup *group=new RDGroup(groupname); + if(!group->exists()) { + *err_msg=QObject::tr("No such group"); + delete group; + return 0; + } + + if(cartnum==0) { + while(!ok) { + if((cartnum=group->nextFreeCart())==0) { + *err_msg=QObject::tr("No free cart available in group"); + delete group; + return 0; + } + QString sql=QString("insert into CART set ")+ + QString().sprintf("NUMBER=%d,",cartnum)+ + QString().sprintf("TYPE=%d,",type)+ + "GROUP_NAME=\""+RDEscapeString(groupname)+"\","+ + "TITLE=\""+RDEscapeString(RDCart::uniqueCartTitle(cartnum))+"\""; + RDSqlQuery *q=new RDSqlQuery(sql); + ok=q->isActive(); + delete q; + } + return cartnum; + } + else { + QString sql=QString("insert into CART set ")+ + QString().sprintf("NUMBER=%d,",cartnum)+ + QString().sprintf("TYPE=%d,",type)+ + "GROUP_NAME=\""+RDEscapeString(groupname)+"\","+ + "TITLE=\""+RDEscapeString(RDCart::uniqueCartTitle(cartnum))+"\""; + RDSqlQuery *q=new RDSqlQuery(sql); + ok=q->isActive(); + delete q; + } + delete group; + if(!ok) { + return 0; + } + return cartnum; +} + + QString RDCart::xmlSql(bool include_cuts) { QString sql=QString("select ")+ diff --git a/lib/rdcart.h b/lib/rdcart.h index 2e165d5b..fa5b284f 100644 --- a/lib/rdcart.h +++ b/lib/rdcart.h @@ -149,8 +149,9 @@ class RDCart RDConfig *config); bool removeCutAudio(RDStation *station,RDUser *user, const QString &cutname,RDConfig *config); - bool create(const QString &groupname,RDCart::Type type); bool remove(RDStation *station,RDUser *user,RDConfig *config) const; + static unsigned create(const QString &groupname,RDCart::Type type, + QString *err_msg,unsigned cartnum=0); static QString xmlSql(bool include_cuts); static QString xml(RDSqlQuery *q,bool include_cuts,bool absolute, RDSettings *settings=NULL,int cutnum=-1); diff --git a/lib/rdcart_dialog.cpp b/lib/rdcart_dialog.cpp index 78a02c78..e137fa01 100644 --- a/lib/rdcart_dialog.cpp +++ b/lib/rdcart_dialog.cpp @@ -541,7 +541,6 @@ void RDCartDialog::loadFileData() { #ifndef WIN32 QString filename; - RDGroup *group=NULL; RDCart *cart=NULL; RDCut *cut=NULL; RDAudioImport *conv; @@ -552,34 +551,25 @@ void RDCartDialog::loadFileData() QString file_title=""; RDWaveFile *wavefile=NULL; RDWaveData wavedata; + QString err_msg; filename=QFileDialog::getOpenFileName(cart_import_path, cart_import_file_filter,this); if(!filename.isEmpty()) { - - // - // Get Cart Number - // cart_import_path=RDGetPathPart(filename); - group=new RDGroup(cart_system->tempCartGroup()); - if((!group->exists())||((cartnum=group->nextFreeCart())==0)) { - delete group; - QMessageBox::warning(this,tr("Cart Error"), - tr("Unable to get temporary cart number for import!")); - return; - } - delete group; // // Create Cart // - cart=new RDCart(cartnum); - if(!cart->create(cart_system->tempCartGroup(),RDCart::Audio)) { + if((cartnum=RDCart::create(cart_system->tempCartGroup(),RDCart::Audio, + &err_msg))==0) { delete cart; QMessageBox::warning(this,tr("Cart Error"), - tr("Unable to create temporary cart for import!")); + tr("Unable to create temporary cart for import!")+ + "["+err_msg+"]"); return; } + cart=new RDCart(cartnum); cart->setOwner(cart_station->name()); cut=new RDCut(cartnum,1,true); diff --git a/rdlogedit/voice_tracker.cpp b/rdlogedit/voice_tracker.cpp index 0cd5cfba..b59e8737 100644 --- a/rdlogedit/voice_tracker.cpp +++ b/rdlogedit/voice_tracker.cpp @@ -3933,6 +3933,7 @@ void VoiceTracker::LogLine(const QString &line) bool VoiceTracker::InitTrack() { int cutnum; + QString err_msg; track_recording=false; track_record_ran=false; @@ -3945,14 +3946,11 @@ bool VoiceTracker::InitTrack() bool ok=false; unsigned next_cart=0; RDCart *cart=NULL; - while(!ok) { - if((next_cart=track_group->nextFreeCart())==0) { - return false; - } - cart=new RDCart(next_cart); - ok=cart->create(track_group->name(),RDCart::Audio); - delete cart; + + if((next_cart=RDCart::create(track_group->name(),RDCart::Audio,&err_msg))==0) { + return false; } + edit_track_cart=new RDCart(next_cart); edit_track_cart->setOwner(track_log->name()); edit_track_cart->setTitle(edit_logline[1]->markerComment().stripWhiteSpace()); diff --git a/utils/rddgimport/rddgimport.cpp b/utils/rddgimport/rddgimport.cpp index b5724d90..3fc31771 100644 --- a/utils/rddgimport/rddgimport.cpp +++ b/utils/rddgimport/rddgimport.cpp @@ -366,16 +366,16 @@ bool MainWidget::LoadEvents() bool MainWidget::ImportAudio() { - if(dg_group->freeCartQuantity()<(int)dg_carts.size()) { - QMessageBox::warning(this,tr("RDDgImport"), - tr("Insufficient free carts in target group!")); - return false; - } + QString err_msg; + for(std::map::const_iterator it=dg_carts.begin(); it!=dg_carts.end();it++) { Event *evt=GetEvent(it->first); if(!CheckSpot(evt->isci())) { - ImportSpot(evt); + if(!ImportSpot(evt,&err_msg)) { + QMessageBox::warning(this,"RDgImport - "+tr("Error"),err_msg); + return false; + } } } return true; @@ -464,10 +464,11 @@ bool MainWidget::CheckSpot(const QString &isci) } -bool MainWidget::ImportSpot(Event *evt) +bool MainWidget::ImportSpot(Event *evt,QString *err_msg) { RDCart *cart; RDCut *cut; + unsigned cartnum; int cutnum; RDAudioImport *conv; RDAudioImport::ErrorCode conv_err; @@ -507,8 +508,12 @@ bool MainWidget::ImportSpot(Event *evt) evt->isci()+"\"."); return false; } + if((cartnum=RDCart::create(dg_group->name(),RDCart::Audio,err_msg, + dg_carts[evt->isci()]))==0) { + return false; + } cart=new RDCart(dg_carts[evt->isci()]); - cart->create(dg_group->name(),RDCart::Audio); + if((cutnum=cart->addCut(dg_library_conf->defaultLayer(), dg_library_conf->defaultBitrate(), dg_library_conf->defaultChannels(), diff --git a/utils/rddgimport/rddgimport.h b/utils/rddgimport/rddgimport.h index ee29eed9..5a542f93 100644 --- a/utils/rddgimport/rddgimport.h +++ b/utils/rddgimport/rddgimport.h @@ -76,7 +76,7 @@ class MainWidget : public QWidget bool ImportAudio(); bool WriteTrafficFile(); bool CheckSpot(const QString &isci); - bool ImportSpot(Event *evt); + bool ImportSpot(Event *evt,QString *err_msg); void ActivateBar(bool state); Event *GetEvent(const QString &isci); QTime GetTime(const QString &str) const; diff --git a/utils/rddgimport/rddgimport_de.ts b/utils/rddgimport/rddgimport_de.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_de.ts +++ b/utils/rddgimport/rddgimport_de.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddgimport/rddgimport_es.ts b/utils/rddgimport/rddgimport_es.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_es.ts +++ b/utils/rddgimport/rddgimport_es.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddgimport/rddgimport_fr.ts b/utils/rddgimport/rddgimport_fr.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_fr.ts +++ b/utils/rddgimport/rddgimport_fr.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddgimport/rddgimport_nb.ts b/utils/rddgimport/rddgimport_nb.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_nb.ts +++ b/utils/rddgimport/rddgimport_nb.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddgimport/rddgimport_nn.ts b/utils/rddgimport/rddgimport_nn.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_nn.ts +++ b/utils/rddgimport/rddgimport_nn.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddgimport/rddgimport_pt_BR.ts b/utils/rddgimport/rddgimport_pt_BR.ts index fc2f92ac..58bf8b01 100644 --- a/utils/rddgimport/rddgimport_pt_BR.ts +++ b/utils/rddgimport/rddgimport_pt_BR.ts @@ -58,10 +58,6 @@ User - - Insufficient free carts in target group! - - Service: @@ -110,5 +106,9 @@ All Files + + Error + + diff --git a/utils/rddiscimport/rddiscimport.cpp b/utils/rddiscimport/rddiscimport.cpp index 6ec4e740..1e112ec0 100644 --- a/utils/rddiscimport/rddiscimport.cpp +++ b/utils/rddiscimport/rddiscimport.cpp @@ -447,6 +447,7 @@ void MainWidget::ripData() unsigned cartnum; RDAudioImport::ErrorCode import_err; RDAudioConvert::ErrorCode conv_err; + QString err_msg; // // Sanity Checks @@ -496,42 +497,44 @@ void MainWidget::ripData() dg_track_label->setText(QString().sprintf("Track %d: ",i+1)+ r->title()+" - "+r->artist()); dg_ripper->rip(i); - if((cartnum=dg_group->nextFreeCart())>0) { - cart=new RDCart(cartnum); - cart->create(dg_group->name(),RDCart::Audio); - cart->addCut(dg_library_conf->defaultFormat(), - dg_library_conf->defaultBitrate(), - dg_channels_box->currentItem()+1,"",r->discId()); - cut=new RDCut(cartnum,1); - dg_importer->setCartNumber(cartnum); - dg_importer->setCutNumber(1); - if((import_err=dg_importer-> - runImport(dg_user->name(),dg_user->password(),&conv_err))== - RDAudioImport::ErrorOk) { - data=new RDWaveData(); - r->getMetadata(data,dg_player->trackLength(i+1)); - if(!dg_autotrim_box->isChecked()) { - data->setStartPos(0); - data->setEndPos(dg_player->trackLength(i+1)); - } - data->setUserDefined(dg_userdef_edit->text(). - replace("%d",dg_discid_edit->text()). - replace("%t",QString().sprintf("%d",i+1))); - cart->setMetadata(data); - cut->setMetadata(data); - delete data; - } - else { - QMessageBox::warning(this,"RDDiscImport - "+tr("Import Error"), - tr("Unable to import track audio!")+"\n"+ - "["+ - RDAudioImport::errorText(import_err,conv_err)+ - "]."); - return; - } - delete cut; - delete cart; + if((cartnum=RDCart::create(dg_group->name(),RDCart::Audio, + &err_msg))==0) { + QMessageBox::warning(this,"RDDiscImport - "+tr("Error"),err_msg); + return; } + cart=new RDCart(cartnum); + cart->addCut(dg_library_conf->defaultFormat(), + dg_library_conf->defaultBitrate(), + dg_channels_box->currentItem()+1,"",r->discId()); + cut=new RDCut(cartnum,1); + dg_importer->setCartNumber(cartnum); + dg_importer->setCutNumber(1); + if((import_err=dg_importer-> + runImport(dg_user->name(),dg_user->password(),&conv_err))== + RDAudioImport::ErrorOk) { + data=new RDWaveData(); + r->getMetadata(data,dg_player->trackLength(i+1)); + if(!dg_autotrim_box->isChecked()) { + data->setStartPos(0); + data->setEndPos(dg_player->trackLength(i+1)); + } + data->setUserDefined(dg_userdef_edit->text(). + replace("%d",dg_discid_edit->text()). + replace("%t",QString().sprintf("%d",i+1))); + cart->setMetadata(data); + cut->setMetadata(data); + delete data; + } + else { + QMessageBox::warning(this,"RDDiscImport - "+tr("Import Error"), + tr("Unable to import track audio!")+"\n"+ + "["+ + RDAudioImport::errorText(import_err,conv_err)+ + "]."); + return; + } + delete cut; + delete cart; } } } diff --git a/utils/rddiscimport/rddiscimport_de.ts b/utils/rddiscimport/rddiscimport_de.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_de.ts +++ b/utils/rddiscimport/rddiscimport_de.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rddiscimport/rddiscimport_es.ts b/utils/rddiscimport/rddiscimport_es.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_es.ts +++ b/utils/rddiscimport/rddiscimport_es.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rddiscimport/rddiscimport_fr.ts b/utils/rddiscimport/rddiscimport_fr.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_fr.ts +++ b/utils/rddiscimport/rddiscimport_fr.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rddiscimport/rddiscimport_nb.ts b/utils/rddiscimport/rddiscimport_nb.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_nb.ts +++ b/utils/rddiscimport/rddiscimport_nb.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rddiscimport/rddiscimport_nn.ts b/utils/rddiscimport/rddiscimport_nn.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_nn.ts +++ b/utils/rddiscimport/rddiscimport_nn.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rddiscimport/rddiscimport_pt_BR.ts b/utils/rddiscimport/rddiscimport_pt_BR.ts index 3d66db16..513a21f1 100644 --- a/utils/rddiscimport/rddiscimport_pt_BR.ts +++ b/utils/rddiscimport/rddiscimport_pt_BR.ts @@ -162,5 +162,9 @@ Unable to open CD-ROM device at + + Error + + diff --git a/utils/rdimport/rdimport.cpp b/utils/rdimport/rdimport.cpp index e9da7801..d8218a78 100644 --- a/utils/rdimport/rdimport.cpp +++ b/utils/rdimport/rdimport.cpp @@ -977,6 +977,8 @@ MainObject::Result MainObject::ImportFile(const QString &filename, RDGroup *effective_group=new RDGroup(import_group->name()); RDWaveData *wavedata=new RDWaveData(); RDWaveFile *wavefile=new RDWaveFile(filename); + QString err_msg; + if(wavefile->openWave(wavedata)) { effective_filename=filename; } @@ -1112,11 +1114,9 @@ MainObject::Result MainObject::ImportFile(const QString &filename, if(import_delete_cuts) { DeleteCuts(import_cart_number); } + cart_created= + RDCart::create(effective_group->name(),RDCart::Audio,&err_msg,*cartnum)!=0; RDCart *cart=new RDCart(*cartnum); - if(!cart->exists()) { - cart->create(effective_group->name(),RDCart::Audio); - cart_created=true; - } int cutnum= cart->addCut(import_format,import_bitrate,import_channels); if(cutnum<0) { diff --git a/web/rdxport/carts.cpp b/web/rdxport/carts.cpp index de367b24..087485b6 100644 --- a/web/rdxport/carts.cpp +++ b/web/rdxport/carts.cpp @@ -43,6 +43,7 @@ void Xport::AddCart() QString type; RDCart::Type cart_type=RDCart::All; int cart_number=0; + QString err_msg; // // Verify Post @@ -96,9 +97,9 @@ void Xport::AddCart() delete cart; XmlExit("Cart already exists",400,"carts.cpp",LINE_NUMBER); } - if(!cart->create(group_name,cart_type)) { + if(RDCart::create(group_name,cart_type,&err_msg,cart_number)==0) { delete cart; - XmlExit("Unable to create cart",500,"carts.cpp",LINE_NUMBER); + XmlExit("Unable to create cart ["+err_msg+"]",500,"carts.cpp",LINE_NUMBER); } printf("Content-type: application/xml\n"); printf("Status: 200\n\n"); diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index 7c58459a..f13442a6 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -41,6 +41,7 @@ void Xport::Import() unsigned msecs=0; int resp_code=0; QString remote_host; + QString err_msg; if(getenv("REMOTE_HOST")==NULL) { if(getenv("REMOTE_ADDR")==NULL) { @@ -147,7 +148,11 @@ void Xport::Import() XmlExit("No available carts for specified group",404,"import.cpp",LINE_NUMBER); } cart=new RDCart(cartnum); - cart->create(group_name,RDCart::Audio); + if(RDCart::create(group_name,RDCart::Audio,&err_msg,cartnum)==0) { + delete cart; + XmlExit("Unable to create cart ["+err_msg+"]",500,"import.cpp", + LINE_NUMBER); + } cutnum=1; cut=new RDCut(cartnum,cutnum,true); delete group;