iosql/tableform.cpp

159 lines
4.7 KiB
C++

#include "tableform.h"
#include "ui_tableform.h"
#include <QSqlDatabase>
#include <QSqlTableModel>
#include <QSqlRecord>
#include <QSqlField>
#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::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);
m_DataModel = new QSqlTableModel(this, m_Database);
m_DataModel->setTable(m_TableName);
m_DataModel->select();
ui->DataTableView->setModel(m_DataModel);
ui->DataTableView->resizeColumnsToContents();
QSqlRecord record = m_DataModel->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;
switch (field.type())
{
case QVariant::String: typeName = "varchar"; break;
case QVariant::Int: typeName = "integer"; break;
case QVariant::Date: typeName = "date"; break;
case QVariant::DateTime: typeName = "datetime"; break;
case QVariant::Bool: typeName = "boolean"; break;
case QVariant::ByteArray: typeName = "byte array"; break;
case QVariant::LongLong: typeName = "bigint"; break;
default: typeName = "unknown"; break;
}
QTableWidgetItem *typeItem = new QTableWidgetItem(typeName);
QTableWidgetItem *sizeItem;
if (field.length() >= 0)
{
sizeItem = new QTableWidgetItem(field.length());
}
else if (field.precision() >= 0)
{
sizeItem = new QTableWidgetItem(field.precision());
}
else
{
sizeItem = new QTableWidgetItem("");
}
QTableWidgetItem *nullItem;
if (field.requiredStatus())
{
nullItem = new QTableWidgetItem("not null");
}
else
{
nullItem = new QTableWidgetItem("nullable");
}
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();
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()
{
m_DataModel->select();
ui->DataTableView->resizeColumnsToContents();
}
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();
}