Форум » 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

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 ?



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