예제 #1
0
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;
}
예제 #2
0
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);
	}
}
예제 #3
0
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);
	}
}