Изменение Lotus Notes ID реплики
В недавнем проекте, мы были копирования баз данных с одного сервера на другой. Существовали многие базы данных, чтобы сделать, поэтому мы решили написать агента сделать копию. Но мы хотели копии, а не копии. Мы выяснили, что NotesDatabase.CreateCopy метод не копирует документы (он только копирует дизайн). Мы могли бы использовать этот метод, то есть обращаться ко всем документам в исходной базе данных и скопировал их в целевую базу данных. Но вместо этого мы использовали другой подход.
Мы решили создать новую копию базы данных, а затем изменить его идентификатор реплики, чтобы что-то уникальное. Это позволило бы эффективно создавать копии базы данных. Здесь, в части 1 этой статье мы поговорим о Изменить ID Реплика функции, которая необходима. В части 2 этой статье мы поговорим об основной структуре кода копию базы данных.
Прежде чем попасть в коде, позвольте мне отметить некоторые вещи:
Во-первых, обратите внимание, что если скрипт запущен на сервере, он понадобится запустить неограниченное. Это потому, что Изменить ID Реплика функция использует Notes API вызовы.
Во-вторых, обратите внимание, что если вы (или агентом подписавшего) должны иметь доступ ко всем документам в исходной базе данных, чтобы выполнить точную копию. Этот код не обойти безопасности читатель поле. Единственный способ обойти это, если вы являетесь администратором на сервере и работают под полными правами администратора.
ОК, вот код для ID функции Реплика Изменить. Мы разместили это в свою собственную библиотеку, скрипт, чтобы он мог быть изолированы. Информация API должен быть помещен в (Объявления) часть сценария:
(Объявления)
Тип TIMEDATE
Внутренности (1) As Long
End Type
Тип DBREPLICAINFO
ID Как TIMEDATE
Флаги As Integer
CutoffInterval As Integer
Cutoff Как TIMEDATE
End Type
Declare Function W32_OSPathNetConstruct Lib "nnotes.dll" Alias "OSPathNetConstruct" _
(ByVal PORTNAME As Integer, ByVal ServerName As String, ByVal FileName As String, _
ByVal путь As String) As Integer
Declare Function W32_NSFDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" _
(ByVal As String путь, HDB As Long) As Integer
Declare Function W32_NSFDbClose Lib "nnotes.dll" Alias "NSFDbClose" _
(ByVal HDB As Long) As Integer
Declare Function W32_NSFDbReplicaInfoGet Lib "nnotes.dll" Alias "NSFDbReplicaInfoGet" _
(ByVal HDB As Long, retReplicationInfo Как DBREPLICAINFO) As Integer
Declare Function W32_NSFDbReplicaInfoSet Lib "nnotes.dll" Alias "NSFDbReplicaInfoSet" _
(ByVal HDB As Long, inpReplicationInfo Как DBREPLICAINFO) As Integer
Мы определяем пару пользовательских типов для нашего собственного времени / даты информация в API, а также реплики информации в API. Затем мы определяем четыре API вызовы, которые будут необходимы. Я не буду вдаваться в подробности на вызовы API - это то, что документация API для.
Функция ChangeReplicaID (источник Как NotesDatabase, DEST Как NotesDatabase) As Integer
Дим полного пути As String * 256
Dim HDB As Long
Dim статус As Integer
Dim replicaInfo Как DBREPLICAINFO
Dim сравнить As String
Dim destCompare As String
"Откройте исходную базу данных
Вызовите W32_OSPathNetConstruct (0, source.Server, source.FilePath, полного пути)
статус = W32_NSFDbOpen (полного пути, HDB)
Если статус <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
"Получить идентификатор реплики из исходной базы данных
статус = W32_NSFDbReplicaInfoGet (HDB, replicaInfo)
Если статус <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
Первая часть функции открывает исходной базе данных. Принять к сведению, как переменная полного пути определена. При работе с API Notes, она не может динамически размер строки. Так что, если один из параметров функции API является строкой, которая будет заполняться на функцию, то вы должны убедиться, что строка имеет достаточно места для возвращаемого значения. В этом коде строка размером до 256 символов. Кроме того, можно определить строку, а затем заполнить строку с последовательностью символов (ASCII значение 0).
Первая функция API строит "API версии" путь к базе данных. Для локальной базы данных, это путь к базе данных. Для сервера баз данных, это имя сервера, затем два восклицательных знаков, то путь к базе данных. Но вместо того чтобы полагаться на код, чтобы выяснить "API версии", мы просто вызываем функцию рассказывает, что значение должно быть.
Если исходная база данных не может быть открыт, или реплики информация не может быть прочитан, функция возвращает значение ЛОЖЬ о том, что реплики информация не была изменена.
"Положите идентификатор реплики в формат строки, чтобы мы могли сравнить позже, если изменение имело
сравнить = Right ("0000000" + Hex (replicaInfo.ID.Innards (1)), ![]()
сравнить сравнить = + Right ("0000000" + Hex (replicaInfo.ID.Innards (0)), ![]()
"Закрыть исходной базе данных - информация реплика была захвачена
статус = W32_NSFDbClose (HDB)
"Убедитесь в том, что мы захватывает вполне нормально - она должна соответствовать свойства базы данных
Если сравнить <> source.ReplicaID Тогда
ChangeReplicaID = False
Exit Function '==========
End If
Следующая часть функция гарантирует, что реплики информацию, которая была прочитана является правильное значение. Там в NotesDatabase свойство ReplicaID, которая дает идентификатор реплики. Таким образом, мы берем то, что было прочитано в по API и формат, чтобы это было так же, как базы данных собственности. Тогда мы можем сравнить их, чтобы убедиться, что API читать, чтобы увидеть, если бы мы действительно чтения стоимости через API, или, если API просто сказав, что это читать.
"Откройте конечную базу данных
Вызовите W32_OSPathNetConstruct (0, dest.Server, dest.FilePath, полного пути)
статус = W32_NSFDbOpen (полного пути, HDB)
Если статус <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
'Попытка установить идентификатор реплики на конечную базу данных
статус = W32_NSFDbReplicaInfoSet (HDB, replicaInfo)
Если статус <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
Следующая часть функции устанавливает идентификатор реплики в целевой базе данных через API. Мы должны создать путь и открыть базу данных таким же образом, мы сделали для исходной базы данных.
"Смотрите, если замена оказалась удачной
статус = W32_NSFDbReplicaInfoGet (HDB, replicaInfo)
Если статус <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
"Сравните, что идентификатор реплики теперь к исходной базе данных
destCompare = Right ("0000000" + Hex (replicaInfo.ID.Innards (1)), ![]()
destCompare = destCompare + Right ("0000000" + Hex (replicaInfo.ID.Innards (0)), ![]()
"Закрыть целевой базы данных
статус = W32_NSFDbClose (HDB)
"Если пункты назначения источника, то изменение было успешным
Если сравнить destCompare = Тогда
ChangeReplicaID = True
Еще
ChangeReplicaID = False
End If
End Function
Наш код не доверяет возвращаемым значением нуля из NSFDbReplicaInfoSet функции. Мы проверяем это для себя. Если, после выполнения изменений, идентификатор реплики соответствует тому, что источник идентификатор реплики было, то мы знаем, замена оказалась удачной, и наша функция возвращает значение True.
Просмотрено 8134 раз 2905 зрителей













