Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx59 / docx177 / КурсУги (2).docx
Скачиваний:
18
Добавлен:
01.08.2013
Размер:
1.14 Mб
Скачать

Модуль 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.";

}

Соседние файлы в папке docx177