Форум » LetoDB, HbNetio. » Leto DB Server » Ответить

Leto DB Server

Pasha: Добавил функцию: LETO_GROUPBY(cGroup, cFields, [cFilter], [xScopeTop], [xScopeBottom]) cGroup - имя поля, по которому группируются данные; cFields - список числовых полей через запятую, которые суммируются. Символ # обозначает к-во записей в группе Функция возвращает двумерный массив строк. 1-й элемент каждой строки - значение поля cGroup, следующие элементы суммы полей, заданных в cFields, или к-во записей в группе

Ответов - 232, стр: 1 2 3 4 5 6 7 8 9 10 11 12 All

AlexMyr: Паша, а на сервер обновления не сбрасывали?

Pasha: Конечно Но мы работаем не с основной revision Надо при checkout указать revision - не Head. а выбрать rel-1-mt1 revision

AlexMyr: Понял, спасибо.


leo: А где на SVN находится Letodb?

AlexMyr: Почему на svn? На CVS: cvs -d:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb login cvs -z3 -d:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb co -P modulename

Pasha: Добавил для leto_udf возможность передачи произвольного числа параметров любых типов на сервер, а также возврата результата любого типа. Для этого используются функции hb_serialize и hb_deserialize. Поскольку сервер сейчас собирается только под Harbour, для сборки клиента под xHarbour добавил версии этих функций от Harbour Также добавил функцию на сервере: LETO_RECLOCK( nUserStru [, nRecord] ) которая может вызываться из udf-функций udf-функция может вернуть в качестве результата клиенту значение текущей записи с помощью вызова функции LETO_REC(). Клиент при этом должен вызвать функцию Leto_ParseRec для установки текущей записи. Пример вызова с клиента: Leto_ParseRec( Leto_Udf("UDF_AppendRec", <cFieldName>, [<cOrder>|<nOrder>]) ) Также в tests добавил пример udf-функции.

AlexMyr: Паша, скачал rel-1-mt, собираю с hbmk2: letodb.exe собирается, потом ищу библиотеку rddleto - не нахожу, нету даже папки lib, смотрю в корне валяется libletodb в rddleto.hbp вместо -olib/rddleto указано -oletodb. Соответсвенно не собираются тесты т.к. в rddleto.hbc указано libs=rddleto. Идут какие-то изменения? В readme ничего не нашел, все по старому и структура каталогов и названия библиотек.

Pasha: Библиотека стала так называться при сборке через hbmk2 после 2011-04-29 15:27 UTC+0300 Alexander Okhotnikov (alxokhotnikov/at/gmail.com)

Pasha: В настоящее время можно на сервере в подгружаемом файле letoudf.prg писать полноценные udf-функции. UDF-функции с клиента можно передать произвольное количество параметров любых типов. В функциях можно использовать обычные методы rdd, за исключением блокировок - вместо rlock/dbrlock/dbunlock надо использовать leto_reclock() и leto_recunlock(), поскольку блокировки выполняются не средствами rdd, а средствами leto. Эти функции могут после выполнения каких-либо действий возвращать клиенту новую текущую запись с помощью вызова leto_Rec(), а клиент в свою очередь может принять эту текущую запись с помощью leto_parserec Пример парочки таких функций я выложил: одна добавляет запись с заполняет значение ключевого поля, вторая - удаляет записи по указанному фильтру. Но все это работает в текущей рабочей области. Теперь как сделать работу в udf-функции с несколькими рабочими областями. Вызов серверного алиаса через leto_alias мне не очень нравится, поэтому возникла другая идея. Сделать на клиенте функцию leto_areaid(), и передавать на сервер номера рабочих областей в качестве параметров. В udf-функции эти номера можно использовать для вызова leto_SelectArea( nuserStru, nAreaId ), и в дальнейшем использовать это рабочую область Для leto_reclock, leto_recunlock и leto_rec ввести еще один необязательный параметр - nAreaId udf-функция могла бы возвращать массив с данными нескольких рабочх областей: {cRecBuf1, cRecBuf2, ...}, а на клиенте можно было бы обрабатывать этот массив вызовами leto_ParseRec Только надо будет доработать leto_FreeArea, чтобы при завершении udf-функции освобождать рабочие области (кроме текущей). Какие будут предложения ? Может быть, есть способ получше ?

AlexMyr: Pasha пишет: Библиотека стала так называться при сборке через hbmk2 после 2011-04-29 15:27 UTC+0300 Alexander Okhotnikov (alxokhotnikov/at/gmail.com) Да я уже вижу, а смысл?

AlexMyr: Pasha пишет: Какие будут предложения ? Может быть, есть способ получше ? Я думаю, что очень мало людей думает об этом, потому как сделаете так и будет.

alx_on: Pasha пишет: Вызов серверного алиаса через leto_alias мне не очень нравится Чем плохо? Скорость (больше ничего на ум не приходит)? Ведь нагляднее и проще передать алиас. Для leto_reclock, leto_recunlock и leto_rec ввести еще один необязательный параметр - nAreaId. udf-функция могла бы возвращать массив с данными нескольких рабочх областей Излишний функционал (к тому же с переделкой протокола). Я вижу это так: 1. Открыли на клиенте все таблицы (либо сделать функцию открытия на сервере) 2. Вызвали leto_alias и leto_SelectArea (можно даже в переменной сохранить AreaID для скорости) 3. Собрали результат 4. Повторили п.2 для следующего параметра 5. Вернули массив Ведь это обычный clipper/harbour -код Только надо будет доработать leto_FreeArea, чтобы при завершении udf-функции освобождать рабочие области (кроме текущей) leto_FreeArea отдает ВСЕ раб.области, открытые в этом потоке. Какие будут предложения ? Может быть, есть способ получше ? Единственная доработка, которая требуется, на мой взгляд (сам не использую пока UDF) - это открытие таблиц в UDF

alx_on: AlexMyr пишет: Идут какие-то изменения? В readme ничего не нашел, все по старому и структура каталогов и названия библиотек Я, честно говоря, выложил версию с потоками "на посмотреть". Т.е. в корне папки исходников ничего не трогал. А оно как все завертелось! У меня свои скрипты компиляции клиента. Можете Вы у себя переделаеть rddleto.hbp и rddleto.hbc? Опубликуете в этом форуме - я выложу на CVS.

AlexMyr: alx_on пишет: Я, честно говоря, выложил версию с потоками "на посмотреть". Ясно, а все доработки потом перейдут в основную ветку или как?

Pasha: AlexMyr пишет: Ясно, а все доработки потом перейдут в основную ветку или как? Версия с потоками куда перспективнее, и она просто должна стать основной. Поэтому letodb без потоков даже не хочется трогать. Хотелось бы, чтобы на новую версию посмотрел А.Кресин.

AlexMyr: Pasha пишет: Хотелось бы, чтобы на новую версию посмотрел А.Кресин. А написать Александру не пытались? Что-то давно он сюда не заглядывал.

Pasha: alx_on пишет: Чем плохо? Скорость (больше ничего на ум не приходит)? Ведь нагляднее и проще передать алиас. Тогда еще на сервере надо добавить функцию leto_areaid() для текущей р/о, для 2-го параметра в leto_selectarea

alx_on: Руки дошли до семейства LETO_VAR*() Переделал под текущую схему (с потоками) Вроде работает. Кто использует? Проверьте на реальном проекте на нюансы...

AlexMyr: Вот что получил при сборке (/* $Id: Changelog,v 1.350.2.14 2011/05/31 09:51:51 aokhotnikov Exp $ */): hbmk2: Compiling... hbmk2: C/C++ compiler command: gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer -W -Wall -pipe -Ic:/dev/harbour/include -I../../../../include ../../../../bin/.hbmk/win/mingw/server.c ../../../../bin/.hbmk/win/mingw/errorsys.c ../../../../bin/.hbmk/win/mingw/common.c ../../../../source/server/errint.c ../../../../source/server/leto_win.c ../../../../source/server/letoacc.c ../../../../source/server/letovars.c ../../../../source/server/letofunc.c ../../../../source/server/leto_2.c ../../../../source/common/blowfish.c ../../../../source/common/common_c.c ../../../../bin/.hbmk/win/mingw/_hbmkaut_server.c ../../../../source/server/letofunc.c: In function 'letoFillTransInfo': ../../../../source/server/letofunc.c:6776:7: warning: format '%d' expects type 'int *', but argument 3 has type 'HB_USHORT *' ../../../../source/server/letofunc.c:6781:7: warning: format '%d' expects type 'int *', but argument 3 has type 'HB_USHORT *' ../../../../source/server/letofunc.c:6794:25: warning: format '%d' expects type 'int *', but argument 3 has type 'HB_USHORT *' ../../../../source/server/letofunc.c:6794:25: warning: format '%d' expects type 'int *', but argument 4 has type 'HB_USHORT *' ../../../../source/server/letofunc.c: In function 'leto_Trans': ../../../../source/server/letofunc.c:6865:16: warning: format '%d' expects type 'int *', but argument 3 has type 'HB_USHORT *' ../../../../source/server/letofunc.c:6885:32: warning: format '%d' expects type 'int *', but argument 3 has type 'HB_USHORT *' ../../../../source/server/letofunc.c:6885:32: warning: format '%d' expects type 'int *', but argument 4 has type 'HB_USHORT *' ../../../../source/server/letofunc.c: In function 'ParseCommand': ../../../../source/server/letofunc.c:7222:45: error: 'mutex_VARS' undeclared (first use in this function) ../../../../source/server/letofunc.c:7222:45: note: each undeclared identifier is reported only once for each function it appears in hbmk2: Error: Running C/C++ compiler. 1 gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer -W -Wall -pipe -Ic:/dev/harbour/include -I../../../../include ../../../../bin/.hbmk/win/mingw/server.c ../../../../bin/.hbmk/win/mingw/errorsys.c ../../../../bin/.hbmk/win/mingw/common.c ../../../../source/server/errint.c ../../../../source/server/leto_win.c ../../../../source/server/letoacc.c ../../../../source/server/letovars.c ../../../../source/server/letofunc.c ../../../../source/server/leto_2.c ../../../../source/common/blowfish.c ../../../../source/common/common_c.c ../../../../bin/.hbmk/win/mingw/_hbmkaut_server.c

alx_on: AlexMyr Странно... Перевыложил

AlexMyr: alx_on пишет: AlexMyr Странно... Перевыложил Теперь нормально собралось.

AlexMyr: Останавливаю сервер, в логе запись 05/31/11 13:57:23: Send STOP to server... может быть так 05/31/11 13:57:23: Send STOP to server... Done. а то послали stop а результата в логе нет.

AlexMyr: О, увидел, оказывается задержка есть 3 сек. 05/31/11 14:08:22: Send STOP to server... 05/31/11 14:08:25: Server has been closed.

alx_on: Pasha пишет: Версия с потоками куда перспективнее, и она просто должна стать основной Я считаю, что текущая реализация хороша, но до определенных пределов Какие есть недостатки: 1. Запуск отдельного потока для каждого подключения накладно. Как по времени запуска, так и по ресурсам. На машинке (win) с 2Гб у меня запустилось около 800 потоков (вроде много, но если клиентов около 100 и каждый создал по 10 соединений, например, это многопоточное клиентское приложение, то к пределу мы уже подошли) 2. Неэффективное использование ядер (больше времени уходит на переключение между ядрами, чем на работу Хочется переделать на использование ограниченного кол-ва рабочих потоков (в идеале, примерно, равное кол-ву ядер) Плюс оптимизация сетевой подсистемы (с учетом реализации стека TCP/IP конкретной ОС) Но! То что поточная реализация точно лучше старой - это факт.

alx_on: Pasha пишет: надо добавить функцию leto_areaid() Я (пока?) не использую UDF Поэтому добавить то могу, но тестировать не на чем. Да и времени сейчас на это нет, честно говоря. Исправляю и добавляю только по мере необходимости, как это не грустно PS leto_ClearAreaEnv() вызывается каждый раз перед завершением операции Так ли это необходимо? Вызова leto_SetAreaEnv() перед операцией вполне достаточно Какие есть мнения?

Pasha: Да функцию я и сам добавлю А leto_ClearAreaEnv() для версии с двумя потоками был просто необходим, так как рабочая область таблицы для всех пользователей была общая, и ее обязательно надо было сбрасывать Для mt-версии наверное это и не надо.

Pasha: Странно, функция leto_areaid() и не понадобилась Сделал udf-функцию для каскадного обновления (вечером выложу): [pre]/* * UDF_UpdCascade - cascade update key fields in main and relation table * Parameters: * nRecNo - record number in the main table * cKeyField - field name in the main table (primary key) * xKeyNew - new value of key field * cClientAlias - client alias of the relation table * cKeyField2 - field name in the relation table (foreign key) * xOrder - order name or order number in the relation table * * This function return array of record buffer in two tables * Call from client: * * aRecBuf := Leto_Udf("UDF_UpdCascade", ... ) * (table1)->( leto_ParseRec( aRecBuf[1] ) ) * (table2)->( leto_ParseRec( aRecBuf[2] ) ) */ FUNCTION UDF_UpdCascade( nUserStru, nRecNo, cKeyField, xKeyNew, cClientAlias, cKeyField2, xOrder ) LOCAL xKeyOld, cLetoAlias, cArea := Alias() LOCAL nPos := FieldPos( cKeyField ), nPos2 dbGoto( nRecNo ) xKeyOld := FieldGet( nPos ) IF xKeyOld != xKeyNew .and. leto_RecLock( nUserStru, nRecNo ) FieldPut( nPos, xKeyNew ) leto_RecUnlock( nUserStru, nRecNo ) cLetoAlias := leto_Alias( nUserStru, cClientAlias ) dbSelectArea( cLetoAlias ) IF Empty( cKeyField2 ) cKeyField2 := cKeyField ENDIF nPos2 := FieldPos( cKeyField2 ) IF ! Empty( xOrder ) ordSetFocus( xOrder ) ENDIF WHILE dbSeek( xKeyOld ) IF leto_RecLock( nUserStru, RecNo() ) FieldPut( nPos2, xKeyNew ) leto_RecUnlock( nUserStru, RecNo() ) ELSE EXIT ENDIF ENDDO dbSeek( xKeyNew ) dbSelectArea( cArea ) ENDIF RETURN { leto_rec( nUserStru ), (cLetoAlias)->(leto_rec( nUserStru)) }[/pre] И оказалось, что при выборе текущей раб.области pUStru->pCurAStru сам присваивается, только мне непонятно как

alx_on: Pasha пишет: pUStru->pCurAStru сам присваивается, только мне непонятно как leto_Alias() - вызывает leto_SelectArea(), там все делается IF ! Empty( xOrder ) ordSetFocus( xOrder ) ENDIF WHILE dbSeek( xKeyOld ) Вот здесь я был бы осторожнее, т.к. не факт, что от другого UDF не остались установленные фильтры и скопы Лучше все сбрасывать перед операциями поиска и прохода по записям Кстати, недостатки текущей реализации UDF: 1 неудобно каждый раз вручную обновлять файл UDF на сервере 2 требуется рестарт сервера 3 непонятно какая именно версия UDF на сервере Как такая идея работы с UDF: 1. Написать функцию отдачи версии UDF-файла (или каждая UDF-функция должна уметь вернуть свою версию) 2. Написать функцию обновления версии UDF-файла (соответственно сервер должен уметь перечитать его) 3. удаление UDF-файла

Pasha: По поводу areaid - не все так просто. leto_rec использует текущий алиас - pArea, и текущую pUStru->pCurAStru. А они в UDF_UpdCascade оказываются разные: AREASTRU для обоих вызовов одинаковая. Так что запрос areaid и ее установка через leto_selectarea() все-таки нужна. Может лучше передавать ее параметром (необязательным) в leto_rec, leto_reclock, leto_recunlock ? Насчет фильтров - ведь каждая udf-функция вызывается по отдельному запросу с клиента, и после ее работы отрабатывается FreeArea, которая должна все сбросить. Это получается как для leto_ClearAreaEnv(). Установленный фильтр надо проверять разве что если одна UDF-функция вызывается из другой. Reload/Unload для UDF сделаю, по аналогии с отработки команды stop - LETO_STOPSERVER. Там надо вызывать hb_hrbunload/hb_hrbload По поводу версии UDF. Может в hrb-модуль добавить функцию UDF_Version, которая возвращала бы строку версии, и с клиента ее можно опросить обычным вызовом leto_Udf('UDF_Version') ? Кстати, можно еще определить функию UDF_INIT, которую сервер вызывал бы при загрузке UDF (если она есть в модуле, конечно)

Pasha: alx_on пишет: 2. Написать функцию обновления версии UDF-файла (соответственно сервер должен уметь перечитать его) А, это запросом с клиента обновлять UDF ? Можно и так, добавить команду, и с ней передавать hrb-файл, который сервер бы загружал

alx_on: Pasha пишет: leto_rec использует текущий алиас - pArea, и текущую pUStru->pCurAStru. Вот именно. Т.е. использование UDF требует аккуратности (мало ли где еще неявно что то используется) Например можно вместо: dbSelectArea( cArea ) ENDIF RETURN { leto_rec( nUserStru ), (cLetoAlias)->(leto_rec( nUserStru)) } написать так: LOCAL aRet := {,} ....... ....... aRet[2] := leto_rec( nUserStru ) dbSelectArea( cArea ) aRet[1] := leto_rec( nUserStru ) ENDIF RETURN aRet Плюс правильно отработать условие "IF xKeyOld != xKeyNew .and. leto_RecLock( nUserStru, nRecNo )" - (пустой массив) Сейчас просто будет падать (cLetoAlias == NIL) после ее работы отрабатывается FreeArea, которая должна все сбросить. Это получается как для leto_ClearAreaEnv() leto_FreeArea() не сбрасывает ничего (явно, по крайней мере), она только передает таблицу в общее пользование потокам Может в hrb-модуль добавить функцию UDF_Version Как вариант, да согласен

Pasha: Обновление обьекта tbrowse происходит так: go top перемещение в начало, вывод строки skip 1 вывод строки skip 1 ... skip -n возврат на первую строку Применительно к letodb это будет выглядеть так: go top выборка записи с сервера skip 1 n записей со 2-й выбираются с сеовера skip 1 запись берется из буфера без обращения к серверу ... skip -n записи с n до 2 беоутся из буфера, а 1-я вновь запрашивается с сервера Чтобы избежать лишнего запроса, я сделал буферизацию записи, которая получена при gotop/gobottom/goto/seek Таким образом, теперь при стабилизации tbrowse к letodb клиент посылает всего 2 запроса: gotop skip Конечно, при этом буфер для skip должен быть не меньше, чем количество строк в tbrowse Для этого можно вызвать: leto_SetSkipBuffer( oB:rowCount() ) Заодно добавил оптимизацию dbGoto: если запрашиваемая запись есть в буфере, она не считывается с сервера.

Pasha: Помимо буферизации skip хочется добавить в letodb буферизацию seek. Предполагается делать буферизацию исключительно на клиенте, сервер при этом задействован не будет. После выполнения seek, если это не поиск по частичному ключу и не поиск последнего ключа, результат поиска добавляется в буфер. Время актуальности буфера - BUFF_REFRESH_TIME (1 сек) Если ключ для seek найден в буфере, то запрос к серверу не выполняется, а запись берется из буфера. Буфер хранится в LETOTAGINFO. При записи в таблице буфер очищается. Использование seek buffer будет целесообразно для небольших справочников, для которых постоянно вызывается seek, а также при задании set relation. Для р/о, в которой задано использование seek buffer, количество мелких запросов к серверу (seek) может быть сокращено в десятки раз. В Ads, насколько я знаю, подобного механизма нет. Какие будут мысли, идеи, сомнения ? Стоит ли использовать такой механизм по умолчанию для всех р/о, или только для заданных ? Как ограничивать размер такого буфера ?

Pasha: Добавил поддержку seek-буфера. По умолчанию он выключен. Чтобы его включить, надо вызвать leto_setseekbuffer( nRecs ) для соответствующего индекса. Параметр - максимальное количество записей в буфере. Использование такого буфера для таблиц, в которых используется преимущественно индексный метод доступа, позволяет существенно сократить количество запросов к серверу. В моем тесте для не очень большой выборки число "попаданий" в буфер достигало тысяч.

alx_on: Pasha пишет: Добавил поддержку seek-буфера 1. поменялся фильтр (выполняемый на сервере) 2. поменялся scope 3. поменяли видимость удаленных записей в этих случаях буфер поиска необходимо сбрасывать (или не учитывать)

Pasha: alx_on пишет: 1. поменялся фильтр (выполняемый на сервере) 2. поменялся scope 3. поменяли видимость удаленных записей в этих случаях буфер поиска необходимо сбрасывать (или не учитывать) Сделаю. Заодно и для skipbuf, там тоже этого нет. set deleted перехватывать не получится, так что прийдется добавить этот флаг в буфер, и проверять его при использовании буфера. Сделаю отдельную структуру для буфера. Зодно хочется добавить статистику запросов для р.о на клиенте - количество запросов, количество попаданий в буфер

Pasha: Сделал Вызов leto_SetSkipBuffer() и leto_SetSeekBuffer теперь возвращает статистику использования буфера для текущей р/о или индекса: сколько раз записи выбирались из буфера, а не запрашивались с сервера.

Pasha: Собрал letodb под win64 с помощью mingw64. Работает.

alx_on: Pasha пишет: Собрал letodb под win64 с помощью mingw64. Работает у меня и раньше работало (правда MAC OS X 64-бита и gcc) есть какая то разница между mingw64 и gcc?

Sergey Spirin: Pasha пишет: Собрал letodb под win64 с помощью mingw64. Работает. Паш, и чего, ни разу приведения pointer к int по всему коду не было? Абалдеть! P.S. Не советую тешиться

Pasha: alx_on пишет: у меня и раньше работало (правда MAC OS X 64-бита и gcc) есть какая то разница между mingw64 и gcc? Да, собиралось и раньше, но в редких случаях могла быть некорректная работа Я убрал варнинги, кое-где поставил вместо ULONG 8-байтный HB_SIZE Думаю, для letodb64 надо давать возможность работать и 32, и 64 разрядным клиентам А в mingw64 используется тот же gcc

Pasha: Sergey Spirin пишет: Паш, и чего, ни разу приведения pointer к int по всему коду не было? Абалдеть! P.S. Не советую тешиться Заслуга в том, что легким движением руки брюки превратились в элегантные шорты, не в letodb, а в истинной многоплатформенности харбора. В харборе напрямую тип __int 64 (longlong) не используется, а используются свои типы, которые в зависимости от архитектуры могут быть 4-х байтными или 8-ми байтными Никто же не специально не делал letodb под MacOS. Оказалось достаточно его собрать, и работает

alx_on: Pasha пишет: Я убрал варнинги Появились новые server/letofunc.c: In function ...leto_Mgmt...: server/letofunc.c:5344: warning: format ...%I64u... expects type ...unsigned int..., but argument 19 has type ...HB_SIZE... server/letofunc.c:5344: warning: format ...%I64u... expects type ...unsigned int..., but argument 20 has type ...HB_SIZE... server/letofunc.c: In function ...leto_udf...: server/letofunc.c:7071: warning: format ...%I64u... expects type ...unsigned int *..., but argument 3 has type ...HB_SIZE *... server/letofunc.c:7071: warning: format ...%I64u... expects type ...unsigned int *..., but argument 3 has type ...HB_SIZE *...

Pasha: Это для 64-битной сборки ? Для mingw64 этих варнингов нет В некоторых компиляторах для 8-байтных целых используется формат не %I64u, а %llu Если использовать для LETO_SIZE_FORMAT %llu, варнинги будут ?

alx_on: Pasha пишет: Если использовать для LETO_SIZE_FORMAT %llu, варнинги будут ? warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 19 has type ‘HB_SIZE’ PS letodb: Mach-O 64-bit executable x86_64

alx_on: Заметил плохую вещь, пока не разбирался на клиенте cp1251 таблицы cp866 установка фильтра с русскими буквами (например: "FIELD->PARAM=='привет'") лажается такие записи точно есть (без лето работает) дополнение: в функции leto_SetFilter() принудительно вызывается leto_SetUserEnv() если вызов leto_SetUserEnv() убрать, то все нормально странно...

Pasha: alx_on пишет: warning: format ‘%llu’ expects type ‘long long unsigned int’, but argument 19 has type ‘HB_SIZE’ PS letodb: Mach-O 64-bit executable x86_64 Странно. А что в этой сборке показывает sizeof(HB_SIZE) ? Должно быть 8

Pasha: Pasha пишет: Заметил плохую вещь, пока не разбирался на клиенте cp1251 таблицы cp866 установка фильтра с русскими буквами (например: "FIELD->PARAM=='привет'") лажается такие записи точно есть (без лето работает) дополнение: в функции leto_SetFilter() принудительно вызывается leto_SetUserEnv() если вызов leto_SetUserEnv() убрать, то все нормально странно... То есть, имеем установку: hb_SetCodepage( "RU1251" ) use ... codepage RU866 Фильтр устанавливаем в cp1251 На клиенте он перекодируется в 866, и сервер его получает в 866 На сервере leto_SetFilter() вызывает leto_SetUserEnv(), который на сервере устанавливает текущую cp1251 Поле при чтении на сервере перекодируется 866->1251, и сравнивается со строкой фильтра в 866. Фильтр не срабатывает. Вызов leto_SetUserEnv() на сервере нужен для установки формата даты, да и для кодовой страницы тоже, чтобы правильно работал upprt/lower Наверное, надо убрать перекодировку строки фильтра на клиенте, и передавать фильтр на сервер без перекодировки, чтобы сервер перекодировал значение поля, и сравнивал его с фильтром. Завтра внимательно протестирую.

alx_on: Pasha пишет: Должно быть 8 Так и есть sizeof(HB_SIZE)=8 компилятор i686-apple-darwin11-llvm-gcc-4.2

Pasha: Да, перекодировку строки фильтра на клиенте надо убрать. Еще, на сервере в leto_RequestArea можно не устанавливать hb_cdpSelect, ведь это делается в leto_SetUserEnv Можно правда включить в leto_RequestArea leto_SetUserEnv, надо подумать

alx_on: Pasha пишет: в leto_RequestArea можно не устанавливать hb_cdpSelect, ведь это делается в leto_SetUserEnv На каждое соединение свой поток В начале инициализации потока один раз вызвать leto_SetUserEnv() Плохо только, если клиент позже сменил, например, кодовую страницу через hb_cdpSelect() Но это и сейчас не отрабатывается в leto_RequestArea() надо устанавливать hb_cdpSelect т.к. я могу подряд вызвать, например, два USE с разными codepage даже не так - hb_cdpSelect надо устанавливать в leto_SelectArea (в одной команде используется много таблиц с разными codepage, например, в UDF) Przemysław Czerpak: On Tue, 24 May 2011, marek.horody...@interia.pl wrote: > Can I in this version, when yes - how, reduce the effects of hb_cdpSelect () only to the current thread? This is default behavior - hb_cdpSelect() changes codepage only for current threads. It does not effect any other threads. Look at doc/xhb-diff.txt, section "MULTI THREAD SUPPORT" Кстати, если использовать для LETO_SIZE_FORMAT %lu, то варнингов нет

Pasha: alx_on пишет: Кстати, если использовать для LETO_SIZE_FORMAT %lu, то варнингов нет Но они есть в mingw64. Надо определить формат, устраивающий все компиляторы, или считывать int не через sscanf Один и тот же формат %lu не может использоваться и для 4, и для 8-ми байтовых int Какая размерность int у i686-apple-darwin11-llvm-gcc-4.2 ? Прогоните тест func main ? 'Hello', U_Long(1), U_Long(2), U_Long(3), U_Long(4), U_Long(5) return nil #pragma BEGINDUMP #define LETO_SIZE_FORMAT "%I64u" #include "hbapi.h" HB_FUNC( U_LONG ) { int iSize = 0; switch( hb_parni(1) ) { case 1: iSize = sizeof( ULONG ); //4 break; case 2: iSize = sizeof( HB_SIZE ); //8 break; case 3: iSize = sizeof( int ); //4 break; case 4: iSize = sizeof( long ); //4 break; case 5: //8 iSize = sizeof( long long ); break; } hb_retnl( iSize ); } HB_FUNC( U_FORMAT ) { HB_SIZE nSize; long lNum; long long llNum; sscanf(hb_parc(1), "Read" LETO_SIZE_FORMAT ";", &nSize); sscanf(hb_parc(1), "%lu", &lNum); sscanf(hb_parc(1), "%lu", &llNum); sscanf(hb_parc(1), "%I64u", &llNum); hb_retnll(nSize); } #pragma ENDDUMP Какие варнинги у последней функции ?

alx_on: ../../../test_c.c:1: warning: ignoring #pragma BEGINDUMP ../../../test_c.c: In function ‘HB_FUN_U_FORMAT’: ../../../test_c.c:43: warning: format ‘%I64u’ expects type ‘unsigned int *’, but argument 3 has type ‘HB_SIZE *’ ../../../test_c.c:43: warning: format ‘%I64u’ expects type ‘unsigned int *’, but argument 3 has type ‘HB_SIZE *’ ../../../test_c.c:45: warning: format ‘%lu’ expects type ‘long unsigned int *’, but argument 3 has type ‘long long int *’ ../../../test_c.c:45: warning: format ‘%lu’ expects type ‘long unsigned int *’, but argument 3 has type ‘long long int *’ ../../../test_c.c:46: warning: format ‘%I64u’ expects type ‘unsigned int *’, but argument 3 has type ‘long long int *’ ../../../test_c.c:46: warning: format ‘%I64u’ expects type ‘unsigned int *’, but argument 3 has type ‘long long int *’ ../../../test_c.c: At top level: ../../../test_c.c:50: warning: ignoring #pragma ENDDUMP Вывод: Hello 8 8 4 8 8

Pasha: т.е, для gcc darwin ULONG - это 8 байт, и формат %lu предназначен для int 64 bit, он подходит и для ULONG, и для HB_SIZE а для gcc mingw64 ULONG - это 4 байт, и формат %lu предназначен для int 32 bit, и формат должен быть разным

Pasha: Все уже украдено придумано до нас Надо вместо LETO_SIZE_FORMAT использовать "%" HB_PFS

alx_on: Отлично (в xHarbour также есть HB_PFS ?) Что решаем с фильтром?

Pasha: В хХарбор - нет, но там и HB_SIZE тоже нет, так что это не вопрос А с фильтром - убрать перекодировку на клиенте. Я проверил различные случаи - работает как надо Через часик выложу

Pasha: Кстати, смотрю: # if defined( HB_OS_DARWIN ) || defined( HB_OS_SUNOS ) || defined( HB_OS_HPUX ) # define HB_BIG_ENDIAN darwin это не big endian часом ?

alx_on: Pasha пишет: darwin это не big endian часом ? Какая то проблема с этим? PS на самом деле это там от безысходности :) /* We cannot detect byte order, we will have to guess */

Pasha: sf упал... некстати :( Вот коммит http://files.mail.ru/H12VQJ Как поднимут - сброшу

alx_on: По поводу фильтра Примерно, до июня все работало Смотрю код - ничего с фильтрами и codepage не менялось (явно, по крайней мере) Нашел! Оказывается я поправил передачу команды "intro" Определение codepage клиента заработало - соответственно фильтр упал :) PS может проще обратно поломать intro? :) шЮтка

Pasha: Да, я тоже проверил, вернул leto без mt - фильтр в таком случае не работает. А там схема работы была точно такой же. Так что повода для беспокойства нет

Pasha: Добавил на сервере функции letoUseArea( nUserStru, nUserStru, cFileName, cAlias, lShared, lReadOnly, cdp ) --> nAreaId letoOrdListAdd( nUserStru, cBagName ) --> Nil letoOrdCreate( nUserStru, cBagName, cKey, cTagName, lUnique, cFor, cWhile, lAll, nRecNo, nNext, lRest, lDesc, lCustom, lAdditive ) --> Nil letoCloseArea( nUserStru ) --> Nil Эти функции можно вызывать из udf-функции в модуле letoudf

AlexMyr: Обновил LetoDB /* $Id: Changelog,v 1.350.2.32 2011/07/08 12:15:46 ptsarenko Exp $ */, собрал, сервер не запускается, пишет: 07/12/11 15:07:45: LetoDB service has had some problems В чем может быть проблема?

Pasha: У меня было такое сообщение, когда я случайно инсталлировал службу с subst-диска Еще вариант - запуск блокирует firewall, например от drweb. Ему надо задать правило для letodb. Какое сообщение выдается при ручном запуске службы ?

AlexMyr: Pasha пишет: Какое сообщение выдается при ручном запуске службы ? Как раз вручную и запускал. До этого собирал официальным mingw, а эту собрал TDM-GCC, может поэтому глючит? Фаервол, антивирусы не устанавливал.

Pasha: AlexMyr пишет: Как раз вручную и запускал. До этого собирал официальным mingw, а эту собрал TDM-GCC, может поэтому глючит? Фаервол, антивирусы не устанавливал. Т.е., сборка с mingw запускается, а с tdm-gcc нет ? Я собирал только с официальным mingw, mingw64 и bcc, и все успешно. Насчет tdm-gcc ничего не могу сказать. А что говорит по этому поводу event viewer ?

Pasha: К слову. Копирую из своего лога: 07/01/11 20:24:31: LetoDB service has had some problems Это я по недосмотру собрал сервер без -D__WIN_SERVICE__, служба уже была инсталлирована ранее, пытался ее запустить, и конечно получил по заслугам

AlexMyr: Пересобрал официальным mingw, проблема осталась: 07/13/11 10:07:08: LetoDB service has had some problems В event viewer ничего нет

AlexMyr: Собрал без -D__WIN_SERVICE__, перестало записывать в letodb.ini сообщение при старте letodb. При попытке остановить сервер в letodb.log: 07/13/11 10:23:08: Can't STOP the server (not started?)... Есть версия: /* $Id: Changelog,v 1.350.2.15 2011/05/31 10:44:43 aokhotnikov Exp $ */ тут все нормально: 07/13/11 10:53:14: Leto DB Server has been started. Leto DB Server v.2.02 ! INIT: DataPath=, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 07/13/11 10:53:24: Send STOP to server... 07/13/11 10:53:27: Server has been closed.

Pasha: AlexMyr пишет: Собрал без -D__WIN_SERVICE__, Для windows надо собирать или с флагом __WIN_SERVICE__ или с __WIN_DAEMON__

AlexMyr: собрал с -prgflag={win}-D__WIN_DAEMON__ #-prgflag={win}-D__WIN_SERVICE__ заработало

Pasha: А сервис letodb ни на каком компьютере не запускается ?

Pasha: Службу я надеюсь вы инсталлировали ? Т.е. letodb install ?

AlexMyr: Pasha пишет: А сервис letodb ни на каком компьютере не запускается ? Letodb крутится на win98 и на win server 2003 еще старая версия (я уже не помню какой сборки). Pasha пишет: Службу я надеюсь вы инсталлировали ? Т.е. letodb install ? Нет, просто запускал, как всегда. А где шла речь о letodb install, м.б. я пропустил этот момент?

Pasha: Семен Семеныч ! Дык службу надо сначала инсталлировать А потом запускать из Панель управления - Администрирование - Службы Разобрались :)

AlexMyr: Pasha пишет: Разобрались :) Так, собрал с #-prgflag={win}-D__WIN_DAEMON__ -prgflag={win}-D__WIN_SERVICE__ потом letodb install, перезапустил комп, все работает. Спасибо.

sashaBG: Привет ! Тестирую LetoDB MT CVS(rel-1-mt) написал такую прогу ////////////////////////// PROCEDURE main() LOCAL _Server := '//127.0.0.1:2812/' REQUEST LETO RDDSETDEFAULT( "LETO" ) use (_Server + 'DVIG') new excl browse() copy to (_Server + 'WORK') use inkey() use (_Server + 'WORK') new excl browse() RETURN второй browse() почемуто пустой ?! с APPEND FROM дело похожее а может я чтото не так делаю ! P.S. в ST версии LeoDB все работает. Я использую COPY ТО и APPEND FROM для обновления структур свойх таблиц use table new copy to temp use dbcreate( 'table' , aStru ) use table new append from temp в SQL-e хорошо там есть ALTER TABLE

Pasha: sashaBG пишет: второй browse() почемуто пустой ?! с APPEND FROM дело похожее а может я чтото не так делаю ! P.S. в ST версии LeoDB все работает. Поправил. На клиенте изменился протокол для этой команды, а сервер не отрабатывал это изменение.

Pasha: Переименовал (вернул) letodb.lib(a) в rddleto.lib(a). Думаю, так будет лучше, все rdd-либы Harbour имеют префикс rdd Добавил пару строк под комментарием в качестве примера, как собрать клиентскую shared-библиотеку (dll/so/dylib/sl)

AlexMyr: При остановке службы бывает, что выскакивает такое сообщение но служба останавливается. Что может быть?

AlexMyr: Pasha пишет: Переименовал (вернул) letodb.lib(a) в rddleto.lib(a). Паша, в старой версии было по правилам, библиотеки в папке lib -olib/rddleto Если можно, то поменяйте.

AlexMyr: Пересобираю letodb и получаю ../../../source/common/net.c:144:18: error: 'MAX_COMPUTERNAME_LENGTH' undeclared (first use in this function) ../../../source/common/net.c:144:18: note: each undeclared identifier is reported only once for each function it appears in ../../../source/common/net.c:148:4: warning: implicit declaration of function 'GetComputerName' ../../../source/common/net.c:145:9: warning: unused variable 'szValue' hbmk2: Error: Running C/C++ compiler. 1 gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer -W -Wall -pipe -Ic:/dev/harbour/include -I../../../include ../../../.hbmk/win/mingw/rddsys.c ../../../source/client/leto1.c ../../../source/client/letomgmn.c ../../../source/common/blowfish.c ../../../source/common/common_c.c ../../../source/common/hbip.c ../../../source/common/net.c Вроде ничего глобально не менялось, а такое вылезло и что делать?

Pasha: AlexMyr пишет: и что делать? Это не вопрос letodb и не вопрос харбора MAX_COMPUTERNAME_LENGTH для mingw определен в include\winbase.h. Проверьте, может берутся какие-то другие *.h файлы Насчет обновления - сделаю в начале августа, т.к. сейчас я в командировке.

sashaBG: Я еще нашел разницу в работе ST и MT версий со SET SCOPE Первая запись попадающая в SCOPE у меня отображается 2 раза Картинка а в ST нет , на картинке видно как я вызываю SCOPE

alx_on: sashaBG пишет: Первая запись попадающая в SCOPE у меня отображается 2 раза Нужен пример самодостаточный тогда смогу посмотреть

sashaBG: вот таким образом я получил подобную ситуацию как в моей MiniGui программе PROCEDURE MAIN() LOCAL _Server := '//127.0.0.1:2812/' REQUEST LETO RDDSETDEFAULT( "LETO" ) USE (_Server + 'DFAKT_0' ) NEW INDEX ON DOK TAG DOK ORDSETFOCUS('DOK') USE (_Server + 'DFAKT_N' ) NEW INDEX ON DOK TAG DOK ORDSETFOCUS('DOK') SELECT DFAKT_0 GO TOP SELECT DFAKT_N SET_SCOPE( ) skip -1 BROWSE() SELECT DFAKT_0 SKIP SELECT DFAKT_N SET_SCOPE( ) skip -1 BROWSE() RETURN //---------------------------------------------------- STATIC PROCEDURE SET_SCOPE( ) DFAKT_N->( ORDSCOPE( 0, DFAKT_0->DOK ) ) DFAKT_N->( ORDSCOPE( 1, DFAKT_0->DOK ) ) DFAKT_N->( DBGOTOP() ) RETURN click here

Pasha: sashaBG пишет: Я еще нашел разницу в работе ST и MT версий со SET SCOPE Первая запись попадающая в SCOPE у меня отображается 2 раза Разобрался. source\client\leto1.c Стр. 1791 ULONG ulDataLen, ulRecLen, ulRecNo = 0; Стр. 1908 - 1911 { bCurRecInBuf = TRUE; ulRecNo = pArea->ulRecNo; } Стр. 1935 if( ! bCurRecInBuf || ( pArea->ulRecNo == ulRecNo ) ) Я смогу сделать коммит на следующей неделе.

Pasha: Отправил изменения

Pasha: Я смотрю, в Harbour SVN убрали HB_LEGACY_TYPES_OFF, и теперь letodb не собирается, хотя с Harbour 3.0 сборка еще работает. Та же проблема и с hwgui Надо менять типы данных ULONG -> HB_ULONG, и т.д и макросы ISBYREF -> HB_ISBYREF. и т.д. Думаю, надо определиться с перечнем версий харбора, для которых возможна сборка letodb Для Harbour это пусть будут версии 1.0, 2.0, 3.0 и SVN (если с 1.0 еще сборка возможна), для xHarbour - надо посмотреть. Думаю, надо отказаться от рудиментов и атавизмов старых версий, и за основу взять новое API. Скажем, использовать не BOOL, а HB_BOOL, и так далее

AlexMyr: Pasha пишет: Думаю, надо отказаться от рудиментов и атавизмов старых версий, и за основу взять новое API. Скажем, использовать не BOOL, а HB_BOOL, и так далее Я тоже так думаю. Хочу попробовать поправить код hwgui, уже малую часть исправил, но времени не хватает (с нашим законодательством и семейством 1с уже замучился бороться и слов не хватает никаких). Так что с меня +1.

Pasha: Не стал выдумывать велосипед, и сделал как Przemek для hwgui Поддержку Harbour 1.0 сделать не получилось. С MAX_COMPUTERNAME_LENGTH дело оказалось вот в чем: После 2011-07-17 16:21 UTC+0200 Viktor Szakats (harbour.01 syenar.hu) windows.h неявно не включается, и его надо указывать напрямую

Pasha: Я получил рекламацию из Бразилии, что служба не запускается. Добавил в лог код ошибки - пишут, что ошибка 0. У меня запуск службы выполняется Непонятно. Как в той пословице: чи рыба чи рак - Кандыба дурак. Чи рак чи рыба - всэ дурэнь Кандыба. Подтвердите запуск или незапуск службы.

AlexMyr: Pasha пишет: Подтвердите запуск или незапуск службы. Сегодня собрал /* $Id: Changelog,v 1.350.2.38 2011/08/07 06:15:27 ptsarenko Exp $ */ Результат: 08/08/11 09:52:24: Leto DB Server has been started. Leto DB Server v.2.02 ! INIT: DataPath=, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10

Pasha: И у меня тоже все в порядке. По-видимому, у моего корреспондента проблема не с letodb

AlexMyr: Еще test_tr не собирается: Generating C source output to 'd:\tmp\hbmk_7iyn9u.dir\test_tr.c'... Done. hbmk2: C/C++ compiler command: gcc.exe -c -O3 -march=i586 -mtune=pentiumpro -fomit-frame-pointer -W -Wall -pipe -Ic:/dev/harbour/include -IC:/dev/letodb/include d:/tmp/hbmk_7iyn9u.dir/test_tr.c d:/tmp/hbmk_o9bjra.c tests\test_tr.prg: In function 'HB_FUN_LETO_DBTRANS': tests\test_tr.prg:56:4: warning: implicit declaration of function 'ISNUM' tests\test_tr.prg:85:13: warning: implicit declaration of function 'ISNIL' hbmk2: Linker command: gcc.exe d:/tmp/hbmk_7iyn9u.dir/test_tr.o d:/tmp/hbmk_7iyn9u.dir/hbmk_o9bjra.o -mconsole -Wl,--start-group -lrddleto -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainstd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -otest_tr.exe -Lc:/dev/harbour/lib/win/mingw -Lc:/dev/harbour/bin -Llib d:/tmp/hbmk_7iyn9u.dir/test_tr.o:test_tr.c:(.text+0x5e): undefined reference to `ISNIL' d:/tmp/hbmk_7iyn9u.dir/test_tr.o:test_tr.c:(.text+0x247): undefined reference to `ISNUM' d:/tmp/hbmk_7iyn9u.dir/test_tr.o:test_tr.c:(.text+0x3ef): undefined reference to `ISNIL' d:/tmp/hbmk_7iyn9u.dir/test_tr.o:test_tr.c:(.text+0x4ce): undefined reference to `ISNIL' collect2: ld returned 1 exit status hbmk2: Error: Running linker. 1 gcc.exe d:/tmp/hbmk_7iyn9u.dir/test_tr.o d:/tmp/hbmk_7iyn9u.dir/hbmk_o9bjra.o -mconsole -Wl,--start-group -lrddleto -lhbextern -lhbdebug -lhbvm -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtpca -lgtstd -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbuddall -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainstd -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre -lhbzlib -Wl,--end-group -otest_tr.exe -Lc:/dev/harbour/lib/win/mingw -Lc:/dev/harbour/bin -Llib

Pasha: Надо сделать замену IS* => HB_IS*

sashaBG: Здравствуйте , захотелось попробовать как работает LetoDB под линукс . Слил HARBOUR из SVNa , установил необходимые библиотеки и компиляторы сделал make install и Harbour откомпилировалсая и устоновился в usr/local/bin , библиотеки в usr/local/lib/harbour, include в usr/lib/harbour потом тупо скопировал из windows компютера LetodbMT . Почитал readme.txt . въполнил ./make_linux.sh , получилась ошибка bash: ./make_linux.sh /bin/bash^M: bad interpreter: No such fil or directory потом попробовал hbmk2 rddleto.hbp lrtodb.hbp Выдало куча ошибок компиляции ERR Посоветуйте пожалуста как откомпилировать сервер !

alx_on: sashaBG пишет: ошибка bash: ./make_linux.sh /bin/bash^M: bad interpreter: No such fil or directory Переводы строк в скрипте виндовые Надо либо с CVS тянуть в linux либо окончания строк поменять в формате linux (т.е. только 10, а не 13,10) потом попробовал hbmk2 rddleto.hbp lrtodb.hbp Выдало куча ошибок компиляции ERR А вот это странно. Файлы не те? По новой с CVS и еще раз UPD: "lrtodb.hbp" - шо це тако???

dimao: Зайдите на мой бложик, там на http://dimao.blogspot.com/p/blog-page.html есть мои пошаговые заметки. Буду рад, если поможет.

sashaBG: alx_on пишет: UPD: "lrtodb.hbp" - шо це тако??? lеtodb.hbp конечно , опечатка вышла :) попробую тянуть с CVS

PSP: dimao, скажите, вы сталкивались на Ubuntu с таким "эффектом", что letodb не реагирует на установку ShareTables? Т.е. всегда ведет себя так, как будто ShareTables = 1.

dimao: Я глубоко не копал. собралось, тесты простенькие потянуло. мне большего и не надо пока. К сожалению давно отошел от программирования - просто тусоваться тут приятно, тешить себя мыслью "и я таким же умным был когда-то"

dimao: А вот подскажите, честной народ, какую версию ЛЕТО взять для продуктивной системы? и каким Харбуром компилировать. Требование - максимально возможное отсутствие глюков. Главное, чтобы меньше старые проги переделывать для работы.

sashaBG: Не знаю как быть с rel-1-mt где указать етот параметр .Я выполнил cvs -d:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb checkout letodb и получил ST версию

alx_on: cvs -d:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb checkout -r rel-1-mt letodb

Pasha: alx_on пишет: цитата: потом попробовал hbmk2 rddleto.hbp lrtodb.hbp Выдало куча ошибок компиляции ERR А вот это странно. Похоже, ситуация следующая. Типы данных BOOL, SHORT/USHORT, LONG/ULONG, константы FALSE/TRUE уже не харборовские. Под windows сборка получается, потому что все они определены во включаемых файлах windows. Под linux они не определены. Вывод: надо в letodb делать глобальную замену: ULONG --> HB_ULONG BOOL --> HB_BOOL и так далее PS. Это все касается Harbour SVN. В релизе 3.0 сборка выполняется.

Pasha: dimao пишет: А вот подскажите, честной народ, какую версию ЛЕТО взять для продуктивной системы? и каким Харбуром компилировать. Я сейчас использую letodb с CVS (mt), собранный Harbour 3.0. На текущий момент глюков не обнаружено (все обнаруженные пофиксены). Падения сервера не видел ни разу.

dimao: Pasha, спасибо. А на какой системе? (WIN?LIN?) Заманчиво сделать маленький LINUX сервачок без иксов с малым энергопотреблением. Есть какие-то наработки? Есть ли в ЛЕТО какие-то механизмы резервного копирования?

Pasha: Я ставлю сервер под windows, под линукс не приходилось Насчет резервного копирования - я думал над этим Видится это как отдельная утилита, которая бы крутилась на сервере, сканировала заданные папки, если это таблицы dbf - открывала бы их через letodb с локальным коннектом, блокировала их через fillock. копировала через Copy To, и результирующую папку архивировала бы Какие будут мысли ?

sashaBG: через hbmk2 все откопилилось , Но не удалось запустить теперь при старте -> letodb: error while loading shared libraries: libharbour.so.3.0: cannot open shared object file: No such file or directory копировал е етот фал в папке где находится letodb и там где harbour но все равно не хочет . А может ето у меня из за линукса я експериментирую на ZENTYAL Linux Small Business Server www.zentyal.org он базирован на Ubuntu 10.04 . Хороший сервер у меня на нем фирменное FTP, VPN и куча всего. Для тех кому интерсно что ето такое click here

Pasha: sashaBG пишет: через hbmk2 все откопилилось , Но не удалось запустить теперь при старте -> letodb: error while loading shared libraries: libharbour.so.3.0: cannot open shared object file: No such file or directory Насколько я помню, делал так: в /etc/ld.so.conf.d задаем: echo /usr/local/lib/harbour > harbour.conf ldconfig только надо уточнить каталог, куда установлен Harbour

Pasha: sashaBG пишет: копировал е етот фал в папке где находится letodb и там где harbour но все равно не хочет Там же много so-библиотек. Надо копировать их все, а лучше настроить путь доступа к ним

Vlad04: Паша пишет Насчет резервного копирования Я примерно так делал для 1с, хотя там есть и специальные приблуды. В нужное время планировщик запускал батник. В батнике было - скопировать нужные файлы по маске в указанное место - создать архив (arj, rar) Копировать dbf в 1с можно и при запущенной программе, если нет монопольного открытия баз. Разрывов баз не наблюдалось. Копирование назначалось на время наименьшей активностью пользователей: в обед, вечером или ночью (если сервер не выключается). В letodb вам видннее, можно ли базы скопировать внешней программой или нет. Если ничто там монопольно не открывается, наверно можно

sashaBG: Спасибо большое Паша в /etc/ld.so.conf.d задаем: echo /usr/local/lib/harbour > harbour.conf ldconfig ето помогло

Pasha: Vlad04 пишет: Если ничто там монопольно не открывается, Как раз в основном режиме БД открывается монопольно, так что и резервное копирование надо делать через letodb

Andrey: Вопрос чисто теоритический: 1) А сколько юзеров потянет LetoDB если СЕРВЕР-LetoDB расположить в каком нибудь ДАТА-Центре ? 2) Какие ресурсы (память, процессор...) нужно заказывать у провайдера ? 3) Хочется такое разделение по папкам городов (у меня программа работает в нескольких городах) \город1\ \город2\ ........ \городN\ Как тогда использовать LetoDb (что лучше): запускать для каждого города свой Сервер-LetoDB или ОДИН Сервер-LetoDB ? Преимущества и недостатки этих вариантов... 4) На какой платформе делать Сервер-LetoDB: Linux или Windows (клиенты будут под Windows) ? Заранее спасибо за ответ.

Pasha: 1. Ограничения на количество юзеров нет. Сколько потянет - могу только сказать, что очень много. 2. Могу только сказать по поводу процессора: чем больше ядер - тем лучше. Насчет оперативки: так как она сейчас измеряется гигабайтами, а letodb занимает в памяти мегабайты, плюс сотни килобайт на каждого подключенного юзера (порядок примерно такой), то ОП - это некритичный ресурс. 3. Да ради бога, можно так и организовать. Сервер путь будет один. Пусть сама БД располагается в какой-нибудь папке, ее и указать в letodb.ini. У каждого клиента сделать настройку папки, где располагается его БД В строке коннекта ее и указывать. А несколько копий letodb можно запускать, если указать каждому серверу в настройке отдельный порт. Но если letodb собран как служба windows, такой вариант не получится, поскольку служба может быть только одна 4. Могу сказать, что letodb хорошо работает и под linux, и под windows.

Andrey: Pasha Спасибо БОЛЬШОЕ !!! Буду пробовать.

AlexMyr: Пытаюсь перелезть на новые версии harbour и letodb, собираю под вин98, в логе есть записи 09/14/11 16:46:58: Leto DB Server has been started. Leto DB Server v.2.02 ! INIT: DataPath=c:\dbfs, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 ERROR! thread2() too big packet ERROR! thread2() too big packet 09/14/11 17:03:01: Send STOP to server... 09/14/11 17:03:05: Server has been closed. Как влияют на работу сервера эти ERROR!

alx_on: AlexMyr пишет: ERROR! thread2() too big packet старый клиент и новый сервер?

AlexMyr: alx_on пишет: старый клиент и новый сервер? может быть, завтра на работе проверю.

AlexMyr: Маленькие неточности: В readme_rus.txt Для удаления службы, вызовите letodb с параметром 'uninstall': letodb.exe install в readme.txt To uninstall service, run letodb with 'install' parameter: letodb.exe install

Pasha: Насчет too big packet - я тоже несколько раз в логе видел такое, когда обновлял сервер и случайно запускал старый клиент. readme - поправлю.

Pasha: Подумалось вот, что можно добавить на сервер функцию закрузки hrb-модуля с клиента, для последующего вызова с клиента функций из этого модуля на выполнение. Но при этом не будет никакой защиты от загрузки на сервер вредоносного кода. Так что делать ее нельзя, а жаль. Хотя даже сейчас такую функцию передачи и загрузки hrb-кода с клиента на сервер можно сделать в letoudf.hrb

Andrey: Pasha пишет: Но при этом не будет никакой защиты от загрузки на сервер вредоносного кода. Тогда нужно сделать типа цифровой подписи разработчика на сервере и при передачи кода делать еще передачу цифровой подписи для этого кода и сравнивать - та подпись или не та. Только не слишком усложнять это.... И еще в настройках внести ГЛОБАЛЬНУЮ параметр ЗАПРЕТ/РАЗРЕШЕНИЯ выполнения кода на сервере.

AlexMyr: В readme.txt еще осталось To uninstall service, run letodb with 'install' parameter: letodb.exe uninstall

Andrey: Теперь вопрос чисто практический: 1) Возможно ли организовать шифрованную передачу данных между СЕРВЕРОМ и КЛИЕНТАМИ ? Alexander S.Kresin писал где-то ранее, что часть (текстовые данные) шифрации уже реализована. 2) Механизм шифрации, какой в LetoDB ? 3) Возможно ли прикрутить "железяку" для шифрования/дешифрования. Имеется в виду ключ HASP-HL, в него встроен криптопроцессор (используется публичный алгоритм шифрования AES/128, RSA/1024). В поставке ключа есть функции обращения к ключу (на С) - зашифровать и расшифровать строку. 4) Возможно ли использовать LetoDB в муниципальных (федеральных) органах. Там же требуется сертификация, и всякая другая фигня.... Где и как можно это сделать (сертификацию), может кто сталкивался ? Если можно будет "прикрутить" HASP-HL, я думаю сертификация не потребуется.... 5) Дайте примеры пожалуйста как настроить СЕРВЕР и КЛИЕНТА для работы. И как на клиенте будет выглядеть запрос к БД-LetoDB ?

Pasha: 1. Да, шифрование траффика есть. И для новых команд я стараюсь делать сразу поддержку и шифрованного траффика 2. Используется симметричный криптоалгоритм blowfish. Ключ - фиксированная строка длиной 10 символов, котораю зашита и на сервере, и на клиенте. 3. Я с ними дела не имел. Этот ключ надо использовать и на сервере, и на клиентах ? Там есть какая-то dll, и протокол обращения к ней ? 4. По поводу сертификации в России - ничего сказать не могу, я ведь живу на Украине. 5. Примеры.. На сервере надо задать параметры в файле leotdb.ini, их описание имеется. Основной параметр - DataPath На клиенте - в командах/функцих use, dbCreate и пр. к имени файла надо добавить строку коннекта, вот и вся настройка.

Andrey: Pasha пишет: Этот ключ надо использовать и на сервере, и на клиентах ? Там есть какая-то dll, и протокол обращения к ней ? Да, вставляем ключ на сервер и другой ключ на клиента. Есть и dll и исходные коды на С. Мне под хХарбор на С сделали функции Encrypting/Decrypting - работают на порядок быстрей чем через dll. Pasha пишет: На клиенте - в командах/функцих use, dbCreate и пр. к имени файла надо добавить строку коннекта, вот и вся настройка. Не совсем понял. Что за строка "коннекта" ? Дайте пожалуйста описание. USE "//127.0.0.1:2812/@/data/test" VIA ????

Pasha: Andrey пишет: Не совсем понял. Что за строка "коннекта" ? Дайте пожалуйста описание. USE "//127.0.0.1:2812/@/data/test" VIA ???? Андрей, а в реадми ты заглядывал ? Я даже на русский язык его перевел: 5. Соединение с сервером клиентских программ Чтобы сконнектиться с сервером, прежде всего необходимо прилинковать rddleto.lib (Windows) или librddleto.a (Linux) у своему приложению, и добавить в начале своей программы две строки: REQUEST LETO RDDSETDEFAULT( "LETO" ) Для открытия файла dbf на сервере необходимо вставить в оператор SET PATH TO, или в команду USE путь к серверу в стандартной форме: //ip_address:port/data_path/file_name. Если задан параметр 'DataPath' в конфигурационном файле сервера, и он имеет непустое значение, необходимо указывать не полный путь к файлу на сервере, а путь относительный ( относительно значению 'DataPath' ). Например, если необходимо открыть файл test.dbf, который расположен на сервере 192.168.5.22 в каталоге /data/mydir и значение параметра 'DataPath' ( в файле конфигурации сервере letodb.ini ) '/data', синтаксис должен быть таким: USE "//192.168.5.22:2812/mydir/test" Если сервер не запущен или Вы указали неверный путь, будет сгенерирована ошибка открытия. Возможно проверить доступность сервера перед открытием файлов вызовом функции leto_Connect( cAddress ), которая вернет -1 в случае неудачной попытки: IF leto_Connect( "//192.168.5.22:2812/mydir/" ) == -1 Alert( "Can't connect to server ..." ) ENDIF

Andrey: Возвращаюсь ОПЯТЬ с вопросом по индексным файлам. CDX поддерживает несколько индексных файлов для одной базы. Как перешел с NTX, так я у себя в программах и оставил. LetoDB пока не поддерживает (или уже сделали) такой нужной фичи... В коде править на один индексный файл у себя в проектах просто немеренно ... Будет ли реализована поддержка нескольких индексных файлов для одной базы в ближайшее время ?

Pasha: source\server\server.prg, надо строку 748 изложить в такой редакции: nIndexStru := leto_InitIndex( nUserStru, OrdBagName( OrdCount() ), cBagName ) Думаю, это решит проблему. Я сейчас сбросить на CVS не могу, сброшу позже, так что сделайте на своей локальной копии.

Andrey: Pasha пишет: Я сейчас сбросить на CVS не могу, сброшу позже Без вопросов... Подожду... Пока есть чем заняться...

sashaBG: Паша у меня просьба к тебе , Расскажи пожалуйста по-подробнее правила работы с LETO_UDF() я почитал в tests\letoudf.prg но к сожалению не все понял , если не трудно сделайте маленький рабочий примерчик . LetoDB отличный сервер я активно им пользуюсь , на нем я перевел свои бухгалтерские программы работает отлично без сбоев. Нагрузка около 50 компов без проблем . Другая моя програма для сервиса сельхоз техники тоже на нем работает ,сервер на Линуксе (помните я спрашивал как откомпилировать, Спасобо все получилось и отлично работает ) , по моим наблюдениям работает быстрее чем под Windows Server 2008 64 bit ( может надо LetoDB сервера собрать тоже в 64 бит. ) Теперь хочется повозится и с Leto_UDF и в связи с етим возникли вопросы: 1. Какая разница между функциями для выполняния на сервере типиа LETO_RECLOCK и обычный RLOCK т.д. для осталных , т.е. какие когда надо использовать ? 2. Что произойдет если получится ошибка при выполнении функций из letoudf.hrb

Pasha: Сервер letodb выполняет блокировки не стандартными средствами rdd, а хранит списки блокированных записей. При блокировке записи она добавляется в этот список, при разблокировке удаляется. Правда, есть еще режим, когда записи блокируются средствами rdd: если в letodb.ini установить параметр "NO_SAVE_WA". Поэтому в udf-функциях лучще использовать только средства letodb для lock/unlock, и не использовать RLock()/dbUnlock(). Если выдать просто RLock(), то сервер не будет знать, что запись блокирована, так как ее нет в списке блокировок, и другой клиент получит неверную информацию. А насчет ошибки: стандартные ошибки харбора перехватываются, так что при возникновении ошибки выполнение udf-функции будет прекращено, и она вернет результат типа Nil. Конечно, функци udf должны быть хорошо отлажены, так как их падение может привести к падению клиента. Такие ошибки, которые привели бы к падению самого сервера, я не представляю как сделать. Это должно быть нечто, приводящее к gpf, да и то сервер может выдержать и gpf. А примеры - так letoudf.prg и есть примеры таких udf-функций. Это что-то вроде storedproc для sql, только пишется функции на харборе. Функция выполняется в той рабочей области, в которой она запущена. Если надо выбирать данные с другой р/о, то она должна получить клиентский алиас, преобразовать его в серверный алиас вызовом leto_Alias. Пример работы с несколькими р/о смотрите в UDF_UpdCascade. udf-функция может изменить текущую запись для клиента. Для этого она должна вернуть строку с записью, которая формируется функцией leto_rec. Клиент, получив эту строку, должен вызвать LETO_PARSEREC, передав полученную строку этой функции в качестве параметра. Можно передавать данные из нескольких р/о, массивом строк.

alx_on: Pasha пишет: Такие ошибки, которые привели бы к падению самого сервера, я не представляю как сделать. Это должно быть нечто, приводящее к gpf, да и то сервер может выдержать и gpf. Раз поднялась такая тема: единственный случай падения (жесткий, молча валится серверная часть, совсем!) - это ошибка в индексном файле (попортилась структура файла или антивирус не дал записать, считать). Не перехватывается корректно ошибка открытия такого индекса. PS т.к. ошибка быстро исправляется (переиндексация), то времени и желания на исправление, как всегда, нет...

Pasha: У себя (а это несколько десятков серверов letodb, часть из которых работает без перезагрузки месяцами) падения сервера мне не пришлось видеть ни разу. В прошлом месяце я получил письмо из Бразилии с таким текстом: Letodb server down while rlock() operation fails. See letodb.log Leto DB Server v.2.02 ! INIT: DataPath=c:\MASTER\DADOS, ShareTables=1, MaxUsers=500, MaxTables=5000, CacheRecords=10 leto_errInternal!!!!!!!!!!!!!!!!!! Same error if ShareTables=0 Поскольку никаких способов воспроизвести эту ситуацию у меня нет, я и не ответил автору. Что там случилось - непонятно. Но ситуация явно тоже разовая. Пару раз видел нарушение индекса. Но там стабильно были (и есть) перебои по питанию.

Pasha: Добавил функцию для блокировки новых коннектов: leto_LockConn( .T. ) После ее вызова сервер не будет устанавливать новые соединения, вплоть до вызова leto_LockConn( .F. ) Соответственно в утилиту magage добавлена кнопка lock/unlock.

Pasha: В настоящее время в letodb используется skip-буфер: при выполнении skip 1/-1 сервер передает клиенту не одну запись, в много, и при следующем skip клиент не обращается к серверу, а берет запись из буфера. При обновлении данных буфер очищается. Если после skip данные обновляются, то возникает нехорошая ситуация: Сервер передал клиенту 10 (к примеру) записей, клиент сделал dbCommit, сбросил буфер, и опять запросил dbSkip(1). Сервер опять передал клинету 10 записей, и так далее. В этом случае использование skip-буфера приводит не у уменьшению, а к увеличению траффика. Как этого избежать ? Можно скажем при отработке commit на сервере устанавливать флаг для рабочей области, чтобы буфер следующий раз не использовать. А при выполнении skip выбирать одну запись, и сбрасывать этот флаг. Или что-то другое ? Как в этом случае поступает Ads ?

Dima: Pasha пишет: Как в этом случае поступает Ads ? Почитай описание AX_CacheRecords() , может поможет чем. [pre2] AX_CacheRecords( [<nNumRecords>] ) -> числовое значение <nNumRecords> - количество записей, которое будет отправлено клиенту с опережением после выполнения операции Skip Возвращаемое значение Если в функцию не передано никаких параметров, то она возвращает те- кущее количество записей, предварительно отправляемых клиенту для те- кущей рабочей области. Если в функцию переданы параметры, то функция возвращает предыдущее значение количества записей, предварительно отправляемых клиенту для текущей рабочей области. Описание Advantage использует схему кэширования с предварительным чтением. Функция AX_CacheRecords() позволяет вам установить значение количест- ва записей, которые будут предварительно считаны и отправлены клиен- ту. Как только вы выполните операцию Skip после любой операции пере- мещения по таблице в вашем приложении, то не одна, а следующие nNum- Records записей будут считаны и отправлены на клиентскую машину. Это позволяет выполнить следующие nNumRecords - 1 операций Skip на ло- кальной машине. Т.о. запись к которой вы перемещались посредством операции Skip будет извлечены из памяти клиентской машины, а не счи- тана с сетевого сервера. Это позволяет достичь значительного увеличе- ния скорости выполнения операций Skip, особенно когда вы производите заполнение вашего browse-окна. Умалчиваемое количество записей, кото- рые будут предварительно считаны на клиентскую машину - меньшее из значений 10 и числа записей, которые могут уместиться в пакетах, пе- редаваемых за один сеанс связи Advantage Database Server и Advantage client (по умолчанию - 8 Кбайт). Замечание: Некоторые предварительно считанные к клиенту записи могут не отражать изменения, сделанные другими пользователями, для которых действительными являются записи, находящиеся в таблице на сервере. Чтобы сбросить записи кэшируемые в данный момент в памяти на клиент- ской машине и обновить текущую запись, используйте операцию "SKIP 0", которая принудительно сбросит кэшируемые на клиентской машине записи. Вызов функции AX_CacheRecords() со значениями 0 или 1 отключает кэши- рование записей. Максимальное количество записей, которые могут быть кэшированы у кли- ента - количество, соответствующее 64 Кбайтам данных. Т.к. каждая за- пись имеет 4 дополнительных (служебных) байта, то мы получим макси- мальное количество записей: nNumRecords = 65535 / ( размер записи + 4 ) Теоретически, оптимальное количество кэшируемых записей - количество записей, которое обычно появляется в browse-окнах вашего приложения. Например, если browse-окно вашего приложения содержит 20 записей, то вы должны рассматривать изменение значения кэшируемых записей т.о., чтобы все 20 записей могли быть прочтены за один запрос к серверу. Однако, если в вашем приложении часто выполняется всего одна операция Skip, то чтение каждый раз 20 записей и не использование их может уменьшить скорость работы вашего приложения. Лучше всего провести эксперимент, для определения оптимального количества кэшируемых запи- сей в вашем приложении (или функции). [/pre2]

Pasha: Судя по описанию, в Ads забота об актуальности буфера возлагается на клиента, и больше никаких действий с ним не предпринимается. Правда, проблем из-за этого я не замечал (когда работал с Ads). В letodb я добавил ограничение на использование буфера. Небольшой (не такой, как ожидалось) выигрыш в производительности наблюдается. Заодно еще кое-что немного оптимизировал.

Softlog86: Извините если не в ту ветку забрёл ... Подскажите где можно скачать готовый пакет LETODB (WINDOWS). Я пока хотел-бы изучить синтаксис команд и тд . Есть-ли описание функций на русском языке ? Буду очень признателен . Нужно переходить со старого доброго 5.3+ADS на Harbour+MiniGUI ну и LETO DB видимо ..... Пока тяжеловато получается ..... в основном из-за отсутствия примеров c описанием .

Andrey: Softlog86 пишет: Пока тяжеловато получается ..... в основном из-за отсутствия примеров c описанием . Harbour+MiniGUI - куча примеров. LETO DB - вообще для новичков сложен.... Нужно бы описание краткое ИДЕОЛОГИИ и ПРИМЕР для новичков. Но времени у наших гуру (как и у всех) не хватает ! Я бы тестером выступил в составление этого руководства....

Pasha: letodb - это сервер и клиентская библиотека. Готовый к употреблению сервер конечно можно собрать и выложить, а с клиенткой библиотекой - много их прийдется собирать, для разных версий харбора, с иксом или без, и для разных C компиляторов. Так что лучше сделайте это сами, тем более это рутинная тривиальная операция. А раз клиента соберете, то нет никакой проблемы и сервер заодно собрать. Насчет примеров я в затруднении. Дело в том, что новых команд у letodb нет никаких. Это rdd, и его использование такое же, как у dbfcdx/dbfntx. Отличается строка коннекта в имени файла, а она подробно описана. Есть дополнительные функции, они описаны плохо, но они предназначены для продвинутого использования, а для простой замены dbfcdx/ads на letodb необязательны. Давать примеры использования use, index, go top, skip, seek, locate что ли ? Зачем ? Отсутствие таких примеров разве являеся препятствием к использованию letodb ? Мне кажется, препятствием является что-то другое. Мне так же не очень понятно, как можно быть тестером описания. Андрей, ты же пробовал работать с letodb ? Вот и описал бы свои попытки, что получилось, что нет.

Andrey: Pasha пишет: Андрей, ты же пробовал работать с letodb ? Вот и описал бы свои попытки, что получилось, что нет. Пробовал, но потом забросил. Рутина заела, времени не хватает... Под тестером, подразумеваю - сборку клиента и сервера и проверку на примерах по шагам с описанием. Давай хотя бы вступление напиши (я не смогу)... Начало уже есть: letodb - это сервер и клиентская библиотека. letodb - это rdd, и его использование такое же, как у dbfcdx/dbfntx.

Pasha: Инструкция на русском языке есть. Последовательность действий: Скачать letodb с помощью TortoiseCVS :pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb указать branch (на вкладке revison TortoiseCVS) rel-1-mt Затем сборка: сервер собрать с помощью letodb.hbp под Harbour, а клиентскую библиотеку: для Harbour - с помощью rddleto.hbp, для xHarbour - make_b32.bat Свои программы собирать с rddleto.lib Пример программы можно посмотреть: tests\test_ta.prg

Softlog86: Спасибо за "Старт" , но вопросов еще больше ... Скачал кучу раных Harbour / MiniGui и т д . Попробовал всё поставить ,,,, но видно какая-то несовместимость ... Подскажите проверенные "комплекты" . Есть HWGUI есть MiniGUI - внутри есть то-же каталоги Harbour ... Тот-ли это что надо или нужно брать из C:\HARBOUR - установленный из другого пакета ? Есть HARBOUR 3.0 Есть 2.0 . Голова круом идёт

Dima: Softlog86 пишет: указать branch (на вкладке revison TortoiseCVS) rel-1-mt Чес слово не понял где это указывать. TortoiseCVS версия 1.12.5

Softlog86: Сервер & LIB LETO я вроде сделал .... Пытаюсь собрать утилиты и примеры .... не получается . Постоянно чего-то нехватает ....

Andrey: Softlog86 пишет: Есть HWGUI есть MiniGUI - внутри есть то-же каталоги Harbour ... Тот-ли это что надо или нужно брать из C:\HARBOUR - установленный из другого пакета ? Есть HARBOUR 3.0 Есть 2.0 . Голова круом идёт Сначала реши на чем будешь делать проги ! Если терминалку, то MiniGUI не нужно, достаточно только HARBOUR 3.0 ! Если Win32 то ставь только MiniGUI !

PSP: Dima, я загружаю командой: cvs -d:pserver:anonymous@letodb.cvs.sourceforge.net:/cvsroot/letodb checkout -r rel-1-mt letodb

Dima: PSP Консольный CVS я где то посеял ;) Слушай а выложи комплект сырцов Letodb на обменник. Спасибо !

Andrey: Dima пишет: Слушай а выложи комплект сырцов Letodb на обменник. Присоединяюсь !!! Я бы тоже не отказался.

Pasha: Выложить несложно, но конечно хочется, чтобы letodb собирали сами. Каждый раз ведь выкладывать не получится ? А изменения есть. Поэтому хотелось бы, чтобы и сборка была максимально простой. Говорите, какие есть проблемы со сборкой. Я не из вредности, сам могу выложить.

PSP: Dima, лови: http://files.mail.ru/V9107O Это - сырцы, бинарника и библиотеки нет, как просил. Но, лучше б, конечно, как Паша говорит...

Pasha: Dima пишет: Чес слово не понял где это указывать. На 2-й вкладке надо отметить Выберите ветку или метку, и там указать rel-1-mt

Dima: Pasha пишет: На 2-й вкладке надо отметить Выберите ветку или метку, и там указать rel-1-mt Сработало . Спасибо ! А "branch (на вкладке revison TortoiseCVS) " не нужен ? PSP Спасибо !

Softlog86: Не могу собрать библиотеки HwGUI : Читал что нужно обновить сырцы .... Не могу найти что-то поновее .... CVS-ом обновил и LETODB и сам HARBOUR .....

Pasha: Dima пишет: А "branch (на вкладке revison TortoiseCVS) " не нужен ? Это одно и то же, у меня просто нерусифицированный TortoiseCVS

Pasha: Softlog86 пишет: Не могу собрать библиотеки HwGUI : Надо обновить сырцы hwgui. Сейчас в функции INFLATERECT стоят вызовы: hb_storvni( pRect.left, 1, 1 ); hb_storvni( pRect.top, 1, 2 ); hb_storvni( pRect.right, 1, 3 ); hb_storvni( pRect.bottom, 1, 4 );

Softlog86: Pasha , подскажите параметры сервера обновления HWGUI через CVS или может есть ссылка?

AlexMyr: svn.exe co https://hwgui.svn.sourceforge.net/svnroot/hwgui/trunk/hwgui hwgui

AlexMyr: Если кому интересно, использую консольній sliksvn __http://www.sliksvn.com/en/download

Andrey: Pasha пишет: Выложить несложно, но конечно хочется, чтобы letodb собирали сами. Каждый раз ведь выкладывать не получится ? А изменения есть. Поэтому хотелось бы, чтобы и сборка была максимально простой. Говорите, какие есть проблемы со сборкой. Я не из вредности, сам могу выложить. Паша, хотелось бы иметь ВСЕГДА рабочую версию в бинарниках, под текущие версии Харбора и хХарбора ! Как в Харборе и хХарборе !!! Пускай будут отставать изменения, не важно (хоть по полгода будут отставать) ! Сам Харбор и хХарбор лежат же в бинарниках, а кто может тот собирает. Я то может и соберу... А вот сборка у новичков точно охоту отобьет !

AlexMyr: Andrey пишет: А вот сборка у новичков точно охоту отобьет ! Letodb точно такой же проект как и все программы которые мы собираем, ничего сложного нет, нужно читать хотя бы readme! По бинарникам тоже могут возникнуть вопросы - как запустить, как настроить, запускать как сервис или нет. Еще раз README

Andrey: AlexMyr пишет: Letodb точно такой же проект как и все программы которые мы собираем, ничего сложного нет, нужно читать хотя бы readme! Согласен. Но для новичков нужно проще сделать ! Хотя бы рабочую (предыдущую) версию выкладывать. Чтоб установил и заработало !!! А там дальше новичок и втянется....

Softlog86: Просто в разные хранилища выкладываются исходники .... И нужна информация где чего брать свеженького :) А вобще - спасибо всем , кто помог ! ( LETODB заработало ! ). Пытаюсь теперь потихоньку перевести свою складскую программу ( писано с 1995 года) на HARBOUR . С организацией данных всё понятно . ВОт в раздумьях - нужен-ли моим пользователям GUI ? Работа с такого вида системами сводится как правило к нажатию стрелок курсора / ENTER/ESC/ и ввод буквенно-цифровой информации . Графическая среда нужна будет только для отображения фотографий товара и тому подобного .... Собственно переход в основном будет связан с новым способом доступа к данным ( LETO/ADS ) и возможностью работы в среде VISTA/WIN7 ...... Пока использую MiniGui и кой какие утилитки уже работают пару лет у клиентов (Программа прайс-лист- фотографии цены и обновление данных через Интернет) . В общем пишется несложно - тут снимаю шляпу перед разработчиками ! а вот с HWGUI не пробовал - смущает что проект вроде утих .....

AlexMyr: Softlog86 пишет: Просто в разные храничлища выкладываются исходники .... И нужна информация где чего брать свеженького Хранилище одно: http://sourceforge.net/projects/letodb/ Softlog86 пишет: ВОт в раздумьях - нужен-ли моим пользователям GUI ? Если они просят, то может и нужен. Softlog86 пишет: а вот с HWGUI не пробовал - смущает что проект вроде утих ..... надо попробовать и потом для себя уяснить подходит проект вам или нет. Меня hwgui устраивает всем, немного бы дизайнер отчетов улучшить, а так все гуд. Есть конечно проблемы у организованности разработчиков, но думаю скоро все прояснится.

Pasha: Andrey пишет: Согласен. Но для новичков нужно проще сделать ! Хотя бы рабочую (предыдущую) версию выкладывать. Чтоб установил и заработало !!! А там дальше новичок и втянется.... У меня, собственно, возражений нет. И лучше сборку выкладывать на сайте проекта: https://sourceforge.net/projects/letodb/files/ Вот только не могу разобраться, как туда ее выложить. Зашел под своим эккаунтом, и не вижу, как туда что-то добавить. Может быть, это может сделать только администратор проекта ? Никто ничего не подскажет ?

Softlog86: Выходные занял полезным делом : Изучаю LETO и заодно кой-чего экспериментирую . Появились вопросы : 1) LETODB - Если IP-сервера у нас не фиксирован а выделяется динамически . Вот у меня в сети компьютеры загружаются в разное время - соответственно роутер выделяет адреса ( ну такая архитектура у нас) - тоесть Динамически . Сегодня у "Сервера" будет 192.168.0.0 а завтра он может быть 192.168.0.10 . Вопрос - есть-ли способ как-то достучаться до сервера не зная его IP а лишь имея Название в сети ? 2) По программированию вопрос . Как сейчас удачнее всего реализовать поиск фрагментов строк в базе имея такую структуру файла : CODE N /5 <- Код довара 1 TYPE C 100 <- Наименование Ручка дверная 2012-R Левая передняя производство Польша COMMENT C 100 <- Описание OPEL VECTRA 95-97/ OPEL ZAFIRA Поиск должен возвращать массив Номеров записи или значений поля CODE в случае обнаружения , например по такому запросу : "перед FIRA 20 " <- То есть я хотел "спросить" как-бы : Дай все записи где есть следующие фрагменты слов " "перед" ( в базе есть строки со словами передний(передняя и тд) + "FIRA" - есть в базе "ZAFIRA" и "20" - есть "2012" Сейчас в CLIPPER я пользуюсь хорошей библиотекой xFinder , а как обстоят дела с таким поиском в среде HARBOUR ? Может есть RDD с уже встроенными функциями такого поиска ? Для меня это ключевой вопрос - потому как это самая главная функция для быстрого поиска в базах ..... Ну так я приучил клиентов .... Они точно не запоминают ассортиментный перечень но по ключевым фразам моментально находят что нужно ...

AlexMyr: Softlog86 пишет: 1) LETODB - Если IP-сервера у нас не фиксирован а выделяется динамически . Проще зарезервировать за mac адресом постоянный ip в настройках dhcp сервера, зачем что-то выдумывать.

AlexMyr: Softlog86 пишет: 2) По программированию вопрос . Как сейчас удачнее всего реализовать поиск фрагментов строк в базе имея такую структуру файла : см. ordwildseek()

Dima: Softlog86 пишет: Сейчас в CLIPPER я пользуюсь хорошей библиотекой xFinder Выложи на обменник глянуть что за зверь.

Pasha: Softlog86 пишет: Выходные занял полезным делом : Изучаю LETO и заодно кой-чего экспериментирую . Появились вопросы : 1. Коннект возможен не только по ip, но и по имени компьютера в сети: //servername:2812 2. Если нет индекса по type, то можно использовать обычный фильтр. Он будет обрабатываться на сервере, а клиент получит только совпадающие строки Строка фильтра: '"' + cStr1 + '"$Type.and.''"' + cStr2 + '"$Type' + ...

AlexMyr: Паша! А не могли бы Вы на __http://sourceforge.net/projects/letodb/ указать где-то, что нужно скачивать rel-1-mt ревизию, а то человек Bruno пробует собрать letodb почти годичной давности свежим Harbourом и ничего не получается. Pasha пишет: Может быть, это может сделать только администратор проекта ? Никто ничего не подскажет ? Попробуйте связаться с Александром, думаю, что ответит.

Pasha: Я вчера другому пользователю из другой страны подсказывал тоже самое. Написал в форум на sf, и Александру тоже.

santy: Pasha Для доступа в https://sourceforge.net/projects/letodb/files/ вам нужны права администратора. Сейчас админ Александр, он должен вам дать права.

AlexMyr: Паша! Вот письмо Przmeka с harbour-users list по поводу сборки под линуксом и он приложил diff файл, может посмотришь. I've just tested it (rel-1-mt) and LETO uses native windows types in its code and this is the source of the problem. Below I'm attaching workaround for it (it defines BOOL, LONG, UINT, ...) which resolves the problem with Harbour builds but I suggest to clean LETO code and replace all such types with native Harbour. I also suggest to create one header file included by leto source code which will have all macros necessary to hide differences between Harbour and xHarbour and older versions of both compilers instead of hardcoding them in different places. The code will be much cleaner and easier to update.

Pasha: Спасибо что подсказали, а то я эту группу не читаю, так бы и прозевал. Только что к ней присоединился. Алексей, а не могли бы переслать мне на ящик это обсуждение, с вложением ? А то у меня сообщения через http://groups.google.com/group/harbour-users?hl=ru почему-то не открываются, а на мыло приходят только новые.

AlexMyr: Паша, вложение отправил на email с профиля, а обсуждали там про ошибки сборки под убунтой. попробуйте это http://groups.google.com/group/harbour-users/browse_thread/thread/c2ee05c7604baf2b?hl=ru# и http://groups.google.com/group/harbour-users/browse_thread/thread/8891537a9041b743?hl=ru# если не получится прочитать, то завтра с работы отправлю обсуждение.

Pasha: Да обсуждение уже и не нужно, спасибо, суть понятна, главное есть патч. Хотя почему-то у меня эти странички открываются пустые. С 3-х провайдеров пробовал.

santy: И у меня тоже пустые страницы, у разных провайдеров

AlexMyr: кеш чистили, может поможет?

Dima: У меня все нормально.

santy: У меня всё нормально в Firefox, в опере не показывает. Обновил оперу и всё стало ок.

Softlog86: Подскажите - как нужно коннектиться к LETODB на локальном компьютере ? Дома приходится работать .... Соединение со строкой "//192.168.0.101:2812/" не проходит ...

Dima: Softlog86 Почитай , должно помочь. Возможно что то не так сделал. http://zalil.ru/32839487

Softlog86: Всё вроде правильно написал : REQUEST LETO RDDSETDEFAULT( "LETO" ) IF leto_Connect( "//192.168.0.101:2812/" ) == -1 && Проверяем загруже-ли LETO-SERVER Alert("LETO-DB NOT CONNECTED " ) ENDIF USE ("//192.168.0.101:2812/DETAL.DBF") SHARED NEW <------ Генерирует страшную ошибку ! PS : Собрал LETO (LIB) из исходников под xHarbour . Может что не так ? Видимо какие-то проблемы с генерацией библиотеки . Только что обновил через CVS получился RDDLETO.LIB РАЗМЕР - 92672 . у всех такой для xHarbour ?? при линковке с новой библиотекой при вызове CONNET_LETO() выскакивает по ошибке : Неисправимая ошибка 9009: hb_xrealloc не может перераспределить память ....

Dima: А сервер запускал ?

Softlog86: Да - он работает ! В я уже проверял . - ошибку соединения не генерирует ..... а вот при вызове USE - проблема ..... Бросьте в меня RDDLETO.LIB для xHARBOUR ..... Похоже в этом дело

Softlog86: Разобрался с глюками ..... перекомпилировал . Получил :LETO DB Server 2.03 . Возможно это и есть последний релиз ... По крайней мере получается хоть что-то делать ... Вопрос ?-> Всё это находится на LETO-DB сервере : Имеется DBF и индекс к нему c несколькими Тэгами . LAN:="//192.168.0.101:2812/" <---- Это маршрут INDEX ON CODE TAG CODE TO (LAN+"JRINDEX.CDX") <--- По коду товара INDEX ON OPER TAG OPER TO (LAN+"JRINDEX.CDX") <--- По коду операции INDEX ON DATEP TAG DATEP TO (LAN+"JRINDEX.CDX") <---- По дате INDEX ON OPTCODE TAG OPTCODE TO (LAN+"JRINDEX.CDX") <---- По коду клиента эти индексы - как-бы общие для всех режимов и пользователей в CLIPPER я использовал "дополнительный-временный" индекс , но организовывал его отдельным файлом в нужный момент (просмотр) : MyBAG:=LAN+"RTMP.CDX" && OPTCODE- поле КОД КЛИЕНТА , Z - нужный в данный момент код клиента INDEX ON DATEP TAG DATX FOR (OPTCODE = Z) TO (MyBAG) UNIQUE ADDITIVE То есть на основе уже имеющегося индекса (DATEP-даты операций) достраивал по условию (OPTCODE=Z - оставить только для клиента Z) SET ORDER TO TAG DATX (Теперь у нас есть все даты (DATEP) для клиента OPTCODE=Z ) .... просмотр данных По окончании просмотра - убираем за собой DELETE TAG DATX DELETE FILE (MyBAG) Но такая конструкция отказывается работать c LETODB ..... Как я понял - к одному DBF файлу нельзя прицепить несколько CDX , да ещё и на разных дисках (LETO / локальный ) ? Хотя должно вроде повторять конструкцию из CLIPPER..... обидно ..... в мануале написано что не все RDD могут поддерживать это ....

Pasha: В харборе для временных индексов есть опция команды INDEX: temporary. Используйте ее. Но такой индекс будет доступен только для одного клиента. Так поступать крайне неэффективно. Я бы просто в таком случае добавил бы еще один постоянный индекс: OptCode+DTOS(DateP) Это было бы куда эффективнее, и, собственно, так и надо делать. Нет необходимости строить левый индекс для каждого клиента, он всегда есть. А letodb не поддерживает собственные индексы и локальные. Поддерживаются только индексы на сервере.

Pasha: А еще лучше модифицировать индексное выражение для 4-го индекса: Вместо OptCode использовать OptCode+DTOS(DateP) Если поле OptCode числовое, то Str(OptCode)+DTOS(DateP) Так убиваются все зайцы одним выстрелом.

Softlog86: Паша , спасибо ! В принципе построение дополнительного индекса было решением "на ходу" ..... а так как систему полностью перелопачиваю - буду оптимизировать и старый код .

Softlog86: Подскажите .... При вызове ORDKEYGOTO() Выскакивает ALERT : Собирал из последних (Получилась версия LETO SERVER : 2.03) ЧТо у меня не так ? Может сие лаконичное сообщение говорит о несовместимости какой ?

Pasha: В letodb никаких алертов и в помине нет, конечно. Если выскакивает такое сообщение - это либо неправильная сборка, либо где-то в программе вызывается этот Alert. Во всяком случае, вызов OrdKeyGoto(<nPos>) эквивалентен dbOrderInfo(DBOI_POSITION,,, <nPos>) с #include "dbinfo.ch", конечно Попробуйте заменить

Softlog86: Паша , спасибо Вам за регулярные подсказки и помощь ! А проблема была странная : в тексте у меня была функция-заменитель : OKEYGOTO(nPOS) IF AX_LOADED() (вызов этой функции для работы с ADS-сервером) ELSE ORDKEYGOTO(nPOS) ENDIF Return Заменил во всех вызовах на штатный ORDKEYGOTO ..... и всё стало нормально Хотелось-бы чтоб сообщения об ошибках в LETO были более вразумительные Заметил что в LETO не работает EVAL + EVERY конструкция : INDEX ON CODE TAG CODE TO (LAN+"DETAL.CDX") EVAL {|| MyMETER()} EVERY REC_INCREMENT Хотел ползунок пришпандорить при индексации .... Ну и обязательный синтаксис с TAG !!! : INDEX ON (ключ) TAG (название) TO (Индексный файл) Если без TAG - будет ошибка ! Поправьте если ошибаюсь

Pasha: Softlog86 пишет: Хотелось-бы чтб сообщения об ошибках в LETO были более вразумительные Заметил что в LETO не работает EVAL + EVERY конструкция : INDEX ON CODE TAG CODE TO (LAN+"DETAL.CDX") EVAL {|| MyMETER()} EVERY REC_INCREMENT Хотел ползунок пришпандорить при индексации .... Эти опции не поддерживаются. Чтобы сделать их поддержку, надо заметно усложнить индексацию. Сейчас алгоритм простой: клиент дает команду серверу на создание индекса, и ждет ее завершения. С этими опциями пришлось бы организовывать обмен пакетами между клиентом и сервером: в процессе индексации сервер должен отправлять клиенту промежуточный пакет, клиент выполнит свой блок кода, даст команду на продолжение индексации, и так далее. Это приведет и к снижению быстродействия. Мне бы не хотелось с этим заморачиваться. Ну и обязательный синтаксис с TAG !!! : INDEX ON (ключ) TAG (название) TO (Индексный файл) Если без TAG - будет ошибка ! Такое использование нестандартно для dbfcdx. Я добавлял поддержку такого синтаксиса, но серьезно его не проверял.

Andrey: Pasha пишет: Это приведет и к снижению быстродействия. Мне бы не хотелось с этим заморачиваться. Правильно! И не надо снижать быстродействие. Только в доку написать что НЕ поддерживается !

Softlog86: Andrey - вот на это самое я и намекал ! Именно описать в доках ! А то приходится часами ковыряться и самого себя десятки раз перепроверять .....

gustow: Кто ковыряет LETODB и немножко сечет в Вики-редактировании - ну нарисуйте главу про него в Вики-книжку по Harbour, что я начал делать на Вики-книге: [url=http://ru.wikibooks.org/wiki/Harbour_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)]вот в этой[/url] . Многим же легче будет при структурированной доке!..

Pasha: Бывает необходимость проверить существование множества файлов в несколькиих каталогах. Скажем, для десятка (или не одного десятка) dbf-файлов, плюс их индексы, это приведет к нескольким десяткам запросов к серверу. Написал маленькую (ну очень) udf-функцию, которая делает это одним запросом. Как обычно - в tests\letoudf.prg

Pasha: gustow пишет: Кто ковыряет LETODB и немножко сечет в Вики-редактировании - ну нарисуйте главу про него в Вики-книжку по Harbour, что я начал делать на Вики-книге: [url=http://ru.wikibooks.org/wiki/Harbour_(%D1%8F%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)]вот в этой[/url] . Многим же легче будет при структурированной доке!.. Алексей, я когда-то сочинил такой текст (см. ниже). Если есть возможность, закиньте пожалуйста его в вики. Что такое Leto DB Server? Leto DB Server (letodb) – это 32/64-разрядный многоплатформенный сервер Баз Данных, в основном предназначенный для клиентских программ, написанных на языке Harbour, для доступа к файлам dbf. Проект Letodb стартовал в 2008-м году, его автор - Александр Кресин. В 2011-м году Letodb был существенно доработан. Letodb – это высокоэффективный RDBMS клиент-сервер для сетевых, автономных (локальных) и интернет - приложений базы данных. Letodb представлен как Open Source проект, разработанный под лицензией GPL, дающей право на его свободное использование. Преимуществом letodb является объединение традиционных средств xBase для доступа Базам Данных и клиент-серверной технологии. Сервер letodb ответственен за весь доступ к базе данных (от имени клиентов). С оптимизированной методологией доступа к данным Letodb обеспечивает безопасность, стабильность и целостность данных при минимальных требованиях к обслуживанию. Сервер Базы данных letodb улучшает работу с базой данных сети. Letodb разгружает большую часть работы, обычно выполняемой каждым автоматизированным рабочим местом клиента. Работая с сетью, letodb обрабатывает запросы данных и возвращает информацию клиентам сети. Сервер Базы данных letodb использует архитектуру клиент-сервер, улучшая многопользовательскую работу, стабильность базы данных, и безопасность базы данных. Сервер letodb поддерживает транзакции. При этом есть гарантия того, что сложная операция обновления Базы данных будет выполнена целиком. Также имеется возможность создания серверных процедур, которые вызываются с клиента и выполняются на сервере. Структурно letodb состоит из серверной и клиентской части. Letodb (как серверная, так и клиентская часть) может использоваться для операционных систем MS Windows, Linux и MacOS. Для MS Windows поддерживаются операционные системы Windows 98/ME, Windows NT/2000/2003, Windows XP 32/64 бит, Windows Vista 32/64 и Windows 7 32/64 бит. Под управлением MS Windows сервер letodb запускается как служба, но есть возможность собрать его как приложение. Для всей линейки разрядных ОС Windows: от Windows 98 до Windows 7 используется одна и та же сборка сервера. Под управлением ОС Linux сервер letodb запускается как демон. Как правило, для различных версий Linux сервер letodb надо собирать отдельно для каждой. Сервер letodb (как и Harbour) поставляется с исходными текстами и правилами сборки. Сервер letodb прост в настройке: достаточно указать папку, в которой располагаются Базы Данных, и некоторые другие настройки. В процессе работы сервер letodb не требует специального обслуживания. Letodb соединяется с клиентскими приложениями по протоколу TCP/IP. По умолчанию при этом используется порт 2812, хотя допускается работа и через другой порт. Соединение с сервером возможно как через локальную сеть, так и через интернет и интранет сети. Сервер letodb обеспечивает безопасность доступа к данным. Имеется возможность включить режим шифрования передаваемого трафика. Также есть средства авторизации пользователей. В этом случае сервер letodb будет обслуживать только те соединения, в которых указаны параметры авторизации: имя пользователя и пароль. Для пользователей можно установить права на администрирование сервера, управление сервером, а также право на изменение данных. Клиентская часть letodb – это библиотека, содержащая драйвер letodb для Harbour – модуль rdd, который удовлетворяет стандарту замещаемых драйверов баз данных языка Harbour, совместимых с драйверами dbfcdx/dbfntx, и поддерживающих их базовую функциональность. Клиентская библиотека letodb также содержит набор функций для управления и администрирования сервером letodb, функции работы с транзакциями, а также набор дополнительных функций для оптимизации работы с Базой данных. Клиентская библиотека letodb позволяет собрать приложение, работающее с сервером letodb, как для ОС MS Windows, так для Linux. Клиентское приложение может работать в гетерогенной сети, в которой используются сервера letodb, работающие под управлением различных ОС: как MS Windows, так и Linux. Для настройки клиентского приложения достаточно указать IP-адрес или имя компьютера, на котором запущен сервер letodb, номер используемого порта, а также папки на сервере, в которых располагается база данных. Для работы с базой данных нет необходимости открывать сетевые ресурсы. Доступ к различным метаданным (шаблонам документов, скриптам, отчетам) также выполняется не через файловые операции, а с помощью запросов к серверу letodb. Возможно соединение приложений, использующих клиентскую библиотеку letodb, с удаленными Базами Данных через интернет и интранет сеть. Для управления сервером предоставляется отдельная утилита, которую можно запустить как на клиенте, так и на компьютере, на котором запущен сервер. С помощью этой утилиты можно просмотреть все клиентские приложения, которые соединились с сервером letodb, а также открытые таблицы Базы Данных. При необходимости есть возможность управления (отключения) соединениями.

gustow: Pasha , спасибо, уже что-то :) Добавил в Википедию в статью про Harbour в главку "Разработка клиент-серверных и Web-приложений".

Pasha: Мне тут поступила рекламация из соседнего полушария нашей планеты. Народ использует инет-соединение для letodb. Обычные операции выборки из БД работают на ура, т.е. быстро. А вот просмотр в гриде - а именно xbrowse fwh - медленно, сильно тормозит. Думаю, тоже самое будет иметь место и для других гридов, в частности tsbrowse. Анализ показал, что причина этого - многочисленные запросы reccount(), которые вызывает грид. Я уже подготовил лекарство. Суть в чем. При получении данных текущей записи я также стал передавать текущее к-во записей. И при запросе reccount можно не выдавать запрос к серверу, а использовать ранее полученное значение. Эта фича включается (по умолчанию она выключена) вызовом: rddInfo(RDDI_REFRESHCOUNT, .f.,, nConnection) Если эта фича включена, то клиент увидит увеличение к-ва записей в таблице не сразу после ее добавления другим клиентом, а только после того, как будет обновлена текущая запись. Кстати, в Ads тоже есть такая фича, но в rddads нет возможности ее включить.

PSP: Pasha пишет: Народ использует инет-соединение для letodb Интересно, какая скорость uplink-а со стороны сервера.

Pasha: PSP пишет: Интересно, какая скорость uplink-а со стороны сервера. Вот чего не знаю, того не знаю

Pasha: Добавил параметр nTimeOut в функции leto_Connect для соединения с сервером, а также опцию "TimeOut=..." в letodb.ini на сервере

AlexMyr: В тестовый пример добавил orddescend [pre2] use ( cPath+"Nakl1" ) New index on Dtos(DORD)+Str(NORD,10) TAG DATA orddescend(,,.t.) [/pre2] и прога вываливается[pre2] C:\dev\letodb\tests\>test_ta.exe Start Files has been created Error LETO/1021 Data type error: -003 Called from ORDDESCEND(0) Called from MAIN(20)[/pre2] Раньше вроде работало.

Pasha: AlexMyr пишет: Раньше вроде работало. Работало в версии 1.х. Поправил.

AlexMyr: Паша, спасибо, завтра проверю на работе.

AlexMyr: Pasha пишет: Поправил. работает, спасибо

sashaBG: Заметил что по команде letodb stop под Win7 процесс Letodb не закрывается а в логе пишет Can't STOP the server (not started?)... под XP все нормально. Замечание: Запускаю и останавливаю из другой программы

PSP: sashaBG, а не собран ли letodb.exe как сервис (служба)?

Pasha: PSP пишет: а не собран ли letodb.exe как сервис (служба)? Так эта команда как раз останавливает сервис. letodb stop коннектится с запущенным сервисом, и посылает ему команду stop. Что-то мещает сконнектиться с сервисом.

Pasha: Я проверил на 2-х компьютерах с win7 - работает Возможно, эту команду блокирует брандмауэр

sashaBG: LetoDB собран с __WIN_DAEMON__ последовательност комманд : letodb letodb stop letodb.log 06/07/12 10:46:49: Leto DB Server has been started. Leto DB Server v.2.05 ! INIT: DataPath=C:\LetoDB, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 06/07/12 10:47:07: Can't STOP the server (not started?)... а кода LetoDb собран как сервис letodb install дает следующее 06/07/12 11:02:05: Error installing LetoDB service: 1072 ето все при использовании BCC55 и батник make_b32.bat когда собраю через hbmk2 service запускается и останавливается (и BCC55 и MINGW ) а через __WIN_DAEMON__ запускается , но не останавливается может я неправильно собираю , вот скрипт: setlocal set path=C:\borland\bcc55\bin;c:\harbour\bin hbmk2 rddleto.hbp letodb.hbp endlocal Пока вернулся на старую сборку с марта месяца , там все везде работает :(

sashaBG: Паша после последних 2-х commit-ов у меня через __WIN_DAEMON__ не работает а до того (2012-04-05 19:20) включительно работает.

Pasha: sashaBG пишет: после последних 2-х commit-ов у меня через __WIN_DAEMON__ не работает а до того (2012-04-05 19:20) включительно работает. Поправил Как оказалось, была необходима инициализация значения timeout для передачи сообщения.

alex_II: Не без труда разобрался и скачал последние исходники и собрал сервер с клиентом. Использую MiniGui+Bcc+Harbour и для экономии времини на освоение прошу поделиться, кому не жалко работающими примерами. Особенно интересует совместная работа на общих таблицах в сети, хотя не откажусь и от любых других исходников. Заранее благодарен

AlexMyr: В папке tests есть примеры, к-е можно пощупать.

Pasha: Различие между rdd dbfcdx и leto заключается только в открытии файла (команда use), а именно в том, что перед именем открываемого файла надо указать строку коннекта к серверу. Все остальные rdd-функции, в том числе совместный доступ к файлам по сети, работают без изменений, и отдельных примеров для них не надо. Еще по-другому надо исмользовать файловые операции, такие как File(), MemoRead() и пр, если предполагается работать с файлами через сервер letodb. Но тут пример не сделаешь, каждый использует эти функции по своему.

Andrey: Pasha пишет: Еще по-другому надо исмользовать файловые операции, такие как File(), MemoRead() и пр, если предполагается работать с файлами через сервер letodb. Но тут пример не сделаешь, каждый использует эти функции по своему. А примерчик небольшой хоть дайте на File() ?

Pasha: Andrey пишет: А примерчик небольшой хоть дайте на File() ? Вот же неисправимый любитель примеров :) Даю пример Local cPath := "//127.0.0.1:2812/temp/" ? leto_File( cPath + cFile ) сильно такой пример поможет ? Наверное, и без примера можно сообразить, как использовать такую функцию

Andrey: Pasha пишет: Вот же неисправимый любитель примеров :) Я опыта набираюсь ! А файловые операции для клиент-серверных программ для меня загадка. Видел в других системах на ADS-клиенте (Delphi) следующее. Программа учета субсидий за квартплату. Приносят базу плательщиков (DBF порядка 30 000 записей) за текущий месяц из ЕРЦ. Так вот чтоб ее принять, т.е. скопировать с клиентского места в рабочую базу, программа тупо копирует по одной записи. Времени уходит примерно 4 часа. Я программисту предлагал, т.к. базы напрямую не доступны, сделать архив DBF, скопировать на сервер, там распаковать и добавить уже на сервере. У него почему-то не получилось. Так юзера и мучаются который год уже.... Вот я и хочу пример на LetoDB сделать для себя на будущее... Операции по добавлению чужих баз очень затратные по времени. Или я не прав ?

Pasha: Andrey пишет: Или я не прав ? В чем не прав ? Какая проблема для программиста скопировать файл ? Странные какие-то проблемы и многочасовые мучения. Это программист неправильный

Andrey: Andrey пишет: скопировать на сервер, Имеется ввиду через порт. Как скопировать файл с флешки в каталог БАЗЫ на LetoDB ?

AlexMyr: Andrey пишет: Как скопировать файл с флешки в каталог БАЗЫ на LetoDB ? Кажется что это двойная работа, сначала данные забросить на сервер а потом эти же данные втянуть в базу. Или я не прав?

Pasha: Andrey пишет: Имеется ввиду через порт. Подумаешь, порт. Какие проблемы у могут быть у программиста с портом ? Тем более на Дельфи. Или лучше заставить юзера помучиться ? Как скопировать файл с флешки в каталог БАЗЫ на LetoDB ? В readme_rus.txt даже не заглядываем ? Если файл небольщой, и его можно полностью прочитать в память, то одним вызовом Leto_MemoWrite Если файл монструазный, то в цикле порциями с помощью функции Leto_FileWrite

Andrey: Pasha пишет: В readme_rus.txt даже не заглядываем ? В последней версии для скачки letodb-0.8.src нет его. Нашел так. Пошел изучать матчасть..... А как кстати проделать обратную операцию: из папки сервера LetoDB переписать файл формы *.fr3 на локальный компьютер ?

Pasha: Andrey пишет: В последней версии для скачки letodb-0.8.src нет его. Так там много чего нет, это версия 3-х летней давности. Файлы для скачивания может заливать только админ проекта, т.е. А.Кресин. Последний раз он это делал давно. Скачивать надо сырцы с CVS, ветвь rel-1-mt Нашел так. Пошел изучать матчасть..... А как кстати проделать обратную операцию: из папки сервера LetoDB переписать файл формы *.fr3 на локальный компьютер ? Дык надо курить leto_memoread и Leto_FileRead



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