SErrorPackage PostgresErrorHandler::handle(const QSqlError &error)
{
// 	new row for relation "doms_persons" violates check constraint doms_persons_email_check
// 	insert or update on table "doms_pacients" violates foreign key constraint "doms_pacients_iddocument_fkey"
	
	QString text = error.databaseText().toLower();
	
	if ( text.contains("duplicate key") )
	{
		SErrorPackage package(error.number(), QObject::tr("Seems like pacients already exists"));
		
		return package;
	}
	else if ( text.contains("syntax error") )
	{
		SErrorPackage package(error.number(), QObject::tr("You're trying to do an invalid action"));
		
		return package;
	}
	
	SErrorPackage package(error.number(), QObject::tr("PostgresErrorHandler %1").arg(error.databaseText()));
	
	// TODO: Analizar los textos!
	return package;
}
Ejemplo n.º 2
0
/*!  \internal

  Virtual function which is called when an error has occurred The
  default implementation displays a warning message to the user with
  information about the error.

*/
void QDataManager::handleError( QWidget* parent, const QSqlError& e )
{
#ifndef QT_NO_MESSAGEBOX
    if (e.driverText().isEmpty() && e.databaseText().isEmpty()) {
	QMessageBox::warning ( parent, "Warning", "An error occurred while accessing the database");
    } else {
	QMessageBox::warning ( parent, "Warning", e.driverText() + "\n" + e.databaseText(),
			   0, 0 );
    }
#endif // QT_NO_MESSAGEBOX
}
Ejemplo n.º 3
0
void Tf::writeQueryLog(const QString &query, bool success, const QSqlError &error)
{
    QString q = query;

    if (!success) {
        QString err = (!error.databaseText().isEmpty()) ? error.databaseText() : error.text().trimmed();
        if (!err.isEmpty()) {
            err = QLatin1Char('[') + err + QLatin1String("] ");
        }
        q = QLatin1String("(Query failed) ") + err + query;
    }
    Tf::traceQueryLog("%s", qPrintable(q));
}
Ejemplo n.º 4
0
void plumaje::insertColor ()
{
	if (!nombrePluma->text().isEmpty() && !descripcionPluma->text().isEmpty())
	{
		if (modificando) 
		{
			QString consulta = "UPDATE plumaje SET nombre = \"" + nombrePluma->text() + "\", \
			descripcion = \"" + descripcionPluma->text() + "\" \
			WHERE plumajeID = " + tablaPlumaje->currentRecord()->value(0).toString();
			qWarning (consulta);
			QSqlQuery queryUpdate (consulta, QSqlDatabase::database("palomar" ));
			QSqlError error = queryUpdate.lastError();
			if (error.type() != QSqlError::None)
				KMessageBox::error (this, i18n("Error actualizando el color de pluma. El error devuelto por la base de datos es:\n") +
					error.databaseText(),
						i18n ("Error actualizando color de pluma"));
			else
			{
				tablaPlumaje->refresh();
				InsertButton->setText(i18n("Insertar"));
				modificando = FALSE;
				descripcionPluma->clear();
				nombrePluma->clear();
			}
		}
		else
		{
			QString consulta = "INSERT INTO plumaje (nombre, descripcion) VALUES ('";
			consulta += nombrePluma->text() + "', '" + descripcionPluma->text() + "');";
			qWarning (consulta);
			QSqlQuery queryInsert (consulta, QSqlDatabase::database("palomar" ));
			QSqlError error = queryInsert.lastError();
			if (error.type() != QSqlError::None)
				KMessageBox::error (this, i18n("Error insertantdo el color de pluma.El error devuelto por la base de datos es:\n") +
													error.databaseText(),
													i18n ("Error añadiendo el color de pluma"));
			else
			{
				tablaPlumaje->refresh();
				descripcionPluma->clear();
				nombrePluma->clear();
			}
		}
	}
	else
		KMessageBox::error (this, i18n("Debe rellenar el nombre y la descripción."),
												i18n ("Error añadiendo tipo de suelta"));
}
Ejemplo n.º 5
0
int Loadable::upsertPkgItem(int &pkgitemid, const int pkgheadid,
                            const int itemid, QString &errMsg)
{
  if (pkgheadid < 0)
    return 0;

  QSqlQuery select;
  QSqlQuery upsert;

  if (pkgitemid >= 0)
    upsert.prepare("UPDATE pkgitem SET pkgitem_descrip=:descrip "
                   "WHERE (pkgitem_id=:id);");
  else
  {
    upsert.prepare("SELECT NEXTVAL('pkgitem_pkgitem_id_seq');");
    upsert.exec();
    if (upsert.first())
      pkgitemid = upsert.value(0).toInt();
    else if (upsert.lastError().type() != QSqlError::NoError)
    {
      QSqlError err = upsert.lastError();
      errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText());
      return -20;
    }
    upsert.prepare("INSERT INTO pkgitem ("
                   "    pkgitem_id, pkgitem_pkghead_id, pkgitem_type,"
                   "    pkgitem_item_id, pkgitem_name, pkgitem_descrip"
                   ") VALUES ("
                   "    :id, :headid, :type,"
                   "    :itemid, :name, :descrip);");
  }

  upsert.bindValue(":id",      pkgitemid);
  upsert.bindValue(":headid",  pkgheadid);
  upsert.bindValue(":type",    _pkgitemtype);
  upsert.bindValue(":itemid",  itemid);
  upsert.bindValue(":name",    _name);
  upsert.bindValue(":descrip", _comment);

  if (!upsert.exec())
  {
    QSqlError err = upsert.lastError();
    errMsg = _sqlerrtxt.arg(_name).arg(err.driverText()).arg(err.databaseText());
    return -21;
  }

  return pkgitemid;
}
Ejemplo n.º 6
0
QString toQSqlConnectionSub::ErrorString(const QSqlError &err, const QString &sql)
{
    QString ret;
    if (err.databaseText().isEmpty())
    {
        if (err.driverText().isEmpty())
            ret = QString::fromLatin1("Unknown error");
        else
            ret = err.driverText();
    }
    else
        ret = err.databaseText();
    if (!sql.isEmpty())
        ret += QString::fromLatin1("\n\n") + sql;
    return ret;
}
Ejemplo n.º 7
0
void Database::login() throw (TimesheetProcessorException )
{
    MySqlStorage::Parameters parameters;
    try {
        parameters = MySqlStorage::parseParameterEnvironmentVariable();
    } catch( ParseError& e ) {
        throw TimesheetProcessorException( e.what() );
    }
    m_storage.configure( parameters );
    bool ok = m_storage.database().open();
    if ( !ok ) {
        QSqlError error = m_storage.database().lastError();

        QString msg = QObject::tr( "Cannot connect to database %1 on host %2, database said "
                                   "\"%3\", driver said \"%4\"" )
                .arg( parameters.database ) .arg( parameters.host )
                .arg( error.driverText() )
                .arg( error.databaseText() );
        throw TimesheetProcessorException( msg );
    }
    // check if the driver has transaction support
    if( ! m_storage.database().driver()->hasFeature( QSqlDriver::Transactions ) ) {
        QString msg = QObject::tr( "The database driver in use does not support transactions. Transactions are required." );
        throw TimesheetProcessorException( msg );
    }
}
Ejemplo n.º 8
0
bool Application::notify(QObject * receiver, QEvent * e)
{
	try
	{
		return QApplication::notify(receiver, e);
	}
	catch (Exception & e)
	{
		qCritical() << e.title() << ':' << e.description();
		QMessageBox::critical(nullptr, e.title(), e.description());
	}
	catch (QSqlQuery & q)
	{
		QString s;
		QTextStream str(&s);
		QSqlError e = q.lastError();

		str << "Query: " << q.lastQuery() << '\n';
		str << "Driver text: " << e.driverText() << '\n';
		str << "Database text: " << e.databaseText() << '\n';
		str << "Native error code: " << e.nativeErrorCode();
		qCritical() << "Database error:" << s;
		QMessageBox::critical(nullptr, "Database error", s);
	}

	return false;
}
Ejemplo n.º 9
0
std::vector< Profile > DatabaseFacade::getUsers()
{
    std::vector<Profile> profiles;

    if(!connected)
    {
        qDebug() << "Not connected to database";
        return profiles;
    }

    QSqlQuery query;
    query.exec("SELECT * FROM Gamers");

    QSqlError err = query.lastError();
    if(err.isValid())
        qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();
    
    while (query.next())
    {
        int id = query.value(0).toInt();
        QString name = query.value(1).toString();

        QPixmap picture;
        picture.loadFromData(query.value(2).toByteArray());

        profiles.emplace_back(id, name, picture);
    }

    query.clear();

    return profiles;
}
Ejemplo n.º 10
0
std::vector< Score > DatabaseFacade::getHightScores( const QString& gameName_, int limit_ )
{
    std::vector< Score > scores;

    if(!connected)
    {
        qDebug() << "Not connected to database";
        return scores;
    }

    QSqlQuery query;
    query.exec(queryGetHighScores.arg(gameName_));

    QSqlError err = query.lastError();
    if(err.isValid())
        qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();

    while (query.next())
    {
        QString name = query.value(0).toString();

        QPixmap picture;
        picture.loadFromData(query.value(1).toByteArray());

        int score = query.value(2).toInt();

        scores.emplace_back(name, picture, score);
    }

    query.clear();

    return scores;
}
Ejemplo n.º 11
0
/*!
 * \brief SqlQuery::exec Execute a existing query with capability to throw SqlException
 * if necessary.
 * \return true if successfully executed, false otherwise.
 */
bool SqlQuery::exec() throw(SqlException)
{
    bool b = m_sqlQuery.exec();

    QSqlError sqlError = m_sqlQuery.lastError();
    switch(sqlError.type ())
    {
    case QSqlError::NoError:
        return b;
    case QSqlError::ConnectionError:

    case QSqlError::StatementError:
        if(sqlError.databaseText() == "MySQL server has gone away"){
            throw SqlConnectionException(sqlError);
        }else{
            throw SqlStatementException(sqlError);
        }
    case QSqlError::TransactionError:
        throw SqlTransactionException(sqlError);
    case QSqlError::UnknownError:
        throw SqlUnknownException(sqlError);
    default:
        throw SqlException(sqlError);
    }
}
Ejemplo n.º 12
0
void SQLiteDriver::setLastError(const QSqlError& e)
{
#if defined(SQLITEDRIVER_DEBUG)
    if (e.isValid())
        qDebug() << "SQLite error:" << e.driverText() << e.databaseText();
#endif
    QSqlDriver::setLastError(e);
}
Ejemplo n.º 13
0
void checkMySQLError(QSqlQuery& q) {
    QSqlError e = q.lastError();
    if(!e.isValid())
        return;//no error
    qDebug()<<"got MySQL-Error"<<e.number()<<e.text()<<"/"<<e.databaseText()<<"/"<<e.driverText();
    qDebug()<<"on query"<<q.lastQuery();
    qDebug()<<"Terminating Application";
    QCoreApplication::quit();
}
Ejemplo n.º 14
0
QT_BEGIN_NAMESPACE

#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QSqlError &s)
{
    dbg.nospace() << "QSqlError(" << s.number() << ", " << s.driverText() <<
                     ", " << s.databaseText() << ')';
    return dbg.space();
}
Ejemplo n.º 15
0
QT_BEGIN_NAMESPACE

#ifndef QT_NO_DEBUG_STREAM
QDebug operator<<(QDebug dbg, const QSqlError &s)
{
    QDebugStateSaver saver(dbg);
    dbg.nospace();
    dbg << "QSqlError(" << s.nativeErrorCode() << ", " << s.driverText()
        << ", " << s.databaseText() << ')';
    return dbg;
}
Ejemplo n.º 16
0
/*!  \internal

  Virtual function which is called when an error has occurred The
  default implementation displays a warning message to the user with
  information about the error.

*/
void Q3DataManager::handleError(QWidget* parent, const QSqlError& e)
{
#ifndef QT_NO_MESSAGEBOX
    if (e.driverText().isEmpty() && e.databaseText().isEmpty()) {
        QMessageBox::warning (parent, QLatin1String("Warning"), QLatin1String("An error occurred while accessing the database"));
    } else {
        QMessageBox::warning (parent, QLatin1String("Warning"), e.driverText() + QLatin1Char('\n') + e.databaseText(),
                           0, 0);
    }
#endif // QT_NO_MESSAGEBOX
}
Ejemplo n.º 17
0
void plumaje::eliminarColor()
{
	QString consulta = "DELETE FROM plumaje WHERE plumajeID = " + tablaPlumaje->currentRecord()->value(0).toString();
	QSqlQuery queryDelete (consulta, QSqlDatabase::database("palomar" ));
	QSqlError error = queryDelete.lastError();
	if (error.type() != QSqlError::None)
			KMessageBox::error (this, i18n("Error eliminando el color de pluma. El error devuelto por la base de datos es:\n") +
				error.databaseText(),
				i18n ("Error eliminando el color de pluma"));
	tablaPlumaje->refresh();
}
Ejemplo n.º 18
0
void ojo::eliminarTipo()
{
	QString consulta = "DELETE FROM ojo WHERE ojoID = " + tablaOjos->currentRecord()->value(0).toString();
	QSqlQuery queryDelete (consulta, QSqlDatabase::database("palomar" ));
	QSqlError error = queryDelete.lastError();
	if (error.type() != QSqlError::None)
			KMessageBox::error (this, i18n("Error eliminando el tipo de ojo. El error devuelto por la base de datos es:\n") +
				error.databaseText(),
				i18n ("Error eliminando el tipo de ojo"));
	tablaOjos->refresh();

}
Ejemplo n.º 19
0
void DatabaseFacade::addUserStat( int userId, const QString& gameName_, int score_ )
{
    if(!connected)
    {
        qDebug() << "Not connected to database";
        return;
    }

    QSqlQuery query;
    QSqlQuery query2;

    qDebug() << "Executing query : \n\t" << queryGetGamerHighScore.arg(gameName_).arg(userId);
    query.exec(queryGetGamerHighScore.arg(gameName_).arg(userId));

    QSqlError err = query.lastError();
    if(err.isValid())
        qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();

    if(query.next())
    {
        if(query.value(1).toInt() < score_)
        {
            qDebug() << "Executing query : \n\t" << queryUpdateHighScore.arg(score_).arg(query.value(0).toString()).arg(userId);
            query2.exec(queryUpdateHighScore.arg(score_).arg(query.value(0).toString()).arg(userId));

            err = query2.lastError();
            if(err.isValid())
                qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();
        }
    }
    else
    {
        qDebug() << "Executing query : \n\t" << queryInsertHighScore.arg(userId).arg(gameName_).arg(score_);
        query2.exec(queryInsertHighScore.arg(userId).arg(gameName_).arg(score_));

        err = query2.lastError();
        if(err.isValid())
            qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();
    }
}
Ejemplo n.º 20
0
void SvSerialEditor::accept()
{
  params.name = ui->cbPortName->currentData().toString();
  params.description = ui->cbPortName->currentText();
  params.baudrate = ui->cbBaudrate->currentData().toUInt();
  params.databits = QSerialPort::DataBits(ui->cbDataBits->currentData().toInt());
  params.flowcontrol = QSerialPort::FlowControl(ui->cbFlowControl->currentData().toInt());
  params.parity = QSerialPort::Parity(ui->cbParity->currentData().toInt());
  params.stopbits = QSerialPort::StopBits(ui->cbStopBits->currentData().toInt());
  
  try {
    
    QSqlError err = check_params_exists(params.dev_type);
    if(QSqlError::NoError != err.type()) _exception.raise(err.databaseText());

    err = SQLITE->execSQL(QString(SQL_UPDATE_DEVICES_SERIAL_PARAMS_WHERE)
                          .arg(params.name)
                          .arg(params.baudrate)
                          .arg(params.parity)
                          .arg(params.stopbits)
                          .arg(params.databits)
                          .arg(params.flowcontrol)
                          .arg(params.description)
                          .arg(params.dev_type));
    
    if(QSqlError::NoError != err.type()) _exception.raise(err.databaseText());
  
    QDialog::accept();
  
  }
  
  catch(SvException e) {
    
    _last_error = e.err;
//        qDebug() << _last_error;
    QDialog::reject();
    
  }
  
}
Ejemplo n.º 21
0
QVariantMap ScriptQuery::lastError()
{
  QVariantMap m;
  QSqlError err = _query.lastError();
  m.insert("databaseText", err.databaseText());
  m.insert("driverText", err.driverText());
  m.insert("text", err.text());
  m.insert("number", err.number());
  m.insert("type", err.type());
  m.insert("isValid", QVariant(err.isValid(), 0));

  return m;
}
Ejemplo n.º 22
0
QString MythDB::DBErrorMessage(const QSqlError& err)
{
    if (!err.type())
        return "No error type from QSqlError?  Strange...";

    return QString("Driver error was [%1/%2]:\n"
                   "%3\n"
                   "Database error was:\n"
                   "%4\n")
        .arg(err.type())
        .arg(err.number())
        .arg(err.driverText())
        .arg(err.databaseText());
}
Ejemplo n.º 23
0
bool importDialog::setUpDB(QString host, QString user, QString pass)
{
    QSqlDatabase writerDb(QSqlDatabase::addDatabase("QMYSQL","Global"));
    writerDb.setHostName(host);
    writerDb.setUserName(user);
    writerDb.setPassword(pass);
    if(!writerDb.open())
    {
        QSqlError err = writerDb.lastError ();
        QMessageBox::critical(this,tr("The database reported an error:"),err.databaseText());
        return false;
    }
    return writerDb.isValid();
}
Ejemplo n.º 24
0
void
SqlDB::throwDatabaseException(const char* file, int line, const QSqlError& err)
{
    string s = IceUtilInternal::toLower(err.databaseText().toUtf8().data());
    if(s.find("deadlock") != string::npos || s.find("database is locked") != string::npos ||
       s.find("could not serialize") != string::npos)
    {
        throw DeadlockException(file, line, err);
    }
    else
    {
        throw DatabaseException(file, line, err);
    }
}
Ejemplo n.º 25
0
QVariantMap XSqlQueryProto::lastError()
{
  QVariantMap m;

  XSqlQuery *item = qscriptvalue_cast<XSqlQuery*>(thisObject());
  if (item)
  {
    QSqlError err = item->lastError();
    m.insert("databaseText", err.databaseText());
    m.insert("driverText", err.driverText());
    m.insert("text", err.text());
    m.insert("number", err.number());
    m.insert("type", err.type());
    m.insert("isValid", QVariant(err.isValid()));
  }

  return m;
}
Ejemplo n.º 26
0
void DatabaseFacade::openConnexion()
{
    db.setHostName( DATABASE_IP );
    db.setDatabaseName( DATABASE_NAME );
    db.setUserName( DATABASE_USER );
    db.setPassword( DATABASE_PASS );

    connected = db.open();

    if(!connected)
    {
        qDebug() << "Connexion to database failed";
        QSqlError err = db.lastError();
        if(err.isValid())
            qDebug() << err.databaseText() << "\n" << err.driverText() << "\n" << err.nativeErrorCode();
    }

}
Ejemplo n.º 27
0
int main(int argc, char* argv[]) {
#ifdef Q_WS_WIN
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(1, 1), &wsaData)) {
        qDebug("Error starting up Windows Socket system... libpq will not work.");
    }
#endif

    QApplication app(argc, argv);

    bool haveDB = FALSE;

    QSqlDatabase *db = QSqlDatabase::addDatabase("QPSQL7");
    if(db) {
        db->setDatabaseName("mfg");
        db->setUserName("cryan");
        db->setPassword("password");
        db->setHostName("192.168.2.100");
        if(db->open()) {
            haveDB = TRUE;
        } else {
            QSqlError err = db->lastError();
            qDebug("Driver:   %s", (const char*)err.driverText());
            qDebug("Database: %s", (const char*)err.databaseText());
            qDebug("Could not make connection to database: sql query will be disabled");
        }
    } else {
        qDebug("Could not load the database driver: sql query will be disabled");
    }

    GraphWindow * gw = new GraphWindow();
    gw->init(haveDB);

    app.setMainWidget(gw);
    gw->show();

    int ret = app.exec();

#ifdef Q_WS_WIN
    WSACleanup();
#endif

    return ret;
}
Ejemplo n.º 28
0
int main(int argc, char* argv[]) {
#ifdef XQ_WS_WIN
    WSADATA wsaData;
    if(WSAStartup(MAKEWORD(1, 1), &wsaData)) {
        qDebug("Error starting up Windows Socket system... libpq will not work.");
    }
#endif

    QApplication app(argc, argv);

    bool haveDB = FALSE;

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    if(db.isValid()) {
        db.setDatabaseName("test");
        db.setUserName("cryan");
        db.setPassword("password");
        db.setHostName("localhost");
        if(db.open()) {
            haveDB = TRUE;
        } else {
            QSqlError err = db.lastError();
            qDebug("Driver:   %s", err.driverText().toLatin1().data());
            qDebug("Database: %s", err.databaseText().toLatin1().data());
            qDebug("Could not make connection to database: sql query will be disabled");
        }
    } else {
        qDebug("Could not load the database driver: sql query will be disabled");
    }

    GraphWindow gw;
    gw.init(haveDB);
    gw.show();

    int ret = app.exec();

#ifdef XQ_WS_WIN
    WSACleanup();
#endif

    return ret;
}
Ejemplo n.º 29
0
ImportWindow::ImportWindow(QWidget* parent, Qt::WindowFlags fl)
    : QMainWindow(parent, fl)
{
    setupUi(this);

    (void)statusBar();

    // signals and slots connections
    connect(helpIndexAction, SIGNAL(activated()), this, SLOT(helpIndex()));
    connect(helpContentsAction, SIGNAL(activated()), this, SLOT(helpContents()));
    connect(helpAboutAction, SIGNAL(activated()), this, SLOT(helpAbout()));
    connect(fileExitAction, SIGNAL(activated()), this, SLOT(fileExit()));
    connect(fileOpenAction, SIGNAL(activated()), this, SLOT(sAdd()));
    connect(_add, SIGNAL(clicked()), this, SLOT(sAdd()));
    connect(_import, SIGNAL(clicked()), this, SLOT(sImport()));
    connect(_remove, SIGNAL(clicked()), this, SLOT(sRemove()));

    _reports->clear();

    QSqlQuery qpop;
    QSqlError err;
    if(!qpop.exec(getSqlFromTag("fmt19", QSqlDatabase::database().driverName())))
    {
        err = qpop.lastError();
        _log->append(tr("<font color=red>The following error was encountered "
                        "retrieving available schemas:\n"
                        "\t%1\n\t%2\n</font>")
                     .arg(err.driverText())
                     .arg(err.databaseText()));
        return;
    } else
        while (qpop.next())
            _schema->addItem(qpop.value(0).toString(), qpop.value(0));

    _dbTimerId = startTimer(60000);
}
Ejemplo n.º 30
0
int LoadReport::writeToDB(const QByteArray &pdata, const QString pkgname, QString &errMsg)
{
  int errLine = 0;
  int errCol  = 0;
  QDomDocument doc;
  if (! doc.setContent(pdata, &errMsg, &errLine, &errCol))
  {
    errMsg = (TR("<font color=red>Error parsing file %1: %2 on "
                          "line %3 column %4</font>")
                          .arg(_filename).arg(errMsg).arg(errLine).arg(errCol));
    return -1;
  }

  QDomElement root = doc.documentElement();
  if(root.tagName() != "report")
  {
    errMsg = TR("<font color=red>XML Document %1 does not have root"
                         " node of report</font>")
                         .arg(_filename);
    return -2;
  }

  for(QDomNode n = root.firstChild(); !n.isNull(); n = n.nextSibling())
  {
    if(n.nodeName() == "name")
      _name = n.firstChild().nodeValue();
    else if(n.nodeName() == "description")
      _comment = n.firstChild().nodeValue();
  }
  QString report_src = doc.toString();

  if(_filename.isEmpty())
  {
    errMsg = TR("<font color=orange>The document %1 does not have"
                         " a report name defined</font>")
                         .arg(_filename);
    return -3;
  }

  /* the following block avoids
      ERROR:  duplicate key violates unique constraint "report_name_grade_idx"
   */
  if (! pkgname.isEmpty())
  {
    // if there's a version of the report that's not part of this pkg
    XSqlQuery select;
    select.prepare("SELECT report_id "
                   "FROM report r JOIN pg_class c ON (r.tableoid=c.oid)"
                   "              JOIN pg_namespace n ON (relnamespace=n.oid) "
                   "WHERE ((report_name=:name)"
                   "  AND  (report_grade=:grade)"
                   "  AND  (nspname<>:pkgname));");
    select.bindValue(":name",    _name);
    select.bindValue(":grade",   _grade);
    select.bindValue(":pkgname", pkgname);
    select.exec();
    if(select.first())
    {
      // then find the next open higher grade
      XSqlQuery next;
      next.prepare("SELECT MIN(sequence_value) AS next "
                       "FROM sequence "
                       "WHERE ((sequence_value NOT IN ("
                       "      SELECT report_grade"
                       "      FROM report"
                       "      WHERE (report_name=:name)))"
                       "  AND (sequence_value>=:grade));");
      next.bindValue(":name", _name);
      next.bindValue(":grade",   _grade);
      next.exec();
      if (next.first())
        _grade = next.value(0).toInt();
      else if (next.lastError().type() != QSqlError::NoError)
      {
        QSqlError err = next.lastError();
        errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText());
        return -8;
      }
    }
    else if (select.lastError().type() != QSqlError::NoError)
    {
      QSqlError err = select.lastError();
      errMsg = _sqlerrtxt.arg(_filename).arg(err.driverText()).arg(err.databaseText());
      return -9;
    }
  }

  _minMql = new MetaSQLQuery("SELECT MIN(report_grade) AS min "
                   "FROM report "
                   "WHERE (report_name=<? value('name') ?>);");

  _maxMql = new MetaSQLQuery("SELECT MAX(report_grade) AS max "
                   "FROM report "
                   "WHERE (report_name=<? value('name') ?>);");

  _selectMql = new MetaSQLQuery("SELECT report_id, -1, -1"
                      "  FROM report "
                      " WHERE ((report_name=<? value('name') ?>) "
                      "    AND (report_grade=<? value('grade') ?>) );");

  _updateMql = new MetaSQLQuery("UPDATE <? literal('tablename') ?> "
                      "   SET report_descrip=<? value('notes') ?>, "
                      "       report_source=E<? value('source') ?> "
                      " WHERE (report_id=<? value('id') ?>) "
                      "RETURNING report_id AS id;");

  _insertMql = new MetaSQLQuery("INSERT INTO <? literal('tablename') ?> ("
                      "    report_id, report_name,"
                      "    report_grade, report_source, report_descrip"
                      ") VALUES ("
                      "    DEFAULT, <? value('name') ?>,"
                      "    <? value('grade') ?>, E<? value('source') ?>,"
                      "    <? value('notes') ?>) "
                      "RETURNING report_id AS id;");

  ParameterList params;
  params.append("tablename", "report");

  return Loadable::writeToDB(pdata, pkgname, errMsg, params);
}