On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение
alkresin
moderator


Пост N: 31
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 31.01.08 11:36. Заголовок: Leto DB Server(продолжение)


Только что открыл на Sourceforge новый проект - Leto DB Server - https://sourceforge.net/projects/letodb

Это мультиплатформенный ( Windows, Unix/Linux ) сервер баз данных, предоставляющий клиентским программам доступ к dbf/cdx файлам, находящимся на удаленном сервере ( можно и на локальном компьютере запускать - в отладочных целях ). В общем, как ADS :).

Проект - на стадии разработки, не все даже базовые функции еще реализованы, до оптимизации дело еще не дошло. Но работает :).
Крутится у меня на сервере несколько дней, подключал до 15 клиентов, пока не падает. Мои программы работают с ним нормально.

Преимущества по сравнению с обычным файл-сервером:
1) Безопасность - базы могут быть в каталоге, недоступном для клиентских компьютеров - никто их случайно не удалит и не повредит.
2) Поскольку базы открываются серверной программой, а не клиентской, ее целостности ничего не грозит при случайном отключении клиентского компьютера.
3) значительное уменьшение сетевого траффика.
4) Должен быть, по идее, выигрыш в скорости.
5) Возможность контроля за пользователями с помощью утилиты manage ( можно придумать и другие формы контроля ).
6) Можно будет сделать транзакции, stored procedures на Харборе, ... и вообще все в наших руках :).

Кто хочет участвовать в разработке, тестировании - пишите.



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


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




Пост N: 1631
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.08.10 14:23. Заголовок: Пример udf-функции, ..


Пример udf-функции, которая вызывается с клиента, добавляет запись на сервере, заполняет ключевое поле по индексу cOrder, и возвращает полученную запись:

Function Leto_AppKey(nUserStru, cAlias, cOrder)
Local cRealAlias := Leto_Alias(nUserStru, cAlias)
Local cField, cKey := "", nKey

if ! Empty(cRealAlias)

dbSelectArea(cRealAlias)
OrdSetFocus(cOrder)
cField := IndexKey()
dbGoBottom()
cKey := FieldGet(FieldPos(cField))
nKey := Val(cKey)
dbAppend()
FieldPut(FieldPos(cField), StrZero(nKey+1, len(cKey)) )
dbCommit()
// Еще не реализовано: кроме возврата результата функции, на клиенте еще будет получена текущая запись в рабочей области cAlias
//leto_udfrec(nUserStru, cRealAlias)

endif
Return cKey

Какие будут мнения, сомнения, предложения, замечания ?


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


Пост N: 411
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 20.08.10 10:33. Заголовок: будут ли эти операто..



 цитата:
будут ли эти операторы компилироваться старым Harbour ?


Какие именно операторы ? Ф-я hb_HrbLoad(() в старом Harbour есть. А вот hbhrb.ch - нет, поэтому у меня оно не компилируется.

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


Пост N: 412
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 20.08.10 10:40. Заголовок: Обнаружил один непри..


Обнаружил один неприятный момент - dbusearea() перестала возвращать neterr(), когда это надо, а вместо этого выдает стандартный error. Раньше в letoOpen() ( leto1.c ) стояла проверка кода возврата от сервера, и если это -004, то предпринимались соответствующие действия. Теперь этот код закомментирован и вместо него используется ф-я leto_checkerror(), где эта проверка не производится. Если нет возражений, я сделаю как было.

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




Пост N: 1632
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.08.10 10:42. Заголовок: А у функции hb_hrbLo..


А у функции hb_hrbLoad 2 параметра, nOption и имя файла ?
Уберите hbhrb.ch , и поставьте
#define HB_HRB_BIND_DEFAULT 0x0


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




Пост N: 1633
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.08.10 10:45. Заголовок: alkresin пишет: Есл..


alkresin пишет:

 цитата:
Если нет возражений, я сделаю как было.



Конечно делайте
Еще надо заменить hb_retcAdopt на hb_retc_buffer в letofunc.c
Этой функции сейчас в Harbour нет

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


Пост N: 413
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 20.08.10 12:06. Заголовок: Pasha пишет: А у фу..


Pasha пишет:

 цитата:
А у функции hb_hrbLoad 2 параметра, nOption и имя файла ?


Нет, только имя файла

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




Пост N: 1634
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 20.08.10 14:30. Заголовок: alkresin пишет: Pas..


alkresin пишет:

 цитата:
Pasha пишет:

цитата:
А у функции hb_hrbLoad 2 параметра, nOption и имя файла ?



Нет, только имя файла



Плохо. У этой функции в разных версиях получаются разные правила вызова.
В старом Harbour есть еще функция __hrbLoad, которой нет в новом
Можно ли проверить, есть ли символ __hrbLoad, и, если есть, вызывать вместо функции hb_hrbLoad функцию __hrbLoad, но не напрямую, а через макроподстановку ?

Вроде:

#ifndef __XHARBOUR__
if SYMEXIST("__HRBLOAD") // как проверить ?
&("__HrbLoad(0,'letoudf.grb')")
else
hb_HrbLoad(0, "letoudf.grb")
endif
#else
...



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


Пост N: 414
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 20.08.10 19:15. Заголовок: Изначально проблема ..


Изначально проблема состоит в том, что в xHarbour и в Harbour 1.0 препроцессор работает не вполне корректно, так ведь ? Тогда можно перенести вызов hb_HrbLoad() на С уровень.

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




Пост N: 1636
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 01.09.10 11:56. Заголовок: Остался вопрос по ко..


Остался вопрос по корректному закрытию сервера при выключении компьютера.
Как можно под windows, терминал gtgui, перехватить событие WM_ENDSESSION ? Ведь окно программы не создается.

Кстати, при перезагрузке/выключении компьютера функция exit function не вызывается

Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 444
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 01.09.10 12:13. Заголовок: А если запускать Let..


А если запускать LetoDB как системную службу?

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



Пост N: 44
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 01.09.10 16:24. Заголовок: PSP пишет: А если з..


PSP пишет:

 цитата:
А если запускать LetoDB как системную службу?

на 98 винде где она эта служба?

Спасибо: 0 
Профиль
PSP
постоянный участник


Пост N: 445
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 01.09.10 16:30. Заголовок: AlexMyr пишет: на 9..


AlexMyr пишет:

 цитата:
на 98 винде где она эта служба?


Ну да... Просто я уже забыл про нее... :)

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




Пост N: 1637
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 02.09.10 09:32. Заголовок: Дело не в версии win..


Дело не в версии win, а в том, что letodb не служба, и средствами harbour ее сделать как служба сейчас не получится
Так что вопрос, где ловить событие, остается

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


Пост N: 415
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.09.10 10:21. Заголовок: Остался вопрос по ко..



 цитата:
Остался вопрос по корректному закрытию сервера при выключении компьютера.
Как можно под windows, терминал gtgui, перехватить событие WM_ENDSESSION ? Ведь окно программы не создается.


Варианты такие:
1) создать окно для сервера и обрабатывать сообщения, реализовав все это на С уровне без использования харборовских GUI библиотек. В принципе, это очень просто, вопрос в том, как это скажется на производительности - это можно проверить экспериментальным путем.
2) По примеру ранее обсуждавшейся утилиты написать маленькую утилитку с окном, которое будет ловить WM_ENDSESSION и корректно закрывать сервер. Правда, это может и не сработать - а вдруг Windows убьет letodb раньше, чем пошлет сообщение для этой утилиты.
3) Выяснить, есть ли в Windows средства поймать и обработать момент закрытия процесса, не имеющего окна.

1-й представляется наиболее универсальным ( для всех версий Windows ) и простым.

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


Пост N: 416
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 06.09.10 10:30. Заголовок: To Pasha: По поводу..


To Pasha:

По поводу последних изменений: было бы хорошо перенести эти новые элементы, возвращаемые при открытии таблицы в конец - так можно было бы избежать проблем с версиями клиента и сервера.

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


Пост N: 417
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 07.09.10 12:41. Заголовок: И еще по поводу посл..


И еще по поводу последних изменений - там закралась какая-то ошибка. Мне прислали вот такой тест:
Скрытый текст

При прохождении вверх/вниз в browse появляются лишние строки - что-то не то с eof()

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




Пост N: 1641
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.09.10 22:25. Заголовок: Я тоже пытался добит..


Я тоже пытался добиться от Itamar M. Lins Jr. Lins пример, но мне это не удалось. Наконец он его дал
Баг связан с буферизацией в skip при смене направления перемещения. Поскольку класс tbrowse в harbour и xharbour разный, в первом баг проявляется, а во втором - нет.
Вот как он проявляется, если в примере добавлять не 3 записи, а 2:

dbUseArea( .T. , 'LETO', cPath + 'test', 'pa', .F. , .F. , )
dbAppend()
REPLACE mercadoria WITH 'teste 1'
dbAppend()
REPLACE mercadoria WITH 'teste 2'

dbgotop()
Skip 1 // стабилизация tbrowse - идем вниз
? "skip 1", RecNo(), bof(), eof()
Skip 1 // стабилизация tbrowse - идем вниз
? "skip 1", RecNo(), bof(), eof()
Skip -1 // стабилизация tbrowse - уперлись в eof, возвращаемся
? "skip -1", RecNo(), bof(), eof()
Skip -1 // стабилизация tbrowse - уперлись в eof, возвращаемся
? "skip -1", RecNo(), bof(), eof()
skip -1 // пользователь нажал K_UP
? "skip -1", RecNo(), bof(), eof()
Skip 1 // пользователь нажал K_DOWN
? "skip 1", RecNo(), bof(), eof()
// здесь баг: после skip должна быть запись № 2, а остается запись № 1
Skip 1
? "skip 1", RecNo(), bof(), eof()
// дальше - последствия этого бага
wait

как исправить баг, я пока не увидел.


Спасибо: 0 
Профиль
alx_on
постоянный участник


Пост N: 100
Зарегистрирован: 07.07.09
ссылка на сообщение  Отправлено: 08.09.10 14:17. Заголовок: многопоточность При..


многопоточность

Примечание:
    Для использования таблиц в exclusive режиме приходится использовать hb_rddDetachArea и hb_rddRequestArea
    (при этом замедление работы одного соединения (в худшем варианте), примерно, 15%)
    Но (я надеюсь, пока не пробовал) в целом отзывчивость системы на множестве соединений должна быть лучше, чем раньше


0 - главный поток
    а) как и ранее отрабатывает новые соединения
    б) часть команд
    в) для (уже установленных) соединений принимает команды в буфер
      если есть свободный поток - вызывает ThreadCondUnlock для него


1 - вторичный поток
    а) только открывает и закрывает таблицы
      (дабы не городить огород, например, при одновременном открытии в двух потоках одной и той же таблицы)
      после открытия таблицы hb_rddDetachArea
      перед закрытием таблицы hb_rddRequestArea

    б) если есть новая команда (открытия закрытия) - снова отрабатывает
      если нет - ThreadCondWait


2 и далее (по ядрам или настраиваемо в ini)
    а) собственно отработка команд (кроме команд для потока 1)
      перед работой с таблицой hb_rddRequestArea
      после hb_rddDetachArea
      (один момент - ожидание другого потока, если таблица уже в работе)

    б) если есть новая команда - снова отрабатывает
      если нет - ThreadCondWait



Какие замечания к схеме?

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




Пост N: 1642
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.09.10 14:59. Заголовок: letodb работал на се..


letodb работал на сервере win2k. Внезапно он перестал запускаться. Причем, до сбоя компьютер не перегружался более месяца, и letodb также работал без останова (видно по логу) больше месяца.
Теперь по логу видно, что letodb стартует и сразу же останавливается. Раскопки показали, что завершение происходит на вызове:

if( ( hSocketMain = hb_ipServer( iServerPort, NULL, 10 ) ) == ( HB_SOCKET_T ) -1 )
return;

Перед return я поставил вызов hb_iperrorcode(), он возвращает код ошибки 0x2736. Где можно глянуть, что это за ошибка ?
Почему не выполняется hb_ipServer - совершенно непонятно. Пришлось перенести letodb на другой компьютер с winxp.
Но бывший сервер не коннектится с новым сервером, т.е. не работает и как клиент.
Это еще не все. В этой же сети есть станция с win98, которая полтора месяца назад вдруг ни с того ни с сего перестала коннектиться с letodb. Я писал об этом. Тогда на ней пришлось переустановить win98.
Так вот, теперь эта станция не коннектится с letodb на новом сервере.
Повторять переустановку ОС я не стал, пришлось настроить запуск letodb в режиме Share_Tables=1, и с этой станции работать с БД через dbfcdx.
Такие вот пироги с котятами. Самое неприятное, что такие сбои происходят неожиданно, после продолжительного периода стабильной работы без единого сбоя
Особенность этой сети то, что у сетевушек настроено два ip адреса, вторая подсеть - для доступа в инет. Но изначально letodb работал, работать он прекращает внезапно и навсегда, по неизвестной причине.


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




Пост N: 1643
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.09.10 15:12. Заголовок: Ошибку я нашел: #def..

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