Форум » LetoDB, HbNetio. » Leto DB Server (продолжение 10) (продолжение) » Ответить

Leto DB Server (продолжение 10) (продолжение)

Dima: Продолжаем тут

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

finder: alkresin пишет: Есть ли возможность биндить сервер к одному конкретному адресу Поясните, что именно вы имеете ввиду. Сейчас сервер стартует без указания IP адреса, т.е. использует все доступные IP адреса с указанным портом. Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP адресе, например 127.0.0.1 или любой другой ОДИН адрес который можно было бы указать. Думаю это было бы более разумно для различных условий использования Leto DB. alkresin пишет: Возможно ли добавить в Leto DB функцию эквивалентную FCREATE? Leto_FileWrite() создает новый файл с указанным именем, если он не существует и поэтому может служить заменой FCreate(). Отличается ли работа Leto_FileWrite от FWRITE? И да, и нет. FWrite(), как вы знаете, записывает буфер в предварительно открытый файл, начиная с текущей позиции. Leto_FileWrite() открывает файл ( или создает, если его нет ), переходит на указанную позицию (fseek), записывает буфер и закрывает файл. Теперь хоть ясно, а то было непонятно почему отсутствовала функция создания файла при наличии функции записи. Пара уточнений: 1. Как поведет себя Leto_FileWrite без указания позиции начала записи? запишет сначала? 2. Как обрезать файл до размера соответствующего объему записываемых данных? В случае fcreate + fwrite независимо от наличия файла создается новый файл с нужными правами доступа и в него записывается нужная порция информации. В случае летних функций я так понимаю это должно выглядеть Leto_Ferase Leto_FileWrite ? А в случае когда есть необходимость дописать в конец файла надо использовать Leto_FileSize чтобы узнать в какой позиции находится конец файла, ввиду отсутствия функции fseek? Несколько непривычно получается, но теперь по крайней мере механизм понятен. Еще вопрос, в пользовательских функциях есть возможность задать стартовую функцию типа RunOnStart которая будет автоматически запускаться разово после загрузки letoudf.hrb ? Ну и может быть заодно RunOnStop при выгрузке/перезагрузке letoudf.hrb. P.S. Уточню - меня больше интересует работа под *nix системами, так вот. Только что проверил работу Leto_FileWrite, файл создался с правами чтение/запись для всех. В случае использования стандартных файловых функций при создании устанавливаются такие атрибуты. /* File create flags */ FC_NORMAL - чтение/запись для всех FC_READONLY - только чтение для всех FC_HIDDEN - чтение/запись только для владельца FC_SYSTEM - чтение/исполнение для всех + запись для владельца P.P.S. Описание не совсем корректное? Leto_FileWrite( cFileName, nStart, cBuf ) --> lSuccess Записывает переменную <cBuf> в файл на сервере со смещения <nStart> размером <nLen> Кто такой <nLen> ? Насколько корректен возврат lSuccess при условиях не записалось все или не записалось часть, подозреваю в обоих будет .F., а правильнее было бы наверное <nLen>.

alkresin: finder пишет: Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP Я посмотрю, что можно сделать. 1. Как поведет себя Leto_FileWrite без указания позиции начала записи? запишет сначала? Да. Но лучше указать 0 ( сейчас в LETO_FILEWRITE() стоит hb_parnl(2) без проверки типа передаваемого значения ). 2. Как обрезать файл до размера соответствующего объему записываемых данных? Вы сами и ответили на этот вопрос. Несколько непривычно получается, но теперь по крайней мере механизм понятен. LetoDb создавался, в общем-то, для лругих целей. Эти функции были добавлены позже по запросам пользователей и были сделаны с учетом уже сложившейся реализации программы. Еще вопрос, в пользовательских функциях есть возможность задать стартовую функцию... Это к Павлу, я сам эту часть кода еще не смотрел. В случае использования стандартных файловых функций при создании устанавливаются такие атрибуты. Соответствующая функция LetoDb не устанавливает права - просто вызывается стандартная ф-я Harbour hb_fsOpen(). Я вижу, 2-го апреля Павел добавил ф-ю leto_FileAttr() - сее поощью, наверное, можно установить нужные атрибуты.

Pasha: Если в модуле letoudf присутствует функция с именем udf_init, она будет запущена после загрузки модуля.


alkresin: alkresin пишет: цитата: Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP Я посмотрю, что можно сделать. Добавил новый параметр в ini-файл: ip, где можно указать этот единственный ip.

finder: Pasha пишет: Если в модуле letoudf присутствует функция с именем udf_init, она будет запущена после загрузки модуля. ТОЧНО ) Прошу прощения - провтыкал... alkresin пишет: цитата: Хотелось бы иметь возможность, чтобы сервер слушал запросы только на ОДНОМ IP Я посмотрю, что можно сделать. Добавил новый параметр в ini-файл: ip, где можно указать этот единственный ip. Проверил, вроде работает ) Спасибо. Имя параметра в letodb.ini окончательное, меняться не будет?

finder: Какие ограничения есть на имена пользовательских групп и переменных? Длина, набор символов, количество, etc...? Доступна ли работа с ними из пользовательских функций? Возможно ли удалить группу? В этих переменных можно хранить только CNL типы?

alkresin: finder пишет: Имя параметра в letodb.ini окончательное, меняться не будет? Окончательное. Какие ограничения есть на имена пользовательских групп и переменных? Длина, набор символов, количество, etc...? Нет ограничений. Доступна ли работа с ними из пользовательских функций? leto_var...(), или вы о чем-то другом ? Возможно ли удалить группу? Попробуйте leto_vardel( cGroupName, "" ) В этих переменных можно хранить только CNL типы? Да.

finder: alkresin пишет: Возможно ли удалить группу? Попробуйте leto_vardel( cGroupName, "" ) С пустой строкой в имени переменной помогло, до этого пробовал указывать только имя группы alkresin пишет: Доступна ли работа с ними из пользовательских функций? leto_var...(), или вы о чем-то другом ? letoudf.prg #include "rddleto.ch" Function UDF_Init LETO_VARSET( 'GroupNameTest', 'VarNameTest', 'VarContent', LETO_VCREAT ) Return NIL hbmk2 letoudf.prg -gh letodb stop letodb start letodb.log 04/07/15 10:20:25: Leto DB Server has been started. Leto DB Server v.2.15 ! INIT: DataPath=/path/data, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 04/07/15 10:20:25: Error BASE/6101 Unknown or unregistered symbol: LETO_VARSET ERROR! SETHRBERROR - pUStru not found!!!!!!!!!!!!!!!!!!!! Возможно я делаю что-то не так? С пользовательскими переменными можно работать только с клиента?

SergKis: finder readme_rus.txt в конце [pre2] Функции letoUseArea, letoOrdListAdd, letoOrdCreate, letoCloseArea, leto_RecLock, leto_RecLock предназначены для использования в udf-функциях вместо rdd функций: dbUseArea, OrdListAdd, OrdCreate, dbCloseArea, RLock, dbUnlock LETO_VARSET( nUserStru, cGroupName, cVarName, xValue[, nFlags ) --> lSuccess LETO_VARGET( nUserStru, cGroupName, cVarName ) --> xValue LETO_VARINCR( nUserStru, cGroupName, cVarName ) --> nValue LETO_VARDECR( nUserStru, cGroupName, cVarName ) --> nValue LETO_VARDEL( nUserStru, cGroupName, cVarName ) --> lSuccess LETO_VARGETLIST( nUserStru, [cGroupName, [lValue]] ) --> aList [/pre2]

SergKis: PS. в пред.версии letodb (двухпоточной): leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) ... cVal := leto_varGet( NIL, cGru, cNam ) в этой версии еще не пробовал

SergKis: finder пишет:04/07/15 10:20:25: Error BASE/6101 Unknown or unregistered symbol: LETO_VARSET добавьте: #include "rddleto.ch"

alkresin: finder пишет: С пользовательскими переменными можно работать только с клиента? Leto_var... функции определены и в серверной части. Я сейчас добавил в server.prg REQUEST для них, теперь не должен ругаться. Правда, при вызове из udf_init() выскакивает ошибка - возможно, на этот момент что-то недоинициализировано, надо проверить.

SergKis: SergKis пишет:добавьте: #include "rddleto.ch" правильнее будет для работы с leto_var...: #define LETO_VCREAT 1 #define LETO_VOWN 2 #define LETO_VDENYWR 4 #define LETO_VDENYRD 8 #define LETO_VPREVIOUS 1 т.к. #include "rddleto.ch" содержит: #define LETO_NTX 1 #define LETO_CDX 2 что повторяется с server.prg (line 64) или убрать в server.prg (line 64, 65) и использовать #include "rddleto.ch" что лучше - это к alkresin и Pasha

alkresin: или убрать в server.prg (line 64, 65) и использовать #include "rddleto.ch" Убрал, добавил. alkresin пишет: Правда, при вызове из udf_init() выскакивает ошибка - возможно, на этот момент что-то недоинициализировано, надо проверить. Просмотрел код. Функции leto_..., вызываемые из udf, должны в качестве первого параметра передавать nUserStru - параметр, который получает udf ф-я, это идентификатор клиента, который выполняет udf ф-ю. Поскольку udf_init() выполняется автоматически при старте и ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее.

finder: alkresin пишет: Просмотрел код. Функции leto_..., вызываемые из udf, должны в качестве первого параметра передавать nUserStru - параметр, который получает udf ф-я, это идентификатор клиента, который выполняет udf ф-ю. Поскольку udf_init() выполняется автоматически при старте и ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее. Спасибо, понял, буду использовать внешний инициализатор. Может стоит в readme что-то сделать с этим описанием, а то получается что суть <nLen> не раскрыта? Возможно стоит добавить так же, что при отсутствии файла он создается. Leto_FileWrite( cFileName, nStart, cBuf ) --> lSuccess Write <cBuf> character string to a file at the server from <nStart> offset and <nLen> length

SergKis: alkresin пишет: ни одного пользователя к этому моменту не определено, то leto_... функции не могут вызываться из нее. в пред.версии letodb (двухпоточной) Pasha специально делал для функций leto_var..., с nUserStru := NIL - работа с общими переменными: leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) cVal := leto_varGet( NIL, cGru, cNam )

finder: SergKis пишет: в пред.версии letodb (двухпоточной) Pasha специально делал для функций leto_var..., с nUserStru := NIL - работа с общими переменными: leto_varSet( NIL, cGru, cNam, cVal, LETO_VCREAT ) cVal := leto_varGet( NIL, cGru, cNam ) Я проверил после обновления, на имя функции ругаться перестало, но валится если их вызывать из udf_init() Кстати это первый раз когда у меня получилось уронить letodb letodb_crash.logBreakdown at: 2015.04.08 10:46:06 Unrecoverable error 6005: Exception %s at address %s SIGSEGV 0x17 ------------------------------------------------------------------------ User: 127.0.0.1 (null) (null) Command: udf_rel Код такой letoudf.prg#include "rddleto.ch" Function UDF_Init LETO_VARSET( NIL, 'GroupNameTest', 'VarNameTest', 'VarContent', LETO_VCREAT ) Return NIL

SergKis: finder пишет:но валится если их вызывать из udf_init() буду знать. я ф-ии использовал в триггере, поэтому было все ok.

alkresin: finder пишет: Может стоит в readme что-то сделать с этим описанием, а то получается что суть <nLen> не раскрыта? Да, никакого nLen нет в этой функции, используется длина cBuf. Исправлю.

nbatocanin: Есть ли где описание команды в дебуг режиме? close;16; unlock;14;02; unlock;15;02; goto;15;1695;par_naz;A; rcou;15; skip;15;-1;1695;par_naz;A; rcou;15; rcou;15; rcou;15; skip;15;1;1695;par_naz;A; rcou;15; rcou;15; rcou;15;



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