Автор | Сообщение |
Dima
|
| |
Пост N: 2728
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.03.13 11:27. Заголовок: Leto DB Server (продолжение 9)
Продолжаем тут
|
|
|
Ответов - 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)
|
|
|
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 ?
|
|
|
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 и локальные - должны остаться открытыми.
|
|
|
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(), которая только оттуда вызывается. Или я что-то упустил ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 3072
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.12.13 15:11. Заголовок: leto_closeAll безусл..
leto_closeAll безусловно выдает команду серверу "close_all". А если уже все р/о с этого сервера закрыты, то эта команда не нужна. Вот и делается дополнительная проверка перед вызовом leto_closeAll(), нужен ли вообще этот вызов. Хотя конечно, можно объединить все в hb_rddIterateWorkAreas. Но тогда в pConnection надо добавить еще один флаг, дополнительно к bCloseAll
|
|
|
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 ); ... } }
|
|
|
Pasha
|
| Администратор
|
Пост N: 3074
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.12.13 15:54. Заголовок: Так в SELF_CLOSE( pA..
Так в SELF_CLOSE( pArea ) используется флаг bCloseAll, чтобы не выдавать серверу команды close. А тут он используется еще и для того, чтобы отметить, есть ли открытые р/о с этого сервера. Вот поэтому и нужны 2 флага: один для SELF_CLOSE, а второй - чтобы затем определить, выдавать или нет команду close_all.
|
|
|
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; }
|
|
|
Pasha
|
| Администратор
|
Пост N: 3075
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.12.13 16:15. Заголовок: Да, так сработает...
Да, так сработает.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3076
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.12.13 16:18. Заголовок: Хотя нет. Вызов то б..
Хотя нет. Вызов то будет для всех р.о, в том числе с других серверов. Тогда будут закрыты р.о., которые закрывать не надо.
|
|
|
alkresin
|
| moderator
|
Пост N: 740
Зарегистрирован: 06.07.06
|
|
Отправлено: 10.12.13 17:41. Заголовок: Хотя нет. Вызов то б..
цитата: | Хотя нет. Вызов то будет для всех р.о, в том числе с других серверов |
| Какой вызов ? Сигнал close_all ? Так он посылается по одному определенному соединению, на один сервер.
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 3077
Зарегистрирован: 23.05.05
|
|
Отправлено: 10.12.13 19:46. Заголовок: Это я уже туплю. Все..
Это я уже туплю. Все там в порядке.
|
|
|
alkresin
|
| moderator
|
Пост N: 742
Зарегистрирован: 06.07.06
|
|
Отправлено: 11.12.13 08:53. Заголовок: Ok. Я сейчас в этом ..
Ok. Я сейчас в этом копаюсь, потому что хочу разбить клиентский модуль на две части, выделить client engine, который не будет содержать вызовов Harbour функций и может использоваться в приложениях на других языках. К тому же это позволит упростить и лучше структуировать код.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3079
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.12.13 09:19. Заголовок: Хорошее дело, и нужн..
Хорошее дело, и нужное, только сложное. А какие есть планы по клиентской библиотеке ? Просто сделать dll по типу ace32 ?
|
|
|
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. А какие еще варианты ?
|
|
|
alkresin
|
| moderator
|
Пост N: 745
Зарегистрирован: 06.07.06
|
|
Отправлено: 11.12.13 17:37. Заголовок: Объясните мне, пожал..
Объясните мне, пожалуйста, еще такую вещь: leto_GetServerCdp() вызывается только из leto_ConnectionNew(), т.е. когда pConnection только создан и pConnection->pCdpTable пуста - и leto_GetServerCdp() ничего там найти не может ...
|
|
|
Pasha
|
| Администратор
|
Пост N: 3082
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.12.13 16:06. Заголовок: Я уже с трудом вспом..
Я уже с трудом вспоминаю тот алгоритм. Кажется, предусматривалось вот что: Сначала надо установить текущее соединение через вызов RDDI_CONNECTION. Затем задать таблицу соответствия кодовых страниц вызовами LETO_ADDCDPTRANSLATE И только после этого коннектиться к серверу.
|
|
|
alkresin
|
| moderator
|
Пост N: 746
Зарегистрирован: 06.07.06
|
|
Отправлено: 12.12.13 18:08. Заголовок: RDDI_CONNECTION зако..
RDDI_CONNECTION закомментарен. Но, в любом случае, это не может работать, поскольку leto_GetServerCdp() вызывается только из leto_ConnectionNew(), т.е. до того как LETO_ADDCDPTRANSLATE могла бы отработать.
|
|
|
Pasha
|
| Администратор
|
Пост N: 3094
Зарегистрирован: 23.05.05
|
|
Отправлено: 16.12.13 10:57. Заголовок: В функции leto_write..
В функции leto_writelog может быть стоит оставить одну ветку, с вызовами hb_fs* ? Эта ветка выполняет все необходимые функции. Зачем тянуть лишнюю ссылку на hb_fopen ?
|
|
|
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 сможет отработать.
|
|
|
Ответов - 301
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|