- •Пояснительная записка
- •1 Описание метода решения задачи
- •1.1 Исходные данные (технические требования) на проектирование
- •1.2 Mpi (Message Passing Interface)
- •2 Описание глобальных переменных
- •3 Спецификации на программные модули
- •3.1 Модуль Main.Cpp
- •3.2 Модуль Server.Cpp
- •8 Руководство пользователя
- •Приложение а. Листинг программного текста.
- •Модуль Server.Cpp
- •Приложение б. Uml Диаграммы.
- •Приложение в. Результаты работы программ.
Модуль Server.Cpp
// Server.cpp
#include "Header.h"
#include "Extern.h"
int DoServerProcess()
{
cout << "----- Server " << ProcRank << " -----" << endl;
//--------------- Соединение сервера с БД (содержит информацию) --------
HSTMT hstmt; //идентификатор оператора
HDBC hdbc; //идентификатор соединения
HENV henv; //идентификатор среды
SQLRETURN retcode;
char dbase[]="Storage_"; //имя БД
char user[]=""; //имя пользователя
char passwd[]=""; //пароль пользователя
itoa(ProcRank, &dbase[7], 10); // дописываем в название базы ProcRank
cout << "DB: " << dbase << endl;
SQLINTEGER sStorageID;
SQLCHAR szName[SIZE_BUF];
SQLINTEGER sSeries;
SQLCHAR szColor[SIZE_BUF];
SQLINTEGER sYear;
SQLINTEGER sCost;
SQLINTEGER cbStorageID;
SQLINTEGER cbName;
SQLINTEGER cbSeries;
SQLINTEGER cbColor;
SQLINTEGER cbYear;
SQLINTEGER cbCost;
//Назаначение идентификатора среды
retcode=SQLAllocEnv(&henv);
if (SQL_SUCCESS!=retcode)
{
printf("HENV Error! Exit\n");
_getch();
return -1;
}
//назначение идентификатора соединения
retcode=SQLAllocConnect(henv,&hdbc);
if (SQL_SUCCESS!=retcode)
{
printf("HDBC Error! Exit\n");
SQLFreeEnv(henv);
_getch();
return -1;
}
cout << "Connecting to DataBase...";
retcode=SQLConnect(hdbc,(SQLCHAR*)dbase,
SQL_NTS,(SQLCHAR*)user,
SQL_NTS,(SQLCHAR*)passwd,
SQL_NTS);
if (SQL_SUCCESS != retcode)
{
printf("Problem with connect to DB! Exit\n");
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
_getch();
return -1;
}
cout << "DONE!" << endl;
retcode=SQLAllocStmt(hdbc,&hstmt);
if(SQL_SUCCESS!=retcode)
{
printf("HSTMT Error! Exit\n");
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
_getch();
return -1;
}
//------------- Цикл работы сервера --------------------
while(1)
{
int countRec = 0;
MPI_Recv(&countRec, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
cout << "Count to receive: " << countRec << endl;
char *SQLStrRec = new char[50];
MPI_Recv(SQLStrRec, countRec, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &Status);
SQLStrRec[countRec] = '\0';
cout << "SQLStrRec = " << SQLStrRec << endl; // получили строку SQL-запроса
if (!strcmp(SQLStrRec, "exit")) break;
//выполнение SQL-оператора
char mes [SIZE_BUF]; // для отправки
char **message = new char*[256]; // не более 256 строк как результат SQL-запроса
retcode=SQLExecDirect(hstmt,(SQLTCHAR*)(LPCTSTR)SQLStrRec,strlen(SQLStrRec));
if (SQL_SUCCESS==retcode)
{
cout << "SQLExecDirect DONE!" << endl << endl;
int countStr = 0;
//выборка следующей строки
while(1)
{
retcode=SQLFetch(hstmt);
if(SQL_SUCCESS==retcode)
{
//выборка данных из колонок
SQLGetData(hstmt, 1, SQL_C_LONG,&sStorageID,0,&cbStorageID);
SQLGetData(hstmt, 2, SQL_C_CHAR, szName, SIZE_BUF, &cbName);
SQLGetData(hstmt, 3, SQL_C_LONG,&sSeries,0,&cbSeries);
SQLGetData(hstmt, 4, SQL_C_CHAR, szColor, SIZE_BUF, &cbColor);
SQLGetData(hstmt, 5, SQL_C_LONG,&sYear,0,&cbYear);
SQLGetData(hstmt, 6, SQL_C_LONG,&sCost,0,&cbCost);
message[countStr] = new char[SIZE_BUF];
sprintf(message[countStr], "%d\t%s\t%d\t%s\t%d\t%d\n", sStorageID, szName, sSeries, szColor, sYear, sCost);
cout << message[countStr];
countStr++;
}
else break;
}
// пересылаем результат клиенту
int countStrSend = countStr;
MPI_Send(&countStrSend, 1, MPI_INT, 0, ProcRank, MPI_COMM_WORLD); // сколько строк
cout << "countStrSend = " << countStrSend << endl;
for (int i=0; i<countStrSend; i++)
{
int len = strlen(message[i]) + 1;
MPI_Send(&len, 1, MPI_INT, 0, ProcRank, MPI_COMM_WORLD);
MPI_Send(message[i], len, MPI_CHAR, 0, ProcRank, MPI_COMM_WORLD); // сами строки
}
}
else cout << "SQLExecDirect Error";
}
// Закрываем соединения
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
cout << endl << endl << "End of work server.";
}