iosql/tableform.cpp

185 lines
5.5 KiB
C++

#include "tableform.h"
#include "ui_tableform.h"
#include <QtSql>
#include <QTableWidgetItem>
#include <QMainWindow>
#include <QStatusBar>
#include <Qsci/qscilexersql.h>
TableForm::TableForm(QWidget *parent) :
QWidget(parent),
ui(new Ui::TableForm)
{
QsciLexerSQL *lexer = new QsciLexerSQL();
lexer->setDefaultPaper(QColor(255, 255, 255));
lexer->setDefaultColor(QColor(0, 0, 0));
lexer->setDefaultFont(QFont("monospace"));
for (int i = -1; i < 23; i++)
{
lexer->setPaper(QColor(255, 255, 255), i);
//lexer->setDefaultColor(QColor(0, 0, 0));
lexer->setFont(QFont("monospace"), i);
}
ui->setupUi(this);
ui->QueryTextEdit->setLexer(lexer);
m_QueryModel = 0;
}
TableForm::~TableForm()
{
delete m_QueryModel;
delete m_DataModel;
delete ui;
}
void TableForm::changeEvent(QEvent *e)
{
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
void TableForm::setColumns()
{
QSqlQuery query;
if (m_Database.driverName() == "QPSQL")
{
query = QSqlQuery("SELECT * FROM \"" + m_TableName + "\" LIMIT 1", m_Database);
// SELECT column_name, column_default, is_nullable, data_type, character_maximum_length FROM information_schema.columns WHERE table_name = "" ORDER BY ordinal_position
}
else if (m_Database.driverName() == "MYSQL")
{
query = QSqlQuery("SELECT * FROM `" + m_TableName + "` LIMIT 1", m_Database);
// SELECT COLUMN_NAME AS column_name, COLUMN_DEFAULT AS column_default, IS_NULLABLE AS is_nullable, DATA_TYPE AS data_type, CHARACTER_MAXIMUM_LENGTH AS character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = "" ORDER BY ordinal_position
}
else if (m_Database.driverName() == "SQLITE")
{
query = QSqlQuery("SELECT * FROM '" + m_TableName + "'' LIMIT 1", m_Database);
// SELECT
}
QSqlRecord record = query.record();
ui->StructureTableWidget->setRowCount(record.count());
for (int i = 0; i < record.count(); i++)
{
QSqlField field = record.field(i);
QTableWidgetItem *nameItem = new QTableWidgetItem(field.name());
QString typeName = QVariant::typeToName(field.type());
QTableWidgetItem *typeItem = new QTableWidgetItem(typeName + " - " + QString::number(field.type()));
QTableWidgetItem *sizeItem;
if (field.length() >= 0)
{
sizeItem = new QTableWidgetItem(QString::number(field.length()));
}
else if (field.precision() >= 0)
{
sizeItem = new QTableWidgetItem(QString::number(field.precision()));
}
else
{
sizeItem = new QTableWidgetItem("");
}
QTableWidgetItem *nullItem;
if (field.requiredStatus() == 1)
{
nullItem = new QTableWidgetItem("not null");
}
else if (field.requiredStatus() == 0)
{
nullItem = new QTableWidgetItem("nullable");
}
else
{
nullItem = new QTableWidgetItem("unknown");
}
ui->StructureTableWidget->setItem(i, 0, nameItem);
ui->StructureTableWidget->setItem(i, 1, typeItem);
ui->StructureTableWidget->setItem(i, 2, sizeItem);
ui->StructureTableWidget->setItem(i, 3, nullItem);
}
ui->StructureTableWidget->resizeColumnsToContents();
}
void TableForm::setTable(const QString connectionName, const QString tableName)
{
QMainWindow * mainWindow = qobject_cast<QMainWindow*>(window());
if (mainWindow)
{
mainWindow->statusBar()->showMessage("Opening table \"" + tableName + "\"...");
}
QCoreApplication::processEvents();
m_ConnectionName = connectionName;
m_TableName = tableName;
m_Database = QSqlDatabase::database(m_ConnectionName);
this->setColumns();
m_DataModel = new QSqlTableModel(this, m_Database);
m_DataModel->setTable(m_TableName);
ui->DataTableView->setModel(m_DataModel);
if (mainWindow)
{
mainWindow->statusBar()->clearMessage();
}
}
void TableForm::on_DataCommitAction_triggered()
{
if (m_DataModel)
{
m_DataModel->database().commit();
}
ui->DataCommitAction->setEnabled(false);
ui->DataRollbackAction->setEnabled(false);
}
void TableForm::on_DataRefreshAction_triggered()
{
QMainWindow * mainWindow = qobject_cast<QMainWindow*>(window());
if (mainWindow)
{
mainWindow->statusBar()->showMessage("Fetching results from \"" + m_TableName + "\"...");
}
m_DataModel->select();
ui->DataTableView->resizeColumnsToContents();
if (mainWindow)
{
mainWindow->statusBar()->clearMessage();
}
}
void TableForm::on_QueryRunAction_triggered()
{
QMainWindow * mainWindow = qobject_cast<QMainWindow*>(window());
if (mainWindow)
{
mainWindow->statusBar()->showMessage("Running query...");
}
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
QCoreApplication::processEvents();
QString query = "";
if (m_QueryModel == 0)
{
m_QueryModel = new QSqlQueryModel;
}
if (ui->QueryTextEdit->hasSelectedText())
{
query = ui->QueryTextEdit->selectedText();
}
else
{
query = ui->QueryTextEdit->text();
}
m_QueryModel->setQuery(query, m_Database);
ui->ResultsTableView->setModel(m_QueryModel);
ui->ResultsTableView->resizeColumnsToContents();
QApplication::restoreOverrideCursor();
if (mainWindow)
{
mainWindow->statusBar()->clearMessage();
}
}