Форум » LetoDB, HbNetio. » Вопросы новичка... » Ответить

Вопросы новичка...

Andrey: Взял последнюю версию с "Новая страница с бинарниками", установил на Win2008 Server, чуток помучился с портом... Собрал на МиниГуи+BCC 551 - \MiniGui\batch\hbmk2.bat rddleto.hbp Получил rddleto.lib - 131072 байт - правильный ли размер ? И еще Warning-и лезут: lib\.hbmk\win\bcc\rddsys.c: source\client\letocl.c: source\client\leto1.c: source\client\letomgmn.c: source\common\blowfish.c: source\common\common_c.c: source\common\hbip.c: TLIB 4.5 Copyright (c) 1987, 1999 Inprise Corporation /P32 lib\rddleto.lib -+ lib\.hbmk\win\bcc\rddsys.obj -+ lib\.hbmk\win\bcc\letocl.obj -+ lib\.hbmk\win\bcc\leto1.obj -+ lib\.hbmk\win\bcc\letomgmn.obj -+ lib\.hbmk\win\bcc\blowfish.obj -+ lib\.hbmk\win\bcc\common_c.obj -+ lib\.hbmk\win\bcc\hbip.objWarning: 'rddsys' not found in library Warning: 'letocl' not found in library Warning: 'leto1' not found in library Warning: 'letomgmn' not found in library Warning: 'blowfish' not found in library Warning: 'common_c' not found in library Warning: 'hbip' not found in library Так должно быть или нет ? Вопрос сразу напрашивается с путями - как писать правильно "\" или "/" : Local cPathServer := "//127.0.0.1:2812/" cPathServer := cPathServer +"DATE_TEST_PATH\test.dbf" Помню что где то обсуждали, а результат не запомнил...

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

Andrey: alkresin пишет: Andrey пишет: цитата: А какой максимальный размер можно передать через cBuf ? Насколько я помню, ограничений нет, но все в пределах разумного... У меня получается передавать 3-5 Мб через cBuf по интенету. В локалке наверно можно и больше. Какой размер нужно передавать чтобы на всех машинах (включая и слабые компы) не вылетала программа ? Если файл размером 29Мб - программа не вылетает, только не копирует файл и всё. Может кто еще попробует... cBuff := HB_MemoRead(cFile) - сколько может считать эта функция ? Какое ограничение по размеру нужно ставить при копировании файла ?

alkresin: Попробуйте определять размер файлов с помощью leto_FileSize() и потом, если надо, передавать его по частям c помощью leto_Fileread()

Andrey: alkresin пишет: Попробуйте определять размер файлов с помощью leto_FileSize() и потом, если надо, передавать его по частям c помощью leto_Fileread() А какой размер МАХ для передачи нужно делать ? И еще вопрос: как определить по базе - кем она открыта: DBFCXD или LETO ?


Pasha: И еще вопрос: как определить по базе - кем она открыта: DBFCXD или LETO ? Надо выдать leto_mgGetTables(), и затем искать в полученном массиве, открыта ли таблицы на сервере letodb.

Andrey: Pasha пишет: Надо выдать leto_mgGetTables(), и затем искать в полученном массиве, открыта ли таблицы на сервере letodb. Спасибо !

Andrey: Выходит ошибка при старте локального сервера (Win8.1) Leto DB Server v.2.15b3 : 06/18/15 11:44:18: Server has been closed. 06/18/15 11:44:29: LetoDB service has had some problems: 1063 Что за ошибка ? Через службы сервер запускается.

Andrey: Не работает мой код для Leto на нескольких серверах, работает только на одном. Что делать, куда "копать" ? Имею сервер Leto DB Server v.2.15b3 - letodb.exe 998912 04.06.15 установлен на всех компах. 1) Windows Server 2008 - код работает ТОЛЬКО на этом сервере. 2) Windows Server 2012 R2 - код не работает. 3) Windows 8.1 Prof - сервер локальный - код не работает. Код примерно такой: SELECT WZAIV nSelZaiv := SELECT() DBSETORDER(1) SELECT WMASTER nSelMast := SELECT() DO WHILE ! (nSelMast)->( EOF() ) aCalc := { 0, 0, 0, 0, 0, 0, 0 } nMaster := WMASTER->KMASTER SELECT WZAIV DBSETORDER(1) // это на всякий случай GOTO TOP // убирал для пробы - всё без разницы SEEK(nMaster) lRet := FOUND() //MsgDebug(lRet,nMaster,ALIAS(), OrdKey(), OrdName(), OrdFor() ) DO WHILE WZAIV->KMASTER == nMaster IF WZAIV->KDATE == 1 aCalc[1]++ .......... SKIP ENDDO SELECT WMASTER WMASTER->ZPR := aCalc[1] ............ SELECT(nSelMast) dbSkip(1) ProcessMessages() // ОБЯЗАТЕЛЬНО ! ENDDO Не работает SEEK(nMaster) lRet := FOUND() lRet для компа 2) и 3) возвращает .F. Ладно бы на всех не работало, это я бы на косячил, но на ОДНОМ 1) же работает ....

Pasha: dbSeek() не найдет ключ в следующих случаях: 1. Открыт не тот индекс 2. Такого ключа в индексе нет 3. Ключ в индексе есть, но он не попадает в установленный фильтр/scope вроде все. Еще, конечно, может быть битый индекс.

Andrey: Pasha пишет: Еще, конечно, может быть битый индекс. Я же его делаю каждый раз, после открытия базы. Значит битым не может быть. Буду делать отдельный тест тогда...

Pasha: alkresin пишет: Попробуйте определять размер файлов с помощью leto_FileSize() и потом, если надо, передавать его по частям c помощью leto_Fileread() Я смотрю, в hbip.c есть такой фрагмент: [pre2] /* Set internal socket send buffer to 64k, * this should fix the speed problems some users have reported */ hb_ipSetBufSize( hSocket, 0xFFFFFF, 0xFFFFFF ); [/pre2] где задается размер буфера для передачи. Надо полагать, что данные все равно передаются фрагментами по 64k ? Кстати, в чем там задается размер ? 0xFFFFFF это вроде не 64k

Andrey: Pasha пишет: где задается размер буфера для передачи. Надо полагать, что данные все равно передаются фрагментами по 64k ? Кстати, в чем там задается размер ? 0xFFFFFF это вроде не 64k Видно сложный вопрос, раз нет ответа... Очень жалко...

Andrey: Сделал тестовый пример. Алгоритм простой - выборка из базы по SEEK и SKIP - суммирование по 7 полям и запись этих 7 полей в локальную базу на компе пользователя. Итого 13 раз нужно просчитать по базе. Убрал лишний вывод на экран. Наверно тормоза МиниГуи были из-за него. Теперь скорость просто чумовая: База 100 000 записей с мемо-полями: ~120 Мб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:00:00 2) локальная LETO - 00:00:01 3) интернет LETO - 00:01:49 База 1 000 000 записей с мемо-полями: ~1,2 Гб Расчет по простому индексу 13 позиций: 1) локальная DBFCDX - 00:00:06 2) локальная LETO - 00:00:09 3) интернет LETO - 00:18:15 Открыть в TBROWSE миллион записей из базы, которая находиться неизвестно где (на просторах интернета) - это просто пипец (как говорит Аллочка из Универа) Вывод: связка Harbour + LetoDB + MiniGui - отличная вещь в работе. Это при том, что используется простой старый алгоритм, без переделки под Leto ! 2 вопроса к форумчанам: 1) Протестируйте кто нибудь по сетке это пример. Ну нет у меня сетки под рукой. Там путь просто набить и будет работать. 2) Как улучшить алгоритм для Leto ? Пример тут - https://cloud.mail.ru/public/DkoH/nSzvMbeCh

Andrey: Как проверить на сервере LetoDB - подключена ли функция LTON ?

Pasha: Например, задать фильтр: set filter to LTON(<lExpr>)==1 и затем вызвать: leto_IsFiltOptim() Если вернет .t. - значит, функция выполняется на сервере

Andrey: Pasha пишет: set filter to LTON(<lExpr>)==1 и затем вызвать: leto_IsFiltOptim() Если вернет .t. - значит, функция выполняется на сервере Что-то сложноватая проверка.... А нет ли более простой ? По типу hb_IsFunction( cFunc ) Программу ставишь и помнить надо - есть на сервере та или иная функция. Затратно как то. А так у себя в коде поставил проверку - нет такой функции на сервере и уже понятней станет. Это сейчас, когда ставишь сервер, помнишь, а потом забудется и будешь потом

Pasha: Должна сработать функция (хотя она немного не для этих целей): leto_UdfExist("LTON") или (для соединения, которое не является текущим): leto_UdfExist("//localhost:2812/LTON")

Andrey: Pasha пишет: leto_UdfExist("LTON") Сработало ! Спасибо ! Pasha пишет: Можно еще добавить перед внешним циклом: leto_SetSkipBuffer(<побольше>) Тогда и он будет выполняться быстрее, так как запросов к серверу будет меньше. А сколько <побольше> ? Диапазон подскажи...

Pasha: Прикидывайте сами. Размер буфера зависит только от размера и содержимого записей. Запись передается подпакованная, без лишних пробелов. Пусть размер записи 100 байт. Передаваемый с сервера размер (он непостоянный) - пусть будет 40 байт. Тогда, если установлен leto_SetSkipBuffer(1000), размер буфера с содержимым 1000 записей будет примерно 40000 байт. Из этих соображений и надо исходить. Соображение примерно те же, что и при передаче больших файлов. leto_SetSkipBuffer устанавливается для каждой рабочей области отдельно. Перед большим циклом его можно установить большим, а после выполнения цикла - вернуть стандартное значение: leto_SetSkipBuffer(10) Для циклов, внутри которых выполняется обновление данных с блокировкой каждой записи, skip-буфер сбрасывается, поэтому его увеличивать нет смысла.

PSP: Паша, а сколько времени "живет" этот буфер? 1 сек? С какого момента отсчет начинается? Что произойдет, если это время закончится раньше, чем закончится выборка в цикле? Что произойдет, если это время закончится в момент передачи уже выбранных данных с сервера клиенту?

Pasha: Да, 1 секунда. По окончании которой данные с сервера будут запрашиваться повторно. Отсчет времени идет после получения данных с сервера, так что время отклика сервера для проверки актуальности буфера роли не играет.



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