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

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

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

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

Pasha: Чуть позже напишу, сейчас некогда, надо самому глянуть, что за флаги Но скорее всего: #define LETO_VCREAT 1 если переменной нет, она создается #define LETO_VOWN 2 переменная этого пользователя (соединения) #define LETO_VDENYWR 4 запрет присвоения для другого пользователя #define LETO_VDENYRD 8 запрет чтения другим пользователем #define LETO_VPREVIOUS 1 надо смотреть

AlexMyr: Dima пишет: хочу контролировать вход юзеров Есть опция Pass_for_Login=.T., раньше с ней игрался, так вот какая мысль, если добавить еще опцию допустим Multi_login (по умолчанию .F. - один пользователь, сервер сам проверяет, если пользователь залогинился, такой уже не зайдет), если .T. - значит допускается больше одного коннекта для одного юзера. Если Pass_for_Login = .F., то MultiLogin не обрабатывается. Вроде так будет лучше и правильней чем игры с переменными и флагами со стороны клиента.

Dima: AlexMyr Начну с переменных а там посмотрим. Вроде и особо играться там не надо. При входе проверил переменную , если ее нет , завел. Если есть то юзер не войдет. Ее даже убивать не надо при выходе из программы (убивается на автомате после LETO_DISCONNECT если я верно понял)


Pasha: sashaBG пишет: LetoDB у меня работает как демон а не как сервиз не знаю может в етом проблема сначала я кинулся убирать AVAST но не в нем проблема , несмотря что он враждебно относится к LetoDB . иногда падает при закрытии одной обласи или всех рабочих облостей со стороны клиента . Лечится ето через Leto_Commit() перед закрытием на локаьном соединении ето нельзя воспроизвести только через сеть. Ошибка получается не кажды раз . У меня такая ошибка никогда не возникала. Судя по тому, что она лечится через Leto_Commit, возможно, перед dbCloseArea остались данные, которые не переданы на сервер, и блокированные записи. Хотя я таких ситуаций стараюсь избегать, смоделировал их, и ошибки не получил. Посмотрел по сырцам - если такая ситуация возникнет, то измененные записи перед закрытием будут переданы на сервер, и список блокированных записей очищается. Причина ошибки пока непонятна.

Pasha: Pasha пишет: #define LETO_VPREVIOUS 1 Функция leto_varset присваивает переменной новое значение, и возвращает ее предыдущее значение

Dima: Pasha пишет: Функция leto_varset присваивает переменной новое значение, и возвращает ее предыдущее значение Спасибо за разъяснения ! Pasha Порадуешь на счет MAC адреса ?

Pasha: Dima пишет: Порадуешь на счет MAC адреса ? А что надо с MAC-адресом ? Возврашать MAC-адрес сервера, что ли ?

Dima: Pasha пишет: Возврашать MAC-адрес сервера, что ли ? Да MAC адрес сетевой платы cервера. Или к примеру volserial() винта откуда стартовал LetoDB сервер.

Pasha: В source\server\server.prg надо добавить функцию: FUNCTION leto_VolSerial( nUserStru ) RETURN VolSerial() линковать сервер с hbct.lib Вызов с клиента: leto_UDF("leto_VolSerial") Тоже самое можно сделать с mac-адресом, надо только найти такую функцию в харборе. Только в сырцы letodb я это включать не хочу, все-таки другая специфика.

Dima: Pasha Спасибо. Pasha пишет: Тоже самое можно сделать с mac-адресом, надо только найти такую функцию в харборе. Уже искал и не нашел. Но есть GetAdaptersInfo в iphlpapi.lib , но одной прилинковки этой библы не достаточно. Видать что то еще надо. Как вариант можно так [pre2] #include "hbwin.ch" PROCEDURE Main LOCAL nHKey := WIN_HKEY_LOCAL_MACHINE LOCAL cRegPath := "SOFTWARE\Microsoft\Windows Genuine Advantage" LOCAL cRegKey := "MAC" ? GetRegistry( nHKey, cRegPath, cRegKey ) RETURN [/pre2]

Dima: Если EnableFileFunc = 1 То функция FILE() сможет определять наличие файла на сервере или нужно юзать LETO_FILE () ? Будут ли функции в будущем ? Leto_Fcreate() Leto_Fseek() Leto_Fopen() Как проверить существование папки на сервере ?

Pasha: Добавлять в letodb эту функциональность как-то не хочется, так как это несвойственные ему задачи, да и дублирование существующих возможностей. File() и прочие файловые функции будут работать: 1. Если есть файловый доступ к данному сетевому ресурсу: сетевой диск или через unc 2. Посредством netio. На сервере должен быть кроме letodb запущен netio-сервер, и тогда можно к нему сконнектиться и использовать файловые операции вида: Local nH := FOpen("net:" + cFileName, ...) Правда, для windows netiosrv работает как приложение, а не как служба, что создаст некоторые трудности. Дополню: конечно, в letodb это можно реализовать посредством udf-функций

Dima: Pasha пишет: File() и прочие файловые функции будут работать: 1. Если есть файловый доступ к данному сетевому ресурсу: сетевой диск или через unc Базу предполагалось спрятать от юзеров и папку с базой расшаривать не предполагалось. Спрошу иначе ;) Когда запускается программа (моя) она проверяет наличие баз данных. Если какой то базы нет ,она создается (проверяю с помощью FILE()) Что бы не париться с NET: мне достаточно с RDD LETO проверить существование файла на сервере Leto с помощью File() или надо юзать Leto_File() ?

Pasha: Если папка не расшарена, то file и все остальные файловые функции работать не будут. Надо использовать leto_file leto_file('//127.0.0.1:2812/' + cFile) путь к файлу надо указывать относительно DataPath из letodb.ini Для проверки существования папки можно использовать leto_Directory. Параметры такие же, что и Directory Все существующие файловые функции описаны в разделе 7.6 readme Можно написать свой набор функций, через механизм udf. Пример: На сервере добавляется функция Function leto_FCreate(nUserStru, cFileName, nAttr) Return FCreate(leto_GetAppOptions( 1 ) + cFileName, nAttr) leto_GetAppOptions( 1 ) возвращает DataPath Вызов с клиента: leto_UDF('leto_FCreate', cFileName, nAttr) и так далее

Dima: Pasha Спасибо за развернутый ответ.

SergKis: Dima пишет:Когда запускается программа (моя) она проверяет наличие баз данных. Если какой то базы нет ,она создается (проверяю с помощью FILE()) Может будет интересно. Т.к. у нас в прогах на clipper каталоги для баз создаются динамически и их много, то при переводе на letodb сохранили такую же схему работы, добавив в сервер в функцию hs_createtable(...) проверку и создание каталогов. Вот текст: [pre2] FUNCTION hs_createtable( nUserStru, cCommand ) ... IF Lower(cName) = "/mem:" cDataPath := "" cName := Substr(cName, 2) ELSE cDataPath := leto_GetAppOptions( 1 ) ENDIF cFileName := cDataPath + cName IF ! empty(cDataPath) // new _CreateDir( cFileName ) // new ENDIF // new BEGIN SEQUENCE WITH { |e|break( e ) } ... STATIC FUNCTION _CreateDir( cDBF ) LOCAL i, cCt, aCt := {} i := RAt('\', cDBF) cCt := Left( cDBF, i-1) DO WHILE ! hb_DirExists( cCt ) i := RAt('\', cCt) IF i == 0 ; EXIT ENDIF AAdd( aCt , subs(cCt, i+1) ) cCt := Left( cCt, i-1) ENDDO i := Len( aCt ) DO WHILE i > 0 cCt += ('\' + aCt[i--]) MakeDir( cCt ) ENDDO RETURN .T. [/pre2]

Dima: SergKis Спасибо !

Dima: Застрял на ерунде. ? leto_file(pathleto+"\dbf\test.dbf") // .t. set path to (pathleto+"\dbf\") ? leto_file("test.dbf") // почему то .f. с обычным RDD .t. впрочем как и в Clipper Куда копать ?

PSP: Видимо, сервер ничего не знает про установку SET PATH TO

Dima: PSP пишет: Видимо, сервер ничего не знает про установку SET PATH TO Вероятно должен знать Выдержка из доки [pre2] Для открытия файла dbf на сервере необходимо вставить в оператор SET PATH TO, или в команду USE путь к серверу в стандартной форме: //ip_address:port/data_path/file_name. [/pre2] Правда тут ни чего не сказано насчет файловых функций таких как File() к примеру. Но ведь в Harbour как и в Clipper SET PATH TO распространяется и на функцию File() в том числе.



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