Форум » [x]Harbour » Cписок алиасов » Ответить

Cписок алиасов

Dima: Как получить список всех открытых баз данных ? Либо в виде алиасов либо номеров рабочих областей. Можно конечно сделать самопал , но вдруг что то готовое есть и эффективное.

Ответов - 32, стр: 1 2 All

fil: Есть, в FWH.. и выглядит это так function aGetWorkAreas() // Returns an Array with all available Alias local aAreas := {} local n for n = 1 to 255 if ! Empty( Alias( n ) ) AAdd( aAreas, Alias( n ) ) endif next return aAreas

Dima: fil О таком самопале я и грил. Такой способ понятен и не очень эффективен. Перебрать надо 255 рабочих областей (кстати в Harbour эта цифра не больше чем 255 ?) Почему вопрос такой возник. При открытии баз в сети (42 базы 105 индексов) , открытие баз происходит быстрее чем закрытие при выходе когда делаю DbCloseAll(). Просто хотел ускорить закрытие баз. Понятно что при открытии баз можно заполнять массив и потом в цикле по нему закрыть базы.

Dima: Хочу добавить что DbCloseAll() с RDD DBFCDX срабатывает быстро а вот с ADSCDX медленновато.


Haz: Вместо dbCloseAll() с ADS можно попробовать AdsCloseAllTables()

Dima: Haz пишет: AdsCloseAllTables() Пробовал. Падает прога с GPF Сегодня dbcloseall() работает нормально , хз что было...

Dima: Заметил если в течении дня часто пересобирать прогу то через какое то время комп начинает тормозить , прога собирается дольше , часов через 5 может даже инет отвалится. Компилятор Mingw +Harbour. Возможно этот тормоз задел каким то боком и ADS который в качестве сервиса крутится на этой же машине.

Haz: Странно ... у меня не падает при вызове ADSCloseAllTables, но я собираю на BCC и может причина в этом. При закрытии программы в main окне работает ON RELEASE {|| DbCloseAll(), AdsDisconnect(), AdsApplicationExit() } может это поможет. PS Тормоза наблюдаются на машине на которой собираю проект если долго висит в памяти HBIDE

Haz: Dima, как вариант подцепись к ADServer при помощи ARC32 c REMOTE connection и посмотри состояние сервера после закрытия твоей программы - кажется мне , что после закрытия остается зависшее подключение

Dima: Haz А как ты подключаешься к нему ? ADS.INI [pre2] [FILES] ; моя фича PATH=//127.0.0.1/sklad$/ [DRIVES] N:=//127.0.0.1/sklad$/ [MYSERVER] LAN_IP=127.0.0.1 LAN_PORT=6262 [SETTINGS] ADS_SERVER_TYPE=7 [/pre2] Подключаюсь так , предварительно считав в прогу установки из ADS.INI [pre2] AdsSetServerType(_servtype) //_servtype считан из ADS_SERVER_TYPE if !AdsConnect60(disk) // disk считан из [DRIVES] в данном примере будет N: ? "Не могу подключится к Advantage Database Server......" quit endif adshandle:=AdsConnection() // хендл подключения if adshandle==0 ? "Не могу получить хендл подключения к Advantage Database Server......" quit endif Собственно все , далее идут настройки AdsSetCharType(2, .t.) AdsLocking( .t. ) AdsSetDeleted(.T.) rddRegister("ADS",1) AdsRightsCheck(.F.) set optimize on SET AUTOPEN OFF Set delete on AdsSetFileType(ADS_CDX) Set date to german set(_SET_FORCEOPT,.t.) set(_SET_OPTIMIZE,.t.) set(_SET_HARDCOMMIT,.f.) [/pre2] Haz пишет: Dima, как вариант подцепись к ADServer при помощи ARC32 c REMOTE connection и посмотри состояние сервера после закрытия твоей программы - кажется мне , что после закрытия остается зависшее подключение Да и по монитору ADS видно что нет зависших подключений

Haz: Примерно так же , но ( к шифрованным базам ) hConnection := NIL IF adsConnect60( cBasePath + "\" + cBase + ".add", 0, "SystemProcess", 'SystemProcess', nServerType, @hConnection ) ELSE MsgExclamation( "Ошибка подключения к словарю данных !" ) END да и формат баз только ADS

Dima: Haz Не в курсе ? Нет ли в ADS похожей фичи как в LetoDB. Что бы можно было объявить из проги переменую на сервере и при выходе ее убить. Ну или флаг какой то на серваке (семафор) поставить из проги. Скажем с одной станции зашел в прогу PETROV , объявили массив (или пополнили) на сервере и добавили него новый элемент "PETROV". Если с другой станции попытается снова зайти PETROV а он уже есть в массиве на сервере , то зайти у него не получится.

Pasha: Haz пишет: Вместо dbCloseAll() с ADS можно попробовать AdsCloseAllTables() Это функция ace, которая закрывает все таблицы для текущего соединения. Но рабочие области харбора - rddads при этом остаются открытыми, и любое обращение к ним приведет к непредсказуемым последствиям, а именно к падению программы. Механизм падения следующий. После AdsCloseAllTables() все равно автоматически будет вызван dbCloseAll. И если в какой-то р/о осталась незавершенная операция: после какого-то изменения не было вызова dbCommit(). это приведет к операции с этой р/о, которую ace уже закрыл и знать о ней не знает. Результат законный - gpf aka access violation. В letodb есть аналогичная функция: Leto_CloseAll(), которая все делает корректно и быстро, тоже одним запросом к серверу, и закрывает все р/о на клиенте.

Pasha: Dima пишет: Не в курсе ? Нет ли в ADS похожей фичи как в LetoDB. Что бы можно было объявить из проги переменую на сервере и при выходе ее убить. Ну или флаг какой то на серваке (семафор) поставить из проги. Не Haz, но перешерстил доку по ace, и ничего подобного не нашел. Семафоры (в виде служебного файла) сервером ads используются только для того, чтобы отследить, жив клиент или уже нет.

Dima: Pasha пишет: Не Haz, но перешерстил доку по ace, и ничего подобного не нашел. Семафоры (в виде служебного файла) сервером ads используются только для того, чтобы отследить, жив клиент или уже нет. Да я тоже покопал и ни чего такого не увидел. На счет семафоров тоже понял. Придется делать по старинке.

Pasha: Dima пишет: Заметил если в течении дня часто пересобирать прогу то через какое то время комп начинает тормозить , прога собирается дольше , часов через 5 может даже инет отвалится. Компилятор Mingw +Harbour. Возможно этот тормоз задел каким то боком и ADS который в качестве сервиса крутится на этой же машине. Современные ОС ведут себя непредсказуемо, и причину этого выяснить трудно. В эту пятницу (позавчера) заметил, причем не первый раз, что у меня что-то повтор нажатия клавиш работает медленно, а именно навигационные клавиши в редакторе. В настойках клавиатуры у меня скорость повтора всегда стоит на максимуме. Проверил - так и есть. Вспомнил древние времена и прерывание 16h. Сделал тест: скорость вместо 30 символов в сек оказалась примерно 10, т.е на минимуме. Поигрался с панелью управления: подергал скорость туда-сюда. Стало как положено. И какая программа гадит - неизвестно. Причем гадит систематически. Непонятно. У меня и программ то установлено по минимуму, только для работы и ни на йоту больше.

Dima: Dima пишет: Придется делать по старинке. А делаю это так. При входе юзера проверяю наличие файла семафора есть ли он и не залочен ли. Если залочен юзер повторно не войдет. Если файла нет , создаю его и блочу. При выходе из проги файл закрываю и удаляю. Если юзер просто отвалился (выпал из проги) файл сам разблочится. Какие еще есть варианты ? Вариант писать все это в базу и лочить запись не подходит , так как не держу все базы открытыми , открываю их по мере необходимости и после выхода из какого то режима делаю Dbcloseall()

Softlog86: Dima , похоже это пока единственный способ . Я его тоже использую . Единственный минус что попытка приконнектиться в сети занимает некоторое время : Проверка наличия определённого файла + попытка открыть его EXCLUSIVE .....

Dima: Softlog86 а ты его с каким номером атрибута открываешь ? я с 18 (не помню где вычитал но тормоза нет)

Softlog86: Я не использую LETO/ADS ..... У меня обычная файл-серверная система . На сетевом диске обычно открывается по USE ("Z:\SKLAD\OP_XX.DBF") .... EXCLUSIVE . Не использую никаких атрибутов ....

Pasha: Dima пишет: Как получить список всех открытых баз данных ? Либо в виде алиасов либо номеров рабочих областей. Оказывается, в харборе есть функция hb_waEval( bBlock ) Блок кода bBlock вызывается для каждой открытой рабочей области. Т.е. массив алиасов или номеров р/о можно получить так: aAlias := {} hb_waEval( {|| AADD(aAlias, Alias())} ) или aSelect := {} hb_waEval( {|| AADD(aSelect, Select())} )

Dima: Pasha Интересно , спасибо. А что делает вот эта функция (из описания не очень понял) function hb_waRelEval(), remove unused local variable int iChildArea Вольный перевод: удаление не используемых локальных переменных в дочерней области

Pasha: Что-то я не найду такой функции. Есть метод rdd в workarea.c c таким же названием, но назначение у него другое. Где она находится ?

Dima: Pasha пишет: Где она находится ? Откопал в ChangeLog.txt когда искал сведения о hb_waEval()

Pasha: Это базовый метод rdd для реализации relations, из харбор-уровня он недоступен. Он касается внутренней реализации rdd. Просто название похожее оказалось.

Dima: Haz пишет: adsConnect60( cBasePath + "\" + cBase + ".add", 0, "SystemProcess", 'SystemProcess', nServerType, @hConnection ) похоже это не правильно вот так надо adsConnect60( cBasePath + "\" + cBase + ".add", nServerTypes, "SystemProcess", 'SystemProcess', nOptions, @hConnection ) а у тебя перепутаны местами nServerTypes и nOptions или я не прав ?

Haz: Dima пишет: похоже это не правильно мож быть , не задумывался т.к. работало перепутаны однозначно

Haz: Дима , спасибо . Исправил во всех своих исходниках странно что все работало, такое впечатление что ADS по барабону )))) сверился с https://github.com/harbour/core/blob/master/contrib/rddads - точно напутал лет так 5 назад и ничего ))

Andrey: Dima пишет: Как получить список всех открытых баз данных ? Либо в виде алиасов либо номеров рабочих областей. aBase := {} FOR nI:=1 TO myFILESFREE() // для харбора сделал 1024, т.к. не нашел в своё время замену этой функции SELECT(nI) IF USED() == .T. cStr:=STR(nI,3)+".│"+DBSETDRIVER()+" │"+STR(DBINFO(DBI_GETRECSIZE),7)+; "│"+PADR(DBINFO(DBI_ALIAS),12)+; "│"+PADR(DBINFO(DBI_FULLPATH),45) AADD(aBase, cStr) ENDIF NEXT DO WHILE lExit K := Achoice( aKoordin[1]+3, aKoordin[2]+1, aKoordin[3]-1, aKoordin[4]-1, aBase ) IF K == 0 .OR. LASTKEY() == K_ESC lExit := .F. ELSE SELECT(K) TekBase() ENDIF ENDDO

Dima: Andrey А что рабочих областей может уже быть больше 255 или я чего путаю ?

Andrey: Dima пишет: А что рабочих областей может уже быть больше 255 или я чего путаю ? Думаю, что да. Надо проверять...

Dima: Andrey пишет: Думаю, что да. Надо проверять... Cделал тестик Clipper 5.2e упал при открытии 246 рабочей области с ошибкой DOS ERROR 4 ну это и понятно так как FILES у меня прописан 250 в CONFIG.NT Странно что упал раньше......... Harbour 3.2 упал при открытии 65000 рабочей области с ошибкой Unrecoverable error 6004: Internal error: size of dynamic symbol table exceed ЗЫ Harbour рулит

Andrey: Dima пишет: Harbour рулит



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