Я пытаюсь использовать 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?
Любая помощь очень ценится.