Автор | Сообщение |
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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.
|
|
|
Ответов - 325
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
All
[только новые]
|
|
Pasha
|
| Администратор
|
Пост N: 857
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:14. Заголовок: Лучше действительно ..
Лучше действительно имена тегов хранить в 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
|
| Администратор
|
Пост N: 858
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:20. Заголовок: Уже почти весь код п..
Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация Я перепишу hs_goto, ok ? Там можно немного оптимизировать go top/ go bottom с установленным filter, используя dbOrderInfo(SKIPEVAL,,, bFilter)/dbOrderInfo(SKIPEVALBACK,,, bFilter) Когда я у себя в программах стал использовать эту функцию, выигрыш в производительности был существенным, в разы в некоторых случаях
|
|
|
Pasha
|
| Администратор
|
Пост N: 859
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 12:24. Заголовок: Кстати, SKIPEVAL мож..
Кстати, SKIPEVAL можно использовать и в hs_skip if bFilter # nil for i := 1 to nSkip dbOrderInfo(SKIPEVAL,,, bFilter) next endif
|
|
|
alkresin
|
| moderator
|
Пост N: 138
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.03.08 14:15. Заголовок: Уже почти весь код п..
цитата: | Уже почти весь код перенесен на С, осталось совсем немного Открытие/создание, и навигация |
| Некоторые вещи, в т.ч. открытие/создание, скорее всего, придется оставить на prg - т.к. на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет. Ok.
|
|
|
Pasha
|
| Администратор
|
Пост N: 860
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 15:14. Заголовок: alkresin пишет: на ..
alkresin пишет: цитата: | на C уровне обработки ошибок ( аналога BEGIN SEQUENCE ... END SEQUENCE ) нет |
| Не получится обрушение сервера при разных нестандартных ситуациях типа "data corruption" ? В этом случае надо как-то перехватывать такие ошибки
|
|
|
alkresin
|
| moderator
|
Пост N: 139
Зарегистрирован: 06.07.06
|
|
Отправлено: 21.03.08 15:24. Заголовок: Такие нестандартные ..
Такие нестандартные ситуации случаются при реальном повреждении файлов, которые, по идее, использование сервера как раз и должно исключить. А то ведь есть и такие ошибки, которые не обрабатываются и на prg уровне - всякие internal error - особенно с индексами.
|
|
|
Pasha
|
| Администратор
|
Пост N: 861
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 16:01. Заголовок: Может стоит сделать ..
Может стоит сделать вызов ParseCommand() на prg-уровне внутри BEGIN SEQUENCE/END ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 862
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 16:11. Заголовок: Надо обязательно пер..
Надо обязательно перехватывать data width error в leto_UpdateRec
|
|
|
Pasha
|
| Администратор
|
Пост N: 863
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 17:01. Заголовок: Извиняюсь, так и дел..
Извиняюсь, так и делается. То есть, такая ситуация блокируется уже на клиенте
|
|
|
Pasha
|
| Администратор
|
Пост N: 864
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.03.08 23:21. Заголовок: Переписал на C hs_go..
Переписал на C hs_goto DBOI_SKIPEVAL не стал использовать: во 1-х, он реализован не на уровне dbfRdd, а выше - для dbfcdx/dbfntx Во 2-х: выигрыш в производительности в своих программах я получил фактически за счет перевода кода в цикле по workarea на С-уровень, что и так уже сделано В hs_skip все в порядке, это меня бес попутал :) Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? И на сервере проблема с поиском тега будет решена
|
|
|
alkresin
|
| moderator
|
Пост N: 140
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 10:09. Заголовок: Как поступим с TagNa..
цитата: | Как поступим с TagName ? Сейчас имя тега передается при каждой операции навигации по таблице Может действительно передавать его на сервер только в letoOrderListFocus ? |
| Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. Обычно ordSetFocus() вызывается не так часто, но это происходит, например, почти при каждом открытии файла - так что если передавать пакет при ordSetFocus(), то файлы будут открываться медленнее. цитата: | И на сервере проблема с поиском тега будет решена |
| Она будет просто перенесена из одной функции в другую. При обработке ordSetFocus() все равно придется это делать.
|
|
|
|
Pasha
|
| Администратор
|
Пост N: 865
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 11:00. Заголовок: alkresin пишет: Воп..
alkresin пишет: цитата: | Вопрос неоднозначный. Сам акт приема-передачи ip-пакета отнимает сравнительно немалое время, поэтому, скажем, один пакет длиной 100 байт передается существенно быстрее, чем 2 по 50. |
| Кстати, о птичках :) Я заметил, что закрытие БД выполняется довольно медленно, поскольку при dbCloseAll() передается отдельный пакет close для каждой workarea. Можно ли сделать закрытие всех областей letodb одним пакетом ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 866
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 11:13. Заголовок: Тогда добавляем имя ..
Тогда добавляем имя тега в LETOTAG ? Поскольку в пакетах goto/skip/seek имя текушего тега уже передается, для поиска данных тега на сервере этой информации будет достаточно
|
|
|
alkresin
|
| moderator
|
Пост N: 141
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 17:47. Заголовок: Можно ли сделать зак..
цитата: | Можно ли сделать закрытие всех областей letodb одним пакетом ? |
| Если написать leto_dbCloseAll() и предложить использовать ее вместо dbcloseall() цитата: | Тогда добавляем имя тега в LETOTAG ? |
| Да
|
|
|
Pasha
|
| Администратор
|
Пост N: 867
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 21:59. Заголовок: Переписал на C hs_sk..
Переписал на C hs_skip, переделал поиск тега на сервере по имени По поводу dbCloseAll: Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? Правда, может быть случай, когда клиент подключен боее чем к одному серверу
|
|
|
alkresin
|
| moderator
|
Пост N: 142
Зарегистрирован: 06.07.06
|
|
Отправлено: 22.03.08 22:45. Заголовок: Переписал на C hs_sk..
цитата: | Переписал на C hs_skip, переделал поиск тега на сервере по имени |
| Отлично! А почему в mail list не шлете changelog ? цитата: | Сделать в leto_dbCloseAll() закрытие только "своих" областей, а затем вызовом dbCloseAll() закрывать остальные ? |
| Не понял. Каких "своих" ? А какие еще закрывает клиентская программа при помощи dbCloseAll() ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 868
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 23:33. Заголовок: Я все свои изменения..
Я все свои изменения отправляю в mail list. Возврата нет. Они не проходят ? Проверил - у меня в адресной книге стотит letodb-developers-bounces@lists.sourceforge.net Наверное надо Letodb-developers@lists.sourceforge.net Эх, Семен Семеныч Отправил тест. Насчет своих, я имел в виду, что могут быть открыты workarea и с другими rdd
|
|
|
Pasha
|
| Администратор
|
Пост N: 869
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.03.08 23:34. Заголовок: Теперь получил свое ..
Теперь получил свое же письмо
|
|
|
Pasha
|
| Администратор
|
Пост N: 870
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.08 00:30. Заголовок: Что-то я смотрю, уст..
Что-то я смотрю, установка set deleted не срабатывает Ставлю set deleted on, и удаленные записи видны. Не пойму, в чем дело
|
|
|
Pasha
|
| Администратор
|
Пост N: 871
Зарегистрирован: 23.05.05
|
|
Отправлено: 23.03.08 10:12. Заголовок: Увидел Может добавит..
Увидел Может добавить еще один байт установок к командам seek/skip/goto для флага deleted и убрать bDeletedOn из USERSTRU ?
|
|
|
Ответов - 325
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
All
[только новые]
|
|