Форум » 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: Если файлы на сервере открываются монопольно, то по reccount ничего не делается, он уже известен. Можно эту проверку оставить только для этого режима, а для shared еене делать. Я добавил проверку, чтобы не выделять лишнюю память без необходимости PS Я сейчас сюда редко заглядываю. Дней через 10 вернусь в рабочий режим

Pasha: Можно ли запустить letodb в windows nt/xp до авторизации пользователя ? Я пробовал в реестре добавлять параметр в раздел: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices] и в раздел [HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows] Параметр: "load"="c:\letodb\letodb.exe" - программы запускаемые до входа пользователя в систему: Но сервер не загружается

Pasha: Помогите разобраться с такой странной ошибкой индексации. xHarbour Открываю файл street.dbf из КЛАДР. Сам кладр можно взять по адресу: http://www.kladr.org/update-kladr-database-2.html Таблица большая, 834457 записей, размер 74MB Кодовая страница программы - RU866 Открываю и индексирую таблицу в режиме readonly: Field Code, Name dbUseArea(.t.,, '\kladr\street',,, .t., 'RU1251') OrdCreate('\kladr\street', 'code', 'CODE', {|| CODE}) OrdCreate('\kladr\street', 'namec', 'SUBSTR(CODE,1,11)+UPPER(NAME)', {|| SUBSTR(CODE,1,11)+UPPER(NAME)}) OrdCreate('\kladr\street', 'nasel', 'SUBSTR(CODE,1,11)', {|| SUBSTR(CODE,1,11)}) OrdCreate('\kladr\street', 'nameg', 'SUBSTR(CODE,1,8)+UPPER(NAME)', {|| SUBSTR(CODE,1,8)+UPPER(NAME)}) OrdCreate('\kladr\street', 'namemp', 'SUBSTR(CODE,1,5)+UPPER(NAME)', {|| SUBSTR(CODE,1,5)+UPPER(NAME)}) клиент сваливается на OrdCreate, причем в разных местах, с ошибкой 9027 Premature Array/Object Release detected, и строка - индексное выражение Почему сваливается именно клиент, непонятно. Сваливается скорее всего на строке 3459 в leto1.c: hb_vmDestroyBlockOrMacro( pKeyExp ); Если убрать кодовую страницу RU1251, то индексация проходит успешно.


alkresin: Сваливается скорее всего на строке 3459 в leto1.c: hb_vmDestroyBlockOrMacro( pKeyExp ); Так скорее всего или точно здесь ? Если здесь, то вопрос в том, почему получается ошибка при выполнении кодоблока. А не может это быть связано с тем, что эта злосчастная RU1251 по-разному называется в Harbour и xHarbour. Если страница с этим именем не прилинкована к клиентскому приложению, то выполнение Upper может вызвать ошибку. И еще: а почему там стоит hb_vmDestroyBlockOrMacro( pKeyExp ) ? При нормальном прохождении SELF_EVALBLOCK() этот pKeyExp освобождается при помощи hb_itemRelease() ...

PSP: Pasha пишет: Можно ли запустить letodb в windows nt/xp до авторизации пользователя ? Я пробовал в реестре добавлять параметр в раздел: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunServices] А если в [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ?

Pasha: PSP пишет: А если в [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] ? Так эти программы выполняются при входе пользователя, а мне хотелось бы запускать letodb до авторизации пользователя Чтобы просто нажали кнопку включения сервера, и работали

Pasha: alkresin пишет: Так скорее всего или точно здесь ? Если здесь, то вопрос в том, почему получается ошибка при выполнении кодоблока. А не может это быть связано с тем, что эта злосчастная RU1251 по-разному называется в Harbour и xHarbour. Если страница с этим именем не прилинкована к клиентскому приложению, то выполнение Upper может вызвать ошибку. Нет. Я определил место, клиент вываливается при выполнении errCode = SELF_EVALBLOCK( ( AREAP ) pArea, pKeyExp ); С именем кодовой страницы это не связано, я собрал сервер для себя корректно. Да и клиент падает еще до выполнения запроса к серверу. В моем случае - при создании 2-го индекса, т.е. на OrdCreate('\kladr\street', 'namec', 'SUBSTR(CODE,1,11)+UPPER(NAME)', {|| SUBSTR(CODE,1,11)+UPPER(NAME)}) Но в некоторых случаях создавалось 4 индекса, и на 5-м - возникала ошибка Причем я успешно открывал таблицу kladr.dbf, создавал индекс с 32-мя тэгами и условиями for. А при индексации street возникает эта непонятная ошибка Неясно, связано ли это с размерами таблица. Сервер ведь создает индекс, ошибка не на сервере Вот как я открываю kladr: Local aKl := {'kladr',, 0,; {'code', 'SUBSTR(CODE,1,13)'},; {'index', 'INDEX'},; {'coder', 'UPPER(NAME)',,, 'substr(code,3,9)="000000000"'},; {'coderr', 'SUBSTR(CODE,1,2)+UPPER(NAME)',,, 'substr(code,6,6)="000000".and.substr(code,3,3)>"000"'},; {'codera', 'UPPER(NAME)',,, 'substr(code,6,6)="000000".and.substr(code,3,3)>"000"'},; {'codego', 'SUBSTR(CODE,1,2)+UPPER(NAME)',,, 'substr(code,6,3)>"000".and.substr(code,9,3)="000"'},; {'codegra', 'SUBSTR(CODE,1,5)+UPPER(NAME)',,, 'substr(code,6,3)>"000".and.substr(code,9,3)="000"'},; {'codega', 'UPPER(NAME)',,, 'substr(code,6,3)>"000".and.substr(code,9,3)="000"'},; {'codena', 'UPPER(NAME)',,, 'substr(code,9,3)>"000"'},; {'codenr', 'SUBSTR(CODE,1,2)+UPPER(NAME)',,, 'substr(code,9,3)>"000"'},; {'codenra', 'SUBSTR(CODE,1,5)+UPPER(NAME)',,, 'substr(code,9,3)>"000"'},; {'codeng', 'SUBSTR(CODE,1,8)+UPPER(NAME)',,, 'substr(code,9,3)>"000"'},; {'nasel1', 'UPPER(NAME)',,, 'substr(code,3,9)="001000001"'},; {'nasel2', 'UPPER(NAME)',,, 'substr(code,3,9)="000000001"'},; {'city1', 'UPPER(NAME)',,, 'substr(code,6,3)>"000".and.substr(code,9,3)=="000"'},; {'city2', 'UPPER(NAME)',,, 'substr(code,3,6)="001001"'},; {'city3', 'UPPER(NAME)',,, 'substr(code,3,6)="000000"'},; {'city3_2', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,2)',,, 'substr(code,6,6)="000001"'},; {'regdig', 'SUBSTR(CODE,1,2)',,, 'substr(code,3,9)="000000000"'},; {'name_2', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,2)'},; {'nasel1_2', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,2)',,, 'substr(code,3,9)="001000001"'},; {'nasel2_2', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,2)',,, 'substr(code,3,9)="000000001"'},; {'codera_2', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,2)',,, 'substr(code,6,6)="000000".and.substr(code,3,3)>"000"'},; {'city_5', 'ALLTRIM(UPPER(NAME))+SUBSTR(CODE,1,5)',,, 'substr(code,9,3)="000"'},; {'ocato', 'ocatd'},; {'gni', 'gninmb'},; {'scode', 'SUBSTR(CODE,1,2)'},; {'tcode', 'SUBSTR(CODE,1,5)'},; {'ncode', 'SUBSTR(CODE,1,8)'},; {'namesocr', 'UPPER(ALLTRIM(name))+" "+UPPER(ALLTRIM(socr))',,, 'substr(code,3,9)="000000000"'},; {'name_s', 'UPPER(ALLTRIM(NAME))+" "+UPPER(ALLTRIM(socr))'},; {'code_all', 'CODE'} } BatOpen({aKl}, ,,,, 'RU1251') В прдмассиве для моей функции открытия индекс описывается параметрами: имя тэга, индексное выражение, условие for (5-й элемент)

PSP: Pasha пишет: а мне хотелось бы запускать letodb до авторизации пользователя А "Назначенные задания" не пробовал?

alkresin: С именем кодовой страницы это не связано, я собрал сервер для себя корректно. Да и клиент падает еще до выполнения запроса к серверу. В моем случае - при создании 2-го индекса В первом индексе у вас ф-и Upper() нет, она появляется как раз во втором. Я так понял, что клиент собран на xHarbour - но в xHarbour сейчас эта кодовая страница называется "RUWIN" ...

Pasha: Дело не в upper и не в xHarbour. Я собираю старым xHarbour, в котором еще есть RU1251. И letodb, и клиентская программа собрана именно с RU1251 К тому же для файла kladr.dbf успешно создается 32 индекса, в которых неоднократно встречается upper. Так что причина ошибки не ясна.

alkresin: Хм.. Странно. Вряд ли это связано с размерами, т.к. клиентской части размеры безразличны, она же непосредственно с файлами дела не имеет. А вы не пробовали все-таки уменьшить этот kladr для эксперимента, ну и программу урезать ?

Pasha: Сейчас убрал из индексного выражения Upper, индексирую по SUBSTR(CODE,1,11)+NAME, и ошибка возникает все равно: Premature String Release detected: '01000001000000100' Called from Substr '01000001000000100' - это значение Code, если сделать go top по первому индексу. Может быть, проблема в использовании hb_stackReturnItem() ? Его использует и Substr в индексном выражении, и SELF_EVALBLOCK Уменьшать не пробовал, это мысль, найду урезанный кладр для 2-х регионов и попробую. Индексацию я вставил в небольшую программу, так что вряд ли дело в программе.

Pasha: Проблема оказалась не в индексации, а в трансляции кодовой страницы Даже если индексация проходит успешно, при обращении к символьному полю возникает ошибка 9009 hb_xrealloc Т.е. в letoGetValue перекодировка выполняется неправильно

Pasha: Да, вопрос решен, вот фикс для leto1.c, со строки 1669: #if defined (__XHARBOUR__) || !defined(__HARBOUR__) || ( (__HARBOUR__ - 0) < 0x020000 ) char * pVal = ( char * ) hb_xgrab( pField->uiLen + 1 ); memcpy( pVal, pArea->pRecord + pArea->pFieldOffset[uiIndex], pField->uiLen ); pVal[ pField->uiLen ] = '\0'; hb_cdpnTranslate( pVal, pArea->area.cdPage, hb_cdp_page, pField->uiLen ); hb_itemPutCL( pItem, pVal, pField->uiLen ); hb_xfree( pVal ); #else char * pVal; HB_SIZE uiKeyLen = pField->uiLen; pVal = hb_cdpnDup( ( const char * ) pArea->pRecord + pArea->pFieldOffset[uiIndex], &uiKeyLen, pArea->area.cdPage, hb_cdp_page ); hb_itemPutCLPtr( pItem, pVal, pField->uiLen ); #endif забросьте пожалуйста на CVS, у меня сейчас нет такой возможности

alkresin: Т.е. если удалить в kladr все записи кроме одной и написать программу: function main REQUEST LETO RDDSETDEFAULT( "LETO" ) use ( "//127.0.0.1:2812/kladr" ) new codepage "RU1251" ? field->SOME_FIELD return Nil то она вылетает ?

alkresin: забросьте пожалуйста на CVS, у меня сейчас нет такой возможности Забросил.

Andrey: Pasha пишет: Так эти программы выполняются при входе пользователя, а мне хотелось бы запускать letodb до авторизации пользователя Чтобы просто нажали кнопку включения сервера, и работали Мне тоже бы хотелось этого ! Какие еще могут быть варианты с запуском сервиса LetoDB ?

sashaBG: Windows XP Pro.. "Start" "Run" пишем < gpedit.msc > Выбираем "Computer Configuration" "Windows Settings" Двойной click на "Scripts(Startup/Shutdown)" Двойной click на "Startup" справо. потом кликаем на "Add" и добавляем скрипт или программу. Закрываем Group Policy editor..

Andrey: sashaBG пишет: Windows XP Pro.. А под 2000 и 2003 ЭТО работать будет ?

sashaBG: Под Windows 7 не работает надо пробовать , у меня есть 2003 на другой машине , вечером попробую .



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