использовать mysql, встроенный в qt? - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь использовать mysql, встроенный в QT. У меня уже есть подключаемый модуль Qt mysql, связанный с mysqld. Плагин прекрасно загружает встроенную базу данных, но в QT нет простых способов настройки встроенных опций, таких как dataDir. Я увидел здесь: http://doc.qt.io/archives/qt-4.7/qsqldatabase.html#addDatabase-2, что я могу запустить драйвер QT sql (QMYSQLDriver) с необходимыми встроенными параметрами, поэтому я сделал:

#include <QtCore/QCoreApplication>
#include <QtSql>

#include "QMYSQLDriver"
#include <mysql.h>

int main(int argc, char *argv[])
{
    //QCoreApplication a(argc, argv);
    {
        QSqlDatabase mydb;
        MYSQL *mysql;

        static char *server_options[] = \
        { "mysql_test", "--defaults-file=/home/cquiros/temp/mysql/my.cnf", NULL };
        int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

        static char *server_groups[] = { "embedded", NULL };

        qDebug() << "Loading embedded";
        mysql_library_init(num_elements, server_options, server_groups);
        mysql = mysql_init(NULL);
        mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "embedded");
        mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);

        mysql_real_connect(mysql, NULL,NULL,NULL, "database1", 0,NULL,0);


        //mydb = QSqlDatabase::addDatabase("QMYSQLE","mydb"); //Add the database connector to MySQL

        QMYSQLDriver *drv = new QMYSQLDriver(mysql);

        mydb = QSqlDatabase::addDatabase(drv,"connection1"); //Add the database connector to MySQL
        qDebug() << "Embedded driver added";

        mydb.setDatabaseName("test");

        if (!mydb.open()) //Try to opens the database
        {
            qDebug() << "Error while opening the database";
        }
        else
        {
            qDebug() << "DB test opened";
            QSqlQuery tables(mydb);
            QString sql;
            sql = "SELECT count(*) FROM system";
            if (tables.exec(sql))
            {
                tables.first();
                qDebug() << "Total records is: " << tables.value(0).toString() << " ok.";
            }
            else
            {
                qDebug() << tables.lastError().databaseText();
            }

        }
    }
    qDebug() << "Closing DB";
    QSqlDatabase::removeDatabase("connection1");
    qDebug() << "DB closed";

    //return a.exec();
    qDebug() << "En of program....";
}

Это работает нормально, и QSqlQuery правильно работает со встроенной базой данных, однако QMYSQLDriver достигает ошибки сегментации, когда я удаляю базу данных с помощью

QSqlDatabase::removeDatabase("connection1");

Это происходит потому, что QMYSQLDriver выполняет это в строке 1337:

mysql_close(d->mysql);

Я не знаю, почему происходит сбой драйвера QT. Также я не знаю, является ли это правильным способом для QT подключиться к встроенной базе данных mysql. Возможно, это не так, но как иначе установить каталог данных mysql?

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 11 января 2016

когда вы смотрите на код Qt, вам говорят

// comment the next line out if you want to use MySQL/embedded on Win32 systems.
// note that it will crash if you don't statically link to the mysql/e library!
# define Q_NO_MYSQL_EMBEDDED

, поэтому вы должны сделать статическую ссылку, но сейчас mysql не может быть скомпилирован с помощью mingw из коробки, вы можете найти некоторыепатчи могут сделать это.

Я думаю, что это конфликтует с механизмом плагина Qt, вы должны следовать ему, даже если вы делаете свой собственный драйвер mysql.

...