Cambia Lotus Notes ID Replica
In un recente progetto, siamo stati Copia di database da un server all'altro. Ci sono stati molti database di fare, così abbiamo deciso di scrivere un agente per fare la copia. Ma volevamo copie, non repliche. Abbiamo scoperto che il metodo NotesDatabase.CreateCopy non copia i documenti (devi copiare il design). Avremmo potuto utilizzare tale metodo, poi ha una maniglia a tutti i documenti nel database di origine e li copiate verso il database di destinazione. Ma invece abbiamo usato un altro approccio.
Abbiamo deciso di creare una nuova replica della banca dati, quindi modificare il suo ID di replica di qualcosa di unico. Questo potrebbe effettivamente creare una copia del database. Qui nella parte 1 di questo articolo, si parla di funzione ID Cambia replica che è necessario. Nella parte 2 di questo articolo, parleremo la struttura principale del codice del database di copia.
Prima di entrare nel codice, vorrei sottolineare alcune cose:
In primo luogo, si noti che se questo script è in esecuzione su un server, sarà necessario eseguire senza restrizioni. Questo perché la funzione Cambia Replica ID utilizza le chiamate API Note.
In secondo luogo, si noti che se voi (o l'agente firmatario) avranno bisogno di avere accesso a tutti i documenti del database di origine per effettuare una copia conforme. Questo codice non permette di ignorare qualsiasi lettore campo della sicurezza. L'unico modo per andare in giro è che se si è un amministratore sul server e sono in esecuzione con privilegi di amministratore completo.
OK, ecco il codice per la funzione ID Cambia Replica. Abbiamo messo questo nella sua libreria di script proprio in modo che possa essere isolato. Le informazioni API ha bisogno di essere messi in (dichiarazioni) sezione dello script:
(Dichiarazioni)
Tipo TimeDate
Interiora (1) As Long
Fine Tipo
Tipo DBREPLICAINFO
ID Come TimeDate
Bandiere As Integer
CutoffInterval As Integer
Cutoff Come TimeDate
Fine Tipo
Declare Function W32_OSPathNetConstruct Lib "nnotes.dll" Alias "OSPathNetConstruct" _
(PortName ByVal As Integer, ByVal serverName As String, ByVal fileName As String, _
PathName ByVal As String) As Integer
Declare Function W32_NSFDbOpen Lib "nnotes.dll" Alias "NSFDbOpen" _
(Percorso 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 Come DBREPLICAINFO) As Integer
Dichiarare W32_NSFDbReplicaInfoSet Funzione Lib "nnotes.dll" Alias "NSFDbReplicaInfoSet" _
(ByVal hdb As Long, inpReplicationInfo Come DBREPLICAINFO) As Integer
Definiamo un paio tipi personalizzati dei nostri per l'ora / data informazione nelle API e le informazioni replica nel API. Quindi definiamo le quattro chiamate API che saranno necessarie. Non voglio entrare nel dettaglio sulle chiamate API - questo è ciò che la documentazione delle API è per.
Funzione ChangeReplicaID (fonte Come NotesDatabase, dest Come NotesDatabase) As Integer
FullPath As String * 256
Hdb As Long
Stato di As Integer
ReplicaInfo As DBREPLICAINFO
Confrontare As String
DestCompare As String
'Aprire il database di origine
Chiamata W32_OSPathNetConstruct (0, source.Server, source.FilePath, FullPath)
status = W32_NSFDbOpen (FullPath, HDB)
Se lo stato <> 0 Then
ChangeReplicaID = False
Funzione di uscita '==========
End If
'Ottiene l'ID di replica del database di origine
status = W32_NSFDbReplicaInfoGet (hdb, replicaInfo)
Se lo stato <> 0 Then
ChangeReplicaID = False
Funzione di uscita '==========
End If
La prima parte della funzione si apre il database di origine. Prendete nota di come la variabile FullPath è definita. Quando si tratta con le API Notes, esso non può dinamicamente la dimensione di una stringa. Quindi, se uno dei parametri a una funzione API è una stringa che verrà popolato dalla funzione, quindi è necessario assicurarsi che la stringa ha abbastanza spazio per il valore di ritorno. In questo codice, la stringa è dimensionato per 256 caratteri. Si potrebbe anche definire una stringa e quindi popolare la stringa con una serie di caratteri (valore ASCII 0).
La prima funzione API si basa la "versione API" del percorso del database. Per un database locale, è il percorso del database. Per un database server, è il nome del server, poi due punti esclamativi, quindi il percorso del database. Ma invece di basarsi sul codice per capire la "versione API", chiamiamo semplicemente una funzione per ciò che dice il valore dovrebbe essere.
Se il database di origine non può essere aperto, o le informazioni di replica non può essere letto, la funzione restituisce il valore False indica che le informazioni di replica non è stata cambiata.
'Mettere l'ID di replica in un formato stringa in modo da poter confrontare in seguito se il cambiamento ha
confrontare destra = ("0000000" + Hex (replicaInfo.ID.Innards (1)), ![]()
confrontare = confrontare Destra + ("0000000" + Hex (replicaInfo.ID.Innards (0)), ![]()
'Chiudere il database di origine - le informazioni replica è stata catturata
stato = W32_NSFDbClose (HDB)
'Assicurarsi che ciò che cattura è legit - dovrebbe corrispondere alla proprietà del database
Se il confronto <> Poi source.ReplicaID
ChangeReplicaID = False
Funzione di uscita '==========
End If
La parte successiva della funzione fa sì che le informazioni replica che è stato letto è il valore corretto. C'è una proprietà chiamata NotesDatabase ReplicaID che dà l'ID di replica. Quindi, prendiamo ciò che è stato letto dalle API e il formato che sia lo stesso che la proprietà del database. Poi possiamo confrontare per vedere se quello che l'API leggere per vedere se siamo stati davvero leggendo il valore attraverso l'API, o se l'API ha appena detto è stato letto.
'Aprire il database di destinazione
Chiamata W32_OSPathNetConstruct (0, dest.Server, dest.FilePath, FullPath)
status = W32_NSFDbOpen (FullPath, HDB)
Se lo stato <> 0 Then
ChangeReplicaID = False
Funzione di uscita '==========
End If
'Tentativo di impostare l'ID di replica nel database di destinazione
status = W32_NSFDbReplicaInfoSet (hdb, replicaInfo)
Se lo stato <> 0 Then
ChangeReplicaID = False
Funzione di uscita '==========
End If
La parte successiva della funzione imposta l'ID di replica del database di destinazione attraverso le API. Dobbiamo creare un percorso e aprire il database nella stessa maniera che abbiamo fatto per i database di origine.
'Vedere se il cambiamento ha avuto successo
status = W32_NSFDbReplicaInfoGet (hdb, replicaInfo)
Se lo stato <> 0 Then
ChangeReplicaID = False
Funzione di uscita '==========
End If
'Confronta l'ID replica è ora al database di origine
destCompare = Right ("0000000" + Hex (replicaInfo.ID.Innards (1)), ![]()
destCompare = destCompare + Destra ("0000000" Hex + (replicaInfo.ID.Innards (0)), ![]()
'Chiudere il database di destinazione
status = W32_NSFDbClose (HDB)
'Se la destinazione corrisponde la fonte, allora il cambiamento è stato un successo
Se = destCompare confrontare poi
ChangeReplicaID = True
Altro
ChangeReplicaID = False
End If
End Function
Il nostro codice non fidarsi di un valore di ritorno pari a zero dalla funzione NSFDbReplicaInfoSet. Noi check it out per noi stessi. Se, dopo aver fatto il cambio, l'ID di replica corrisponde a ciò che la fonte replica ID è stato, poi sappiamo che il cambiamento ha avuto successo e la nostra funzione restituisce il valore Vero.
Visto 8096 volte da 2897 spettatori













