Форум » 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

alkresin: Добавляем. По безопасности - важно то, что эти операции можно сделать только с помощью Leto, т.е.: 1) если это предусмотрел автор программы ( а не рядовой user, не знающий куда деть руки ), а он должен знать, что делает 2) эти операции не опаснее, чем zap, например 3) авторизацию на сервере мы, так или иначе, сделаем - и там в опциях можно будет указать, например, что на удаление/переименование имеет право только админ.

Петр: alkresin пишет: Добавляем. По безопасности - важно то, что эти операции можно сделать только с помощью Leto, т.е.: 1) если это предусмотрел автор программы ( а не рядовой user, не знающий куда деть руки ), а он должен знать, что делает 2) эти операции не опаснее, чем zap, например 3) авторизацию на сервере мы, так или иначе, сделаем - и там в опциях можно будет указать, например, что на удаление/переименование имеет право только админ. То что все операции делаются с помощью серверов - это понятно. По первому пункту - знать то он должен, а на практике.. Если мы считаем операцию ZAP небезопасной - мы можем на сервере ее и не выполнять. Закрыть таблицу, переименовать в какой-то dbf.bak и создать новую с именем и структурой прежней - быстрый бэкап, или более медленный - сохранить каким либо образом все данные и сделать ZAP. Только я вот не понял - в существующем варианте letodb допускает конкурирующих юзерей или нет? По третьему пункту - если этим никто еще не занимается, то я могу внести на рассмотрение свои предложения, правда только после того как решу проблему гриппа..

Pasha: Петр пишет: По третьему пункту - если этим никто еще не занимается Я не занимаюсь


alkresin: Только я вот не понял - в существующем варианте letodb допускает конкурирующих юзерей или нет? Да. По третьему пункту - если этим никто еще не занимается, то я могу внести на рассмотрение свои предложения, Ждем.

Pasha: Мне кажется, надо переделать delete/recall. Сейчас эта команда сразу передается на сервер и немедленно выполняется Надо это делать только при putRec, т.е добавить к этой команде еще один параметр. При нынешней схеме может произойти такая ситуация: dbAppend() // команда на сервер еще не передана dbDelete() // команда на сервер сразу передана и фактически не отработана, поскольку запись еще не добавлена ... dbCommit() // добавлена запись, у которой не установлен флаг deleted()

Pasha: Надо вводить что-то вроде Connection Id. Каждый раз передавать ip-адрес и порт неудобно

Петр: Pasha пишет: Надо вводить что-то вроде Connection Id. Каждый раз передавать ip-адрес и порт неудобно Не знаю, что Вы конкретно имели ввиду, но в принципе согласен что-то вроде CREATE CONNECTION mycon USER "user" PASSWORD "password" IF mycon:ErrorCode() != 0 ? "Извините, сервер недоступен" Return 1 ENDIF USE table1 NEW CONNECTION mycon USE table2 NEW CONNECTION mycon тогда и с авторизацией меньше хлопот буде и обработку ошибок легче будет делать, и проверку "живо" ли соеденение перед операциями с таблицей после длительного простоя или во время длительной операции можно будет организовать..

Pasha: Да, так было бы лучше всего. Тем более параметр nConnection предусмотрен в dbUse/dbCreate Только он должен быть числовой

Петр: Увидя в коде сл.конструкцию и зная об отличии в реализации Adel Harbour и xHarbour сначала заменил j := Ascan( HSTable():aTables,{|o|o==oTable} ) Adel( HSTable():aTables,j ) Asize( HSTable():aTables,Len(HSTable():aTables)-1 ) на j := Ascan( HSTable():aTables,{|o|o==oTable} ) #ifdef __XHARBOUR__ Adel( HSTable():aTables,j, .t. ) #else #include "hbver.h" #if HB_VER_MAJOR >= 1 Hb_Adel( HSTable():aTables,j, .t. ) #else Adel( HSTable():aTables,j ) Asize( HSTable():aTables,Len(HSTable():aTables)-1 ) #endif #endif Потом решил, что это громоздко и по принципу leto_at написал leto_adel, потом опять подумал и решил, что лучше будет использовать leto_ScanAndDel HB_FUNC( LETO_SCANANDDEL ) { PHB_ITEM pArray = hb_param( 1, HB_IT_ARRAY ); PHB_ITEM pValue = hb_param( 2, HB_IT_ANY ); if( pArray && pValue ) { ULONG ulStart = hb_parnl( 3 ); ULONG ulCount = hb_parnl( 4 ); long lPos; lPos = hb_arrayScan( pArray, pValue, ISNUM( 3 ) ? &ulStart : NULL, ISNUM( 4 ) ? &ulCount : NULL, FALSE ); if (lPos > 0 && hb_arrayDel(pArray, lPos) ) { hb_arraySize( pArray, hb_arrayLen( pArray ) - 1 ); } } hb_itemReturn( pArray ); }

alkresin: Мне кажется, надо переделать delete/recall. Сейчас эта команда сразу передается на сервер и немедленно выполняется Надо это делать только при putRec, т.е добавить к этой команде еще один параметр. Да, пожалуй.

alkresin: Что-то вроде CREATE CONNECTION так или иначе надо вводить, чтобы указать логин/пароль, если это требует сервер. А use/create с использованием ID можно ввести опционально, оставив и существующую схему, поскольку она ( существующая ) позволяет оставить код программы без изменений. Я, честно говоря, не вижу проблем с ее использованием. Если пути к файлам хранятся в переменных, инициализируемых в начале программы, как оно по хорошему и должно быть, а не указываются непосредственно в команде USE, то для программиста это изменение пути будет практически незаметно.

alkresin: Петр пишет: Увидя в коде сл.конструкцию и зная об отличии в реализации Adel Harbour и xHarbour А в чем эта разница ? Я не в курсе.

Петр: Дело в том, что xHarbour за счет введения третьего параметра позволяет заменить конструкцию Adel( array, pos ) Asize( array, Len(array)-1 ) на Adel( array, pos, .t. ) третий параметр т.н. <lShrink> Optionally, a logical value can be specified. If .T. (true) is passed, the length of the array is reduced by one element. The default value is .F. (false) leaving the number of elements in <aArray> unchanged Это удобно и выполняется быстрее. В Harbour c недавного времени тоже есть подобная функция - она называется Hb_Adel. Сначала она появилась в xhb.lib, а потом ввиду очевидных преимуществ попала и в core.

Петр: alkresin пишет: Что-то вроде CREATE CONNECTION так или иначе надо вводить, чтобы указать логин/пароль, если это требует сервер. А use/create с использованием ID можно ввести опционально, оставив и существующую схему, поскольку она ( существующая ) позволяет оставить код программы без изменений. Я, честно говоря, не вижу проблем с ее использованием. hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ENDIF hSocket := NIL Выполнение этого кода меня не порадовало. Сервер обязательно должен требовать авторизацию, другое дело можно позволить анонимный вход с учетной записью по умолчанию и с соответствующими ей правами. Я понимаю, что Вы стремитесь к минимизации переделок существующего кода и это очень хорошо. Но код все равно придется переделывать, добавлять же нужно REQUEST LETO RDDSETDEFAULT( "LETO" ) почему не добавить еще и CREATE CONNECTION cn USER "user" PASSWORD "password" IF cn:ErrorCode() != 0 ? "Извините, сервер недоступен" Return 1 ENDIF OPEN DATABASE base CONNECTION cn IF base:ErrorCode() != 0 ? "Извините, не удалось открыть базу " Return 1 ENDIF USE table1 NEW USE table2 NEW [DATABASE base] .. К тому же, на мой взгяд DataPath в letodb.ini не может быть опциональным, как и IndexPath. И leto_file() должна быть привязана к DataPath/IndexPath Да и сам letodb.ini не может не существовать..

Петр: + added LETO_FERASE(), LETO_FRENAME(), LETO_FERROR() functions Тест успешно пройден hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ?LETO_FERASE("//127.0.0.1:2812/c:/windows/system.ini") ENDIF hSocket := NIL

Pasha: Петр пишет: почему не добавить еще и CREATE CONNECTION cn USER "user" PASSWORD "password" Этой функции можно было бы передавать еще используемый rdd на сервере: dbfcdx/dbfntx/etc

Pasha: Петр пишет: Тест успешно пройден hSocket := hb_IPConnect( "127.0.0.1", 2812 ) IF hb_IPErrorCode() != 0 ?LETO_FILE("//127.0.0.1:2812/c:/windows/*.*") ?LETO_FERASE("//127.0.0.1:2812/c:/windows/system.ini") ENDIF hSocket := NIL :) что тут еще сказать :)

Pasha: добавил ordCondSet()

Pasha: Какие будут предложения по безопасности ? Давать права на опасные операции на ккаталоги БД или отдельно на таблицы/индексы ?

alkresin: Потом решил, что это громоздко и по принципу leto_at написал leto_adel, потом опять подумал и решил, что лучше будет использовать leto_ScanAndDel Дело хорошее, но надо еще подумать :). Наученный горьким опытом, я заглянул в сырцы xHarbour и обнаружил, что там в hb_arrayScan() уже 6 параметров: ULONG HB_EXPORT hb_arrayScan( PHB_ITEM pArray, PHB_ITEM pValue, ULONG * pulStart, ULONG * pulCount, BOOL bExact, BOOL bAllowChar )



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