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

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

Pasha: В Harbour вместо HB_FT_PICTURE определен HB_FT_IMAGE. Сейчас поменяю

alkresin: Уже просто компиляция вернет ошибку (нет функции Some_UDF) Вот пример: Function Main Private x := 2, b, s := "x == 1 .and. f1()" b := &( "{||" + s + "}" ) // Проходит нормально ? eval(b) // Проходит нормально x := 1 ? eval(b) // Ошибка появляется только теперь При строгой проверке (ключ -w3) без "FIELD->" макрокоманда "SET FILTER" не компиляется return nil Ну так можно объявить FIELD ... в начале функции.

AlexMyr: Blob поле создается, но на BLOBIMPORT( nPos, cPixFile ) выдает ошибку Error LETO/0 Operation not supported Called from DBFILEPUT(0) Called from SHOWPIX(20)


alx_on: alkresin пишет: ? eval(b) // Ошибка появляется только теперь Как все сложно :) Не проверил до конца, теперь верю... Хорошо, поставим вопрос по другому: без лето аналогичная ситуация? Да. Зачем перекладывать на сервер проблему кривого написания фильтра? Даже внешне правильно написанный может упасть: Private x := 2, y := 1, b, s := "if(x==2,.T.,y) == .T." Где "y" ошибочно написанное имя поля (цифра 1 для примера падения). Было бы замечательно прикрутить UDF, а со строгой проверкой это невозможно Ну так можно объявить FIELD ... в начале функции В макросах это невозможно (да и не нужно). Но общий стиль написания кода необходимо сохранить (для быстрого понимания - где поле, а где переменная или константа)

alkresin: Хорошо, поставим вопрос по другому: без лето аналогичная ситуация? Да. Нет. Без leto это все отлично выполняется ( при условии наличия в коде клиентской программы соответствующих udf или переменных ). С leto -благодаря parsefilter это ловится и фильтр формируется на стороне клиента - и потому отрабатывает нормально. Без parsefilter сервер бы взял обработку фильтра на себя и при достижении записи с соответствующим значением SOME_FIELD попытался бы выполнить эту UDF, что привело бы ко всяким неприятностям. Зачем перекладывать на сервер проблему кривого написания фильтра? Да не криво написан этот фильтр. Что кривого в том, что вызов UDF стоит не в начале ? Было бы замечательно прикрутить UDF, а со строгой проверкой это невозможно Почему невозможно ? Наоборот - именно благодаря этой строгой проверке фильтр классифицируется как не optimized и благополучно выполняется на стороне клиента.

alx_on: Я говорю о проблеме в целом - невозможности (на текущий момент) написать серверный вариант UDF Это не претензия к лето, такая реализация harbour (где компиляция и выполнение - две совершенно разные вещи). Это не плохо и не хорошо. Так было нужно в некоторых случаях (в зависимости от окружения при запуске). Сейчас нет возможности более тонко контролировать этот процесс (могу ошибаться) Было бы неплохо каким то образом реализовать проверку в более общем варианте, т.е. проверять возможность выполнения на стороне сервера UDF (и не только UDF). Простейший (очень тупой) пример: "if(LEFT(XXX,4)=='1234',.T.,.F.)" Может выполняться на сервере, но не выполняется (повысило бы скорость обработки таблицы в разы при наличии большого кол-ва не попадающих под фильтр записей)

alkresin: Сейчас нет возможности более тонко контролировать этот процесс (могу ошибаться) Было бы неплохо каким то образом реализовать проверку в более общем варианте, т.е. проверять возможность выполнения на стороне сервера UDF (и не только UDF). Вы имеете ввиду возможность просто послать на сервер строку для проверки возможности ее выполнения на нем ? Такой функции действительно нет, но ее очень просто реализовать. Простейший (очень тупой) пример: "if(LEFT(XXX,4)=='1234',.T.,.F.)" Может выполняться на сервере, но не выполняется Почему не выполняется ? Я проверил ( заменив XXX на имя поля ) - выполняется...

alx_on: alkresin пишет: Вы имеете ввиду возможность просто послать на сервер строку для проверки Нет, расширить возможности leto_ParseFilter Я проверил ( заменив XXX на имя поля ) - выполняется... Странно, у меня LETO_ISFLTOPTIM() возвращает .F.

alkresin: Нет, расширить возможности leto_ParseFilter Я понимаю, что эта функция сейчас довольно проста, но все-таки - чего именно в ней не хватает ( кроме обработки field-> ) ? Странно, у меня LETO_ISFLTOPTIM() возвращает .F. Проверьте еще раз, не должно такого быть. Функции left() и if/iif вызываются в server.prg, так что они 100% прилинкованы.

alkresin: Что-то мне последние дни пришло несколько писем с жалобами на то, что leto не компилируется с xHarbour 1.2.1 : Error E2141 source\client\leto1.c 140: Declaration syntax error Warning W8019 source\client\leto1.c 4496: Code has no effect in function letoRegisterRDD Error E2379 source\client\leto1.c 4496: Statement missing ; in function letoRegisterRDD Error E2451 source\client\leto1.c 4500: Undefined symbol 'errCode' in function letoRegisterRDD Error E2451 source\client\leto1.c 4500: Undefined symbol 'letoTable' in function letoRegisterRDD Error E2141 source\client\leto1.c 4527: Declaration syntax error Error E2451 source\client\leto1.c 4820: Undefined symbol 'pModuleSymbols' in function leto1__InitSymbols Error E2451 source\client\leto1.c 4823: Undefined symbol 'hb_letoRddInit' in function _hb_leto_rdd_init_ Кто-нибудь здесь использует xHarbour ?

Pasha: xHarbour почему-то перестал видеть ERRCODE. Я попробую собрать с этой версией, это как раз CVS

Sergey Spirin: Pasha пишет: xHarbour почему-то перестал видеть ERRCODE. Я попробую собрать с этой версией, это как раз CVS По моему, его давно переименовали в HB_ERRCODE. У меня в свое время фаст из-за этого не компилился.

Pasha: Так в разных харборах, старых и новых, может быть по разному: и так typedef unsigned int HB_ERRCODE; и так typedef USHORT HB_ERRCODE; и так typedef USHORT ERRCODE; Может быть использовать LETO_ERRCODE, как в letbdb/source/errint.c ?

Pasha: Сборку для xHb модулей С я поправил, собирается с Harbour SVN, со старым Harbour тоже должно собираться Не будет собираться с xHarbour, когда еще не было hbverbld.h, а он появился года 3 назад Остался вопрос со сборкой server.prg под xHarbour, ругается на строке 111 Если я заменю эту конструкцию, как в комментариях, не пойдет сборка под старым Harbour Я понимаю, что это недостаток препроцессора xHarbour, но как решить этот вопрос пока не придумал

alx_on: alkresin пишет: Проверьте еще раз, не должно такого быть. Функции left() и if/iif вызываются в server.prg, так что они 100% прилинкованы Проверил еще раз, результат: LETO_ISFLTOPTIM= .F. DBFILTER= if(LEFT(DACC,4)=='1208',.T.,.F.) Вот пример (вырезано мое лишнее): REQUEST HB_LANG_RUWIN REQUEST HB_CODEPAGE_RU1251 REQUEST HB_CODEPAGE_RU866 PROCEDURE MAIN LOCAL cPath LOCAL cDrvName LOCAL cFilter request LETO cPath := "//127.0.0.1:2811/" cDrvName := "LETO" SET( _SET_CODEPAGE, "RU1251" ) HB_LANGSELECT( "RUWIN" ) rddSetDefault( cDrvName ) IF leto_Connect( cPath ) == -1 ? "Error init LetoDB", cPath return ENDIF SET( _SET_DATEFORMAT, "DD/MM/YYYY" ) set( _SET_AUTOPEN, .F. ) set( _SET_EPOCH, 1910 ) DbUseArea( .T., cDrvName, cPath+"data/default/journ___.dbf", "JOURN", .T., .F., "RU866" ) ORDLISTADD( cPath+"data/default/idx/journ___.cdx" ) OrdSetFocus( ORDNUMBER("OPDATE") ) cFilter := "if(LEFT(DACC,4)=='1208',.T.,.F.)" DBSETFILTER( &("{||"+cFilter+"}"), cFilter ) ? "LETO_ISFLTOPTIM=", LETO_ISFLTOPTIM() ? "DBFILTER=", DBFILTER() GO TOP RETURN

AlexMyr: alx_on пишет: Вот пример (вырезано мое лишнее): Скрытый текст Тоже бы проверил, но пример не самодостаточный - нет создания базы и наполнения ее данными. Да и базу для проверки уж лучше просто в cPath+"/journ___.dbf"

alkresin: Остался вопрос со сборкой server.prg под xHarbour, ругается на строке 111 Не только. Вот еще мне прислали: Error: Unresolved external '_hb_GetSetStructPtr' referenced from C:\LETODB\OBJ\B32\LETOFUNC.OBJ Если я заменю эту конструкцию, как в комментариях, не пойдет сборка под старым Harbour Я понимаю, что это недостаток препроцессора xHarbour, но как решить этот вопрос пока не придумал А может отказаться от использования этого "hbextcdp.ch" и ограничиться простым перечислением страниц ? Если какая-то окажется не включена - кому надо включит.

Pasha: Надо было снять комментарий с #define HARBOUR_VER_AFTER_101 Но я уже поправил сборку и без такого вмешательства А насчет hbextcdp.ch, может быть в letodb/include приготовить 2 файла: letocdph.ch и letocdpx.ch, и затем средствами make копировать их в letodb/include/hbextcdp.ch, если не существует HB_PATH/include/hbextcdp.ch ? Что-то вроде if not exist ... copy ... ?

alkresin: А насчет hbextcdp.ch, может быть в letodb/include приготовить 2 файла: letocdph.ch и letocdpx.ch, и затем средствами make копировать их в letodb/include/hbextcdp.ch, если не существует HB_PATH/include/hbextcdp.ch ? А как это сделать для hbmk2 ? Можно создать letodb/include/hbextcdp.ch, включив туда какой-то минимальный набор страниц, общий для всех компиляторов/версий и написать в readme, что при отсутствии нужной страницы надо руками дополнить этот файл.

alkresin: Павел, а зачем вот это сделано: 2010-07-09 19:10 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru) .... * added control SkipBuf value to RecCount limit Это ж лишняя файловая операция, а смысл ? Все равно ведь по eof останов происходит...



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