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: 1619
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 30.07.10 15:21. Заголовок: alkresin пишет: Т.е..


alkresin пишет:

 цитата:
Т.е. если удалить в kladr все записи кроме одной и написать программу...



Да, у меня ошибка 9009 выскочила, правда почему-то только на 3-й раз
А с фиксом все работает. Вроде бы код аналогичный, но тем не менее..
А в Harbour этот пример работает ?

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


Пост N: 408
Зарегистрирован: 25.12.07
ссылка на сообщение  Отправлено: 30.07.10 15:25. Заголовок: Andrey пишет: Какие..


Andrey пишет:

 цитата:
Какие еще могут быть варианты с запуском сервиса LetoDB ?



Я что-то не понимаю, если он сервис, то какие могут быть проблемы? Идем в службы, находим его и ставим - "тип запуска - Авто". ??

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


Пост N: 422
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 30.07.10 16:04. Заголовок: Запуск сервера - ..


Запуск сервера - "Панель управления - Назначенные задания"

<\/u><\/a>

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


Пост N: 404
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 30.07.10 16:40. Заголовок: А в Harbour этот при..



 цитата:
А в Harbour этот пример работает ?


У меня kladr сейчас под рукой нет, а качать 74М не хочется.

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



Пост N: 36
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 06.08.10 16:33. Заголовок: Сегодня упал сервер,..


Сегодня упал сервер, в letodb_crash.log
Breakdown at: 2010.08.06 10:37:04
Unrecoverable error 1010: hb_cdxIndexPageRead: Read index page failed.
------------------------------------------------------------------------
User: 127.0.0.1 GRU VIEWWSGUI.EXE
Command: ord;02;513;data;2;
Table: \res.dbf
Unrecoverable error 9104: hb_cdxIndexFree: index file still locked.
Breakdown at: 2010.08.06 10:44:45
Unrecoverable error 6005: Exception error: %s

Exception Code:C0000005
Exception Address:00408AC2
EAX:00000000 EBX:00000000 ECX:00000024 EDX:004C0000
ESI:0070FB0C EDI:01050174 EBP:0070FB18
CS:EIP:017F:00408AC2 SS:ESP:0187:0070FAF4
DS:0187 ES:0187 FS:0F9F GS:0000
Flags:00010293
CS:EIP: 83 7B 40 00 0F 84 19 02 00 00 8B 03 50 E8 4C 1A
SS:ESP: 00000000 0070FB18 01050174 0070FB0C 01052EA4 00408EBC 00000017 00000000 40E2E3A0 3638004C 30303538 76720031 76207265 392E302E 003B4E3B 00000000

C stack:
EIP: EBP: Frame: OldEBP, RetAddr, Params...
00408AC2 0070FB18 3638004C 30303538 76720031 76207265 392E302E 003B4E3B 00000000 004C0CF0 0070FB60 004A4474
...

и letodb.log
08/06/10 10:18:25: Leto DB Server has been started.
08/06/10 10:21:29: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:26:52: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:26:52: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:28:10: Leto DB Server has been started.
08/06/10 10:32:18: Leto DB Server has been started.
08/06/10 10:38:07: Leto DB Server has been started.
08/06/10 10:44:00: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:44:45: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:44:45: Error DBFCDX/1011 Write error: c:\cars\res.dbf (DOS Error 5)
08/06/10 10:48:42: Leto DB Server has been started.

База res размером 42 Мб, записей 1060560. Работает програма с декабря 2009 года.
Только один компьютер собирает информацию и записывает данные в базу через
leto_BeginTransaction()
...
leto_CommitTransaction(),
3-4 компа только читают.
После падения потерялись в базе за вчерашний день больше половины информации за сегодняший почти вся.
Что могло произойти?

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




Пост N: 1621
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.08.10 14:44. Заголовок: Ошибка возникает при..


Ошибка возникает при выполнении команды ord;02, т.е при вызове OrdKeyNo
Возможно, произошло разрушение индексного файла
Вы открываете БД в режиме shared или монопольно ?


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



Пост N: 39
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 09.08.10 11:00. Заголовок: Share_tables = 1..


Share_tables = 1

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




Пост N: 1622
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 09.08.10 11:22. Заголовок: AlexMyr пишет: Shar..


AlexMyr пишет:

 цитата:
Share_tables = 1



А зачем ? Если сервер открывает БД монопольно, он работает намного лучше
Возможно, в процессе совместной работы letodb и еще какой-то программы и произошло нарушение индекса.

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




Пост N: 1624
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 10.08.10 14:17. Заголовок: После выполнения Ord..


После выполнения OrdListAdd текущая запись становится не первая по индексу, а запись с номером один, на которую таблица позиционируется после открытия без индекса.
Для исправления несовместимости предпочтительнее будет изменить протокол, в результат команды open;02 добавить leto_rec, и на клиенте отрабатывать ParseRec
Хотя можно и с клиента после открытия индекса делать gotop прямо в функции letoOrderListAdd
Как сделать ?

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


Пост N: 407
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 12.08.10 14:58. Заголовок: AlexMyr пишет: Unre..


AlexMyr пишет:

 цитата:
Unrecoverable error 1010: hb_cdxIndexPageRead: Read index page failed.


Да, это повреждение индекса. Оно может произойти или из-за какой-либо ошибки в dbfcdx, или, поскольку у вас используется Share_tables = 1, из-за аварийного завершения клиентской программы, работающей параллельно с leto.

А вот в пропажу информации из БД не верится. При Share_tables = 1 letodb открывает таблицу в shared режиме ( если она в программе открывается как shared - а раз ту таблицу читают с других компьютеров, это, наверное, так и есть ). DBFCDX в shared режиме, естественно, не использует буферы и записывает каждое изменение на диск, чтобы параллельно работающие программы его сразу видели. Возможно, переиндексировав файл, вы найдете все "потерянные" записи.

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


Пост N: 408
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 12.08.10 15:26. Заголовок: Pasha пишет: Для ис..


Pasha пишет:

 цитата:
Для исправления несовместимости предпочтительнее будет изменить протокол, в результат команды open;02 добавить leto_rec, и на клиенте отрабатывать ParseRec
Хотя можно и с клиента после открытия индекса делать gotop прямо в функции letoOrderListAdd


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

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



Пост N: 40
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 12.08.10 16:48. Заголовок: alkresin пишет: Да,..


alkresin пишет:

 цитата:
Да, это повреждение индекса. Оно может произойти или из-за какой-либо ошибки в dbfcdx, или, поскольку у вас используется Share_tables = 1, из-за аварийного завершения клиентской программы, работающей параллельно с leto.

А вот в пропажу информации из БД не верится. При Share_tables = 1 letodb открывает таблицу в shared режиме ( если она в программе открывается как shared - а раз ту таблицу читают с других компьютеров, это, наверное, так и есть ). DBFCDX в shared режиме, естественно, не использует буферы и записывает каждое изменение на диск, чтобы параллельно работающие программы его сразу видели. Возможно, переиндексировав файл, вы найдете все "потерянные" записи.



Да я сразу всех остановил (пользователей, сервер), индекс удалил, запустился, индекс создался, но данных нет (смотрел саму базу без индекса - тоже данных нет). Может дело все в том, что у меня сервер собран еще второго февраля, а клиент собран в мае (хотя до того дня все работало)?

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


Пост N: 409
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 13.08.10 08:26. Заголовок: AlexMyr пишет: Да я..


AlexMyr пишет:

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


А диск на потерянные кластеры проверяли ?

 цитата:
Может дело все в том, что у меня сервер собран еще второго февраля, а клиент собран в мае (хотя до того дня все работало)?


Не думаю, что это могло создать проблему.

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


Пост N: 410
Зарегистрирован: 06.07.06
ссылка на сообщение  Отправлено: 13.08.10 09:33. Заголовок: 3-4 компа только чит..



 цитата:
3-4 компа только читают.


А эти 3-4 компа через letodb работают ?
Я это к тому, что если они работают параллельно, через dbfcdx ( иначе зачем share_tables=1 ? ) и "видят" каждое новое изменение - значит, это каждое изменение записывается на диск ...

Есть сейчас в реализации транзакций один момент, который меня беспокоит - по ее завершении не происходит автоматический commit, а если он находится между leto_BeginTransaction() и leto_CommitTransaction(), то он не передается на сервер.
Думаю, что в shared режиме добавляемые записи и без commit должны писаться на диск ( сейчас у себя сделал маленький тест - вроде так и есть ), но все равно commit внутри транзакции сделать надо.


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



Пост N: 41
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 13.08.10 09:49. Заголовок: alkresin пишет: А д..


alkresin пишет:

 цитата:
А диск на потерянные кластеры проверяли ?


Проверю.

alkresin пишет:

 цитата:
А эти 3-4 компа через letodb работают ?
Я это к тому, что если они работают параллельно, через dbfcdx ( иначе зачем share_tables=1 ? ) и "видят" каждое новое изменение - значит, это каждое изменение записывается на диск ...



Да, через letodb, а с share_tables игрался когда тестировал, то так и оставил, не менял больше. Еще открывал Dos Navigatorom по F3 (на компе где leto запущено и база лежит), но сначала работы програмы такого не было.

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




Пост N: 1626
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.08.10 10:11. Заголовок: AlexMyr пишет: у м..


AlexMyr пишет:

 цитата:
у меня сервер собран еще второго февраля, а клиент собран в мае



Лучше пересобрать и сервер, и клиент. За последнее время было много существенных изменений, в том числе исправлялись ошибки

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



Пост N: 42
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 13.08.10 10:55. Заголовок: Буду пересобирать, н..


Буду пересобирать, но уже в сентябре - ухожу в отпуск

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




Пост N: 1627
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 13.08.10 19:50. Заголовок: Сбросил кое-какие из..


Сбросил кое-какие изменения:

Функция Leto_Memoread()
- Отключил проверку SkipBuf для shared режима;
- Позиционирование на первую запись при открытии индекса;
- Обьявление кодовых страниц перенес в отдельный файл
- Протокол для открытия индекса изменился, но, поскольку содержимое записи добавлено в конец пакета, клиент можно не пересобирать
Но, если клиент пересобран, надо собрать и сервер.

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




Пост N: 1629
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 16.08.10 15:06. Заголовок: Для вызова с клиента..


Для вызова с клиента функций на сервере предлагается такая схема:

Сервер собирается вместе с модулем udf.prg, в который разработчик по желанию сможет добавлять свои функции. Первый параметр, который получает такая функция - это nUserStru.
На сервере добавляется функция Leto_Alias(nUserStru, cClientAlias) --> cRealAlias, которая возвращает реальный алиас по клиентскому, для доступа к таблицам БД. Эта функция уже написана.

На клиенте добавляется функция Leto_Udf(<cFuncName>, Param1, ...). Серверу передается команда usr;01;cFuncName;cParams
Параметры формируются с помощью HB_Serialize. На сервере параметры обрабатываются с помощью hb_DeSerialize, функция выполняется, результат возвращается опять таки через HB_Serialize - hb_DeSerialize
Поскольку для xHarbour HB_Serialize сделана на prg-уровне, прийдется написать обертку, что-то вроде leto_Serialize

Недостаток этого способа (пока) - то, что udf-функция будет выполняться в основном потоке, но, думаю, он будет устранен. Некорректная функция к тому же может привести к падению сервера, но это уже будет проблема разработчика такой функции.


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




Пост N: 1630
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 19.08.10 13:52. Заголовок: В конце концов реали..


В конце концов реализовал (пока) такую схему:

На клиенте вызывается функция:

leto_udf(cServerName+cFunction, cParam)

пример:

leto_udf('//127.0.0.1:2812/leto_alias', 'employee')

на сервере вызывается функция cFunction с параметрами nUserStru и cParam

ее результат (пока только символьная строка) возвращается клиенту
В дальнейшем планирую реализовать произвольное число параметров любых типов

На сервере для реализации пользовательских функций загружается файл letoudf.hrb, в котором пользователь и делает свои функции

В связи с этим у меня вопрос: как загружать hrb на старом харборе ?
Сейчас я сделал так в server.prg:

#ifndef __XHARBOUR__
#include "hbhrb.ch"
#endif
...

IF File( "letoudf.hrb" )
#ifndef __XHARBOUR__
hb_HrbLoad(HB_HRB_BIND_DEFAULT, "letoudf.hrb" )
#else
__hrbLoad( "letoudf.hrb" )
#endif
WrLog( "letoudf.hrb has been loaded." )
ENDIF

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

В дальнейшем еще планирую для udf-функций дать возможность возвращать клиенту содержимое изменившихся рабочих областей, т.е. leto_rec
Скажем, функция-триггер добавила запись, и вернула ее клиенту


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