void ModelValidationHelper::resolveConflict(ValidationInfo &info) { try { vector<BaseObject *> refs=info.getReferences(); BaseObject *obj=nullptr; //Resolving broken references by swaping the object ids if(info.getValidationType()==ValidationInfo::BROKEN_REFERENCE) { unsigned obj_id=info.getObject()->getObjectId(); //Search for the object with the minor id while(!refs.empty() && !valid_canceled) { if(obj_id > refs.back()->getObjectId()) { obj=refs.back(); obj_id=obj->getObjectId(); } refs.pop_back(); } //Swap the id of the validation object and the found object (minor id) if(obj) BaseObject::swapObjectsIds(info.getObject(), obj, true); sleepThread(5); } //Resolving no unique name by renaming the constraints/indexes else if(info.getValidationType()==ValidationInfo::NO_UNIQUE_NAME) { unsigned suffix=1; QString new_name; Table *table=nullptr; ObjectType obj_type; BaseObject *obj=info.getObject(); TableObject *tab_obj=nullptr; /* If the last element of the referrer objects is a table or view the info object itself need to be renamed since tables and views will not be renamed */ bool rename_obj=(refs.back()->getObjectType()==OBJ_TABLE || refs.back()->getObjectType()==OBJ_VIEW); if(rename_obj) { table=dynamic_cast<Table *>(dynamic_cast<TableObject *>(obj)->getParentTable()); obj_type=obj->getObjectType(); do { //Configures a new name for the object [name]_[suffix] new_name=QString("%1_%2").arg(obj->getName()).arg(suffix); suffix++; } //Generates a new name until no object is found on parent table while(table->getObjectIndex(new_name, obj_type) >= 0); //Renames the object obj->setName(new_name); } //Renaming the referrer objects while(!refs.empty() && !valid_canceled) { obj_type=refs.back()->getObjectType(); tab_obj=dynamic_cast<TableObject *>(refs.back()); //Tables and view aren't renamed only table child objects (constraints, indexes) if(tab_obj && !tab_obj->isAddedByRelationship()) { table=dynamic_cast<Table *>(tab_obj->getParentTable()); do { //Configures a new name for the object [name]_[suffix] new_name=QString("%1_%2").arg(refs.back()->getName()).arg(suffix); suffix++; } //Generates a new name until no object is found on parent table while(table->getObjectIndex(new_name, obj_type) >= 0); //Renames the referrer object refs.back()->setName(new_name); } refs.pop_back(); sleepThread(5); } } } catch(Exception &e) { throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } }
void ModelValidationWidget::updateValidation(ValidationInfo val_info) { QTreeWidgetItem *item=new QTreeWidgetItem, *item1=nullptr, *item2=nullptr; QLabel *label=new QLabel, *label1=nullptr, *label2=nullptr; vector<BaseObject *> refs; BaseTable *table=nullptr; TableObject *tab_obj=nullptr; QString ref_name; if(val_info.getValidationType()==ValidationInfo::BROKEN_REFERENCE) label->setText(trUtf8("The object <strong>%1</strong> <em>(%2)</em> [id: %3] is being referenced by <strong>%4</strong> object(s) before its creation.") .arg(Utf8String::create(val_info.getObject()->getName(true).remove("\""))) .arg(val_info.getObject()->getTypeName()) .arg(val_info.getObject()->getObjectId()) .arg(val_info.getReferences().size())); else if(val_info.getValidationType()==ValidationInfo::NO_UNIQUE_NAME) { tab_obj=dynamic_cast<TableObject *>(val_info.getObject()); if(tab_obj) { table=tab_obj->getParentTable(); ref_name=table->getName(true).remove("\"") + "." + val_info.getObject()->getName(true).remove("\""); } else ref_name=val_info.getObject()->getName(true).remove("\""); label->setText(trUtf8("The object <strong>%1</strong> <em>(%2)</em> has a name that conflicts with <strong>%3</strong> object's name(s).") .arg(Utf8String::create(ref_name)) .arg(val_info.getObject()->getTypeName()) .arg(val_info.getReferences().size())); } else if(val_info.getValidationType()==ValidationInfo::SQL_VALIDATION_ERR) label->setText(trUtf8("SQL validation failed due to error(s) below. <strong>NOTE:</strong><em> These errors does not invalidates the model thus you can save it without any problem.</em>")); else label->setText(val_info.getErrors().at(0)); if(val_info.getValidationType()==ValidationInfo::SQL_VALIDATION_ERR || val_info.getValidationType()==ValidationInfo::VALIDATION_ABORTED) { QStringList errors=val_info.getErrors(); QFont fnt; item->setIcon(0, QPixmap(QString(":/icones/icones/msgbox_alerta.png"))); validation_prog_pb->setValue(validation_prog_pb->maximum()); reenableValidation(); if(val_info.getValidationType()==ValidationInfo::SQL_VALIDATION_ERR) { //Adding all the sql errors into the output pane while(!errors.isEmpty()) { item1=new QTreeWidgetItem(item); label1=new QLabel; label1->setText(errors.back()); fnt=label1->font(); fnt.setPointSizeF(8.0f); label1->setFont(fnt); output_trw->setItemWidget(item1, 0, label1); errors.pop_back(); } } } else { item->setIcon(0, QPixmap(QString(":/icones/icones/msgbox_erro.png"))); //Listing the referrer object on output pane refs=val_info.getReferences(); while(!refs.empty()) { item1=new QTreeWidgetItem(item); label1=new QLabel; item1->setIcon(0, QPixmap(QString(":/icones/icones/") + refs.back()->getSchemaName() + QString(".png"))); if(val_info.getValidationType()==ValidationInfo::NO_UNIQUE_NAME) { TableObject *tab_obj=dynamic_cast<TableObject *>(refs.back()); ref_name=refs.back()->getName(true); //If the referrer object is a table object, concatenates the parent table name if(tab_obj) { ref_name=dynamic_cast<TableObject *>(refs.back())->getParentTable()->getName(true) + "." + ref_name; if(tab_obj->isAddedByRelationship()) { QPalette pal; item2=new QTreeWidgetItem(item1); label2=new QLabel; pal.setColor(QPalette::Text, QColor(255,0,0)); label2->setPalette(pal); label2->setText(trUtf8("<em>The above object was created by a relationship. Change the name pattern on it's generator relationship. Fix will not be applied!</em>")); output_trw->setItemWidget(item2, 0, label2); item1->setExpanded(true); } } label1->setText(trUtf8("Conflicting object: <strong>%1</strong> <em>(%2)</em>.") .arg(Utf8String::create(ref_name).remove("\"")) .arg(Utf8String::create(refs.back()->getTypeName()))); } else { label1->setText(trUtf8("Referrer object: <strong>%1</strong> <em>(%2)</em> [id: %3].") .arg(Utf8String::create(refs.back()->getName(true))) .arg(Utf8String::create(refs.back()->getTypeName())) .arg(refs.back()->getObjectId())); } output_trw->setItemWidget(item1, 0, label1); refs.pop_back(); } } output_trw->addTopLevelItem(item); output_trw->setItemWidget(item, 0, label); item->setExpanded(false); //Stores the validatin on the current tree item item->setData(0, Qt::UserRole, QVariant::fromValue<ValidationInfo>(val_info)); warn_count_lbl->setText(QString("%1").arg(validation_helper.getWarningCount())); error_count_lbl->setText(QString("%1").arg(validation_helper.getErrorCount())); output_trw->setItemHidden(item, false); output_trw->scrollToBottom(); }