void Table::removeObject(unsigned obj_idx, ObjectType obj_type) { //Raises an error if the user try to remove a object with invalid type if(!TableObject::isTableObject(obj_type) && obj_type!=OBJ_TABLE) throw Exception(ERR_REM_OBJ_INVALID_TYPE,__PRETTY_FUNCTION__,__FILE__,__LINE__); else if(obj_type==OBJ_TABLE && obj_idx < ancestor_tables.size()) { vector<Table *>::iterator itr; Table *tab=nullptr; itr=ancestor_tables.begin() + obj_idx; ancestor_tables.erase(itr); with_oid=false; for(auto &obj : ancestor_tables) { tab=dynamic_cast<Table *>(obj); if(!with_oid && tab->isWithOIDs()) { with_oid=true; break; } } } else if(obj_type!=OBJ_TABLE && obj_type!=BASE_TABLE) { vector<TableObject *> *obj_list=nullptr; vector<TableObject *>::iterator itr; obj_list=getObjectList(obj_type); //Raises an error if the object index is out of bound if(obj_idx >= obj_list->size()) throw Exception(ERR_REF_OBJ_INV_INDEX,__PRETTY_FUNCTION__,__FILE__,__LINE__); if(obj_type!=OBJ_COLUMN) { itr=obj_list->begin() + obj_idx; TableObject *tab_obj=(*itr); Constraint *constr=dynamic_cast<Constraint *>(tab_obj); tab_obj->setParentTable(nullptr); obj_list->erase(itr); if(constr && constr->getConstraintType()==ConstraintType::primary_key) dynamic_cast<Constraint *>(tab_obj)->setColumnsNotNull(false); } else { vector<TableObject *> refs; Column *column=nullptr; itr=obj_list->begin() + obj_idx; column=dynamic_cast<Column *>(*itr); //Gets the references to the column before the exclusion getColumnReferences(column, refs, true); //Case some trigger, constraint, index is referencing the column raises an error if(!refs.empty()) { throw Exception(Exception::getErrorMessage(ERR_REM_INDIRECT_REFERENCE) .arg(column->getName()) .arg(column->getTypeName()) .arg(refs[0]->getName()) .arg(refs[0]->getTypeName()) .arg(this->getName(true)) .arg(this->getTypeName()), ERR_REM_INDIRECT_REFERENCE,__PRETTY_FUNCTION__,__FILE__,__LINE__); } column->setParentTable(nullptr); columns.erase(itr); } } setCodeInvalidated(true); }
void Table::removeObject(unsigned obj_idx, ObjectType obj_type) { //Raises an error if the user try to remove a object with invalid type if(obj_type!=OBJ_COLUMN && obj_type!=OBJ_CONSTRAINT && obj_type!=OBJ_TRIGGER && obj_type!=OBJ_INDEX && obj_type!=OBJ_RULE && obj_type!=OBJ_TABLE) throw Exception(ERR_REM_OBJ_INVALID_TYPE,__PRETTY_FUNCTION__,__FILE__,__LINE__); else if(obj_type==OBJ_TABLE && obj_idx < ancestor_tables.size()) { vector<Table *>::iterator itr; itr=ancestor_tables.begin() + obj_idx; ancestor_tables.erase(itr); } else if(obj_type!=OBJ_TABLE && obj_type!=BASE_TABLE) { vector<TableObject *> *obj_list=nullptr; vector<TableObject *>::iterator itr; obj_list=getObjectList(obj_type); //Raises an error if the object index is out of bound if(obj_idx >= obj_list->size()) throw Exception(ERR_REF_OBJ_INV_INDEX,__PRETTY_FUNCTION__,__FILE__,__LINE__); if(obj_type!=OBJ_COLUMN) { itr=obj_list->begin() + obj_idx; (*itr)->setParentTable(nullptr); obj_list->erase(itr); } else { vector<TableObject *> refs; Column *column=nullptr; itr=obj_list->begin() + obj_idx; column=dynamic_cast<Column *>(*itr); //Gets the references to the column before the exclusion getColumnReferences(column, refs, true); //Case some trigger, constraint, index is referencing the column raises an error if(!refs.empty()) { throw Exception(Exception::getErrorMessage(ERR_REM_INDIRECT_REFERENCE) .arg(Utf8String::create(column->getName())) .arg(column->getTypeName()) .arg(Utf8String::create(refs[0]->getName())) .arg(refs[0]->getTypeName()) .arg(Utf8String::create(this->getName(true))) .arg(this->getTypeName()), ERR_REM_INDIRECT_REFERENCE,__PRETTY_FUNCTION__,__FILE__,__LINE__); } column->setParentTable(nullptr); columns.erase(itr); } } }