• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

E:/sqlmaster/src/servereditor.cpp

Go to the documentation of this file.
00001 #include "servereditor.h"
00002 #include "ui_servereditor.h"
00003 #include <QtSql>
00004 #include <QCompleter>
00005 #include "gpublics.h"
00006 ServerEditor::ServerEditor(QWidget *parent) :
00007         QWidget(parent),
00008         ui(new Ui::ServerEditor)
00009 {
00010     ui->setupUi(this);
00011     //
00012     tableModel = new QSqlTableModel(this, db);
00013     tableModel->setEditStrategy(QSqlTableModel::OnRowChange);
00014     //
00015     //set up query editor wirh auto complete, syntax highlighting
00016 
00017     //and line numbers
00018     queryEditor = new QsciScintilla;
00019     queryEditor->setAutoCompletionSource(QsciScintilla::AcsAPIs);
00020     queryEditor->setAutoCompletionThreshold(2);
00021     lex = new QsciLexerSQL(queryEditor);
00022     lex->setFoldComments(true);
00023     queryEditor->setLexer(lex);
00024     queryEditor->setFolding(QsciScintilla::CircledTreeFoldStyle, 2);
00025 
00026     queryEditor->setAutoCompletionFillupsEnabled(true);
00027     queryEditor->setBraceMatching(QsciScintilla::StrictBraceMatch);
00028     queryEditor->setCallTipsVisible(true);
00029     queryEditor->setCallTipsStyle(QsciScintilla::CallTipsNoContext);
00030     queryEditor->setCaretLineVisible(true);
00031     queryEditor->setMarginWidth(1, 40);
00032     queryEditor->setMarginLineNumbers(1, true);
00033     ui->queryArea->addWidget(queryEditor);
00034 
00035     ui->txtSceneQuery->setLexer(new QsciLexerSQL);
00036     ui->txtSceneQuery->setFolding(QsciScintilla::PlainFoldStyle, 2);
00037     ui->txtSceneQuery->setAutoCompletionSource(QsciScintilla::AcsAll);
00038     ui->txtSceneQuery->setAutoCompletionFillupsEnabled(true);
00039     ui->txtSceneQuery->setBraceMatching(QsciScintilla::StrictBraceMatch);
00040     ui->txtSceneQuery->setCallTipsVisible(true);
00041     ui->txtSceneQuery->setCallTipsStyle(QsciScintilla::CallTipsNoContext);
00042     ui->txtSceneQuery->setCaretLineVisible(true);
00043     ui->txtSceneQuery->setMarginLineNumbers(1, true);
00044     //create auto complete
00045     comp = new QCompleter(queryEditor);
00046     comp->setModel(modelFromFile(":/dat/datafiles/keywords.dat"));
00047     //create syntax highlighter
00048     //icon set
00049     ico_folder = QIcon(QApplication::style()->standardIcon(QApplication::style()->SP_DirIcon));
00050     ico_db = QIcon("://icons/Icon_45.ico");
00051     ico_table = QIcon("://icons/Icon_44.ico");
00052     ico_view = QIcon("://icons/Icon_96.ico");
00053     ico_proc = QIcon("://icons/Icon_100.ico");
00054     ico_col = QIcon("://icons/Icon_42.ico");
00055     ico_key = QIcon("://icons/Icon_43.ico");
00056     ico_key2 = QIcon("://icons/key.ico");
00057     ico_gears = QIcon("://icons/Icon_79.ico");
00058     ico_vars = QIcon("://icons/Icon_120.ico");
00059     //
00060     QWidget *widget = ui->trvServerExplorer;
00061     QSizePolicy policy = widget->sizePolicy();
00062     policy.setHorizontalStretch(0);
00063     policy.setVerticalStretch(1);
00064     widget->setSizePolicy(policy);
00065     //
00066     ui->tabWidget->setCurrentIndex(0);
00067     //
00068     variablesLoaded = false;
00069     processesLoaded = false;
00070     //
00071     scene = new QGraphicsScene(this);
00072     scene->addText("Double click on tables and views on the database explorer to load them here.", QFont("Verdana", 20, 1, false));
00073     ui->graphicsView->setScene(scene);
00074     //
00075     connect (ui->tabQueryResults, SIGNAL(tabCloseRequested(int)), this, SLOT(closeQueryTab(int)));
00076     //
00077     postMessage("Connected to server.");
00078     //
00079     ui->trvServerDetails->setFirstColumnSpanned(0, QModelIndex(), true);
00080     ui->trvServerDetails->setFirstColumnSpanned(1, QModelIndex(), true);
00081     ui->trvServerDetails->expandAll();
00082     ui->trvServerDetails->resizeColumnToContents(0);
00083 }
00084 //--------------------------------------------------------------------------------
00085 ServerEditor::~ServerEditor()
00086 {
00087     delete ui;
00088 }
00089 //--------------------------------------------------------------------------------
00090 void ServerEditor::refreshDbList() {
00091     QSqlQuery *qu = new QSqlQuery("show databases", db);
00092     ui->trvServerExplorer->clear();
00093     dbList.clear();
00094     apis = new QsciAPIs(lex);
00095     //GPublics *pubs = new GPublics();
00096     //QStringList lstKeys = pubs->mysqlKeywords();
00097     //apis->updateAutoCompletionList(QStringList(), lstKeys);
00098     //emit signalse
00099     emit tableSelected(false);
00100     //end emit signals
00101     while (qu->next()) {
00102         dbList << qu->value(0).toString();
00103         QTreeWidgetItem *it = new QTreeWidgetItem(ui->trvServerExplorer);
00104         it->setText(0, qu->value(0).toString());
00105         it->setIcon(0, ico_db);
00106         it->setText(1, "db");
00107         it->setText(2, "new");
00108         apis->add(qu->value(0).toString());
00109         QTreeWidgetItem *tablesFolder = new QTreeWidgetItem(it);
00110         tablesFolder->setText(0, "Tables");
00111         tablesFolder->setText(1, "folTables");
00112         tablesFolder->setIcon(0, ico_folder);
00113         tablesFolder = new QTreeWidgetItem(it);
00114         tablesFolder->setText(0, "Views");
00115         tablesFolder->setText(1, "folViews");
00116         tablesFolder->setIcon(0, ico_folder);
00117         tablesFolder = new QTreeWidgetItem(it);
00118         tablesFolder->setText(0, "Stored Procs");
00119         tablesFolder->setText(1, "folProcs");
00120         tablesFolder->setIcon(0, ico_folder);
00121         tablesFolder = new QTreeWidgetItem(it);
00122         tablesFolder->setText(0, "Functions");
00123         tablesFolder->setText(1, "folFunctions");
00124         tablesFolder->setIcon(0, ico_folder);
00125         tablesFolder = new QTreeWidgetItem(it);
00126         tablesFolder->setText(0, "Triggers");
00127         tablesFolder->setText(1, "folTriggers");
00128         tablesFolder->setIcon(0, ico_folder);
00129         tablesFolder = new QTreeWidgetItem(it);
00130         tablesFolder->setText(0, "Events");
00131         tablesFolder->setText(1, "folEvents");
00132         tablesFolder->setIcon(0, ico_folder);
00133     }
00134     apis->prepare();
00135     queryEditor->setLexer(lex);
00136     emit dbListChanged(dbList);
00137     postMessage("Database List Reloaded");
00138 }
00139 //--------------------------------------------------------------------------------
00140 QAbstractItemModel *ServerEditor::modelFromFile(const QString &fileName) {
00141     QFile file(fileName);
00142     if (!file.open(QFile::ReadOnly))
00143         return new QStringListModel(comp);
00144 
00145 #ifndef QT_NO_CURSOR
00146     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
00147 #endif
00148     QStringList words;
00149 
00150     while (!file.atEnd()) {
00151         QByteArray line = file.readLine();
00152         if (!line.isEmpty())
00153             words << line.trimmed();
00154     }
00155 
00156 #ifndef QT_NO_CURSOR
00157     QApplication::restoreOverrideCursor();
00158 #endif
00159     return new QStringListModel(words, comp);
00160 }
00161 //--------------------------------------------------------------------------------
00162 void ServerEditor::on_trvServerExplorer_itemExpanded(QTreeWidgetItem* item)
00163 {
00164     if (item->text(1) == "db") {
00165         if (item->text(2) == "new") {
00166             item->takeChildren();
00167             QTreeWidgetItem *tablesFolder = new QTreeWidgetItem(item);
00168             QTreeWidgetItem *child;
00169             QTreeWidgetItem *tableFolder;
00170 
00171             tablesFolder->setText(0, "Tables");
00172             tablesFolder->setText(1, "folTables");
00173             tablesFolder->setIcon(0, ico_folder);
00174             QSqlQuery *qu = new QSqlQuery(tr("show full tables from `%1` WHERE table_type = 'BASE TABLE'").arg(item->text(0)), db);
00175             while (qu->next()) {
00176                 child = new QTreeWidgetItem(tablesFolder);
00177                 child->setText(0, qu->value(0).toString());
00178                 apis->add(qu->value(0).toString());
00179                 child->setText(1, "chilTable");
00180                 child->setIcon(0, ico_table);
00181                 tableFolder = new QTreeWidgetItem(child);
00182                 tableFolder->setIcon(0, ico_folder);
00183                 tableFolder->setText(0, "Columns");
00184                 tableFolder->setText(1, "grndCols");
00185                 tableFolder->setText(2, "old");
00186                 QTreeWidgetItem *dummy = new QTreeWidgetItem(tableFolder);
00187                 dummy->setText(0, "...");
00188                 tableFolder = new QTreeWidgetItem(child);
00189                 tableFolder->setIcon(0, ico_folder);
00190                 tableFolder->setText(0, "Indexes");
00191                 tableFolder->setText(1, "grndIndexes");
00192                 tableFolder->setText(2, "old");
00193                 dummy = new QTreeWidgetItem(tableFolder);
00194                 dummy->setText(0, "...");
00195             }
00196 
00197             tablesFolder = new QTreeWidgetItem(item);
00198             tablesFolder->setText(0, "Views");
00199             tablesFolder->setText(1, "folViews");
00200             tablesFolder->setIcon(0, ico_folder);
00201             qu = new QSqlQuery(tr("SELECT `TABLE_NAME` FROM `INFORMATION_SCHEMA`.`TABLES` WHERE `TABLE_SCHEMA` = '%1' AND `TABLE_TYPE` = 'VIEW'").arg(item->text(0)), db);
00202             while (qu->next()) {
00203                 child = new QTreeWidgetItem(tablesFolder);
00204                 child->setText(0, qu->value(0).toString());
00205                 child->setText(1, "chilView");
00206                 apis->add(qu->value(0).toString());
00207                 child->setIcon(0, ico_view);
00208             }
00209             tablesFolder = new QTreeWidgetItem(item);
00210             tablesFolder->setText(0, "Stored Procs");
00211             tablesFolder->setText(1, "folProcedures");
00212             tablesFolder->setIcon(0, ico_folder);
00213             qu = new QSqlQuery(tr("SELECT `SPECIFIC_NAME` FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE `ROUTINE_SCHEMA` = '%1' AND `ROUTINE_TYPE` = 'PROCEDURE'").arg(item->text(0)), db);
00214             while (qu->next()) {
00215                 child = new QTreeWidgetItem(tablesFolder);
00216                 child->setText(0, qu->value(0).toString());
00217                 child->setText(1, "chilProcedure");
00218                 child->setIcon(0, ico_proc);
00219             }
00220 
00221             tablesFolder = new QTreeWidgetItem(item);
00222             tablesFolder->setText(0, "Functions");
00223             tablesFolder->setText(1, "folFunctions");
00224             tablesFolder->setIcon(0, ico_folder);
00225             qu = new QSqlQuery(tr("SELECT `SPECIFIC_NAME` FROM `INFORMATION_SCHEMA`.`ROUTINES` WHERE `ROUTINE_SCHEMA` = '%1' AND `ROUTINE_TYPE` = 'FUNCTION'").arg(item->text(0)), db);
00226             while (qu->next()) {
00227                 child = new QTreeWidgetItem(tablesFolder);
00228                 child->setText(0, qu->value(0).toString());
00229                 child->setText(1, "chilFunction");
00230                 child->setIcon(0, ico_proc);
00231             }
00232             tablesFolder = new QTreeWidgetItem(item);
00233             tablesFolder->setText(0, "Triggers");
00234             tablesFolder->setText(1, "folTriggers");
00235             tablesFolder->setIcon(0, ico_folder);
00236             qu = new QSqlQuery(tr("SELECT `TRIGGER_NAME` FROM `INFORMATION_SCHEMA`.`TRIGGERS` WHERE `ROUTINE_SCHEMA` = '%1'").arg(item->text(0)), db);
00237             while (qu->next()) {
00238                 child = new QTreeWidgetItem(tablesFolder);
00239                 child->setText(0, qu->value(0).toString());
00240                 child->setText(1, "chilTrigger");
00241                 child->setIcon(0, ico_proc);
00242             }
00243             tablesFolder = new QTreeWidgetItem(item);
00244             tablesFolder->setText(0, "Events");
00245             tablesFolder->setText(1, "folEvents");
00246             tablesFolder->setIcon(0, ico_folder);
00247             qu = new QSqlQuery(tr("SELECT `EVENT_NAME` FROM `INFORMATION_SCHEMA`.`EVENTS` WHERE `ROUTINE_SCHEMA` = '%1'").arg(item->text(0)), db);
00248             while (qu->next()) {
00249                 child = new QTreeWidgetItem(tablesFolder);
00250                 child->setText(0, qu->value(0).toString());
00251                 child->setText(1, "chilEvent");
00252                 child->setIcon(0, ico_proc);
00253             }
00254             item->setText(2, "old");
00255         }
00256         apis->prepare();
00257     }
00258     if (item->text(1).left(4) == "grnd") {
00259         if (item->text(2) == "old") {
00260             item->takeChildren();
00261             item->setText(2, "new");
00262             QString tableName = item->parent()->text(0);
00263             QString dbName = item->parent()->parent()->parent()->text(0);
00264             QSqlQuery qu(db);
00265             if (item->text(0) == "Columns") {
00266                 if (qu.exec(tr("describe `%1`.`%2`").arg(dbName, tableName))) {
00267                     while (qu.next()) {
00268                         QSqlRecord rec = qu.record();
00269                         QTreeWidgetItem *col = new QTreeWidgetItem(item);
00270                         col->setText(0, tr("%1, %2").arg(rec.value(0).toString(), rec.value(1).toString()));
00271                         col->setText(1, "greatGrandCol");
00272                         col->setIcon(0, ico_col);
00273                         if (rec.value(3) != "")
00274                             col->setIcon(0, ico_key2);
00275                     }
00276                 }
00277             }else if (item->text(0) == "Indexes") {
00278                 if (qu.exec(tr("show keys from `%1`.`%2`").arg(dbName, tableName))) {
00279                     while (qu.next()) {
00280                         QSqlRecord rec = qu.record();
00281                         QTreeWidgetItem *col = new QTreeWidgetItem(item);
00282                         col->setText(0, tr("%1, %2").arg(rec.value(4).toString(), rec.value(2).toString()));
00283                         col->setText(1, "greatGrandIndex");
00284                         col->setIcon(0, ico_key);
00285                     }
00286                 }
00287             }
00288         }
00289     }
00290     if (item->text(1) == "chilTable") {
00291         currentTable = item->text(0);
00292         on_trvServerExplorer_itemClicked(item, 0);
00293     }
00294 }
00295 //-------------------------------------------------------------------------------------------------------------
00296 void ServerEditor::addNewDb(QString dbName) {
00297     QSqlQuery *qu = new QSqlQuery(tr("create database %1").arg(dbName), db);
00298     if (qu->lastError().isValid()) {
00299         QMessageBox::critical(this, "Error", qu->lastError().text());
00300     } else
00301     {
00302         QMessageBox::information(this, "Success", tr("The database %1 has been successfully created.").arg(dbName));
00303         refreshDbList();
00304     }
00305 }
00306 //--------------------------------------------------------------------------------
00307 void ServerEditor::on_trvServerExplorer_itemChanged(QTreeWidgetItem* /*item*/, int)
00308 {
00309 
00310 }
00311 //-------------------------------------------------------------------------------------------------------------
00312 void ServerEditor::on_trvServerExplorer_itemClicked(QTreeWidgetItem* item, int)
00313 {
00314     currentTable = "";
00315     currentView = "";
00316     if (item->text(1) == "db") {
00317         currentDb = item->text(0);
00318     } else if (item->text(1).left(3) == "fol") {
00319         currentDb =item->parent()->text(0);
00320     } else if (item->text(1).left(3) == "chi") {
00321         currentDb = item->parent()->parent()->text(0);
00322     }
00323     QSqlQuery *use = new QSqlQuery(tr("use %1").arg(currentDb), db);
00324     use->clear();
00325     emit currentDbChanged(currentDb);
00326     QString tagText = item->text(1);
00327     if (tagText == "chilTable") {
00328         //a table has been clicked
00329         currentTable = item->text(0);
00330         emit tableSelected(true);
00331         tableModel = new QSqlTableModel(this, db);
00332         tableModel->setTable(item->text(0));
00333         tableModel->select();
00334         ui->tblTableData->setModel(tableModel);
00335         ui->tabObjectBrowser->setCurrentIndex(0);
00336 
00337     } else if (tagText == "chilView") {
00338         //a view has been clicked
00339         currentView = item->text(0);
00340         QString qu = tr("SELECT * FROM `%1`.`%2`").arg(currentDb, item->text(0));
00341         QSqlQueryModel *model = new QSqlQueryModel(this);
00342         if (model->lastError().isValid()) {
00343             QMessageBox::critical(this, "Error", model->lastError().text());
00344         } else {
00345             model->setQuery(qu, db);
00346             ui->tblViewData->setModel(model);
00347             ui->tabObjectBrowser->setCurrentIndex(1);
00348         }
00349     } else if (tagText.left(4) == "grnd") {
00350         currentTable = item->parent()->text(0);
00351     } else if (tagText.left(5) == "great") {
00352         currentTable = item->parent()->parent()->text(0);
00353     }
00354 
00355     if (currentTable == "") {
00356         emit tableSelected(false);
00357     } else {
00358         emit tableSelected(true);
00359     }
00360     if (currentView == "") {
00361         emit viewSelected(false);
00362     } else {
00363         emit viewSelected(true);
00364     }
00365 }
00366 //---------------------------------------------------------------------------------------------------------------------
00367 void ServerEditor::setCurrentDb(QString dbName) {
00368     this->currentDb = dbName;
00369     emit currentDbChanged(currentDb);
00370     if (ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).count() > 0) {
00371         ui->trvServerExplorer->setCurrentItem(ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).at(0));
00372     }
00373     QSqlQuery *use = new QSqlQuery(tr("use %1").arg(currentDb), db);
00374     use->clear();
00375 }
00376 //---------------------------------------------------------------------------------------------------------------------
00377 void ServerEditor::on_trvServerExplorer_customContextMenuRequested(QPoint pos)
00378 {
00379     QTreeWidgetItem *it = ui->trvServerExplorer->itemAt(pos);
00380     if (it != 0)
00381         emit callPopupMenu(it->text(1));
00382 }
00383 //---------------------------------------------------------------------------------------------------------------------
00384 void ServerEditor::executeQuery(QString query) {
00385     if (query != "") {
00386         QSqlQueryModel *model = new QSqlQueryModel(this);
00387         QueryResults *res = new QueryResults(this);
00388         model->setQuery(query, db);
00389         if (model->lastError().isValid()) {
00390             postMessage(tr("Query failed. Error: %1").arg(model->lastError().text()));
00391             ui->tabObjectBrowser->setCurrentIndex(4);
00392             return;
00393         }
00394 
00395         if (model->query().isSelect()) {
00396             res->query = query;
00397             res->model = model;
00398             res->loadModel();
00399             res->db = db;
00400             res->dbName = currentDb;
00401             ui->tabQueryResults->insertTab(0, res, ico_table, "Query");
00402             ui->tabQueryResults->setCurrentIndex(0);
00403             res->tab = ui->tabQueryResults;
00404             ui->tabObjectBrowser->setCurrentIndex(2);
00405         } else {
00406             postMessage(tr("Query succeeded. %1 rows affected").arg(model->rowCount()));
00407             ui->tabObjectBrowser->setCurrentIndex(4);
00408         }
00409     }
00410 }
00411 //---------------------------------------------------------------------------------------------------------------------
00412 void ServerEditor::parseLargeQuery(QString query) {
00413     if (query.contains(";")) {
00414         QStringList queries = query.split(";");
00415         for (int i = 0; i < queries.length(); i++) {
00416             if (queries.at(i) != "")
00417                 executeQuery(queries.at(i));
00418         }
00419     } else
00420     {
00421         executeQuery(query);
00422     }
00423 }
00424 //---------------------------------------------------------------------------------------------------------------------
00425 bool ServerEditor::runQuery(QString query) {
00426     QSqlQuery qu(query, db);
00427     if (qu.lastError().isValid()) {
00428         if (qu.isSelect()) {
00429             executeQuery(query);
00430             return true;
00431         }
00432         lastQueryError = qu.lastError().text();
00433         return false;
00434     } else {
00435         return true;
00436     }
00437 }
00438 //---------------------------------------------------------------------------------------------------------------------
00439 void ServerEditor::executeTypedQuery() {
00440     parseLargeQuery(queryEditor->text());
00441 }
00442 //---------------------------------------------------------------------------------------------------------------------
00443 void ServerEditor::reloadCurrentDb() {
00444     QString dbName = currentDb;
00445     if (ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).count() > 0) {
00446         QTreeWidgetItem *it =  (ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).at(0));
00447         it->setText(2, "new");
00448         it->setExpanded(false);
00449         it->setExpanded(true);
00450     }
00451 }
00452 //---------------------------------------------------------------------------------------------------------------------
00453 void ServerEditor::selectTable(QString dbName, QString tableName) {
00454     if (ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).count() > 0) {
00455         QTreeWidgetItem *it =  (ui->trvServerExplorer->findItems(dbName, Qt::MatchExactly, 0).at(0));
00456         it->setExpanded(true);
00457         for (int j = 0; j < it->childCount(); j++) {
00458             QTreeWidgetItem *fol = it->child(j);
00459             if (fol->text(0) == "Tables") {
00460                 for (int k = 0; k < fol->childCount(); k++) {
00461                     QTreeWidgetItem *tab = fol->child(k);
00462                     if (tab->text(0) == tableName) {
00463                         fol->setExpanded(true);
00464                         tab->setSelected(true);
00465                         return;
00466                     }
00467                 }
00468             }
00469         }
00470     }
00471 }
00472 //---------------------------------------------------------------------------------------------------------------------
00473 void ServerEditor::on_graphicsView_customContextMenuRequested(QPoint /*pos*/)
00474 {
00475     QMenu *newMenu = new QMenu(this);
00476     QAction *addTable = new QAction(this);
00477     addTable->setText("&Add Table");
00478     connect (addTable, SIGNAL(triggered()), this, SLOT(addTableToScene()));
00479     addTable->setIcon(ico_table);
00480     newMenu->addAction(addTable);
00481     newMenu->addSeparator();
00482     QAction *clearAll = new QAction(this);
00483     clearAll->setText("&Clear All");
00484     newMenu->addAction(clearAll);
00485 
00486     newMenu->popup(QCursor::pos());
00487 }
00488 //---------------------------------------------------------------------------------------------------------------------
00489 void ServerEditor::addTableToScene() {
00490     QListWidget *newtable = new QListWidget(0);
00491     newtable->insertItem(0, "Column 1");
00492     newtable->insertItem(1, "Column 2");
00493     scene->addWidget(newtable, Qt::Tool);
00494 }
00495 //--------------------------------------------------------------------------------
00496 void ServerEditor::on_trvServerExplorer_itemDoubleClicked(QTreeWidgetItem* item, int /*column*/)
00497 {
00498     if (item->text(1) == "chilTable" || item->text(1) == "chilView") {
00499         QString dbName = item->parent()->parent()->text(0);
00500         QString tableName =item->text(0);
00501         insertObjectToScene(dbName, tableName);
00502     }
00503 }
00504 //--------------------------------------------------------------------------------
00505 void ServerEditor::insertObjectToScene(QString dbname, QString tableName) {
00506     ColumnList *list = new ColumnList(0);
00507     list->db = db;
00508     list->setWindowIcon(ico_table);
00509     list->dbName = dbname;
00510     list->tableName = tableName;
00511     connect (list, SIGNAL(objectDoubleClicked(QString,QString,QString)), this, SLOT(sceneItemDoubleClicked(QString,QString,QString)));
00512     list->loadColumns();
00513     scene->addWidget(list, Qt::Tool);
00514     sceneObjects << tr("`%1`.`%2`").arg(list->dbName, list->tableName);
00515     buildSceneQuery();
00516 }
00517 //--------------------------------------------------------------------------------
00518 void ServerEditor::sceneItemDoubleClicked(QString objDb, QString objTable, QString objCol) {
00519     QTreeWidgetItem *sceneItem = new QTreeWidgetItem(ui->trvSceneColumns);
00520     sceneItem->setText(0, objDb);
00521     sceneItem->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled );
00522     sceneItem->setIcon(0, ico_table);
00523     sceneItem->setText(1, objTable);
00524     sceneItem->setText(2, objCol);
00525     QLineEdit alias(this);
00526     alias.setAutoFillBackground(true);
00527     sceneItem->setText(3, objCol);
00528     ui->trvSceneColumns->setItemWidget(sceneItem, 3, &alias);
00529 
00530     buildSceneQuery();
00531 }
00532 //-------------------------------------------------------------------------------------------------------------
00533 void ServerEditor::buildSceneQuery() {
00534     sceneQuery = "";
00535     sceneQuery.append("SELECT");
00536 
00537     //add columns
00538     QTreeWidgetItem *paren = ui->trvSceneColumns->invisibleRootItem();
00539     for (int i = 0; i < paren->childCount(); i++) {
00540         QTreeWidgetItem *x = paren->child(i);
00541         QString attatch = "\n";
00542         QString colName =  x->text(2);
00543         if (colName != "*") {
00544             colName = tr("`%1`").arg(colName);
00545         }
00546         attatch.append(tr("`%1`.`%2`.%3,").arg(x->text(0), x->text(1), colName));
00547         sceneQuery.append(attatch);
00548     }
00549     if (paren->childCount() > 0) {
00550         sceneQuery = sceneQuery.left(sceneQuery.length() - 1);
00551     }
00552     //
00553 
00554     //add tableList
00555     sceneQuery.append("\nFROM");
00556     for (int i = 0; i < sceneObjects.count(); i++) {
00557         sceneQuery.append("\n");
00558         sceneQuery.append(sceneObjects.at(i));
00559         sceneQuery.append(",");
00560     }
00561     sceneQuery = sceneQuery.left(sceneQuery.length() - 1);
00562     //
00563 
00564     ui->txtSceneQuery->setText(sceneQuery);
00565 }
00566 //-------------------------------------------------------------------------------------------------------------
00567 void ServerEditor::closeQueryTab(int tabIndex) {
00568     ui->tabQueryResults->removeTab(tabIndex);
00569 }
00570 //-------------------------------------------------------------------------------------------------------------
00571 void ServerEditor::postMessage(QString msg) {
00572     ui->txtMessages->append(tr("%1 %2").arg(QTime::currentTime().toString("[hh:mm:ss:zzz AP]   "), msg));
00573 }
00574 //-------------------------------------------------------------------------------------------------------------
00575 void ServerEditor::newQuery(QString query) {
00576     queryEditor->setText(query);
00577 }
00578 //-------------------------------------------------------------------------------------------------------------
00579 void ServerEditor::on_cmdExecuteSceneQuery_clicked()
00580 {
00581     newQuery(ui->txtSceneQuery->text());
00582 }
00583 //-------------------------------------------------------------------------------------------------------------
00584 void ServerEditor::reloadServerInformation() {
00585     QTreeWidgetItem *inv = ui->trvServerDetails->invisibleRootItem();
00586     for (int i = 0; i < inv->childCount(); i++) {
00587         QTreeWidgetItem *topLevel = inv->child(i);
00588         for (int j = 0; j < topLevel->childCount(); j++) {
00589             QTreeWidgetItem *childCol = topLevel->child(j);
00590             //variables
00591             if (childCol->text(0) == "Variables") {
00592                 QSqlQuery var(db);
00593                 if (var.exec("show variables")) {
00594                     childCol->takeChildren();
00595                     while (var.next()) {
00596                         QTreeWidgetItem *varItem = new QTreeWidgetItem(childCol);
00597                         varItem->setText(0, var.value(0).toString());
00598                         varItem->setText(1, var.value(1).toString());
00599                         varItem->setIcon(0, ico_vars);
00600                     }
00601                 }
00602             }
00603         }
00604     }
00605 }
00606 
00607 //-------------------------------------------------------------------------------------------------------------
00608 void ServerEditor::dropView() {
00609     if (currentView != "") {
00610         if (QMessageBox::question(this, "Conform drop", tr("Are you sure you want to drop the view <b>%1</b> from %2?").arg(currentView, currentDb),QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) {
00611             QSqlQuery qu(db);
00612             if (qu.exec(tr("drop view if exists `%1`.`%2`").arg(currentDb, currentView))) {
00613                 QMessageBox::information(this, "Success", "View Dropped");
00614                 reloadCurrentDb();
00615             } else {
00616                 QMessageBox::critical(this, "Error", tr("There was an error in dropping thew view.\n\n").arg(qu.lastError().text()));
00617             }
00618         }
00619     }
00620 }
00621 //-------------------------------------------------------------------------------------------------------------
00622 void ServerEditor::renameTable() {
00623     if (currentTable != "") {
00624         bool ok;
00625         QString newTableName =  QInputDialog::getText(this, "Rename table",
00626                                                       "Enter the new table name", QLineEdit::Normal,
00627                                                       currentTable, &ok
00628                                                       );
00629         if (ok && !newTableName.isEmpty()) {
00630             QString query = tr("rename table `%1`.`%2` to `%1`.`%3`").arg(currentDb,currentTable,newTableName);
00631             QSqlQuery qu(db);
00632             if (qu.exec(query)) {
00633                 //rename successful
00634                 reloadCurrentDb();
00635                 selectTable(currentDb, newTableName);
00636             } else {
00637                 //rename failed
00638                 QMessageBox::critical(this, "Error", tr("There was an error while renaming table %1.\n\n")
00639                                       .arg(currentTable, qu.lastError().text()));
00640             }
00641         }
00642     }
00643 }
00644 //-------------------------------------------------------------------------------------------------------------
00645 void ServerEditor::truncateTable() {
00646     if (currentTable != "") {
00647         int x = QMessageBox::question(this, "Confirm", tr(""
00648                                                           "Do you really want to truncate the table(%1)?"
00649                                                           "\n\n"
00650                                                           "Warning: You will lose all data.").arg(currentTable),
00651                                       QMessageBox::Yes, QMessageBox::No, QMessageBox::Help);
00652         if (x == QMessageBox::Yes) {
00653             QSqlQuery truncate = QSqlQuery(db);
00654             truncate.exec(tr("truncate table `%1`.`%2`").arg(currentDb, currentTable));
00655             QMessageBox::information(this, "Succes", tr("The data in the table %1 has been truncated.").arg(currentTable));
00656         }else if (x == QMessageBox::Help) {
00657             QMessageBox::information(this, "Truncate table", tr(""
00658                                                                 "The truncate table command will delete all data in the selected table."));
00659         }
00660     }
00661 }
00662 //-------------------------------------------------------------------------------------------------------------
00663 void ServerEditor::dropTable() {
00664     if (currentTable != "") {
00665         int x = QMessageBox::question(this, "Confirm", tr(""
00666                                                           "Do you really want to delete the table(%1)?"
00667                                                           "\n\n"
00668                                                           "Warning: You will lose all data in this table.").arg(currentTable),
00669                                       QMessageBox::Yes, QMessageBox::No, QMessageBox::Help);
00670 
00671         if (x == QMessageBox::Yes) {
00672             QSqlQuery truncate = QSqlQuery(db);
00673             truncate.exec(tr("drop table `%1`.`%2`").arg(currentDb, currentTable));
00674             QMessageBox::information(this, "Succes", tr("The table %1 has been deleted.").arg(currentTable));
00675             refreshDbList();
00676         }else if (x == QMessageBox::Help) {
00677             QMessageBox::information(this, "Delete Table table", tr("The drop table command will delete the selected table."));
00678         }
00679     }
00680 }
00681 
00682 //-------------------------------------------------------------------------------------------------------------
00683 
00684 void ServerEditor::on_tabWidget_currentChanged(int index)
00685 {
00686     if (index == 3) {
00687         if (variablesLoaded == false) {
00688             on_cmdReloadVariables_clicked();
00689             on_cmdReloadProcesses_clicked();
00690         }
00691     }
00692 }
00693 //-------------------------------------------------------------------------------------------------------------
00694 void ServerEditor::on_cmdReloadVariables_clicked()
00695 {
00696     QSqlQuery *qu = new QSqlQuery(db);
00697     if (qu->exec("show variables")) {
00698         QSqlQueryModel *varModel = new QSqlQueryModel(this);
00699         varModel->setQuery("show variables", db);
00700         ui->trvVariables->setModel(varModel);
00701         variablesLoaded = true;
00702     } else {
00703         QMessageBox::critical(this, "Error", tr("There was an error while loading the server variables.\n").arg(qu->lastError().text()));
00704         variablesLoaded = false;
00705     }
00706 }
00707 //-------------------------------------------------------------------------------------------------------------
00708 void ServerEditor::on_cmdReloadProcesses_clicked()
00709 {
00710     QSqlQuery *qu = new QSqlQuery(db);
00711     if (qu->exec("show processlist")) {
00712         QSqlQueryModel *procModel = new QSqlQueryModel(this);
00713         procModel->setQuery("show full processlist", db);
00714         ui->trvProcesses->setModel(procModel);
00715         processesLoaded = true;
00716     } else {
00717         QMessageBox::critical(this, "Error", tr("There was an error while loading the server processlist.\n").arg(qu->lastError().text()));
00718         processesLoaded = false;
00719     }
00720 }
00721 //-------------------------------------------------------------------------------------------------------------
00722 void ServerEditor::openSQLFile() {
00723     QFileDialog *op = new QFileDialog(this);
00724     QString fileName = op->getOpenFileName(this, "Select an SQL File", qApp->applicationDirPath(), tr("SQL Files (*.sql)"));
00725 
00726     if (fileName != "") {
00727         QFile sqlFile(fileName);
00728         if (!sqlFile.open(QIODevice::ReadOnly | QIODevice::Text))
00729             return;
00730         queryEditor->setText(sqlFile.readAll());;
00731         sqlFile.close();
00732     }
00733 }
00734 //-------------------------------------------------------------------------------------------------------------
00735 void ServerEditor::dropDb() {
00736     if (currentDb != "")   {
00737         int res = 0;
00738         res = QMessageBox::question(this, "Drop Database", tr("Are you sure you want to drop the database <b>%1</b>? \n\nWARNING!!! \nYou will lose all data.").arg(currentDb), QMessageBox::Yes, QMessageBox::No);
00739         if (res == QMessageBox::Yes) {
00740             if(runQuery(tr("drop database `%1`").arg(currentDb))) {
00741                 refreshDbList();
00742             } else {
00743                 QMessageBox::critical(this, "Error", "Could not drop the database.");
00744             }
00745         }
00746     }
00747 }
00748 //-------------------------------------------------------------------------------------------------------------
00749 void ServerEditor::truncateDb() {
00750     if (currentDb != "")   {
00751         int res = 0;
00752         res = QMessageBox::question(this, "Truncate Database", tr("Are you sure you want to truncate the database <b>%1</b>? \n\nWARNING!!! \nYou will lose all data.").arg(currentDb), QMessageBox::Yes, QMessageBox::No);
00753         if (res == QMessageBox::Yes) {
00754             QSqlQuery qu(db);
00755             QSqlQuery qu2(db);
00756             if (qu.exec(tr("show full tables from `%1` where table_type = 'BASE TABLE'").arg(currentDb))){
00757                 while (qu.next()) {
00758                     if (qu2.exec(tr("truncate table `%1`.`%2`").arg(currentDb, qu.value(0).toString()))) {
00759                         postMessage(tr("Truncated data for table `%1`.`%2`").arg(currentDb, qu.value(0).toString()));
00760                     } else {
00761                         postMessage(tr("Could not truncate data for table `%1`.`%2`. Error: %3").arg(currentDb, qu.value(0).toString(), qu.lastError().text()));
00762                     }
00763                 }
00764             }
00765         }
00766     }
00767 }
00768 //-------------------------------------------------------------------------------------------------------------
00769 void ServerEditor::emptyDb() {
00770     if (currentDb != "")   {
00771         int res = 0;
00772         res = QMessageBox::question(this, "Empty Database", tr("Are you sure you want to empty the database <b>%1</b>? \n\nWARNING!!! \nYou will lose all data.").arg(currentDb), QMessageBox::Yes, QMessageBox::No);
00773         if (res == QMessageBox::Yes) {
00774             QSqlQuery qu(db);
00775             QSqlQuery qu2(db);
00776             if (qu.exec(tr("show full tables from `%1` where table_type = 'BASE TABLE'").arg(currentDb))){
00777                 while (qu.next()) {
00778                     if (qu2.exec(tr("drop table if exists `%1`.`%2`").arg(currentDb, qu.value(0).toString()))) {
00779                         postMessage(tr("Dropped table `%1`.`%2`").arg(currentDb, qu.value(0).toString()));
00780                     } else {
00781                         postMessage(tr("Could not drop table `%1`.`%2`. Error: %3").arg(currentDb, qu.value(0).toString(), qu.lastError().text()));
00782                     }
00783                 }
00784                 qu.clear();
00785             }
00786             if (qu.exec(tr("select `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` where `TABLE_SCHEMA` = '%1' and `TABLE_TYPE` = 'VIEW'").arg(currentDb))){
00787                 while (qu.next()) {
00788                     if (qu2.exec(tr("drop view if exists `%1`.`%2`").arg(currentDb, qu.value(0).toString()))) {
00789                         postMessage(tr("Dropped view `%1`.`%2`").arg(currentDb, qu.value(0).toString()));
00790                     } else {
00791                         postMessage(tr("Could not drop view `%1`.`%2`. Error: %3").arg(currentDb, qu.value(0).toString(), qu.lastError().text()));
00792                     }
00793                 }
00794                 qu.clear();
00795             }
00796         }
00797     }
00798 }
00799 //-------------------------------------------------------------------------------------------------------------
00800 void ServerEditor::runSQLFile() {
00801     QFileDialog *op = new QFileDialog(this);
00802     QString fileName = op->getOpenFileName(this, "Select an SQL File", qApp->applicationDirPath(), tr("SQL Files (*.sql)"));
00803 
00804     if (fileName != "") {
00805         QFile sqlFile(fileName);
00806         if (!sqlFile.open(QIODevice::ReadOnly | QIODevice::Text))
00807             return;
00808         QString queryText = sqlFile.readAll();
00809         sqlFile.close();
00810         QSqlQuery qu(db);
00811         qu.exec(tr("use `%1`").arg(currentDb));
00812         parseLargeQuery(queryText);
00813     }
00814 }
00815 //-------------------------------------------------------------------------------------------------------------

Generated on Wed Dec 1 2010 08:43:40 for SQL Master by  doxygen 1.7.2