Форум » LetoDB, HbNetio. » Leto DB Server » Ответить

Leto DB Server

alkresin: Только что открыл на 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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.

Ответов - 325, стр: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 All

Pasha: Лучше действительно имена тегов хранить в LETOTAG А для исключения излишней передачи сохранять текущий индекс в AREASTRU, и не передавать его в других командах. а только в dbSetOrder() Пересматриваю код Во 1-х, я немного ошибся в hs_goto: Надо написать для go top hs_setscope( nUserStru, nId, .t.) dbGoTop() IF oArea:bFilter != Nil hs_setscope( nUserStru, nId, .f.) DO WHILE !Eof() .AND. !Eval(oArea:bFilter) dbSkip(1) ENDDO hs_clearscope(nUserStru, nId, .f.) ENDIF hs_clearscope(nUserStru, nId, .t.) и для bottom тоже, поправлю И у меня сомнения по поводу кода в hs_skip: dbSkip( nSkip ) IF oArea:bFilter != Nil IF nSkip > 0 DO WHILE !Eof() .AND. !Eval(oArea:bFilter) dbSkip(1) ENDDO ELSE DO WHILE !Bof() .AND. !Eval(oArea:bFilter) dbSkip(-1) ENDDO ENDIF ENDIF Если nSkip > 1 и установлен bFilter, то этот код отработает неправильно

Pasha: Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация Я перепишу hs_goto, ok ? Там можно немного оптимизировать go top/ go bottom с установленным filter, используя dbOrderInfo(SKIPEVAL,,, bFilter)/dbOrderInfo(SKIPEVALBACK,,, bFilter) Когда я у себя в программах стал использовать эту функцию, выигрыш в производительности был существенным, в разы в некоторых случаях

Pasha: Кстати, SKIPEVAL можно использовать и в hs_skip if bFilter # nil for i := 1 to nSkip dbOrderInfo(SKIPEVAL,,, bFilter) next endif


alkresin: Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация Некоторые вещи, в т.ч. открытие/создание, скорее всего, придется оставить на prg - т.к. на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет. Я перепишу hs_goto, ok ? Ok.

Pasha: alkresin пишет: на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет Не получится обрушение сервера при разных нестандартных ситуациях типа "data corruption" ? В этом случае надо как-то перехватывать такие ошибки

alkresin: Такие нестандартные ситуации случаются при реальном повреждении файлов, которые, по идее, использование сервера как раз и должно исключить. А то ведь есть и такие ошибки, которые не обрабатываются и на prg уровне - всякие internal error - особенно с индексами.

Pasha: Может стоит сделать вызов ParseCommand() на prg-уровне внутри BEGIN SEQUENCE/END ?

Pasha: Надо обязательно перехватывать data width error в leto_UpdateRec

Pasha: Извиняюсь, так и делается. То есть, такая ситуация блокируется уже на клиенте

Pasha: Переписал на C hs_goto DBOI_SKIPEVAL не стал использовать: во 1-х, он реализован не на уровне dbfRdd, а выше - для dbfcdx/dbfntx Во 2-х: выигрыш в производительности в своих программах я получил фактически за счет перевода кода в цикле по workarea на С-уровень, что и так уже сделано В hs_skip все в порядке, это меня бес попутал :) Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? И на сервере проблема с поиском тега будет решена

alkresin: Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. Обычно ordSetFocus() вызывается не так часто, но это происходит, например, почти при каждом открытии файла - так что если передавать пакет при ordSetFocus(), то файлы будут открываться медленнее. И на сервере проблема с поиском тега будет решена Она будет просто перенесена из одной функции в другую. При обработке ordSetFocus() все равно придется это делать.

Pasha: alkresin пишет: Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. Кстати, о птичках :) Я заметил, что закрытие БД выполняется довольно медленно, поскольку при dbCloseAll() передается отдельный пакет close для каждой workarea. Можно ли сделать закрытие всех областей letodb одним пакетом ?

Pasha: Тогда добавляем имя тега в LETOTAG ? Поскольку в пакетах goto/skip/seek имя текушего тега уже передается, для поиска данных тега на сервере этой информации будет достаточно

alkresin: Можно ли сделать закрытие всех областей letodb одним пакетом ? Если написать leto_dbCloseAll() и предложить использовать ее вместо dbcloseall() Тогда добавляем имя тега в LETOTAG ? Да

Pasha: Переписал на C hs_skip, переделал поиск тега на сервере по имени По поводу dbCloseAll: Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? Правда, может быть случай, когда клиент подключен боее чем к одному серверу

alkresin: Переписал на C hs_skip, переделал поиск тега на сервере по имени Отлично! А почему в mail list не шлете changelog ? Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? Не понял. Каких "своих" ? А какие еще закрывает клиентская программа при помощи dbCloseAll() ?

Pasha: Я все свои изменения отправляю в mail list. Возврата нет. Они не проходят ? Проверил - у меня в адресной книге стотит letodb-developers-bounces@lists.sourceforge.net Наверное надо Letodb-developers@lists.sourceforge.net Эх, Семен Семеныч Отправил тест. Насчет своих, я имел в виду, что могут быть открыты workarea и с другими rdd

Pasha: Теперь получил свое же письмо

Pasha: Что-то я смотрю, установка set deleted не срабатывает Ставлю set deleted on, и удаленные записи видны. Не пойму, в чем дело

Pasha: Увидел Может добавить еще один байт установок к командам seek/skip/goto для флага deleted и убрать bDeletedOn из USERSTRU ?



полная версия страницы