QList<QObject *> DbSchema::tables() { QList<QObject *> ret; QObject *db_schema = dbSchema(); QQmlListReference tbllst(db_schema, "tables", m_eventPlugin->qmlEngine()); for (int i = 0; i < tbllst.count(); ++i) { ret << tbllst.at(i); } return ret; }
void EventPlugin::importEvent_qbe() { qfLogFuncFrame(); qff::MainWindow *fwk = qff::MainWindow::frameWork(); /* if(connectionType() != ConnectionType::SqlServer) { qfd::MessageBox::showError(fwk, tr("Data file can be imported to SQL server only!")); return; } */ QString ext = ".qbe"; QString fn = qf::qmlwidgets::dialogs::FileDialog::getOpenFileName (fwk, tr("Import as Quick Event"), QString(), "Quick Event files *.qbe (*.qbe)"); if(fn.isEmpty()) return; QString event_name = QInputDialog::getText(fwk, tr("Query"), tr("Event will be imported as ID:")).trimmed(); if(event_name.isEmpty()) return; QStringList existing_events = (connectionType() == ConnectionType::SingleFile)? existingFileEventNames(): existingSqlEventNames(); if(existing_events.contains(event_name)) { qfd::MessageBox::showError(fwk, tr("Event ID '%1' exists already!").arg(event_name)); return; } QString err_str; QString import_connection_name = QStringLiteral("qe_import_connection"); QString export_connection_name = QStringLiteral("qe_export_connection"); do { qfs::Connection current_conn = qfs::Connection::forName(); qfs::Connection imp_conn(QSqlDatabase::addDatabase("QSQLITE", import_connection_name)); imp_conn.setDatabaseName(fn); qfInfo() << "Opening import database file" << fn; if(!imp_conn.open()) { qfd::MessageBox::showError(fwk, tr("Open Database Error: %1").arg(imp_conn.errorString())); return; } qfs::Connection exp_conn(QSqlDatabase::addDatabase(current_conn.driverName(), export_connection_name)); if(connectionType() == ConnectionType::SingleFile) { exp_conn.setDatabaseName(eventNameToFileName(event_name)); } else { exp_conn.setHostName(current_conn.hostName()); exp_conn.setPort(current_conn.port()); exp_conn.setUserName(current_conn.userName()); exp_conn.setPassword(current_conn.password()); exp_conn.setDatabaseName(current_conn.databaseName()); } qfInfo() << "Opening export database:" << exp_conn.databaseName(); if(!exp_conn.open()) { qfd::MessageBox::showError(fwk, tr("Open Database Error: %1").arg(exp_conn.errorString())); return; } qfs::Transaction transaction(exp_conn); DbSchema db_schema = dbSchema(); auto tables = db_schema.tables(); int step_cnt = tables.count() + 1; int step_no = 0; fwk->showProgress(tr("Creating database"), ++step_no, step_cnt); { DbSchema::CreateDbSqlScriptOptions create_options; create_options.setDriverName(exp_conn.driverName()); create_options.setSchemaName(event_name); QStringList create_script = db_schema.createDbSqlScript(create_options); qfs::Query ex_q(exp_conn); if(!run_sql_script(ex_q, create_script)) { err_str = tr("Create Database Error: %1").arg(ex_q.lastError().text()); break; } } exp_conn.setCurrentSchema(event_name); for(QObject *table : tables) { QString table_name = table->property("name").toString(); qfDebug() << "Copying table" << table_name; fwk->showProgress(tr("Copying table %1").arg(table_name), ++step_no, step_cnt); QSqlRecord rec = db_schema.sqlRecord(table, true); err_str = copy_sql_table(table_name, rec, imp_conn, exp_conn); if(!err_str.isEmpty()) break; } if(!err_str.isEmpty()) break; transaction.commit(); } while(false); QSqlDatabase::removeDatabase(import_connection_name); QSqlDatabase::removeDatabase(export_connection_name); fwk->hideProgress(); if(!err_str.isEmpty()) { qfd::MessageBox::showError(fwk, err_str); return; } if(qfd::MessageBox::askYesNo(fwk, tr("Open imported event '%1'?").arg(event_name))) { openEvent(event_name); } }
void EventPlugin::exportEvent() { qfLogFuncFrame(); qff::MainWindow *fwk = qff::MainWindow::frameWork(); QString ext = ".qbe"; QString ex_fn = qf::qmlwidgets::dialogs::FileDialog::getSaveFileName (fwk, tr("Export as Quick Event"), QString(), tr("Quick Event files *%1 (*%1)").arg(ext)); if(ex_fn.isEmpty()) return; if(!ex_fn.endsWith(ext, Qt::CaseInsensitive)) ex_fn += ext; QString err_str; QString export_connection_name = QStringLiteral("qe_export_connection"); do { if(QFile::exists(ex_fn)) { if(!QFile::remove(ex_fn)) { err_str = tr("Cannot delete existing file %1").arg(ex_fn); break; } } qfs::Connection ex_conn(QSqlDatabase::addDatabase("QSQLITE", export_connection_name)); ex_conn.setDatabaseName(ex_fn); qfInfo() << "Opening export database file" << ex_fn; if(!ex_conn.open()) { qfd::MessageBox::showError(fwk, tr("Open Database Error: %1").arg(ex_conn.errorString())); return; } qfs::Transaction transaction(ex_conn); DbSchema db_schema = dbSchema(); auto tables = db_schema.tables(); int step_cnt = tables.count() + 1; int step_no = 0; fwk->showProgress(tr("Creating database"), ++step_no, step_cnt); { DbSchema::CreateDbSqlScriptOptions create_options; create_options.setDriverName(ex_conn.driverName()); QStringList create_script = db_schema.createDbSqlScript(create_options); qfs::Query ex_q(ex_conn); if(!run_sql_script(ex_q, create_script)) { err_str = tr("Create Database Error: %1").arg(ex_q.lastError().text()); break; } } qfs::Connection conn = qfs::Connection::forName(); for(QObject *table : tables) { QString table_name = table->property("name").toString(); qfDebug() << "Copying table" << table_name; fwk->showProgress(tr("Copying table %1").arg(table_name), ++step_no, step_cnt); QSqlRecord rec = db_schema.sqlRecord(table); err_str = copy_sql_table(table_name, rec, conn, ex_conn); if(!err_str.isEmpty()) break; } if(!err_str.isEmpty()) break; transaction.commit(); } while(false); { QSqlDatabase c = QSqlDatabase::database(export_connection_name, false); if(c.isOpen()) c.close(); } QSqlDatabase::removeDatabase(export_connection_name); fwk->hideProgress(); if(!err_str.isEmpty()) { qfd::MessageBox::showError(fwk, err_str); } }