Автор | Сообщение |
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 на Харборе, ... и вообще все в наших руках :). Кто хочет участвовать в разработке, тестировании - пишите.
|
|
|
Ответов - 301
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|
Pasha
|
| Администратор
|
Пост N: 1589
Зарегистрирован: 23.05.05
|
|
Отправлено: 12.07.10 22:54. Заголовок: В Harbour вместо HB_..
В Harbour вместо HB_FT_PICTURE определен HB_FT_IMAGE. Сейчас поменяю
|
|
|
alkresin
|
| moderator
|
Пост N: 387
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.07.10 08:41. Заголовок: Уже просто компиляци..
цитата: | Уже просто компиляция вернет ошибку (нет функции 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
|
| |
Пост N: 19
Зарегистрирован: 11.06.10
|
|
Отправлено: 13.07.10 09:45. Заголовок: Blob поле создается,..
Blob поле создается, но на BLOBIMPORT( nPos, cPixFile ) выдает ошибку Error LETO/0 Operation not supported Called from DBFILEPUT(0) Called from SHOWPIX(20)
|
|
|
alx_on
|
| постоянный участник
|
Пост N: 96
Зарегистрирован: 07.07.09
|
|
Отправлено: 13.07.10 09:57. Заголовок: alkresin пишет: ? e..
alkresin пишет: цитата: | ? eval(b) // Ошибка появляется только теперь |
| Как все сложно :) Не проверил до конца, теперь верю... Хорошо, поставим вопрос по другому: без лето аналогичная ситуация? Да. Зачем перекладывать на сервер проблему кривого написания фильтра? Даже внешне правильно написанный может упасть: Private x := 2, y := 1, b, s := "if(x==2,.T.,y) == .T." Где "y" ошибочно написанное имя поля (цифра 1 для примера падения). Было бы замечательно прикрутить UDF, а со строгой проверкой это невозможно цитата: | Ну так можно объявить FIELD ... в начале функции |
| В макросах это невозможно (да и не нужно). Но общий стиль написания кода необходимо сохранить (для быстрого понимания - где поле, а где переменная или константа)
|
|
|
alkresin
|
| moderator
|
Пост N: 389
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.07.10 10:54. Заголовок: Хорошо, поставим воп..
цитата: | Хорошо, поставим вопрос по другому: без лето аналогичная ситуация? Да. |
| Нет. Без leto это все отлично выполняется ( при условии наличия в коде клиентской программы соответствующих udf или переменных ). С leto -благодаря parsefilter это ловится и фильтр формируется на стороне клиента - и потому отрабатывает нормально. Без parsefilter сервер бы взял обработку фильтра на себя и при достижении записи с соответствующим значением SOME_FIELD попытался бы выполнить эту UDF, что привело бы ко всяким неприятностям. цитата: | Зачем перекладывать на сервер проблему кривого написания фильтра? |
| Да не криво написан этот фильтр. Что кривого в том, что вызов UDF стоит не в начале ? цитата: | Было бы замечательно прикрутить UDF, а со строгой проверкой это невозможно |
| Почему невозможно ? Наоборот - именно благодаря этой строгой проверке фильтр классифицируется как не optimized и благополучно выполняется на стороне клиента.
|
|
|
alx_on
|
| постоянный участник
|
Пост N: 97
Зарегистрирован: 07.07.09
|
|
Отправлено: 13.07.10 12:01. Заголовок: Я говорю о проблеме ..
Я говорю о проблеме в целом - невозможности (на текущий момент) написать серверный вариант UDF Это не претензия к лето, такая реализация harbour (где компиляция и выполнение - две совершенно разные вещи). Это не плохо и не хорошо. Так было нужно в некоторых случаях (в зависимости от окружения при запуске). Сейчас нет возможности более тонко контролировать этот процесс (могу ошибаться) Было бы неплохо каким то образом реализовать проверку в более общем варианте, т.е. проверять возможность выполнения на стороне сервера UDF (и не только UDF). Простейший (очень тупой) пример: "if(LEFT(XXX,4)=='1234',.T.,.F.)" Может выполняться на сервере, но не выполняется (повысило бы скорость обработки таблицы в разы при наличии большого кол-ва не попадающих под фильтр записей)
|
|
|
alkresin
|
| moderator
|
Пост N: 390
Зарегистрирован: 06.07.06
|
|
Отправлено: 13.07.10 12:18. Заголовок: Сейчас нет возможнос..
цитата: | Сейчас нет возможности более тонко контролировать этот процесс (могу ошибаться) Было бы неплохо каким то образом реализовать проверку в более общем варианте, т.е. проверять возможность выполнения на стороне сервера UDF (и не только UDF). |
| Вы имеете ввиду возможность просто послать на сервер строку для проверки возможности ее выполнения на нем ? Такой функции действительно нет, но ее очень просто реализовать. цитата: | Простейший (очень тупой) пример: "if(LEFT(XXX,4)=='1234',.T.,.F.)" Может выполняться на сервере, но не выполняется |
| Почему не выполняется ? Я проверил ( заменив XXX на имя поля ) - выполняется...
|
|
|
alx_on
|
| постоянный участник
|
Пост N: 98
Зарегистрирован: 07.07.09
|
|
Отправлено: 13.07.10 13:01. Заголовок: alkresin пишет: Вы ..
alkresin пишет: цитата: | Вы имеете ввиду возможность просто послать на сервер строку для проверки |
| Нет, расширить возможности leto_ParseFilter цитата: | Я проверил ( заменив XXX на имя поля ) - выполняется... |
| Странно, у меня LETO_ISFLTOPTIM() возвращает .F.
|
|
|
alkresin
|
| moderator
|
Пост N: 391
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.07.10 11:54. Заголовок: Нет, расширить возмо..
цитата: | Нет, расширить возможности leto_ParseFilter |
| Я понимаю, что эта функция сейчас довольно проста, но все-таки - чего именно в ней не хватает ( кроме обработки field-> ) ? цитата: | Странно, у меня LETO_ISFLTOPTIM() возвращает .F. |
| Проверьте еще раз, не должно такого быть. Функции left() и if/iif вызываются в server.prg, так что они 100% прилинкованы.
|
|
|
alkresin
|
| moderator
|
Пост N: 392
Зарегистрирован: 06.07.06
|
|
Отправлено: 15.07.10 11:57. Заголовок: Что-то мне последние..
Что-то мне последние дни пришло несколько писем с жалобами на то, что 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
|
| Администратор
|
Пост N: 1594
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.07.10 12:38. Заголовок: xHarbour почему-то п..
xHarbour почему-то перестал видеть ERRCODE. Я попробую собрать с этой версией, это как раз CVS
|
|
|
|
Sergey Spirin
|
| постоянный участник
|
Пост N: 395
Зарегистрирован: 25.12.07
|
|
Отправлено: 15.07.10 13:29. Заголовок: Pasha пишет: xHarbo..
Pasha пишет: цитата: | xHarbour почему-то перестал видеть ERRCODE. Я попробую собрать с этой версией, это как раз CVS |
| По моему, его давно переименовали в HB_ERRCODE. У меня в свое время фаст из-за этого не компилился.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1595
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.07.10 15:10. Заголовок: Так в разных харбора..
Так в разных харборах, старых и новых, может быть по разному: и так typedef unsigned int HB_ERRCODE; и так typedef USHORT HB_ERRCODE; и так typedef USHORT ERRCODE; Может быть использовать LETO_ERRCODE, как в letbdb/source/errint.c ?
|
|
|
Pasha
|
| Администратор
|
Пост N: 1596
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.07.10 22:48. Заголовок: Сборку для xHb модул..
Сборку для xHb модулей С я поправил, собирается с Harbour SVN, со старым Harbour тоже должно собираться Не будет собираться с xHarbour, когда еще не было hbverbld.h, а он появился года 3 назад Остался вопрос со сборкой server.prg под xHarbour, ругается на строке 111 Если я заменю эту конструкцию, как в комментариях, не пойдет сборка под старым Harbour Я понимаю, что это недостаток препроцессора xHarbour, но как решить этот вопрос пока не придумал
|
|
|
alx_on
|
| постоянный участник
|
Пост N: 99
Зарегистрирован: 07.07.09
|
|
Отправлено: 16.07.10 09:30. Заголовок: alkresin пишет: Про..
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
|
| |
Пост N: 24
Зарегистрирован: 11.06.10
|
|
Отправлено: 16.07.10 16:18. Заголовок: alx_on пишет: Вот п..
alx_on пишет: цитата: | Вот пример (вырезано мое лишнее): Скрытый текст |
| Тоже бы проверил, но пример не самодостаточный - нет создания базы и наполнения ее данными. Да и базу для проверки уж лучше просто в cPath+"/journ___.dbf"
|
|
|
alkresin
|
| moderator
|
Пост N: 393
Зарегистрирован: 06.07.06
|
|
Отправлено: 16.07.10 17:43. Заголовок: Остался вопрос со сб..
цитата: | Остался вопрос со сборкой server.prg под xHarbour, ругается на строке 111 |
| Не только. Вот еще мне прислали: Error: Unresolved external '_hb_GetSetStructPtr' referenced from C:\LETODB\OBJ\B32\LETOFUNC.OBJ цитата: | Если я заменю эту конструкцию, как в комментариях, не пойдет сборка под старым Harbour Я понимаю, что это недостаток препроцессора xHarbour, но как решить этот вопрос пока не придумал |
| А может отказаться от использования этого "hbextcdp.ch" и ограничиться простым перечислением страниц ? Если какая-то окажется не включена - кому надо включит.
|
|
|
Pasha
|
| Администратор
|
Пост N: 1598
Зарегистрирован: 23.05.05
|
|
Отправлено: 17.07.10 20:04. Заголовок: Надо было снять комм..
Надо было снять комментарий с #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
|
| moderator
|
Пост N: 394
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.07.10 13:54. Заголовок: А насчет hbextcdp.ch..
цитата: | А насчет 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
|
| moderator
|
Пост N: 395
Зарегистрирован: 06.07.06
|
|
Отправлено: 26.07.10 13:59. Заголовок: Павел, а зачем вот э..
Павел, а зачем вот это сделано: 2010-07-09 19:10 UTC+0300 Pavel Tsarenko (tpe2/at/mail.ru) .... * added control SkipBuf value to RecCount limit Это ж лишняя файловая операция, а смысл ? Все равно ведь по eof останов происходит...
|
|
|
Ответов - 301
, стр:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
All
[только новые]
|
|