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
00016
00017
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
00045 comp = new QCompleter(queryEditor);
00046 comp->setModel(modelFromFile(":/dat/datafiles/keywords.dat"));
00047
00048
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
00096
00097
00098
00099 emit tableSelected(false);
00100
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* , 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
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
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 )
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 )
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
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
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
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
00634 reloadCurrentDb();
00635 selectTable(currentDb, newTableName);
00636 } else {
00637
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