Форум » 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: Dima пишет: я тут подумал. может оставить в покое DBsetfilter и пусть он работает как и работал до введения BM , если это сложно. для установки BM фильтра вполне достаточно иметь LBM_DBSETFILTERARRAY а оптимально заполнить массив как бы и не проблема. Да уже все равно сделано. Пусть будет. Если bm дает эту фичу, нелишне будет иметь к ней доступ. Тем более, настройка, использовать ее или нет, существует.

Dima: Pasha пишет: Да уже все равно сделано В смысле уже на CVS с учетом последних глючков ? В Index on почему не срабатывает предложение [EVAL <bBlock>] ? Без него плёхо будет , юзеры не поймут.

Pasha: Нет, на CVS не сбрасывал. Но это уже называется "осталось допилить" А индексация ведь выполняется на сервере, и во время индексации обмена между клиентом и сервером нет, поэтому EVAL и не поддерживается.


Dima: Pasha пишет: А индексация ведь выполняется на сервере, и во время индексации обмена между клиентом и сервером нет, поэтому EVAL и не поддерживается. Хммм а почему в ADS это работает ? [pre2] Предложение EVAL обычно содержит пользовательскую функцию (UDF), которая отображает состояние создания индекса. UDF доступна клиенту пока на сервере строится индекс. Если условие EVAL определено, оно будет вычисляться каждые 2 секунды у клиента. С такой частотой Advantage изменяет внутренний номер записи и количество ключей. Если используются функции RecNo() и/или AX_KeysIncluded(), будет возвращен корректный результат. [/pre2] По моему разумно сделано и юзеру можно показать что он не "висит". Пометил красным ключевую фразу.

Pasha: Это в клиппере ? Я смотрю, в харборе в rddads тоже это условие игнорируется Запускать его отдельным потоком во время ожидания завершения индексации, что ли Пока не представляю, как это сделать

Dima: Pasha пишет: Это в клиппере ? Да А вот так в RDDADS [pre2] INDEXING and Progress Displays: Remote server does not support the EVAL/EVERY clauses. Remember, there is an external process doing the indexing that knows nothing of Harbour expressions or codeblocks. Even with Local Server it's the DLLs doing all the indexing. So to do progress meters you need to implement <b>AdsRegCallback( bEval )</b>. It lets you set a codeblock that is eval'ed every 2 seconds. A numeric value of the "percent completed" is passed to the codeblock by the ADS server. <table> #include "inkey.ch" PROCEDURE Main() ... AdsRegCallback( {| nPercent | outputstuff( nPercent ) } ) /* The above codeblock will be called approximately every 2 seconds while indexing. The codeblock can return .T. to abort. */ INDEX ON First+LAST+LABEL1+LABEL2 TAG First AdsClrCallback() RETURN FUNCTION outputstuff( nPercent ) /* The "callback" function */ ? "output stuff", nPercent RETURN Inkey() == K_ESC /* If press ESC, returns .T. to abort. */ </table> [/pre2] На маленьких базах EVAL в индексе не нужен а вот если база широкая и толстая.......... Можно пойти по тому же пути как в описании выше к RDDADS Тебе виднее можно и нужно ли это. я просто высказал пожелание

Pasha: Отправил на CVS изменения по BM-фильтрам, о которых мы говорили, кроме учета настройки _SET_FORCEOPT на клиенте.

Dima: как бы все красиво но не все. нужно сбрасывать фильтра при установке LBM_DBSETFILTERARRAY() и не важно как они ставились через dbsetfilter или LBM_DBSETFILTERARRAY То есть если сделать так LBM_DBSETFILTERARRAY({1,2,3}) go top ? len(LBM_DBGETFILTERARRAY()) //3 LBM_DBSETFILTERARRAY({1}) go top ? len(LBM_DBGETFILTERARRAY()) //1 работает а если так нет и надо делать dbclearfilter перед LBM_DBSETFILTERARRAY Set filter to nomer==3 go top ? len(LBM_DBGETFILTERARRAY()) //36 LBM_DBSETFILTERARRAY({1}) go top ? len(LBM_DBGETFILTERARRAY()) //0 Pasha пишет: кроме учета настройки _SET_FORCEOPT на клиенте а что там еще не так ? А вообще отличная работа , спасибо !!!

Andrey: Dima пишет: На маленьких базах EVAL в индексе не нужен а вот если база широкая и толстая.......... Можно пойти по тому же пути как в описании выше к RDDADS Тебе виднее можно и нужно ли это. Нужно ! Как юзер увидет что идет индексация ? Что-то нужно делать с этим... Не сейчас, так чуть позже, все равно я только пробую...

Dima: Andrey пишет: Как юзер увидет что идет индексация ? как бы идея есть но она не самая хорошая и сам процесс индексирования конкретного файла юзер не увидит.

Pasha: Dima пишет: Pasha пишет: цитата: кроме учета настройки _SET_FORCEOPT на клиенте а что там еще не так ? Сейчас на сервере letodb+bm используется драйвер BMDBF*. По команде "set filter to ..." строится либо BM-фильтр (если включен FORCEOPT), либо обычный (если выключен). Реализация bm-фильтра в нынешнем варианте BMDBF* мне не нравится, поскольку фильтр строится для всех записей файла. Я об этом написал в devlist, но автор: Przemek - туда не заглянул. Поэтому я хочу дать возможность клиенту также установить эту опцию. Если на сервере FORCEOPT включен, то с клиента можно будет задавать для кажного фильтра его настройку: будет ли он обычный или bitmap. Конечно, можно переделать реализацию letodb+bm: на клиенте добавить еще один rdd: LETOBM, наследник LETO. При этом для первого сервер работал бы через BMDBFCDX, а для второго - через DBFCDX. Это был бы самый гибкий способ, но реализация его сложнее.

Dima: Dima пишет: нужно сбрасывать фильтра при установке LBM_DBSETFILTERARRAY() Pasha Это можно починить ?

Dima: Pasha А можно ли с клиента узнать время и дату на сервере Leto ? Можно ли это добавить в LETO_MGGETINFO() ?

Pasha: Dima пишет: Pasha Это можно починить ? Да, вечером сделаю А какая дата сервера нужна ? Текущая ? Можно самому сделать функцию в letoudf.hrb, примерно такую: Function Leto_Date( nUserStru ) Return DTOC(Date()) + " " + Time() и вызывать ее с клиента: leto_Udf("Leto_Date")

PSP: Дима, такая функция есть: Leto_MGGetTime() 2009-01-30 21:40 UTC+0200 Pavel Tsarenko (tpe2/at/mail.ru) * source/client/letomgmn.c * source/server/letofunc.c * Readme.txt + added LETO_MGGETTIME function. It's return array with server date and time (seconds after midnight): {dDate, nSeconds}

Dima: PSP пишет: Дима, такая функция есть: Leto_MGGetTime() Точно ;) Не увидел сразу. Pasha пишет: А какая дата сервера нужна ? Текущая ? Уже прояснился вопрос.

Pasha: Выложил на CVS сброс фильтра перед LBM_DBSETFILTERARRAY()

Andrey: Pasha пишет: Это был бы самый гибкий способ, но реализация его сложнее. Я за гибкость !

SergKis: Pasha пишет:А индексация ведь выполняется на сервере, и во время индексации обмена между клиентом и сервером нет, поэтому EVAL и не поддерживается. [pre2] Может использовать переменные сервера для процеса индексации: на клиенте: Leto_Progress(.T.) // создает на сервере 2 переменные на каждого nUserStru: // группа PROGRESS: 1. lProgres_+nUserStru := .T./.F. создание индекса идет // 2. nProgres_+nUserStru := счетчик // на сервере добавить в индекацию ведение счетчика. INDEX ON ... // будет работать с заполнением счетчика while leto_IsProgress() ? Leto_Progress() // возвращает счетчик inkey(2) end Leto_Progress(.F.) // убирает переменные [/pre2]

Dima: Pasha пишет: Выложил на CVS сброс фильтра перед LBM_DBSETFILTERARRAY() Спасибо , работает норм !!! Есть одна мысль по поводу BM фильтров и оптимальной их установке. Думаю она тебе тоже посещала. Изложу позже.



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