void Table::addObject(BaseObject *obj, int obj_idx) { ObjectType obj_type; if(!obj) throw Exception(ERR_ASG_NOT_ALOC_OBJECT,__PRETTY_FUNCTION__,__FILE__,__LINE__); else { int idx; obj_type=obj->getObjectType(); #ifdef DEMO_VERSION #warning "DEMO VERSION: table children objects creation limit." vector<TableObject *> *obj_list=(obj_type!=OBJ_TABLE ? getObjectList(obj_type) : nullptr); if((obj_list && obj_list->size() >= GlobalAttributes::MAX_OBJECT_COUNT) || (obj_type==OBJ_TABLE && ancestor_tables.size() >= GlobalAttributes::MAX_OBJECT_COUNT)) throw Exception(trUtf8("In demonstration version tables can have only `%1' instances of each child object type or ancestor tables! You've reach this limit for the type: `%2'") .arg(GlobalAttributes::MAX_OBJECT_COUNT) .arg(BaseObject::getTypeName(obj_type)), ERR_CUSTOM,__PRETTY_FUNCTION__,__FILE__,__LINE__); #endif try { //Raises an error if already exists a object with the same name and type if(getObject(obj->getName(),obj_type,idx)) { throw Exception(QString(Exception::getErrorMessage(ERR_ASG_DUPLIC_OBJECT)) .arg(obj->getName(true)) .arg(obj->getTypeName()) .arg(this->getName(true)) .arg(this->getTypeName()), ERR_ASG_DUPLIC_OBJECT,__PRETTY_FUNCTION__,__FILE__,__LINE__); } //Raises an error if the user try to set the table as ancestor/copy of itself else if((obj_type==OBJ_TABLE || obj_type==BASE_TABLE) && obj==this) throw Exception(ERR_INV_INH_COPY_RELATIONSHIP,__PRETTY_FUNCTION__,__FILE__,__LINE__); switch(obj_type) { case OBJ_COLUMN: case OBJ_CONSTRAINT: case OBJ_TRIGGER: case OBJ_INDEX: case OBJ_RULE: TableObject *tab_obj; vector<TableObject *> *obj_list; Column *col; tab_obj=dynamic_cast<TableObject *>(obj); col=dynamic_cast<Column *>(tab_obj); //Sets the object parent table if there isn't one if(!tab_obj->getParentTable()) tab_obj->setParentTable(this); //Raises an error if the parent table of the table object is different from table 'this' else if(tab_obj->getParentTable()!=this) throw Exception(ERR_ASG_OBJ_BELONGS_OTHER_TABLE,__PRETTY_FUNCTION__,__FILE__,__LINE__); //Validates the object SQL code befor insert on table obj->getCodeDefinition(SchemaParser::SQL_DEFINITION); if(col && col->getType()==this) { throw Exception(Exception::getErrorMessage(ERR_INV_COLUMN_TABLE_TYPE) .arg(col->getName()) .arg(this->getName()), ERR_INV_COLUMN_TABLE_TYPE,__PRETTY_FUNCTION__,__FILE__,__LINE__); } else if(obj_type==OBJ_CONSTRAINT) { //Raises a error if the user try to add a second primary key on the table if(dynamic_cast<Constraint *>(tab_obj)->getConstraintType()==ConstraintType::primary_key && this->getPrimaryKey()) throw Exception(ERR_ASG_EXISTING_PK_TABLE,__PRETTY_FUNCTION__,__FILE__,__LINE__); } else if(obj_type==OBJ_TRIGGER) dynamic_cast<Trigger *>(tab_obj)->validateTrigger(); obj_list=getObjectList(obj_type); //Adds the object to the table if(obj_idx < 0 || obj_idx >= static_cast<int>(obj_list->size())) obj_list->push_back(tab_obj); else { //If there is a object index specified inserts the object at the position if(obj_list->size() > 0) obj_list->insert((obj_list->begin() + obj_idx), tab_obj); else obj_list->push_back(tab_obj); } if(obj_type==OBJ_COLUMN || obj_type==OBJ_CONSTRAINT) { updateAlterCmdsStatus(); if(obj_type==OBJ_CONSTRAINT) dynamic_cast<Constraint *>(tab_obj)->setColumnsNotNull(true); } break; case OBJ_TABLE: Table *tab; tab=dynamic_cast<Table *>(obj); if(obj_idx < 0 || obj_idx >= static_cast<int>(ancestor_tables.size())) ancestor_tables.push_back(tab); else ancestor_tables.insert((ancestor_tables.begin() + obj_idx), tab); /* Updating the storage parameter WITH OIDS depending on the ancestors. According to the docs, the child table will inherit WITH OID status from the parents */ with_oid=(with_oid || tab->isWithOIDs()); break; default: throw Exception(ERR_ASG_OBJECT_INV_TYPE,__PRETTY_FUNCTION__,__FILE__,__LINE__); break; } setCodeInvalidated(true); } catch(Exception &e) { if(e.getErrorType()==ERR_UNDEF_ATTRIB_VALUE) throw Exception(Exception::getErrorMessage(ERR_ASG_OBJ_INV_DEFINITION) .arg(obj->getName()) .arg(obj->getTypeName()), ERR_ASG_OBJ_INV_DEFINITION,__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); else throw Exception(e.getErrorMessage(),e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } }
ColumnDef::ColumnDef(const Column &column, ColumnType type) : Describable(column.getName() + " " + ColumnTypeName(type)) { }