программно определить путь к реплицируемой базе

Тема в разделе "Lotus - Программирование", создана пользователем Vvv, 24 авг 2009.

  1. Vvv

    Vvv Гость

    Подскажите пожалуйста как на стороне Notes можно определить списко реплецируемых с сервера баз и путь к ним на сервере.
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Как узнать список реплицируемых баз, с наскока не скажу.
    Найти пусть гораздо проще: ты знаешь сервак и ReplicaID.
    Делаешь
    Код (Text):
    flag = notesDatabase.OpenByReplicaID( server$, replicaID$ )
    у получившегося объекта берёшь путь, это он и есть :rolleyes:

    Ща гляну насчёт списка реплицируемых баз...
    ---------------
    Ну как вариант:
    берёшь через NotesDbDirectory пробегаешь анализируемый сервак, у каждой базы берёшь NotesDatabase.NotesReplication.
    Делаешь этому объекту
    Код (Text):
    Set notesReplicationEntry = notesReplication.GetEntry( source$ , destination$ [ , createflag = FALSE] )
    Если Вернулся не Nothing, значит база реплицируется с чем-то.

    Возможно есть гораздо более оптимальные варианты, это я так, одним глазком глянул.
     
  3. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    только через нотес апи - просматривать єтот список в репликаторе
     
  4. Vvv

    Vvv Гость

    to Omh
    большое спасибо за ответ сейчас обдумываю

    to ToxaRat
    >только через нотес апи - просматривать єтот список в репликаторе
    я пишу именно на С API
    подскажите пожалуйста названия функций которыми я могу воспользоваться
    пока мне удалось получить
    список title и servername для всех реплицируемых баз для данного Notes (ReplId или путь получить не удаеться)
    получить историю реплицкаций для заданной базы - NSFDbGetReplHistorySummary

    но получить список всех реплицируеммых для данного Notes баз и пути к ним не как не получаеться


    аналога flag = notesDatabase.OpenByReplicaID( server$, replicaID$ ) в C API мне тоже найти не удалось
     
  5. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    #include <nsfdb.h>

    STATUS LNPUBLIC NSFDbLocateByReplicaID(
    DBHANDLE hDB,
    DBID far *ReplicaID,
    char far *retPathName,
    WORD PathMaxLen);

    Description :

    This function takes a database handle (DBHANDLE) to the data directory, or to one of its subdirectories, and the replica ID of a database. It returns an expanded path specification for the replica. The function searches all subdirectories of the data directory for the database.

    Note: If you are trying to locate a replica on a remote Lotus Domino Server, obtain the replica ID of the local database replica with NSFDbReplicaInfoGet, build a fully qualified network pathname to the remote server's data directory with OSPathNetConstruct, use that path with NSFDbOpen to obtain a handle to the data directory, and then pass that handle to NSFDbLocateByReplicaID to get the server's pathname for the replica you want. The network path to that database may then be constructed using OSPathNetConstruct.

    Parameters :

    Input :
    hDB - A handle to a directory.

    ReplicaID - A pointer to the Replica ID of the database you wish to find in the directory.

    PathMaxLen - A WORD containing the length of the buffer minus one (1) for the NULL terminator.

    Output :
    (routine) - Return status from this call -- indicates either success or what the error is. The return codes include:

    NOERROR - Successfully got path specifications for database.

    ERR_NOT_DIRECTORY - Handle provided was not a directory.


    retPathName - The address of a text buffer into which the expanded pathname for the Domino database Replica is returned. The pathname is returned as a null-terminated string. The buffer should be declared with a length of MAXPATH.
     
  6. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Аналог OpenByReplicaId:

    NSFDbOpen("MyServer", hDir)
    NSFDbLocateByReplicaID(hDir,...)

    Не могли бы Вы другими словами сказать, что такое "БД, реплицируеммая для данного Notes"? Кто такой "данный нотес"? Вся директория DATA для указанного сервера, или для текущего сервера, или всех серверов домена? И что в Вашем понимании "реплицируемая"? Имеющая реплику, плюс реплицированная хотя бы раз, плюс без галки "temporary disable replication", плюс настроенное расписание репликации, плюс разрешение по ACL, или какая-либо комбинация перечисленных параметров?
     
  7. Vvv

    Vvv Гость

    Большое спасибо за помощь.

    Мое приложение работает на PC клиента под Lotus Notes.
    Мне надо
    1) получить списко всех баз реплицируемых с Lorus Domino (сервера) на Lotus Notes (пользовательская PC)
    2) проверить что среплицированная в Lotus Notes база находиться по тому же пути в каталоге Data что и на сервере.

    реплицируемая" мне надо проверять базы - имеющая реплику, плюс реплицированная хотя бы раз
     
  8. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Если набор серверов неизвестен, то как Вы делаете не плохо - читаете историю репликации. Правда, её могут почистить.
    Если реплики возможны с небольшого числа заранее известных серверов то всё проще и никакого API не надо:
    1. При помощи NotesDbDirectory сканируете локальную DATA, поочерёдно получая все БД.
    2. Для каждой БД по её ReplicaId получаете её на каждом из известных серверов.
    3. Сравниваете путь для каждой полученной серверной реплики.
     
  9. Vvv

    Vvv Гость

    TIA большое спасибо за помощь
    Ваше описание это то что мне надо для первой версии
     
  10. ToxaRat

    ToxaRat Чёрный маг
    Lotus team

    Регистрация:
    6 ноя 2007
    Сообщения:
    3.047
    Симпатии:
    18
    Vvv
    вариант предложенный TIA может быть опасен тем что сервера с к оторыми будет осуществлен перебор по репликаид отключены а это в свою очередь создает большие таймаут, хотя они в любом случае возможны
     
  11. TIA

    TIA :-)
    Lotus team

    Регистрация:
    15 май 2009
    Сообщения:
    790
    Симпатии:
    0
    Задача - сравнить путь БД на сервере с локальным. Без получения серверной реплики не обойтись. Поэтому вариант сам по себе не опасен. Опасно не обрабатывать исключения. А они будут при любом варианте решения. Если говорить о быстродействии, то при большом числе проверяемых БД можно выполнить такую оптимизацию. Просканировать всю директорию сервера и запомнить реплики всех имеющихся на нём БД. И перед получением серверной реплики БД, проверять наличие её ReplicaId в запомненном списке. Выигрыш получается за счёт того, что не происходит открытия БД, не имеющей реплики на данном сервере. Получение ReplicaId БД через NotesDbDirectory также не требует открытия БД.
     
  12. divankin

    divankin Senjor developer

    Регистрация:
    13 авг 2009
    Сообщения:
    182
    Симпатии:
    0
    Есть еще такая идейка. Кажется, ссылки на все открываемые базы сохраняются в базе bookmarks.nsf. Для каждой базки создается документик, содержащий поле URL, в котором, если посмотреть побайтово, можно увидеть сервер и путь к базе.
    Возможно стоит покопать в эту сторону.
     
  13. Vvv

    Vvv Гость

    спасибо всем ответившим

    Есть еще такая идейка. Кажется, ссылки на все открываемые базы сохраняются в базе bookmarks.nsf. Для каждой базки создается документик, содержащий поле URL, в котором, если посмотреть побайтово, можно увидеть сервер и путь к базе.

    Это путь который я копаю сейчас
    пока из names.nsf только вытащил имя севреа и title базы
    сейчас займусь bookmarks.nsf

    при программной репликации базы ее нет в names.nsf и скрей всего не будет в bookmarks.nsf
     
Загрузка...

Поделиться этой страницей