Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Embedded MySQL  (Прочитано 14697 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 24-09-2009 04:12 » 

при установке MySQL 5.0 увидел в дереве установщика  компонентов пункт Embedded server - это что ли можно прямо в экзешник зашить СУБД ?  Как это делается и какие плюсы и минусы ?
« Последнее редактирование: 25-09-2009 02:45 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 24-09-2009 11:12 » 

Не думаю, что можно в исполняемый файл зашить сервис баз данных..
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 24-09-2009 14:39 » 

так наверное просто получится поддержка чисто в данном экзешнике. Хотя, фиг знает ) Потом попробую, если руки дойдут
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 24-09-2009 16:10 » 

Это не экзешник - это библиотека. Полноценный MySQL-сервер в рамках одного процесса.
« Последнее редактирование: 25-09-2009 02:46 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 25-09-2009 02:54 » 

Ром, то есть, даже устанавливать из дистрибутива MySQL тогда не нужно будет ? Просто длл рядом положить и всё ? Я вот ещё вычитал в туторе, что для embedded надо будет лишь вызвать в начале работы приложения

mysql_library_init(int argc, char **argv, char **groups);

а по завершении -
mysql_library_end(void);


собственно, почему заинтерисовался - именно такая политика системы задумывается, что с базой общаться будет только программа-сервер (причём локально на компьютере) и никто более. Всё остальное работает через эту программу. И если есть возможность просто длл скопировать вместо запуска инталляшки MySQL - это было бы здорово

тут
C:\Program Files\MySQL\MySQL Server 5.0\Embedded\DLL\release

лежат файлики
libmysqld.lib
libmysqld.dll
libmysqld.exp

первые два понятно, а что за libmysqld.exp ?
« Последнее редактирование: 25-09-2009 03:03 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-09-2009 03:51 » 

что то не выходит...

(все длл для удобства закинуты в system32)

сначала попробовал не embedded :
Код:
#pragma comment(lib,"libmysql.lib")

//возвращает 0 - видимо, так оно и правильно
mysql_server_init(0,0,0);

MYSQL* pCONN=0;

pCONN=mysql_init(0);

if(pCONN)
{
   pCONN=mysql_real_connect(pCONN,"localhost","root","1","mysql",3306,0,0);
   //соединение удачно установлено, pCONN!=0
}

тут на первый взгляд всё пучком.

пробую embedded :
Код:
#pragma comment(lib,"libmysqld.lib")

//возвращает 1 !!!
mysql_server_init(0,0,0);

MYSQL* pCONN=0;

pCONN=mysql_init(0);

//pCONN==0 !!!


что не так делаю ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 25-09-2009 03:53 » 

MySQL 5.1.
21.9. libmysqld, the Embedded MySQL Server Library


И еще mysql_thread_init() и mysql_thread_end() для каждого потока при многопоточном приложении.

Естественно, все равно нужен конфиг my.ini (или конфиг может быть передан в mysql_library_init()), нужна директория для баз, директория для временных таблиц и прочее, что потребуется для данной конфигурации.

Цитата
The choice of whether the application operates as a regular client or uses the embedded server depends on whether you use the libmysqlclient or libmysqld library at link time to produce the final executable. For additional information, see Section 21.10.2, “C API Function Overview”.

Леш, внимательно почитай мануал - там сказано, когда что надо вызывать и как собрать приложение. Причем, видимо, лучше работать с 5.1.

Тут пример приложения:
http://dev.mysql.com/doc/refman/5.1/en/libmysqld-example.html
« Последнее редактирование: 25-09-2009 03:57 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 25-09-2009 04:02 » 

хм, на функции mysql_thread_init() и mysql_thread_end()  линкер ругается

 error LNK2019: ссылка на неразрешенный внешний символ _mysql_thread_init@0 в функции "public: __thiscall CSERVER_DLG::CSERVER_DLG(class CWnd *)" (??0CSERVER_DLG@@QAE@PAVCWnd@@@Z)

 error LNK2019: ссылка на неразрешенный внешний символ _mysql_thread_end@0 в функции "public: virtual __thiscall CSERVER_DLG::~CSERVER_DLG(void)" (??1CSERVER_DLG@@UAE@XZ)


пример поглядел, программа падает в
Цитата
/ special version of CThreadSlotData::GetData that only works with
// thread local storage (and not process local storage)
// this version is inlined and simplified for speed
inline void* CThreadSlotData::GetThreadValue(int nSlot)
{
   EnterCriticalSection(&m_sect);
   ASSERT(nSlot != 0 && nSlot < m_nMax);
   ASSERT(m_pSlotData != NULL);
   ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
<...>
}

nSlot имеет невменяемое значение, наверное как раз изза не  вызванного mysql_thread_init()



------------------
пока разбираться нет времени, оставил не embedded...
« Последнее редактирование: 25-09-2009 05:09 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 25-09-2009 04:40 » 

блин, ещё и
pCONN=mysql_real_connect(pCONN,"localhost","root","1","mysql",3306,0,0);

стало возвращать 0 , совсем весело )))


-- разобрался: в конфигураторе нужно поставить галочку "TCP/IP"
« Последнее редактирование: 25-09-2009 05:06 от Алексей1153++ » Записан

Paul
Участник

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 02-06-2010 10:37 » new

Хочу заменить у себя MySQL на MySQL embedded. В мануале как-то расплывчато сказано что именно использовать. Если беру mysql_server_init(0,0,0), сервер инициализируется, если mysql_library_init, то программа вылетает не поясняя почему она так делает (mysql_errno выдаёт 0).

Вот пример кода:

Код:
static char *server_options[] = { "mysql_test", "--defaults-file=my.cnf",NULL };
int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;
static char *server_groups[] = { "libmysqld_server", "libmysqld_client", NULL };

BOOL CMyProg_onlineDlg::OnInitDialog()
{
....
   if(mysql_library_init(num_elements, server_options, server_groups)!=0)
      MessageBox("Ошибка");
....
}

Собственно вылетает не доходя до сообщения "Ошибка". Подскажите в какую сторону копать.

my.ini:
Код:
[client]
default-character-set=utf8
[server]
default-character-set=utf8
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines