diff --git a/ChangeLog b/ChangeLog index 41ec00fb..e3bc256e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22424,3 +22424,6 @@ 2021-09-13 Fred Gleason * Fixed a regression in 'RDCartFilter' that caused a SQL error to be thrown during initialization. +2021-09-13 Fred Gleason + * Added an 'RDGroups::create()' static method. + * Added an 'RDGroups::remove()' static method. diff --git a/lib/rdgroup.cpp b/lib/rdgroup.cpp index 05de9c31..a11c4c33 100644 --- a/lib/rdgroup.cpp +++ b/lib/rdgroup.cpp @@ -392,6 +392,115 @@ QString RDGroup::xml() const } +bool RDGroup::create(const QString &name,bool allow_all_users, + bool allow_all_services,QString *err_msg) +{ + QString sql; + RDSqlQuery *q=NULL; + + if(name.length()>10) { + *err_msg=QObject::tr("Name too long (ten characters max)"); + return false; + } + if(name.isEmpty()||(name.toLower()==QObject::tr("all").toLower())) { + *err_msg=QObject::tr("Invalid group name"); + return false; + } + sql=QString("select ")+ + "`NAME` "+ + "from `GROUPS` where "+ + "`NAME`='"+RDEscapeString(name)+"'"; + q=new RDSqlQuery(sql); + if(q->first()) { + *err_msg=QObject::tr("group already exists"); + delete q; + return false; + } + delete q; + sql=QString("insert into `GROUPS` set ")+ + "`NAME`='"+RDEscapeString(name)+"'"; + if(!RDSqlQuery::apply(sql)) { + *err_msg=QObject::tr("unable to create database record"); + return false; + } + + // + // Create Default Users Perms + // + if(allow_all_users) { + sql="select `LOGIN_NAME` from `USERS`"; + q=new RDSqlQuery(sql); + while(q->next()) { + sql=QString("insert into `USER_PERMS` set ")+ + "`USER_NAME`='"+RDEscapeString(q->value(0).toString())+"',"+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + } + delete q; + } + + // + // Create Default Service Perms + // + if(allow_all_services) { + sql="select `NAME` from `SERVICES`"; + q=new RDSqlQuery(sql); + while(q->next()) { + sql=QString("insert into `AUDIO_PERMS` set ")+ + "`SERVICE_NAME`='"+RDEscapeString(q->value(0).toString())+"',"+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + } + delete q; + } + + *err_msg=QObject::tr("OK"); + + return true; +} + + +bool RDGroup::remove(const QString &name,QString *err_msg) +{ + QString sql; + RDSqlQuery *q=NULL; + + // + // Check for carts using group + // + sql=QString("select ")+ + "`NUMBER` "+ // 00 + "from `CART` where "+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + q=new RDSqlQuery(sql); + if(q->first()) { + *err_msg=QObject::tr("group name in use"); + delete q; + return false; + } + + sql=QString("delete from `USER_PERMS` where ")+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + + sql=QString("delete from `AUDIO_PERMS` where ")+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + + sql=QString("delete from `GROUPS` where ")+ + "`NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + + sql=QString("delete from `REPLICATOR_MAP` where ")+ + "`GROUP_NAME`='"+RDEscapeString(name)+"'"; + RDSqlQuery::apply(sql); + + *err_msg=QObject::tr("OK"); + + return true; +} + + unsigned RDGroup::GetNextFreeCart(unsigned startcart) const { QString sql; diff --git a/lib/rdgroup.h b/lib/rdgroup.h index dfda3d77..676873b0 100644 --- a/lib/rdgroup.h +++ b/lib/rdgroup.h @@ -62,7 +62,10 @@ class RDGroup RDCart::Type type,int quan) const; bool cartNumberValid(unsigned cartnum) const; QString xml() const; - + static bool create(const QString &name,bool allow_all_users, + bool allow_all_services,QString *err_msg); + static bool remove(const QString &name,QString *err_msg); + private: unsigned GetNextFreeCart(unsigned startcart) const; bool ReserveCart(const QString &station_name,RDCart::Type type, diff --git a/rdadmin/add_group.cpp b/rdadmin/add_group.cpp index be5e7dd9..da28b19f 100644 --- a/rdadmin/add_group.cpp +++ b/rdadmin/add_group.cpp @@ -127,72 +127,27 @@ QSizePolicy AddGroup::sizePolicy() const void AddGroup::okData() { - RDSqlQuery *q; - RDSqlQuery *q1; - QString sql; + QString err_msg; if(group_name_edit->text().isEmpty()) { QMessageBox::warning(this,tr("Invalid Name"),tr("You must give the group a name!")); return; } - - sql=QString("insert into `GROUPS` set ")+ - "`NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - - q=new RDSqlQuery(sql); - if(!q->isActive()) { - QMessageBox::warning(this,tr("Group Exists"),tr("Group Already Exists!"), - 1,0,0); - delete q; + if(!RDGroup::create(group_name_edit->text(),group_users_box->isChecked(), + group_svcs_box->isChecked(),&err_msg)) { + QMessageBox::warning(this,"RDAdmin - "+tr("Error"), + tr("Error creating group!")+"\n"+ + "["+err_msg+"]"); return; - } - delete q; - - // - // Create Default Users Perms - // - if(group_users_box->isChecked()) { - sql="select `LOGIN_NAME` from `USERS`"; - q=new RDSqlQuery(sql); - while(q->next()) { - sql=QString("insert into `USER_PERMS` set ")+ - "`USER_NAME`='"+RDEscapeString(q->value(0).toString())+"',"+ - "`GROUP_NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - RDSqlQuery::apply(sql); - } - delete q; - } - - // - // Create Default Service Perms - // - if(group_svcs_box->isChecked()) { - sql="select `NAME` from `SERVICES`"; - q=new RDSqlQuery(sql); - while(q->next()) { - sql=QString("insert into `AUDIO_PERMS` set ")+ - "`SERVICE_NAME`='"+RDEscapeString(q->value(0).toString())+"',"+ - "`GROUP_NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - q1=new RDSqlQuery(sql); - delete q1; - } - delete q; - } + } EditGroup *group=new EditGroup(group_name_edit->text(),this); - if(group->exec()<0) { - sql=QString("delete from `USER_PERMS` where ")+ - "`GROUP_NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - q=new RDSqlQuery(sql); - delete q; - sql=QString("delete from `AUDIO_PERMS` where ")+ - "`GROUP_NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - q=new RDSqlQuery(sql); - delete q; - sql=QString("delete from `GROUPS` where ")+ - "`NAME`='"+RDEscapeString(group_name_edit->text())+"'"; - q=new RDSqlQuery(sql); - delete q; + if(!group->exec()) { + if(!RDGroup::remove(group_name_edit->text(),&err_msg)) { + QMessageBox::warning(this,"RDAdmin - "+tr("Error"), + tr("Error removing stale database record!")+"\n"+ + "["+err_msg+"]"); + } delete group; done(false); return; diff --git a/rdadmin/list_groups.cpp b/rdadmin/list_groups.cpp index 986b6712..731e36fc 100644 --- a/rdadmin/list_groups.cpp +++ b/rdadmin/list_groups.cpp @@ -134,7 +134,6 @@ void ListGroups::addData() return; } delete add_group; - add_group=NULL; QModelIndex index=list_groups_model->addGroup(grpname); if(index.isValid()) { list_groups_view->selectRow(index.row()); @@ -187,13 +186,13 @@ void ListGroups::deleteData() RDSqlQuery *q=NULL; QString warning; int carts=0; + QString err_msg; QModelIndexList rows=list_groups_view->selectionModel()->selectedRows(); if(rows.size()!=1) { return; } - QString grpname=list_groups_model->groupName(rows.first()); if(grpname.isEmpty()) { return; @@ -229,33 +228,13 @@ void ListGroups::deleteData() } delete q; - // - // Delete Member Audio Perms - // - sql=QString("delete from `AUDIO_PERMS` where ")+ - "`GROUP_NAME`='"+RDEscapeString(grpname)+"'"; - RDSqlQuery::apply(sql); - - // - // Delete Member User Perms - // - sql=QString("delete from `USER_PERMS` where ")+ - "`GROUP_NAME`='"+RDEscapeString(grpname)+"'"; - RDSqlQuery::apply(sql); - - // - // Delete Replicator Map Records - // - sql=QString("delete from `REPLICATOR_MAP` where ")+ - "`GROUP_NAME`='"+RDEscapeString(grpname)+"'"; - RDSqlQuery::apply(sql); - - // - // Delete from Group List - // - sql=QString("delete from `GROUPS` where ")+ - "`NAME`='"+RDEscapeString(grpname)+"'"; - RDSqlQuery::apply(sql); + if(!RDGroup::remove(grpname,&err_msg)) { + QMessageBox::warning(this,"RDAdmin - "+tr("Error"), + tr("Unable to remove group!")+"\n"+ + "["+err_msg+"]"); + return; + } + list_groups_model->removeGroup(grpname); }