Mod Подключаем MySql

Тема в разделе "Готовые работы", создана пользователем Garry599, 10 мар 2013.

  1. StaleCracker

    StaleCracker

    Регистрация:
    19 фев 2011
    Гугли std::thread и аналоги. Пили менеджмент своих сообщений.

    Я с sql не работал, но будет что-то вроде:
    Код:
    #include "thread"
    #include "mutex"
     
    vector<reqest> ReadyReq; // Обработанные
    mutex ReadyReq_mut;
     
    vector<reqest> WaitReq;  // Ожидающие обработки
    mutex WaitReq_mut;
     
    bool	ExitThread;
    mutex ExitThread_mut;
     
    void SqlThread( )
    {
    	BD* Bd = CreateBD();
    	bool isContinue = true;
    	while( isContinue )
    	{
    		 ExitThread_mut.lock();
    		 isContinue = !ExitThread;
    		 ExitThread_mut.unlock();
    		 if( !isContinue )
    			break;
    		reqest* req = NULL;
    		WaitReq_mut.lock();
    		req = WaitReq.At(0);
    		if( req )
    			WaitReq.erase( 0 );
    		WaitReq_mut.unlock();
     
    		if( !req )
    			std::this_thread::sleep_for(1s);
    		else
    		{
    			Bd.check( reqest );
    	  
    			ReadyReq_mut.lock();
    			ReadyReq.push_back( reqest );
    			ReadyReq_mut.unlock();
    		}
    	}
    	// Чистим все
    	ReleaseBD( bd );
    }
     
    void AddReqestBD( reqest* req  )
    {
    	 WaitReq_mut.lock();
    	 WaitReq.push_back( reqest );
    	 WaitReq_mut.unlock();
    }
     
    reqest* CheckReqest(  )
    { 
    	  reqest* req = NULL;
    	 ReadyReq_mut.lock();
    	  // Ищем нужный, записываем его в реквест, удаляем с вектора обработанных.
    	 ReadyReq_mut.unlock();
    	return req;
    )
     
    void StartBDThread( )
    {
    	 thread myThread(SqlThread);
    }
    Собственно на финише нужно убивать этот процесс, через ExitThread, лучше заджойниться с ним после установки переменной, и дождаться пока он закочит работу.
    Medvedev нравится это.
  2. Brightside

    Brightside

    Регистрация:
    2 июн 2013
    Можно делать временные таблицы с ENGINE MEMORY, откуда потом выгребать все в нужные таблицы в InnoDB любым обработчиком. Можно писать все в обычные файлы, из которых потом неспеша делать
    Код:
    LOAD DATA INFILE 'data.txt' INTO TABLE table;
    в нужные таблицы.

    В ситуации, когда дисковый массив сервера зачастую работает "на бобинах", и данные пачками инсертятся в MySQL myisam/innodb, то при большом количестве данных в таблицах и большом количестве одновременных операций все может завалиться. Это будет вдвойне невесело, если MySQL расположен на том же сервере, где работает фолач, потому что задержки в работе дисковой системы при нагрузках могут блокировать много CPU.

    Можно использовать какой-нибудь Redis как временное высокопроизводительное хранилище для временных данных, а потом выгребать и обрабатывать их в MySQL, расположенном на другом сервере, любым удобным способом с помощью воркера.
  3. Medvedev

    Medvedev

    Регистрация:
    17 сен 2014
    В общем, подогнал cpp как мне надо, но теперь не могу его скомпилировать. Точнее, после танцев с бубном, выяснилось, что скомпилировать может только VS2010, но с получившейся дллкой сервер не стартует в принципе, и валится с дампом. Можно попросить подробную инструкцию как и чем это компилировать?

    Код:
    #include "fonline_tla.h"
     
    #include "Windows.h"
     
    #include "mysql.h"
     
    #pragma comment (lib, "libmysql.lib")
     
    // Extern data definition
     
    _GlobalVars GlobalVars;
     
    // Entry point
     
    FONLINE_DLL_ENTRY( isCompiler )
     
    {
     
    if( isCompiler )
     
    return;
     
    // Test Memory Level 3 for loaded DLLs
     
    for( uint i = 0; i < 666; i++ )
     
    volatile char* leak = new char[ 2 ];
     
    }
     
    EXPORT int SqlQueryti(ScriptString& ServerIp ,int port ,ScriptString& name,ScriptString& pass, ScriptString& BdName, ScriptString& query, ScriptString& result)
     
    {
     
    MYSQL *conn;
     
    MYSQL_RES *res;
     
    MYSQL_ROW row;
     
    int i = 0;
     
    bool IsConected = false;
     
     
     
    // Получаем дескриптор соединения
     
    conn = mysql_init(NULL);
     
    result = "";
     
    if(conn == NULL)
     
    {
     
    // Если дескриптор не получен – выводим сообщение об ошибке
     
    result = "Error: can't create MySQL-descriptor \n";
     
    return 1;
     
    }
     
    // Подключаемся к серверу
     
    if(!mysql_real_connect(conn, ServerIp.c_str(), name.c_str(), pass.c_str(), BdName.c_str(), port, NULL, 0))
     
    {
     
    // Если нет возможности установить соединение с сервером
     
    // базы данных выводим сообщение об ошибке
     
    result = "Error: can't connect to database \n";
     
    return 2;
     
    }
     
    else
     
    {
     
    // Если соединение успешно установлено
     
    IsConected = true;
     
    mysql_set_character_set(conn, "cp1251"); //изменяем кодировку на нужную, по умалчанию идёт latin1
     
     
     
    }
     
     
     
    string tempSrt ="";
     
    if(IsConected)
     
    {
     
    mysql_query(conn, query.c_str()); //Делаем запрос
     
    return 0;
     
    }
     
    return 0;
     
    }
  4. Medvedev

    Medvedev

    Регистрация:
    17 сен 2014
    Буду признателен, если кто-то сможет скомпилировать. Бьюсь вторую неделю, но ничего не выходит. Даже оригинал не компилируется.
  5. Medvedev

    Medvedev

    Регистрация:
    17 сен 2014
    В общем, перепробовав десятки различных комбинаций ПО, удалось таки скомпилироваться. Выкладываю примерный порядок действий, если кому понадобится.

    1) Устанавливаем ПО:
    Microsoft SDKs
    mysql-5.1.40
    Microsoft Visual Studio 10.0

    Делаем полную установку, а не рекомендуемую.

    2) На всякий пожарный копируем сборку сервера в отдельную папку.

    3) Кладем MySqlСonnect.cpp в папку server/scripts.

    4) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\include и копируем оттуда всё в server/scripts.

    5) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\bin и копируем оттуда libmysql.dll в server/scripts.

    6) Идем в C:\Program Files (x86)\MySQL\MySQL Server 5.1\lib\opt и копируем оттуда libmysql.lib в server/scripts, т.к. без него libmysql.dll не будет правильно открываться.

    7) Открываем блокнот, создаем новый файл, копируем туда следующий код, после чего сохраняем как makeMySqlConnect.bat в server/scripts. Проверяем, чтобы все пути совпадали с теми, где у вас реально установлеон ПО.

    Код:
    @echo off
    @: Environment
    @set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE;%PATH%
    @set PATH=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN;%PATH%
    @set LIB=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\LIB;%LIB%
    @set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\Lib;%LIB%
    @set LIB=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib;%LIB%
    @set LIB=.\StlPort;%LIB%
    @set INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include;%INCLUDE%
    @set INCLUDE=.\StlPort;%INCLUDE%
    @set INCLUDE=C:\Program Files (x86)\Windows Kits\8.1\Include\shared;%INCLUDE%
    @set INCLUDE=C:\Program Files (x86)\Windows Kits\8.0\Include\shared;%INCLUDE%
    @set INCLUDE=C:\Program Files (x86)\Windows Kits\8.1\Include\um;%INCLUDE%
    @set INCLUDE=C:\Program Files\MySQL\MySQL Server 5.1\include;%INCLUDE%
     
    @set INCLUDE=C:\Program Files\MySQL\Connector.C++ 1.1\include\cppconn;%INCLUDE%
    @set INCLUDE=C:\Program Files\MySQL\Connector.C++ 1.1\include;%INCLUDE%
     
    @set LIB=C:\Program Files\MySQL\Connector.C++ 1.1\lib\opt;%LIB%
     
    @set INCLUDE=C:\Program Files\MySQL\MySQL Connector.C 6.1\include;%INCLUDE%
     
    @set LIB=C:\Program Files\MySQL\MySQL Connector.C 6.1\lib;%LIB%
     
    @set INCLUDE=C:\Program Files\MySQL\MySQL Server 5.1\include;%INCLUDE%
     
    @set INCLUDE=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include;%INCLUDE%
     
    @: Server
    @del "./MySqlConnect.dll"
    cl.exe /nologo /MT /W3 /O2 /Gd /D "__SERVER" /Fo"./MySqlConnect.obj" /FD /c "./MySqlConnect.cpp"
    link.exe /nologo /dll /incremental:no /machine:I386 "./MySqlConnect.obj" /out:"./MySqlConnect.dll"
     
    @pause
    7) Запускаем makeMySqlConnect.bat в server/scripts. Если всё прошло удачно, в server/scripts появится MySqlConnect.dll.

Поделиться этой страницей