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

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

Andrey: Случайно нашел: Откуда взял http://forum.ru-board.com/topic.cgi?forum=8&topic=34526&start=20 DBF рулит....

alkresin: Pasha пишет: Александр, посмотрите пожалуйста такой случай Перед транзакцией запись удалена Сделал такой тест: Function Main Local cPath := "//127.0.0.1:2812/" REQUEST LETO RDDSETDEFAULT( "LETO" ) ? "Start" dbCreate( cPath+"Nakl1", { {"NORD","N",10,0} } ) use ( cPath+"Nakl1" ) New append blank replace nord with 10 append blank replace nord with 20 unlock go top delete ? "Deleted ?", deleted() skip(1) go top ? "Deleted ?", deleted() leto_BeginTransaction() dbRecall() leto_CommitTransaction() ? "Deleted ?", deleted() ? Return Nil Результат: Deleted ? .T. Deleted ? .T. Deleted ? .F. Вроде, все правильно работает ...

Pasha: Значит, есть еще какой-то фактор, вилияющий на этот флажок У меня этот глюк проявляется в большой транзакции. Я покопаюсь еще и попробую выяснить, в чем дело


alkresin: Pasha, мне кажется, вы что-то не так сделали при последних исправлениях в реализации leto_intro - портится формат даты. Теперь, если во время сеанса работы открывались таблицы ( при этом вызывается setuserenv ), во всех последующих записях в журнал, в т.ч. при остановке сервера, вместо даты пишется ;F. Это ведь и на выполнение операций, связанных с датой, может влиять.

alkresin: Я разделил letofunc.c на 2 файла - выделил в letocore.c ядро, те функции, которые организуют работу сервера. Предлагаю построить работу по созданию нового ядра следующим образом: 1. Создать новый файл ( cernel2.c, например ), где будет реализована та же схема использования потоков, что и сейчас, только методами Harbour mt. В любом случае у нас будет поток, принимающий соединения и, как минимум один, поток, исполняющий RDD операции, так что это будет нормальная база для дальнейшей работы. 2. Отлаживаем - чтоб работало стабильно и с не меньшей производительностью, чем действующий вариант, без этого дальше идти нет смысла. 3. Прорабатываем и реализуем схему взаимодействия дополнительных потоков.

Pasha: alkresin пишет: Pasha, мне кажется, вы что-то не так сделали при последних исправлениях в реализации leto_intro - портится формат даты. Теперь, если во время сеанса работы открывались таблицы ( при этом вызывается setuserenv ), во всех последующих записях в журнал, в т.ч. при остановке сервера, вместо даты пишется ;F. Это ведь и на выполнение операций, связанных с датой, может влиять. Дело оказалось не в последних исправлениях Раньше этот код: [pre] if( nParam > 5 ) { if( ( ptr = strchr( pp1, ';' ) ) != NULL ) { *ptr = '\0'; pUStru->cdpage = hb_cdpFind( pp1 ); pp1 = ptr + 1; if( ( ptr = strchr( pp1, ';' ) ) != NULL ) { if( pUStru->szDateFormat ) hb_xfree( pUStru->szDateFormat ); pUStru->szDateFormat = (char*) hb_xgrab( ptr - pp1 + 1 ); memcpy( pUStru->szDateFormat, ptr, ptr - pp1 ); pUStru->szDateFormat[ptr-pp1] = '\0'; if( *(ptr + 1) == ';') pUStru->bCentury = (*(ptr + 2) == 'T' ? TRUE : FALSE); } } }[/pre] игнорировался, а теперь он отрабатывается. А в нем ошибка: вместо memcpy( pUStru->szDateFormat, ptr, ptr - pp1 ); надо memcpy( pUStru->szDateFormat, pp1, ptr - pp1 ); Действительно серьезная ошибка, приведет к тому, что DTOC() в фильтрах и индексах на сервере не будет работать Я смогу исправить на CVS только вечером, так что есть есть возможность - поправьте

Pasha: Кстати, а как закрывается letodb при выключении сервера (windows) ? Я смотрю, в логе нет записи про останов сервера

alkresin: Я смогу исправить на CVS только вечером, так что есть есть возможность - поправьте Спасибо за информацию. Поправлю. Кстати, а как закрывается letodb при выключении сервера (windows) ? Боюсь, что никак. Я его использую под Линуксом и там у меня прописан стандартный скрипт для запуска/остановки служб. А под Windows надо, наверное, обработку сигнала соответствующего сделать.

Pasha: Александр, помогите пожалуйста исправить ошибку, связанную с relations: Сэлф-контайнед такой: Local nId dbCreate("Table1", {{'id', 'N', 8, 0}}) dbCreate("Table2", {{'id', 'N', 8, 0},{'Name','C',20,0}}) USE table1 new shared INDEX ON id TAG table1 USE table2 new shared INDEX ON id TAG table2 for nId := 1 to 100 table1->(dbAppend()) table1->Id := nId table2->(dbAppend()) table2->Id := nId next table1->(dbCommit(), dbUnlock()) table2->(dbCommit(), dbUnlock()) select table1 dbSetRelation( "table2", {|| id}, "id" ) seek 2 //Если снять комментарий со следующего оператора (чтение любого поля table2), ошибка исчезает //? table2->Id if table2->(RLock()) table2->Name := '1' ? table2->(dbRecordInfo(2)) // .T. // запись как будто блокирована, но table2->(dbCommit()) // ошибка endif На клиенте flush выдает команду "upd", и ошибка возникает на сервере в UpdateRec: if( ( !pTA || ulRecNo ) && pAStru->pTStru->bShared && !pAStru->bLocked && leto_IsRecLocked( pAStru, ulRecNo ) != 1 ) { /* The table is opened in shared mode, but the record isn't locked */ if( !pTA ) hb_xvmSeqEnd(); return 4; }

Pasha: alkresin пишет: цитата: Кстати, а как закрывается letodb при выключении сервера (windows) ? Боюсь, что никак. Я его использую под Линуксом и там у меня прописан стандартный скрипт для запуска/остановки служб. А под Windows надо, наверное, обработку сигнала соответствующего сделать. В xHarbour наверное можно воспользоваться функцией: HB_PushSignalHandler( HB_SIGNAL_QUIT, "Handle" ) ... Function Handle( nSignal, aParams ) IF nSignal == HB_SIGNAL_QUIT ... а какой аналог есть в Harbour ? Эту обработку делать только для windows ?

alkresin: Александр, помогите пожалуйста исправить ошибку, связанную с relations: Исправил. Там при блокировке запись в дочерней area не устанавливалась предварительно в соответствие с родительской. Кстати, такая же ерунда может и при replace для этой записи произойти. а какой аналог есть в Harbour ? Эту обработку делать только для windows ? 1)Не знаю, не смотрел 2)По-хорошему, и для Линукс надо - не все ведь правильно letodb установят.

Pasha: alkresin пишет: Исправил. Спасибо

Pasha: Наверное, надо бы переделать генерацию ошибок на клиенте, и соответственно передачу полной информации об ошибке с сервера А то сейчас вместо lock required получаем data type error. Делаем ?

alkresin: Наверное, надо бы переделать генерацию ошибок на клиенте, и соответственно передачу полной информации об ошибке с сервера Да, конечно, дело нужное.

Andrey: Pasha пишет: Кстати, а как закрывается letodb при выключении сервера (windows) ? Я смотрю, в логе нет записи про останов сервера alkresin пишет: А под Windows надо, наверное, обработку сигнала соответствующего сделать. Вот, вот я об этом в самом начале писал ! Сидит процесс в Windows'e и только ручками можно удалить. Не по правилам сделано. Нужно наверно как у всех в трее сделать, чтоб останавливать можно было ! А для терминала, тоже запрос нужно делать, а не по ESC - чтоб отключался....

alkresin: Вот, вот я об этом в самом начале писал ! Сидит процесс в Windows'e и только ручками можно удалить. Не по правилам сделано. Нужно наверно как у всех в трее сделать, чтоб останавливать можно было ! В трэй его можно посадить только средствами одной из GUI оболочек. Вы хотите, чтобы я всех принудительно посадил на HwGUI ? Если нужна такая штука, напишите маленькую GUI утилиту теми инструментами, которые вы используете ( HwGUI, MiniGui, Fivewin, ... ) - чтобы она запускала и останавливала сервер ( letodb, letodb stop ). Еще одно преимущество такого решения - сам сервер избавлен от необходимости обрабатывать сообщения, идущие на его окно и занимается исключительно своими непосредственными задачами. А для терминала, тоже запрос нужно делать, а не по ESC - чтоб отключался.... Вы имеете ввиду сервер, скомпилированный с __CONCOLE__ ? Это ж экспериментальный режим, использовавшийся только на начальной стадии разработки. Забудьте про него.

alx_on: alkresin пишет: Предлагаю построить работу по созданию нового ядра следующим образом Поддерживаю PS я не потерялся, просто офис переезжает (и я вместе с ним :) ) в выходные включусь в обсуждения и доработку

Andrey: alkresin пишет: Еще одно преимущество такого решения - сам сервер избавлен от необходимости обрабатывать сообщения, идущие на его окно и занимается исключительно своими непосредственными задачами. Спасибо, понял.

Pasha: alkresin пишет: Если нужна такая штука, напишите маленькую GUI утилиту теми инструментами, которые вы используете ( HwGUI, MiniGui, Fivewin, ... ) - чтобы она запускала и останавливала сервер ( letodb, letodb stop ). Можно сделать такую утилитку средствами hwgui, и положить ее в letodb\utils В связи с этим обьявляется конкурс на иконку для letodb-tray

Pasha: Pasha пишет: Значит, есть еще какой-то фактор, вилияющий на этот флажок У меня этот глюк проявляется в большой транзакции. Я покопаюсь еще и попробую выяснить, в чем дело Докладываю. Вот в таком случае: Local nId dbCreate("Table1", {{'id', 'N', 8, 0}}) use table1 shared for nId := 1 to 10 table1->(dbAppend()) table1->Id := nId next go top if RLock() leto_BeginTransaction() dbDelete() skip skip -1 dbCommit() leto_CommitTransaction() dbUnlock() endif ? RecNo(), Deleted() // .F. skip skip -1 ? RecNo(), Deleted() // .T. флажок deleted() возвращается неправильный



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