Zmień Lotus Notes Replica ID

W ostatnim projekcie, byliśmy kopiowanie baz danych z jednego serwera na inny. Było wiele baz danych do zrobienia, więc postanowiłem napisać agenta zrobić kopię. Ale chcieliśmy kopie, a nie replik. Dowiedzieliśmy się, że NotesDatabase.CreateCopy metoda nie kopiuje dokumenty (tylko kopiuje design). Mogliśmy używana metoda, a następnie dostał uchwyt do wszystkich dokumentów w źródłowej bazie danych i kopiować je do docelowej bazy danych. Ale zamiast tego stosuje inne podejście.

Zdecydowaliśmy się utworzyć nową replikę bazy danych, a następnie zmienić jego identyfikator repliki do czegoś unikalnego. To skutecznie utworzyć kopię bazy danych. Tutaj w części 1 niniejszego końcówki, mówimy o Replica zmienić funkcje ID, który jest niezbędny. W części 2 tej końcówki, będziemy rozmawiać o głównej strukturze kodu bazy danych kopii.

Zanim przejdę do kodu, chciałbym wskazać na kilka rzeczy:

Po pierwsze, zauważyć, że jeśli ten skrypt jest uruchomiony na serwerze, będzie musiała uruchomić nieograniczony. To dlatego, że replika Zmiana funkcji ID wykorzystuje Notes wywołań API.
Po drugie, pamiętać, że jeśli (lub podmiot podpisujący) będą musiały mieć dostęp do wszystkich dokumentów w źródłowej bazie danych do wykonywania prawdziwej kopii. Kod ten nie omija żadnych zabezpieczeń polu czytnika. Jedynym sposobem, aby ominąć to, że jeśli jesteś administratorem serwera i pracują pod pełnymi prawami administratora.

OK, tutaj jest kod dla repliki zmienić funkcje ID. Umieściliśmy to na własną bibliotekę skryptów więc może być izolowana. Informacje API musi być umieszczony w (deklaracje) części skryptu:

(Deklaracje)
Typ TimeDate
Wnętrzności (1) Jak długo
Typ End

Typ DBREPLICAINFO
ID Jako TimeDate
Flagi As Integer
CutoffInterval As Integer
Cutoff Jak TimeDate
Typ End

Oświadczam Funkcja W32_OSPathNetConstruct lib "nnotes.dll" Alias ​​"OSPathNetConstruct" _
(ByVal PortName As Integer, w ByVal nazwa_serwera As String, ByVal nazwa_pliku As String, _
ByVal ścieżka As String) As Integer
Oświadczam funkcyjnych W32_NSFDbOpen lib "nnotes.dll" Alias ​​"NSFDbOpen" _
(ByVal ścieżka As String, hdb As Long) As Integer
Oświadczam funkcyjnych W32_NSFDbClose lib "nnotes.dll" Alias ​​"NSFDbClose" _
(ByVal hdc As Long) As Integer
Oświadczam funkcyjnych W32_NSFDbReplicaInfoGet lib "nnotes.dll" Alias ​​"NSFDbReplicaInfoGet" _
(ByVal hdc As Long, retReplicationInfo Jak DBREPLICAINFO) As Integer
Oświadczam W32_NSFDbReplicaInfoSet Lib Function "nnotes.dll" Alias ​​"NSFDbReplicaInfoSet" _
(ByVal hdc As Long, inpReplicationInfo Jak DBREPLICAINFO) As Integer

Możemy zdefiniować kilka nowych, niestandardowych typów nasz własny do czasu / daty informacji w API oraz informacje repliki w API. Następnie możemy zdefiniować cztery wywołań API, które będą potrzebne. Nie pójdę do bardzo szczegółowo na API - to właśnie dokumentacja API jest.

Funkcja ChangeReplicaID (źródło jak NotesDatabase, dest jako NotesDatabase) As Integer
Dim fullpath As String * 256
Dim hdb As Long
Dim Stan As Integer
Dim replicaInfo Jak DBREPLICAINFO
Dim porównać As String
Dim destCompare As String

"Otwórz źródłową bazę danych
Zadzwoń W32_OSPathNetConstruct (0, source.Server, source.FilePath, fullpath)
status = W32_NSFDbOpen (fullpath, hdb)
Jeśli status <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
"Get ID repliki źródłowej bazy danych
status = W32_NSFDbReplicaInfoGet (hdb, replicaInfo)
Jeśli status <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If

Pierwsza część funkcji otwiera źródłowej bazy danych. Należy wziąć pod uwagę, jak zmienna fullpath jest zdefiniowana. Gdy mamy do czynienia z API Notes, że nie może dynamicznie rozmiar ciąg. Więc jeśli jeden z parametrów do funkcji API to ciąg, który zostanie wypełniona przez funkcję, to musisz się upewnić ciąg ma wystarczająco dużo miejsca dla wartości zwracanej. W tym kodzie ciąg jest wielkości do 256 znaków. Można również zdefiniować ciąg a następnie wypełnić ciąg z ciągu znaków (ASCII wartość 0).

Pierwsza funkcja API tworzy "wersję API" w drodze do bazy danych. Dla lokalnej bazy danych, jest ścieżka do bazy danych. W przypadku bazy danych serwera, jest to nazwa serwera, a następnie dwa wykrzykniki, to ścieżka do bazy danych. Ale zamiast opierania się na kodzie, aby dowiedzieć się "w wersji API", po prostu zadzwoń funkcja mówi co wartość powinna być.

Jeśli źródłowa baza danych nie mógł zostać otwarty, lub informacja replika nie można odczytać, funkcja zwraca wartość False wskazujący, że informacje replika nie został zmieniony.

"Put identyfikatory replik w formacie string więc możemy porównać później, jeśli zmiana miała
porównać = Right ("0000000" + Hex (replicaInfo.ID.Innards (1)), 8)
porównać = porównać + Right ("0000000" + Hex (replicaInfo.ID.Innards (0)), 8)
"Zamknij źródłowej bazy danych - informacji replika została przejęta
status = W32_NSFDbClose (hdb)
"Upewnij się, co oddaje to legit - powinna pasować do własności bazy danych
Jeśli porównać <> source.ReplicaID Następnie
ChangeReplicaID = False
Exit Function '==========
End If

Kolejna część funkcji zapewnia, że ​​informacje Replika została odczytana jest poprawna wartość. Jest własnością NotesDatabase nazywa ReplicaID że daje id replik. Tak więc wziąć to, co zostało odczytane w przez API i sformatować je za tak samo jak własności bazy danych. Wtedy możemy je porównać, czy co API przeczytać aby sprawdzić, czy byliśmy naprawdę odczyt wartości poprzez API, lub jeśli API właśnie powiedzenie było czytać.

"Otwórz docelową bazę danych
Zadzwoń W32_OSPathNetConstruct (0, dest.Server, dest.FilePath, fullpath)
status = W32_NSFDbOpen (fullpath, hdb)
Jeśli status <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
"Spróbuj ustawić ID repliki na docelowej bazie danych
status = W32_NSFDbReplicaInfoSet (hdb, replicaInfo)
Jeśli status <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If

Kolejna część funkcji ustawia ID repliki na docelowej bazie danych za pośrednictwem interfejsu API. Musimy utworzyć ścieżkę i otworzyć bazę danych w taki sam sposób jak my do źródłowej bazy danych.

"Zobacz, czy zmiana była sukcesem
status = W32_NSFDbReplicaInfoGet (hdb, replicaInfo)
Jeśli status <> 0 Then
ChangeReplicaID = False
Exit Function '==========
End If
"Porównaj to, co ID replika jest teraz do źródłowej bazy danych
destCompare = Right ("0000000" + Hex (replicaInfo.ID.Innards (1)), 8)
destCompare = destCompare + Right ("0000000" + Hex (replicaInfo.ID.Innards (0)), 8)
"Zamknij docelowej bazie danych
status = W32_NSFDbClose (hdb)
"Jeśli docelowy pasuje do źródła, a następnie zmiana zakończyła się sukcesem
Jeśli = destCompare porównać Następnie
ChangeReplicaID = True
Więcej
ChangeReplicaID = False
End If
End Function

Nasz kod nie ufa wartości zwracanej zero z NSFDbReplicaInfoSet funkcji. Sprawdzimy go dla siebie. Jeśli po wykonaniu zmiany, ID replika pasuje co źródło replika ID było, to wiemy, że zmiana była udana i nasza funkcja zwraca wartość True.

Oglądany 8218 razy przez 2927 widzów

  1. Brak komentarzy jeszcze.
  1. Brak jeszcze trackbacków