int View::getReferenceIndex(Reference &ref, unsigned sql_type) { vector<unsigned> *vet_idref=getExpressionList(sql_type); vector<unsigned>::iterator itr, itr_end; int idx_ref; bool found=false; idx_ref=getReferenceIndex(ref); if(sql_type==Reference::SQL_VIEW_DEFINITION && idx_ref >=0 && ref.isDefinitionExpression()) return(idx_ref); else if(sql_type!=Reference::SQL_VIEW_DEFINITION) { itr=vet_idref->begin(); itr_end=vet_idref->end(); while(itr!=itr_end && !found) { found=(static_cast<int>(*itr)==idx_ref); if(!found) itr++; } if(!found) return(-1); else return(itr-vet_idref->begin()); } else return(-1); }
unsigned View::getReferenceCount(unsigned sql_type, int ref_type) { vector<unsigned> *vect_idref=getExpressionList(sql_type); if(!vect_idref) { if(sql_type==Reference::SQL_VIEW_DEFINITION) return(references.size()); else return(0); } else { if(ref_type < 0) return(vect_idref->size()); else { vector<unsigned>::iterator itr, itr_end; unsigned count=0; itr=vect_idref->begin(); itr_end=vect_idref->end(); while(itr!=itr_end) { if(references[(*itr)].getReferenceType()==static_cast<unsigned>(ref_type)) count++; itr++; } return(count); } } }
void View::addReference(Reference &refer, unsigned sql_type, int expr_id) { int idx; vector<unsigned> *expr_list=nullptr; Column *col=nullptr; //Specific tests for expressions used as view definition if(sql_type==Reference::SQL_VIEW_DEFINITION) { //Raises an error if the expression is empty if(refer.getExpression().isEmpty()) throw Exception(ERR_INV_VIEW_DEF_EXPRESSION,__PRETTY_FUNCTION__,__FILE__,__LINE__); //Raises an error if already exists a definition expression else if(hasDefinitionExpression()) throw Exception(ERR_ASG_SEC_VIEW_DEF_EXPRESSION,__PRETTY_FUNCTION__,__FILE__,__LINE__); //Raises an error if the user try to add a definition expression when already exists another references else if(!references.empty()) throw Exception(ERR_MIX_VIEW_DEF_EXPR_REFS,__PRETTY_FUNCTION__,__FILE__,__LINE__); } //Raises an error if the user try to add a ordinary reference when there is a reference used as definition expression else if(hasDefinitionExpression()) throw Exception(ERR_MIX_VIEW_DEF_EXPR_REFS,__PRETTY_FUNCTION__,__FILE__,__LINE__); //Checks if the reference already exists idx=getReferenceIndex(refer); //If not exists if(idx < 0) { //Inserts the reference on the view refer.setDefinitionExpression(sql_type==Reference::SQL_VIEW_DEFINITION); references.push_back(refer); idx=references.size()-1; } if(sql_type!=Reference::SQL_VIEW_DEFINITION) { //Gets the expression list expr_list=getExpressionList(sql_type); //Inserts the reference id on the expression list if(expr_id >= 0 && expr_id < static_cast<int>(expr_list->size())) expr_list->insert(expr_list->begin() + expr_id, static_cast<unsigned>(idx)); //Raises an error if the expression id is invalid else if(expr_id >= 0 && expr_id >= static_cast<int>(expr_list->size())) throw Exception(ERR_REF_OBJ_INV_INDEX,__PRETTY_FUNCTION__,__FILE__,__LINE__); else expr_list->push_back(static_cast<unsigned>(idx)); col=refer.getColumn(); if(col && col->isAddedByRelationship() && col->getObjectId() > this->object_id) this->object_id=BaseObject::getGlobalId(); } setCodeInvalidated(true); }
void View::removeReference(unsigned expr_id, unsigned sql_type) { vector<unsigned> *vect_idref=getExpressionList(sql_type); if(expr_id >= vect_idref->size()) throw Exception(ERR_REF_OBJ_INV_INDEX,__PRETTY_FUNCTION__,__FILE__,__LINE__); vect_idref->erase(vect_idref->begin() + expr_id); }
Reference View::getReference(unsigned ref_id, unsigned sql_type) { vector<unsigned> *vect_idref=getExpressionList(sql_type); //Raises an error if the reference id is out of bound if(ref_id >= references.size()) throw Exception(ERR_REF_OBJ_INV_INDEX,__PRETTY_FUNCTION__,__FILE__,__LINE__); if(sql_type==Reference::SQL_VIEW_DEFINITION || vect_idref) return(references[ref_id]); else return(references[vect_idref->at(ref_id)]); }