Russian Qt Forum
Сентябрь 24, 2024, 18:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4 + MySql-embedded под Windows  (Прочитано 14752 раз)
bigirbis
Гость
« : Июль 30, 2007, 12:38 »

Объясните дятлу по пунктам, что за чем идет после сборки самого мускуля. (Везде по разному пишут, уже запутался, а результата ни какого)
Записан
crocus
Гость
« Ответ #1 : Июль 31, 2007, 11:02 »

Ну раз настойчивый Улыбающийся
Цитировать
MySQL Embedded Server

This is a useful way of providing a stand-alone application that incorporates a database server. As noted above, the embedded server libraries seem to have disappeared from the MySQL 5 releases, so you will need to go back to MySQL 4 or compile MySQL 5 from source with the embedded server option. To keep it simple, obtain the "Windows (x86) ZIP/Setup.EXE" package for MySQL 4.1.22 and install only the Developer Components.

Locate the libmysqld.lib file in c:\mysql\Embedded\DLL\release and make the conversion of the library file to the GNU compatible form:

# cd c:\mysql\Embedded\DLL\release
# reimp -d libmysqld.lib
# dlltool -k --input-def libmysqld.def --dllname libmysqld.dll --output-lib libmysqld.a

Change the code in the source file c:\qt\src\sql\drivers\mysql\qsql_mysql.cpp to the lines below (this is near the bottom of the file) since the mysql_get_client_version() function call appears to have changed or disappeared from the MySQL API.

//#if MYSQL_VERSION_ID >= 40108
// d->preparedQuerysEnabled = mysql_get_client_version() >= 40108
// && mysql_get_server_version(d->mysql) >= 40100;
//#else
// d->preparedQuerysEnabled = false;
//#endif
d->preparedQuerysEnabled = true;

At the top of this file is a section that needs to be commented out as follows:

//#ifdef Q_OS_WIN32
// 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
//#endif

The advice is to be taken seriously. We will need to statically link the libmysqld.a file. If MySQL server is to be incorporated into an application, then it is likely that Qt would also be statically compiled with the application, as Qt is not common in the Windows world.

Now do the following for static compilation of Qt and MySQL Embedded:

# cd c:\qt
# mingw32-make clean
# configure -debug-and-release -static -qt-sql-mysql -l mysqld -I c:\mysql\include -L c:\mysql\embedded\dll\release
# mingw32-make sub-src

The third option -l specifies the libmysqld.a library to use, the second (capital i) specifies the directory of the MySQL include files and the final -L specifies the directory of the MySQL library file. The make sub-src line ensures that the examples are not built. This not only cuts down the compilation time, but also the disk space as each example is built with the full Qt static linkage.

This compiles without errors, but I have not yet attempted to compile an application to make use of the embedded MySQL server.
Записан
bigirbis
Гость
« Ответ #2 : Июль 31, 2007, 11:34 »

Прошу прощения, за расплывчатость вопроса. :oops:
Как будет правильно пересобрать SQL модуль Qt после сборки самого мускуля? Какие там действия?
Записан
crocus
Гость
« Ответ #3 : Июль 31, 2007, 13:51 »

Кстати какую версию MySQL собирал.
И еще http://prokyon3.sourceforge.net - отсюда все...
Записан
bigirbis
Гость
« Ответ #4 : Июль 31, 2007, 14:30 »

Цитировать
Кстати какую версию MySQL собирал

4.1.22
Записан
crocus
Гость
« Ответ #5 : Январь 09, 2008, 03:53 »

А что разве вопрос еще открыт??
Записан
ритт
Гость
« Ответ #6 : Январь 14, 2008, 12:42 »

для меня открыт!
венда, мингв...
скачал 5.1.22, собрал плагин шаредом, сложил май.ини, дата, mysqld.dll в папку с проектом - думаю "всё, вроде"
при попытке соединения молча крашит, возвращая код выхода 1
хоть бы на своём на аглицком выматерился Грустный

ассистант говорит:
Цитировать
The MySQL embedded server is a drop-in replacement for the normal client library. With the embedded MySQL server, a MySQL server is not required to use MySQL functionality.

To use the embedded MySQL server, simply link the Qt plugin to libmysqld instead of libmysqlclient. This can be done by replacing -lmysqlclient_r by -lmysqld in the qmake command in the section below.
врёт, похоже...

перекопал все доки, до которых дорвался...заискал весь форум прокъёна (нашёл похожую траблу, но под лялихом)...мысли закончились
выручайте!
Записан
Tonal
Гость
« Ответ #7 : Январь 14, 2008, 13:52 »

Собери с отладочной инфой и запусти под отладчиком - дальше будем посмотреть. :-)
Записан
ритт
Гость
« Ответ #8 : Январь 14, 2008, 14:51 »

так и сделаю...наверное, ближе к вечеру (надо винт почистить, а то дэбажка не влезет)
Цитировать
//#ifdef Q_OS_WIN32
// 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
//#endif
для чего здесь говорится, что надо статически линковать, а то будет крашить? и при этом в ассистанте говорят, что можно просто эмбэд-либу шаред вместо клиентской шаред скормить...

а мускули тоже молодцы: на запрос документации по эмбэддед-мускулю выслали пдфку о том, как хороша встроенная версия мускуля, и поблагодарили за то, что свой мыльник им спалил...
Записан
Tonal
Гость
« Ответ #9 : Январь 14, 2008, 18:22 »

Пока не видел не одного отзыва о том что удалось завести MySql под виндой.
Похоже пока SQLite и Firebird для эмбедид рулят.
Записан
crocus
Гость
« Ответ #10 : Январь 14, 2008, 18:43 »

Работает под MinGW.
Правишь drivers.pri и mysql.pro
Собирал -qt-sql-mysql
Коннект к серверу  в main.cpp.. адаптировано под Qt4 из прокиона
Лучше не my.ini а .cnf (c my не завел)
У меня так
Код:
[embedded]
skip-bdb
skip-innodb
skip-ndbcluster
skip-networking
skip-grant-tables

[coolproga_embedded_SERVER]
port=3309
default-character-set=utf8_general_ci
в папку с exешником копируешь /data и /share
« Последнее редактирование: Январь 14, 2008, 19:06 от crocus » Записан
ритт
Гость
« Ответ #11 : Январь 15, 2008, 02:47 »

так-с...убил ещё два часа...

cодержимое e:/opt/project/trunk/my.cnf:
Код:
[embedded]
skip-bdb
skip-innodb
skip-ndbcluster
#skip-networking
skip-grant-tables

[project_embedded_SERVER]
port=3307

basedir=e:/opt/project/trunk
datadir=e:/opt/project/trunk/data
tmpdir=d:/windows/temp

default-character-set=cp1251
default-collation=cp1251_general_ci
character_sets-dir=e:/opt/project/trunk/share/charsets/

в qsql_mysql.cpp закомментировано # define Q_NO_MYSQL_EMBEDDED, а qLibraryInit() выглядит следующим образом:
Код:
static void qLibraryInit()
{
#ifndef Q_NO_MYSQL_EMBEDDED
# if MYSQL_VERSION_ID >= 40000
    if (qMySqlInitHandledByUser || qMySqlConnectionCount > 1)
        return;

static char *server_args[] = {
    "project_embedded_SERVER",
    "--defaults-file=e:/opt/project/trunk/my.cnf",
    "--key_buffer_size=32M"
};
static char *server_groups[] = {
    "embedded",
    "server",
    "project_embedded_SERVER",
    (char *)NULL
};

# if (MYSQL_VERSION_ID >= 40110 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50003
    if (mysql_library_init(sizeof(server_args) / sizeof(char *), server_args, server_groups)) {
# else
    if (mysql_server_init(sizeof(server_args) / sizeof(char *), server_args, server_groups)) {
# endif
        qWarning("QMYSQLDriver::qServerInit: unable to start server.");
    }
# endif // MYSQL_VERSION_ID
#endif // Q_NO_MYSQL_EMBEDDED
}

при попытке инициализировать драйвер
Код:
QSqlDatabase::addDatabase("QMYSQL");
валится в qsql_mysql.cpp на строке
Код:
if (mysql_library_init(sizeof(server_args) / sizeof(char *), server_args, server_groups)) {
с сообщением
Цитировать
Program received signal SIGSEGV, Segmentation fault.

0x7c918fea in ntdll!RtlpWaitForCriticalSection () from D:\WINDOWS\system32\ntdll.dll

т.е. дело даже не доходит до соединения с сервером - валится ещё при инициализации

если
Код:
if (mysql_library_init(sizeof(server_args) / sizeof(char *), server_args, server_groups)) {
заменить на
Код:
if (mysql_library_init(0, 0, 0)) {
, то молча выходит с кодом 01
Записан
ритт
Гость
« Ответ #12 : Январь 16, 2008, 02:48 »

так-с...для меня тема закрыта!
если ещё кто хочет для себя её закрыть, рисуем пиво и стучимся к крокусу в приват Улыбающийся

зы. мускули в своём проспекте не наврали - падения производительности я пока не наблюдаю
« Последнее редактирование: Январь 16, 2008, 02:53 от xep » Записан
aliks-os
Гость
« Ответ #13 : Май 28, 2013, 09:04 »

Так подскажите же в чем же дело...я на те же грабли наступаю...

так-с...для меня тема закрыта!
если ещё кто хочет для себя её закрыть, рисуем пиво и стучимся к крокусу в приват Улыбающийся

зы. мускули в своём проспекте не наврали - падения производительности я пока не наблюдаю
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 21.