void DatabaseImportForm::listDatabases(DatabaseImportHelper &import_helper, bool hide_postgres_db, QComboBox *dbcombo) { if(dbcombo) { try { attribs_map db_attribs, extra_attr; attribs_map::iterator itr; QStringList list; map<QString, unsigned> oids; extra_attr[ParsersAttributes::HIDE_POSTGRES_DB]=(hide_postgres_db ? "1" : ""); db_attribs=import_helper.getObjects(OBJ_DATABASE, "", "", extra_attr); dbcombo->clear(); if(db_attribs.empty()) dbcombo->addItem(QString("No databases found")); else { dbcombo->blockSignals(true); itr=db_attribs.begin(); while(itr!=db_attribs.end()) { list.push_back(itr->second); oids[itr->second]=itr->first.toUInt(); itr++; } list.sort(); dbcombo->addItems(list); for(int i=0; i < list.count(); i++) { dbcombo->setItemIcon(i, QPixmap(":/icones/icones/" + BaseObject::getSchemaName(OBJ_DATABASE) + ".png")); dbcombo->setItemData(i, oids[list[i]]); } dbcombo->insertItem(0, QString("Found %1 database(s)").arg(db_attribs.size())); dbcombo->setCurrentIndex(0); dbcombo->blockSignals(false); } } catch(Exception &e) { throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } }
void DatabaseImportForm::listDatabases(DatabaseImportHelper &import_helper, QComboBox *dbcombo) { if(dbcombo) { try { attribs_map db_attribs; attribs_map::iterator itr; QStringList list; map<QString, unsigned> oids; db_attribs=import_helper.getObjects(OBJ_DATABASE); dbcombo->blockSignals(true); dbcombo->clear(); if(db_attribs.empty()) dbcombo->addItem(trUtf8("No databases found")); else { itr=db_attribs.begin(); while(itr!=db_attribs.end()) { list.push_back(itr->second); oids[itr->second]=itr->first.toUInt(); itr++; } list.sort(); dbcombo->addItems(list); for(int i=0; i < list.count(); i++) { dbcombo->setItemIcon(i, QPixmap(PgModelerUiNS::getIconPath(OBJ_DATABASE))); dbcombo->setItemData(i, oids[list[i]]); } dbcombo->insertItem(0, trUtf8("Found %1 database(s)").arg(db_attribs.size())); } dbcombo->setCurrentIndex(0); dbcombo->blockSignals(false); } catch(Exception &e) { throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } }
vector<QTreeWidgetItem *> DatabaseImportForm::updateObjectsTree(DatabaseImportHelper &import_helper, QTreeWidget *tree_wgt, vector<ObjectType> types, bool checkable_items, bool disable_empty_grps, QTreeWidgetItem *root, const QString &schema, const QString &table) { vector<QTreeWidgetItem *> items_vect; if(tree_wgt) { QTreeWidgetItem *group=nullptr, *item=nullptr; QFont grp_fnt=tree_wgt->font(); attribs_map extra_attribs={{ParsersAttributes::FILTER_TABLE_TYPES, ParsersAttributes::_TRUE_}}; QString tooltip=QString("OID: %1"), name, label; bool child_checked=false; vector<attribs_map> objects_vect; map<ObjectType, QTreeWidgetItem *> gen_groups; ObjectType obj_type; QList<QTreeWidgetItem*> groups_list; unsigned oid=0; int start=-1, end=-1; grp_fnt.setItalic(true); tree_wgt->blockSignals(true); tree_wgt->setUpdatesEnabled(false); tree_wgt->setSortingEnabled(false); try { for(ObjectType grp_type : types) { //Create a group item for the current type group=new QTreeWidgetItem(root); group->setIcon(0, QPixmap(PgModelerUiNS::getIconPath(BaseObject::getSchemaName(grp_type) + QString("_grp")))); group->setFont(0, grp_fnt); //Group items does contains a zero valued id to indicate that is not a valide object group->setData(OBJECT_ID, Qt::UserRole, 0); group->setData(OBJECT_TYPE, Qt::UserRole, grp_type); group->setData(OBJECT_COUNT, Qt::UserRole, 0); group->setData(OBJECT_SCHEMA, Qt::UserRole, schema); group->setData(OBJECT_TABLE, Qt::UserRole, table); gen_groups[grp_type]=group; groups_list.push_back(group); } objects_vect=import_helper.getObjects(types, schema, table, extra_attribs); for(attribs_map &attribs : objects_vect) { obj_type=static_cast<ObjectType>(attribs[ParsersAttributes::OBJECT_TYPE].toUInt()); group=gen_groups[obj_type]; group->setData(OBJECT_COUNT, Qt::UserRole, group->data(OBJECT_COUNT, Qt::UserRole).toUInt() + 1); //Creates individual items for each object of the current type oid=attribs[ParsersAttributes::OID].toUInt(); attribs[ParsersAttributes::NAME].remove(QRegExp(QString("( )(without)( time zone)"))); label=name=attribs[ParsersAttributes::NAME]; //Removing the trailing type string from op. families or op. classes names if(obj_type==OBJ_OPFAMILY || obj_type==OBJ_OPCLASS) { start=name.indexOf(QChar('[')); end=name.lastIndexOf(QChar(']')); name.remove(start, (end-start)+1); name=name.trimmed(); } item=new QTreeWidgetItem(group); item->setIcon(0, QPixmap(PgModelerUiNS::getIconPath(obj_type))); item->setText(0, label); item->setText(OBJECT_ID, attribs[ParsersAttributes::OID]); item->setData(OBJECT_NAME, Qt::UserRole, name); if(checkable_items) { if((oid > import_helper.getLastSystemOID()) || (obj_type==OBJ_SCHEMA && name==QString("public")) || (obj_type==OBJ_COLUMN && root && root->data(0, Qt::UserRole).toUInt() > import_helper.getLastSystemOID())) { item->setCheckState(0, Qt::Checked); child_checked=true; } else item->setCheckState(0, Qt::Unchecked); //Disabling items that refers to PostgreSQL's built-in data types if(obj_type==OBJ_TYPE && oid <= import_helper.getLastSystemOID()) { item->setDisabled(true); item->setToolTip(0, trUtf8("This is a PostgreSQL built-in data type and cannot be imported.")); } //Disabling items that refers to pgModeler's built-in system objects else if((obj_type==OBJ_TABLESPACE && (name==QString("pg_default") || name==QString("pg_global"))) || (obj_type==OBJ_ROLE && (name==QString("postgres"))) || (obj_type==OBJ_SCHEMA && (name==QString("pg_catalog") || name==QString("public"))) || (obj_type==OBJ_LANGUAGE && (name==~LanguageType(LanguageType::c) || name==~LanguageType(LanguageType::sql) || name==~LanguageType(LanguageType::plpgsql)))) { item->setFont(0, grp_fnt); item->setForeground(0, BaseObjectView::getFontStyle(ParsersAttributes::PROT_COLUMN).foreground()); item->setToolTip(0, trUtf8("This is a pgModeler's built-in object. It will be ignored if checked by user.")); } } //Stores the object's OID as the first data of the item item->setData(OBJECT_ID, Qt::UserRole, oid); if(!item->toolTip(0).isEmpty()) item->setToolTip(0,item->toolTip(0) + QString("\n") + tooltip.arg(oid)); else item->setToolTip(0,tooltip.arg(oid)); //Stores the object's type as the second data of the item item->setData(OBJECT_TYPE, Qt::UserRole, obj_type); //Stores the schema and the table's name of the object item->setData(OBJECT_SCHEMA, Qt::UserRole, schema); item->setData(OBJECT_TABLE, Qt::UserRole, table); if(obj_type==OBJ_SCHEMA || obj_type == OBJ_TABLE || obj_type == OBJ_VIEW) items_vect.push_back(item); } //Updating the object count in each group for(ObjectType grp_type : types) { group=gen_groups[grp_type]; group->setDisabled(disable_empty_grps && group->data(OBJECT_COUNT, Qt::UserRole).toUInt() == 0); group->setText(0, BaseObject::getTypeName(grp_type) + QString(" (%1)").arg(group->data(OBJECT_COUNT, Qt::UserRole).toUInt())); if(checkable_items) { if(!group->isDisabled() && child_checked) group->setCheckState(0, Qt::Checked); else group->setCheckState(0, Qt::Unchecked); } } tree_wgt->addTopLevelItems(groups_list); tree_wgt->setSortingEnabled(true); tree_wgt->setUpdatesEnabled(true); tree_wgt->blockSignals(false); } catch(Exception &e) { throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } return(items_vect); }
void DatabaseImportForm::listObjects(DatabaseImportHelper &import_helper, QTreeWidget *tree_wgt, bool checkable_items, bool disable_empty_grps, bool create_db_item, bool create_dummy_item) { TaskProgressWidget task_prog_wgt; try { if(tree_wgt) { QTreeWidgetItem *db_item=nullptr, *item=nullptr; vector<QTreeWidgetItem *> sch_items, tab_items; float inc=0, inc1=0, aux_prog=0; if(!create_dummy_item) { task_prog_wgt.setWindowTitle(trUtf8("Retrieving objects from database...")); task_prog_wgt.show(); task_prog_wgt.updateProgress(1, trUtf8("Retrieving cluster level objects..."), OBJ_DATABASE); } tree_wgt->clear(); tree_wgt->setColumnHidden(1, true); if(create_db_item) { Catalog catalog=import_helper.getCatalog(); vector<attribs_map> attribs; //Creating database item db_item=new QTreeWidgetItem; db_item->setText(0, import_helper.getCurrentDatabase()); db_item->setIcon(0, QPixmap(PgModelerUiNS::getIconPath(OBJ_DATABASE))); attribs=catalog.getObjectsAttributes(OBJ_DATABASE, QString(), QString(), {}, {{ParsersAttributes::NAME, import_helper.getCurrentDatabase()}}); db_item->setData(OBJECT_ID, Qt::UserRole, attribs[0].at(ParsersAttributes::OID)); db_item->setData(OBJECT_TYPE, Qt::UserRole, OBJ_DATABASE); db_item->setData(OBJECT_TYPE, Qt::UserRole, OBJ_DATABASE); db_item->setToolTip(0, QString("OID: %1").arg(attribs[0].at(ParsersAttributes::OID))); tree_wgt->addTopLevelItem(db_item); } //Retrieving and listing the cluster scoped objects sch_items=DatabaseImportForm::updateObjectsTree(import_helper, tree_wgt, BaseObject::getChildObjectTypes(OBJ_DATABASE), checkable_items, disable_empty_grps, db_item); if(create_dummy_item) { while(!sch_items.empty()) { item=new QTreeWidgetItem(sch_items.back()); item->setText(0, QString("...")); item->setData(OBJECT_OTHER_DATA, Qt::UserRole, QVariant::fromValue<int>(-1)); sch_items.pop_back(); } } else { ObjectType obj_type = BASE_OBJECT; aux_prog=task_prog_wgt.progress_pb->value(); inc=40/static_cast<float>(sch_items.size()); while(!sch_items.empty()) { task_prog_wgt.updateProgress(static_cast<int>(aux_prog), trUtf8("Retrieving objects of schema `%1'...").arg(sch_items.back()->text(0)), OBJ_SCHEMA); //Retrieving and listing the schema scoped objects tab_items=DatabaseImportForm::updateObjectsTree(import_helper, tree_wgt, BaseObject::getChildObjectTypes(OBJ_SCHEMA), checkable_items, disable_empty_grps, sch_items.back(), sch_items.back()->text(0)); inc1=(60/static_cast<float>(tab_items.size()))/static_cast<float>(sch_items.size()); while(!tab_items.empty()) { aux_prog+=inc1; if(aux_prog > 99) aux_prog=99; obj_type = static_cast<ObjectType>(tab_items.back()->data(OBJECT_TYPE, Qt::UserRole).toUInt()); task_prog_wgt.updateProgress(static_cast<int>(aux_prog), trUtf8("Retrieving objects of `%1' (%2)...").arg(tab_items.back()->text(0)).arg(BaseObject::getTypeName(obj_type)), obj_type); DatabaseImportForm::updateObjectsTree(import_helper, tree_wgt, BaseObject::getChildObjectTypes(obj_type), checkable_items, disable_empty_grps, tab_items.back(), sch_items.back()->text(0), tab_items.back()->text(0)); tab_items.pop_back(); } aux_prog+=inc; if(aux_prog > 99) aux_prog=99; task_prog_wgt.progress_pb->setValue(static_cast<int>(aux_prog)); sch_items.pop_back(); } } tree_wgt->sortItems(0, Qt::AscendingOrder); if(db_item) db_item->setExpanded(true); if(!create_dummy_item) { task_prog_wgt.progress_pb->setValue(100); task_prog_wgt.close(); } } } catch(Exception &e) { task_prog_wgt.close(); tree_wgt->clear(); throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } }
vector<QTreeWidgetItem *> DatabaseImportForm::updateObjectsTree(DatabaseImportHelper &import_helper, QTreeWidget *tree_wgt, vector<ObjectType> types, bool checkable_items, bool disable_empty_grps, QTreeWidgetItem *root, const QString &schema, const QString &table) { vector<QTreeWidgetItem *> items_vect; if(tree_wgt) { QTreeWidgetItem *group=nullptr, *item=nullptr; QFont grp_fnt=tree_wgt->font(); attribs_map objects, extra_attribs={{ParsersAttributes::FILTER_TABLE_TYPES, "1"}}; attribs_map::iterator itr; QString tooltip="OID: %1", msg=trUtf8("Retrieving `%1'..."); bool child_checked=false; int progress=0; grp_fnt.setItalic(true); tree_wgt->blockSignals(true); try { for(unsigned i=0; i < types.size(); i++) { if(task_prog_wgt->isVisible()) { progress=task_prog_wgt->progress_pb->value() + (i/static_cast<float>(types.size())); task_prog_wgt->updateProgress(progress, msg.arg(BaseObject::getTypeName(types[i])), types[i]); } //Retrieve the objects of the current type from the database objects=import_helper.getObjects(types[i], schema, table, extra_attribs); //Create a group item for the current type group=new QTreeWidgetItem(root); group->setIcon(0, QPixmap(QString(":/icones/icones/") + BaseObject::getSchemaName(types[i]) + QString("_grp.png"))); group->setText(0, BaseObject::getTypeName(types[i]) + QString(" (%1)").arg(objects.size())); group->setFont(0, grp_fnt); //Group items does contains a zero valued id to indicate that is not a valide object group->setData(OBJECT_ID, Qt::UserRole, 0); group->setData(OBJECT_TYPE, Qt::UserRole, types[i]); group->setData(OBJECT_COUNT, Qt::UserRole, QVariant::fromValue<unsigned>(objects.size())); group->setData(OBJECT_SCHEMA, Qt::UserRole, schema); group->setData(OBJECT_TABLE, Qt::UserRole, table); //Creates individual items for each object of the current type itr=objects.begin(); while(itr!=objects.end()) { item=new QTreeWidgetItem(group); item->setIcon(0, QPixmap(QString(":/icones/icones/") + BaseObject::getSchemaName(types[i]) + QString(".png"))); item->setText(0, itr->second); item->setText(1, itr->first); if(checkable_items) { if((itr->first.toUInt() > import_helper.getLastSystemOID()) || (types[i]==OBJ_SCHEMA && itr->second=="public") || (types[i]==OBJ_COLUMN && root && root->data(0, Qt::UserRole).toUInt() > import_helper.getLastSystemOID())) { item->setCheckState(0, Qt::Checked); child_checked=true; } else item->setCheckState(0, Qt::Unchecked); //Disabling items that refers to PostgreSQL's built-in data types if(types[i]==OBJ_TYPE && itr->first.toUInt() <= import_helper.getLastSystemOID()) { item->setDisabled(true); item->setToolTip(0, trUtf8("This is a PostgreSQL built-in data type and cannot be imported.")); } //Disabling items that refers to pgModeler's built-in system objects else if((types[i]==OBJ_TABLESPACE && (itr->second=="pg_default" || itr->second=="pg_global")) || (types[i]==OBJ_ROLE && (itr->second=="postgres")) || (types[i]==OBJ_SCHEMA && (itr->second=="pg_catalog" || itr->second=="public")) || (types[i]==OBJ_LANGUAGE && (itr->second==~LanguageType(LanguageType::c) || itr->second==~LanguageType(LanguageType::sql) || itr->second==~LanguageType(LanguageType::plpgsql)))) { item->setFont(0, grp_fnt); item->setForeground(0, BaseObjectView::getFontStyle(ParsersAttributes::PROT_COLUMN).foreground()); item->setToolTip(0, trUtf8("This is a pgModeler's built-in object. It will be ignored if checked by user.")); } } //Stores the object's OID as the first data of the item item->setData(OBJECT_ID, Qt::UserRole, itr->first.toUInt()); if(!item->toolTip(0).isEmpty()) item->setToolTip(0,item->toolTip(0) + "\n" + tooltip.arg(itr->first)); else item->setToolTip(0,tooltip.arg(itr->first)); //Stores the object's type as the second data of the item item->setData(OBJECT_TYPE, Qt::UserRole, types[i]); //Stores the schema and the table's name of the object item->setData(OBJECT_SCHEMA, Qt::UserRole, schema); item->setData(OBJECT_TABLE, Qt::UserRole, table); if(types[i]==OBJ_SCHEMA || types[i]==OBJ_TABLE) items_vect.push_back(item); itr++; } group->setDisabled(disable_empty_grps && objects.empty()); if(checkable_items) { if(!group->isDisabled() && child_checked) group->setCheckState(0, Qt::Checked); else group->setCheckState(0, Qt::Unchecked); } tree_wgt->addTopLevelItem(group); } tree_wgt->blockSignals(false); } catch(Exception &e) { throw Exception(e.getErrorMessage(), e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } return(items_vect); }