On-line: alex_II, PSP, гостей 2. Всего: 4 [подробнее..]
АвторСообщение
Dima
администратор




Пост N: 2728
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 12.03.13 11:27. Заголовок: Leto DB Server (продолжение 9)


Продолжаем тут

Спасибо: 0 
Профиль
Ответов - 301 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]


Pasha
Администратор




Пост N: 3068
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 06.12.13 14:34. Заголовок: Согласен. А в исходн..


Согласен. А в исходниках сервера можно убрать ветки для xHarbour.
Только ветки с __OLDRDD__ я еще использую (для xHarbour)

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 735
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 10.12.13 14:20. Заголовок: Что-то до меня никак..


Что-то до меня никак не доходит смысл конструкции в leto_ConnectionClose():

pConnection->bCloseAll = 0;
hb_rddIterateWorkAreas( leto_CheckAreas, (void *) pConnection );
if( pConnection->bCloseAll )
leto_CloseAll( pConnection );

leto_CheckAreas() проверяет, принадлежит ли area этому соединению и является ли она leto area. Если хоть одна такая area находится, то тогда выполняется leto_closeall() - а там опять такая же проверка ( в leto_doclose() ). Почему нельзя сразу вызвать leto_closeall() ?
И непонятно, зачем в leto_closeall() перед и после вызова hb_rddIterateWorkAreas() устанавливается pConnection->bCloseAll ?

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3071
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 14:36. Заголовок: leto_ConnectionClose..


leto_ConnectionClose() вызывается по leto_disconnect(), или при завершении программы.
Должно быть закрыто только указанное соединение, или текущее.
При вызове leto_disconnect() могут быть открыты рабочие области на нескольких серверах letodb, и локальные р.о.
По hb_rddIterateWorkAreas проверяется, открыта ли хотя бы одна р.о. на этом сервере. Если открыта - тогда надо выдать команду этому серверу, и только этому: close_all. Если нет открытых р.о. - то такую команду именно этому серверу выдавать незачем. Все остальные р.о. - с других серверов letodb и локальные - должны остаться открытыми.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 736
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 10.12.13 14:57. Заголовок: Pasha пишет: Если о..


Pasha пишет:

 цитата:
Если открыта - тогда надо выдать команду этому серверу, и только этому: close_all


Но ведь такая же проверка осуществляется еще раз в leto_doClose().
Т.е. можно в leto_doClose() добавить строчку:

if( leto_CheckAreaConn( pArea, ( LETOCONNECTION * ) p ) )
{
SELF_CLOSE( pArea );
pConnection->bCloseAll = 1;
}

и в leto_CloseAll() выдавать команду close_all, если установлен pConnection->bCloseAll:

if( pConnection->bCloseAll )

Тогда мы избавляемся от того лишнего кода в leto_ConnectionClose() и от функции leto_CheckAreas(), которая только оттуда вызывается.
Или я что-то упустил ?

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3072
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 15:11. Заголовок: leto_closeAll безусл..


leto_closeAll безусловно выдает команду серверу "close_all". А если уже все р/о с этого сервера закрыты, то эта команда не нужна. Вот и делается дополнительная проверка перед вызовом leto_closeAll(), нужен ли вообще этот вызов.

Хотя конечно, можно объединить все в hb_rddIterateWorkAreas. Но тогда в pConnection надо добавить еще один флаг, дополнительно к bCloseAll

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 738
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 10.12.13 15:40. Заголовок: Зачем еще один флаг ..


Зачем еще один флаг ?

static ERRCODE leto_doClose( AREAP pArea, void * p )
{
if( leto_CheckAreaConn( pArea, ( LETOCONNECTION * ) p ) )
{
SELF_CLOSE( pArea );
pConnection->bCloseAll = 1;
}
return SUCCESS;
}

BOOL leto_CloseAll( LETOCONNECTION * pConnection )
{
char szData[16];

hb_rddIterateWorkAreas( leto_doClose, (void *) pConnection );
if( pConnection->bCloseAll )
{
if( leto_CheckServerVer( pConnection, 100 ) )
sprintf( szData,"close_all;\r\n" );
else
sprintf( szData,"close;00;\r\n" );

pConnection->bCloseAll = 0;
if( leto_DataSendRecv( pConnection, szData, 0 ) )
return TRUE;
else
return FALSE;
}
else
return TRUE;
}

void leto_ConnectionClose( LETOCONNECTION * pConnection )
{

if( pConnection->pAddr )
{
leto_CloseAll( pConnection );
...
}
}

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3074
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 15:54. Заголовок: Так в SELF_CLOSE( pA..


Так в SELF_CLOSE( pArea ) используется флаг bCloseAll, чтобы не выдавать серверу команды close. А тут он используется еще и для того, чтобы отметить, есть ли открытые р/о с этого сервера. Вот поэтому и нужны 2 флага: один для SELF_CLOSE, а второй - чтобы затем определить, выдавать или нет команду close_all.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 739
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 10.12.13 16:09. Заголовок: Так в SELF_CLOSE( pA..



 цитата:
Так в SELF_CLOSE( pArea ) используется флаг bCloseAll, чтобы не выдавать серверу команды close.


Ну так поменяем местами строчки в предлагаемом варианте leto_doClose() и этот флаг выполнит обе функции:
static ERRCODE leto_doClose( AREAP pArea, void * p )
{
if( leto_CheckAreaConn( pArea, ( LETOCONNECTION * ) p ) )
{
pConnection->bCloseAll = 1;
SELF_CLOSE( pArea );
}
return SUCCESS;
}

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3075
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 16:15. Заголовок: Да, так сработает...


Да, так сработает.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3076
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 16:18. Заголовок: Хотя нет. Вызов то б..


Хотя нет. Вызов то будет для всех р.о, в том числе с других серверов. Тогда будут закрыты р.о., которые закрывать не надо.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 740
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 10.12.13 17:41. Заголовок: Хотя нет. Вызов то б..



 цитата:
Хотя нет. Вызов то будет для всех р.о, в том числе с других серверов


Какой вызов ? Сигнал close_all ? Так он посылается по одному определенному соединению, на один сервер.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3077
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.12.13 19:46. Заголовок: Это я уже туплю. Все..


Это я уже туплю. Все там в порядке.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 742
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 11.12.13 08:53. Заголовок: Ok. Я сейчас в этом ..


Ok. Я сейчас в этом копаюсь, потому что хочу разбить клиентский модуль на две части, выделить client engine, который не будет содержать вызовов Harbour функций и может использоваться в приложениях на других языках. К тому же это позволит упростить и лучше структуировать код.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3079
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 11.12.13 09:19. Заголовок: Хорошее дело, и нужн..


Хорошее дело, и нужное, только сложное.
А какие есть планы по клиентской библиотеке ? Просто сделать dll по типу ace32 ?

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 743
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 11.12.13 10:34. Заголовок: Хорошее дело, и нужн..



 цитата:
Хорошее дело, и нужное, только сложное.


Буду делать постепенно - сначала connect/disconnect, management функции, запись/чтение переменных - уже в таком наборе это можно использовать. Потом одну за другой функции для работы с БД.

 цитата:
А какие есть планы по клиентской библиотеке ? Просто сделать dll по типу ace32 ?


Есть 3 C файла - letoclient.c, common_c.c, blowfish.c, их можно непосредственно включить в проект, или построить из них dll или lib. А какие еще варианты ?

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 745
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 11.12.13 17:37. Заголовок: Объясните мне, пожал..


Объясните мне, пожалуйста, еще такую вещь:

leto_GetServerCdp() вызывается только из leto_ConnectionNew(), т.е. когда pConnection только создан и pConnection->pCdpTable пуста - и leto_GetServerCdp() ничего там найти не может ...

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3082
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 12.12.13 16:06. Заголовок: Я уже с трудом вспом..


Я уже с трудом вспоминаю тот алгоритм.
Кажется, предусматривалось вот что:

Сначала надо установить текущее соединение через вызов RDDI_CONNECTION.
Затем задать таблицу соответствия кодовых страниц вызовами LETO_ADDCDPTRANSLATE
И только после этого коннектиться к серверу.

Спасибо: 0 
Профиль
alkresin
moderator


Пост N: 746
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 12.12.13 18:08. Заголовок: RDDI_CONNECTION зако..


RDDI_CONNECTION закомментарен. Но, в любом случае, это не может работать, поскольку leto_GetServerCdp() вызывается только из leto_ConnectionNew(), т.е. до того как LETO_ADDCDPTRANSLATE могла бы отработать.

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3094
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.12.13 10:57. Заголовок: В функции leto_write..


В функции leto_writelog может быть стоит оставить одну ветку, с вызовами hb_fs* ?
Эта ветка выполняет все необходимые функции.
Зачем тянуть лишнюю ссылку на hb_fopen ?

Спасибо: 0 
Профиль
Pasha
Администратор




Пост N: 3095
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.12.13 11:01. Заголовок: alkresin пишет: RDD..


alkresin пишет:

 цитата:
RDDI_CONNECTION закомментарен. Но, в любом случае, это не может работать, поскольку leto_GetServerCdp() вызывается только из leto_ConnectionNew(), т.е. до того как LETO_ADDCDPTRANSLATE могла бы отработать.



Да нет там комментария:
case RDDI_CONNECTION:
...

А структура letoConnPool выделяется в letoInit, т.е до вызова leto_ConnectionNew().
По RDDI_CONNECTION можно установить текущее соединение, тоже до первого коннекта.
И LETO_ADDCDPTRANSLATE сможет отработать.

Спасибо: 0 
Профиль
Ответов - 301 , стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 All [только новые]
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 52
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет