Das Notes Forum

Domino 9 und frühere Versionen => Entwicklung => Thema gestartet von: Friese am 02.08.02 - 12:18:45

Titel: Automatische Replikerstellung
Beitrag von: Friese am 02.08.02 - 12:18:45
Moin Moin!

Ich hab´ da mal eine Frage:

Um automatisch eine Replik zu erstellen, bietet Notes ja im Script eine Möglichkeit. Ich kann sagen: Erstelle mir von Datenbank x auf Server y eine Replik.

Ich möchte diese Replik aber nur als nackte Datenbank, so daß erst bei der nächsten Replikation (sei es manuell oder zeitlich) diese Datenbanken abgeglichen werden.

Kann mir da einer helfen? Es würde nämlich zu lange dauern, wenn ich zum Beispiel 5 Datenbanken hätte und alle ziemlich groß sind.

Vielen Dank schon mal im voraus.

Gruß aus Friesland
Titel: Re: Automatische Replikerstellung
Beitrag von: lrzwkle am 02.08.02 - 13:00:13
Servus,

ich würde es so machen:
Ich würde eine lokale Replik der Datenbank erstellen.
In dieser lokalen Replik würde ich dann alle Dokumente löschen.
Auf Basis dieser leeren Datenbank würde ich mittels eines kleinen Agents die benötigten Repliken auf den betroffenen Servern erstellen.
Bei der nächsten Replikation werden - sofern in den Verbindungsdokumenten vorgesehen - die Repliken mit Daten gefüllt.
Die leere lokale Replik kannst Du dann wieder löschen.

Ciao, Siegi
Titel: Re: Automatische Replikerstellung
Beitrag von: Friese am 02.08.02 - 13:07:51
und das alles im script unterbringen? *grübel* Erstelle Datenbank (lokal), lösche alle Dokumente (lokal), davon Replik anlegen (auf Server)....

Hmmmmm

Versuch macht kluch

Gruß
Titel: Re: Automatische Replikerstellung
Beitrag von: Friese am 02.08.02 - 13:16:34
Moin Moin!

Wollte grad anfangen, aber ich kann mir nicht vorstellen, daß diese drei Schritte wesentlich schneller sind als der eine (s.o.), zumal ja noch eine richtige Replik lokal angelegt wird *wart*

Hat noch jemand eine Idee?

Gruß
Titel: Re: Automatische Replikerstellung
Beitrag von: Zimmi am 02.08.02 - 14:35:17
Hallo,

versuch's mal folgendermaßen:

Starte manuell eine Replikation bis diese 5 bis 10 % fortgeschritten ist. Dann abbrechen und an der Server-Console den Task "replicate ..." abrufen, geht sehr schnell.
So machen wir das, wenn wir User mit großen Mailfiles umziehen.

Jimmi
Titel: Re: Automatische Replikerstellung
Beitrag von: HaPe am 07.08.02 - 15:38:30
Hi,

ich hab das Problem auch gerade gehabt und eine Lösung gefunden. Hier die fertige Funktion:

'Declarations:
'For CreateEmptyReplica
Type TIMEDATE
     Innards(1) As Long
End Type
Type DBREPLICAINFO
     ID As TIMEDATE
     Flags As Integer
     CutoffInterval As Integer
     Cutoff As TIMEDATE
End Type
Declare Function W32NSFDbReplicaInfoGet Lib "nnotes" Alias "NSFDbReplicaInfoGet" ( Byval hDb As Long, ReplicationInfo As DBREPLICAINFO ) As Integer
Declare Function W32NSFDbReplicaInfoSet Lib "nnotes" Alias "NSFDbReplicaInfoSet" ( Byval hDb As Long, ReplicationInfo As DBREPLICAINFO ) As Integer
Declare Function W32NSFDbOpen Lib "nnotes" Alias "NSFDbOpen" ( Byval PathName As Lmbcs String, rethDb As Long ) As Integer
Declare Function W32NSFDbClose Lib "nnotes" Alias "NSFDbClose" ( Byval hDb As Long ) As Integer
Declare Function W32OSLoadString Lib "nnotes" Alias "OSLoadString" ( Byval hModule As Long, Byval StringCode As Integer, Byval retBuffer As Lmbcs String, Byval BufferLength As Integer ) As Integer
Const NULLHANDLE = 0&
Const NOERROR = 0
Const PKG_NSF = &H200
Const ERR_NOT_NSF = PKG_NSF + 1
Const ERR_NSF_VERSION = PKG_NSF + 25
Const REPLFLG_HIDDEN_DESIGN = &H00 ' &H20 Hide , &H00 Unhide.

Sub CreateEmptyReplica( strSrSrv As String, strSrNa As String, strDeSrv As String, strDeNa As String)
     
     Dim dbSr As New NotesDatabase(strSrSrv,strSrNa)
     Dim dbDes As NotesDatabase
     Dim hDbSr As Long
     Dim hDbDe As Long
     Dim dbRepInfo As DBREPLICAINFO
     Dim iStatus As Integer
     Dim sErrMsg As String
     Dim sBuffer As String
     Dim strTmp As String
     
     'Create empty copy of DB
     Call dbSr.CreateCopy(strDeSrv,strDeNa)
     
     'Copy Replica info to make it a replica
     sBuffer = String$(256, 0)
     'Open Source DB
     If strSrSrv="" Then
           strTmp=strSrNa
     Else
           strTmp=strSrSrv+"!!"+strSrNa      
     End If
     iStatus = W32NSFDbOpen(strTmp, hDbSr) 'Source Server and database name
     If iStatus <> NOERROR Then
           Select Case iStatus
           Case ERR_NOT_NSF
                 sErrMsg = "No NSF File"
           Case ERR_NSF_VERSION
                 sErrMsg = "Version NSF Invalide"
           Case Else
                 sErrMsg = GetCAPIErrorMsg(iStatus)
           End Select
           Msgbox sErrMsg, 48, "Error in API C"
           Exit Sub
     End If
     'Open Destination DB
     If strDeSrv="" Then
           strTmp=strDeNa
     Else
           strTmp=strDeSrv+"!!"+strDeNa      
     End If
     iStatus = W32NSFDbOpen(strTmp, hDbDe) 'Destination Server and database name
     If iStatus <> NOERROR Then
           Select Case iStatus
           Case ERR_NOT_NSF
                 sErrMsg = "No NSF File"
           Case ERR_NSF_VERSION
                 sErrMsg = "Version NSF Invalide"
           Case Else
                 sErrMsg = GetCAPIErrorMsg(iStatus)
           End Select
           Msgbox sErrMsg, 48, "Error in API C"
           Exit Sub
     End If
     'Read Source Replica Info
     iStatus = W32NSFDbReplicaInfoGet(hDbSr, dbRepInfo)
     If iStatus <> NOERROR Then
           Msgbox GetCAPIErrorMsg(iStatus), 48, "Error in API C"
           Exit Sub
     End If
     'Write Dest. Replica Info
     iStatus = W32NSFDbReplicaInfoSet(hDbDe, dbRepInfo)
     If iStatus <> NOERROR Then
           Msgbox GetCAPIErrorMsg(iStatus), 48, "Error in API C"
           Exit Sub
     End If
     'Close Source
     iStatus = W32NSFDbClose(hDbSr)
     If iStatus <> NOERROR Then
           Msgbox GetCAPIErrorMsg(iStatus), 48, "Error in API C"
     End If
     'Close Dest.
     iStatus = W32NSFDbClose(hDbDe)
     If iStatus <> NOERROR Then
           Msgbox GetCAPIErrorMsg(iStatus), 48, "Error in API C"
     End If
     
End Sub

Achtung: Wenn man nicht direkt in der ACL mit Name eingetragen ist, ist der Zugriff auf die Replik erst nach dem ersten replicieren möglich!

Gurß Hape


Titel: Re: Automatische Replikerstellung
Beitrag von: Friese am 08.08.02 - 12:32:55
Hallo!

Danke erst einmal....

Aber wie und wo hast Du das eingebaut? Alleine schon durch GetCAPIErrorMsg kann ich diese Funktion (sei es als Button oder Agent) nicht speichern.

Hilfe!  :'(
Titel: Re: Automatische Replikerstellung
Beitrag von: HaPe am 08.08.02 - 14:25:35
Sorry ich hatte die Funktion vergessen :-( . Hier ist Sie:

Function GetCAPIErrorMsg(iStatus As Integer) As String
%REM
GetCAPIErrorMsg - Cette fonction prend le statut de l'erreur retourné par l'API C, retourne le message d'erreurs correspondant venant des entrailles de Notes
et retourne le message à l'appelant.
%END REM
     Dim iLen As Integer
     Dim sBuffer As String
     sBuffer = String$(256, 0)
     iLen = W32OSLoadString(NULLHANDLE, iStatus, sBuffer, Len(sBuffer) - 1)
     If iLen > 0 Then
           GetCAPIErrorMsg = Left$(sBuffer, Instr(1, sBuffer, Chr$(0)) - 1)
     Else
           GetCAPIErrorMsg = "Error unknown"
     End If
End Function

Jetzt sollte es klappen.
Titel: Re: Automatische Replikerstellung
Beitrag von: Friese am 08.08.02 - 14:39:34
Hallo!

Erst einmal wieder Danke für die Nachricht!

Nur meckert er immer noch, bzw. wieder.

Dieses mal über W32OSLoadString

Könntest Du mir nicht eine Datenbank schicken, in der die Funktion steckt? Mehr braucht ja nicht in der Datenbank sein.

Gruß aus Friesland

PS.: frieslaender@gmx.de
Titel: Re: Automatische Replikerstellung
Beitrag von: Friese am 08.08.02 - 15:42:37
Hallo!

Nun habe ich es hinbekommen HaPe, besten Dank nochmal.

Die einzige Verbesserung wäre nur noch, daß wenn ich eine neue Replik anlege (eben mit dem Script), daß dann auch nicht das Design erstellt wird. Sprich so, als würde ich mit der rechten Maustaste auf das Datenbank Icon gehen würde und sage, ja moin, ich möchte eine neue Replik, aber nicht sofort. Dann entsteht da so etwas, was unter 200 kb groß, bzw klein ist ;-) Und mit der nächsten Replizierung wird das Dingens auf Normalgröße gebracht.

Vielleicht fällt Dir ja noch was ein *hoff*

Gruß
Titel: Re: Automatische Replikerstellung
Beitrag von: HaPe am 09.08.02 - 08:42:21
Klar fällt mir dazu was ein  ::).

Wenn du die Dim Zeile:

Dim dbSr As New NotesDatabase(strSrSrv,strSrNa)

durch das Template einer neuen leeren DB ersetzt:

Dim dbSr As New NotesDatabase("","default.ntf")

sollte es klappen. Die default.ntf musst du durch das erstellen einer neuen datenbank mut dem "- Blank -" template erstellen.

Hab momentan keinen Zeit das zu testen, gieb mal feedback.

Gruß HaPe


Titel: Re: Automatische Replikerstellung
Beitrag von: Hardy am 09.08.02 - 14:48:02
Hi,

Ich hatte auch schon nach Möglichkeiten gesucht !
Hier meine Ergebnisse:

Über den AdminClient :
Dateien dann rechts Repliken erstellen. Den Rest macht dann der AdminP. Man muß aber mindestenz Leser auf der DB sein.

oder

in der Sandbox:

http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/90bb96e358b38d5485256a240052f0b3?OpenDocument&Highlight=0,replica

habe ich aber noch nicht getestet !
Ich braucht man aber keine Rechte auf der DB.


Gruß

Hardy