Autor Thema: ReplicationEntry  (Gelesen 3126 mal)

TomLudwig

  • Gast
ReplicationEntry
« am: 06.10.04 - 09:53:27 »
Hallo zusammen,

ich möchte mir ein Script basteln, welches mir das Replizierungsprotokoll in ein Dokument abspeichert.

Ich habe schon mit ReplicationEntry und GetEntry von der ReplicationClass herum gespielt.
Aber ich bekomme leider nie einen Eintrag aus dem Replizierungsprotokoll.
Sondern eigentlich nur auf die Replizierparameter. Oder sonst irgendwas, womit ich leider nichts anfangen kann.


Kann mir jemand helfen???

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #1 am: 06.10.04 - 22:16:20 »
Soweit ich weiss, ist die replication history nur über die API zugänglich, nicht über LS
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

Glombi

  • Gast
Re: ReplicationEntry
« Antwort #2 am: 06.10.04 - 22:21:49 »
So ist es. Keine Chance mit Script.
Ob die API das hergibt, kann ich momentan nicht sagen. Es ist aber wohl eher ein schwarzes Loch  ;D

Andreas

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #3 am: 07.10.04 - 09:05:17 »
Mittlerweile habe ich auch schon rausgefunden, dass es nur über die API möglich ist.
Ich habe einen schönen Beispiel Code für die C-API gefunden, den ich euch natürlich nicht vorenthalten möchte  ;)

Leider hab ich damit noch ein kleines Problem. An der rot markierten Stelle sollte die Funktion in die Variable sPath einen Wert schreiben. Leider tut sie das nicht, obwohl die Variable db gesetzt ist (Datenbank kann geöffnet werden).
An was kann das liegen?


=====================================================
' (Declarations)
' Notes API constants
Const DIRECTION_NEVER=0
Const DIRECTION_SEND=1
Const DIRECTION_RECEIVE=2
Const MAXPATH=256
Const MAXALPHATIMEDATE=80
Const ERR_SPECIAL_ID=578

' custom type for storing individual replication history entries
Type HIST_ENTRY
RepTime As String
ServerName As String
FileName As String
Direction As String
End Type

' Notes API types (based on C structs)
Type TIMEDATE
Innards1 As Long
Innards2 As Long
End Type

Type REPLHIST_SUMMARY
ReplicationTime As TIMEDATE
AccessLevel As Integer
AccessFlags As Integer
Direction As Integer
ServerNameOffset As Long
ServerNameLength As Integer
FileNameLength As Integer
Spare1 As Long
Spare2 As Long
End Type

' Notes API declares
Declare Sub OSPathNetConstruct Lib "nnotes" (Byval portName$, Byval ServerName$, Byval FileName$, Byval retPathName$)
Declare Function NSFDbGetReplHistorySummary% Lib "nnotes" (Byval hDb&, Byval Flags&, rethSummary&, retNumEntries&)
Declare Function NSFDbOpen% Lib "nnotes" (Byval PathName$, hDB&)
Declare Function NSFDbClose% Lib "nnotes" (Byval hDB&)
Declare Function OSMemFree% Lib "nnotes" (Byval Handle&)
Declare Function OSLockObject& Lib "nnotes" (Byval nHandle&)
Declare Function OSUnlockObject% Lib "nnotes" (Byval nHandle&)
Declare Function ConvertTIMEDATEToText% Lib "nnotes" (Byval intFormat&, Byval TextFormat&, InputTime As TIMEDATE, Byval retTextBuffer$, Byval TextBufferLength%, retTextLength%)
Declare Function OSLoadString% Lib "nnotes" (Byval hModule&, Byval StringCode%, Byval retBuffer$, BufferLength%)

' Win32 API declares
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As REPLHIST_SUMMARY, Byval pSource&, Byval dwLength&)
Declare Sub CopyMemoryStr Lib "kernel32" Alias "RtlMoveMemory" (Byval pDest$, Byval pSource&, Byval dwLength&)


Function GetReplHistory(db As NotesDatabase, sList() As String, lEntries&) As Integer
' This function returns the replication history for a database in the same format as you would see
' by selecting "File - Replication - History" (and clicking Server name radio button) in the Notes R5 client.
' The function has (3) parameters:
'
' 1. db (NotesDatabase) - [Input] Indicates the database you wish to open
' 2. sList (String array) - [Output] Returns array of strings that will hold the formatted history
' 3. lEntries (Long) - [Output] Returns the number of entries returned from the NSFDbGetReplHistorySummary call

' The function itself returns an integer. If no errors are found, it returns a 0. Otherwise, it returns the error
' code returned by the Notes API.
Dim hDb&, hLock&, hSummary&
Dim nLoop%, cbReturn%, nPos%, nRetCode%
Dim sPath$, sHold$, sRepTime$, sTemp$, sServer$, sFileName$
Dim summary As REPLHIST_SUMMARY
Dim entry() As HIST_ENTRY
Dim nm As NotesName

' what to return if no errors are found
GetReplHistory=0

' prepare a string for API call
sPath$=Space(MAXPATH)

' create an API-friendly path to the db and open it
OSPathNetConstruct "", db.Server, db.FilePath, sPath$
nRetCode%=NSFDbOpen(sPath$, hDb&)

If nRetCode% <> 0 Then
GetReplHistory = nRetCode%
Else
' get handle to replication history summary (sorted by server name)
nRetCode%=NSFDbGetReplHistorySummary(hDb&, 0, hSummary&, lEntries&)

If nRetCode% <> 0 Then
GetReplHistory = nRetCode%
Else

' process only if there are entries in the history summary
If lEntries& > 0 Then
Redim entry(lEntries& - 1)
sRepTime$=Space(MAXALPHATIMEDATE + 1)

' lock down the handle to the history summary so we can get at the data
hLock&=OSLockObject(hSummary&)

For nLoop%=0 To lEntries&-1
' extract replication history by looping over the array of REPLHIST_SUMMARY structs
CopyMemory summary, hLock&, Lenb(summary)

' convert Notes TIMEDATE to a legible text string for replication time
ConvertTIMEDATEToText 0, 0, summary.ReplicationTime, sRepTime$, MAXALPHATIMEDATE, cbReturn%
entry(nLoop%).RepTime=Left$(sRepTime$, cbReturn%)

' get replication direction
Select Case summary.Direction
Case DIRECTION_NEVER
entry(nLoop%).Direction="Never Received"

Case DIRECTION_SEND
entry(nLoop%).Direction="Send"

Case DIRECTION_RECEIVE
entry(nLoop%).Direction="Receive"

End Select

' advance offset to next REPLHIST_SUMMARY struct
hLock&=hLock&+Lenb(summary)
Next

' as server/filenames are not part of the REPLHIST_SUMMARY struct, but rather at the end of the
' array of these structs, we'll need to grab this info one char at a time (for each entry we find) in the
' format: CN=ServerA/O=OrgA!!myfile.nsf/0CN=ServerB/O=OrgAA!!myfile.nsf/0, etc.
sHold$=""
sTemp$=String$(1, 0)
nLoop%=0
Do While nLoop% < lEntries&
CopyMemoryStr sTemp$, hLock&, 1
If sTemp$ = Chr$(0) Then
' parse out server and filename
nPos%=Instr(1, sHold$, "!!")
entry(nLoop%).ServerName=Left$(sHold$, nPos%-1)
entry(nLoop%).FileName=Right$(sHold$, Len(sHold$)-nPos%-1)
sHold$=""
nLoop%=nLoop% + 1
Else
' build the string one char at a time
sHold$=sHold$ & sTemp$
End If

' advance the offset
hLock& = hLock& + 1
Loop

' release the lock on the history summary handle once we're done with it
OSUnlockObject(hSummary&)

Redim sList(lEntries&-1)
For nLoop%=0 To lEntries&-1
' populate the array of entries to return to the caller
Set nm=New NotesName(entry(nLoop%).ServerName)
sList(nLoop%)=Trim$(nm.Abbreviated & " " & entry(nLoop%).FileName & " " & entry(nLoop%).RepTime & " (" & entry(nLoop%).Direction & ")")
Next

End If

End If

' free any open handles to the history summary and/or the db
If hSummary& <> 0 Then OSMemFree hSummary&
If hDb& <> 0 Then NSFDbClose hDb&
End If
End Function


Sub Click(Source As Button)
' This sample button calls the GetReplHistory function and displays a database's replication history
' sorted by server name in the format <server> <filename> <date> <time> (<direction>). For example:
' ServerA/CompanyX HR\hris.nsf 08/01/2000 08:01:54 PM (Receive)
' ServerA/CompanyX HR\hris.nsf 08/01/2000 02:32:12 PM (Send)
' If errors were encountered by the Notes API calls in GetReplHistory, the
' OSLoadString API is used to determine the error string returned.
Dim session As New NotesSession
Dim db As NotesDatabase
Dim sList() As String
Dim nCt%, nReturn%
Dim lEntries&
Dim sMsg$, sBuffer$

Set db=session.GetDatabase("", "test.nsf")

' retrieve the history sorted by server name
nReturn%=GetReplHistory(db, sList, lEntries&)

If nReturn% = 0 Then
' no errors--build a string to show in a msgbox
sMsg$=""
For nCt%=0 To lEntries&-1
sMsg$=sMsg$ & sList(nCt%) & Chr(13) & Chr(10)
Next

' show the string
Msgbox sMsg$, 0, "Replication History for " & db.Title

Elseif nReturn=ERR_SPECIAL_ID Then
' no history found
Msgbox "There is no replication history for this database.", 32, "Replication History"

Else
' find out what the error string is from the API
sBuffer$=String$(256, 0)
OSLoadString 0, nReturn%, sBuffer$, 255

' errors found
Msgbox "Error found in retrieving history: " & sBuffer$, 48, "Replication History Error"
End If
End Sub

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #4 am: 08.10.04 - 13:06:52 »
Hallo zusammen,

mittlerweile funktioniert der ganze Code. Ich hab mich nur zu blöd angestellt und den Code in die falschen Stellen rein kopiert ....

Aber jetzt möchte ich die Ausgabe nicht nach Server sortiert haben sondern nach Datum. Das ganze geht wenn man in der funktion NSFDbGetReplHistorySummary das Flag REPLHIST_SORT_BY_DATE  übergibt. Aber leider habe ich jetzt schon x-Varianten ausprobiert. Nichts funktioniert. Und ich finde den Wert von REPLHIST_SORT_BY_DATE  auch nicht. Wie kann ich dieses Flag übergeben?

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #5 am: 08.10.04 - 13:12:02 »
Zitat
#define REPLHIST_SORT_BY_DATE      0x00000002L   /*   Sort by date.  Default is
                                       by server name */

Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #6 am: 08.10.04 - 13:12:59 »
Den Eintrag hab ich auch schon gefunden. Aber ich hab nicht genau gewusst wo ich den hin schreiben soll... sorry... ich habe nur Fehlermeldungen bekommen....

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #7 am: 08.10.04 - 13:19:31 »
STATUS LNPUBLIC NSFDbGetReplHistorySummary(
   DBHANDLE  hDb,
   DWORD  Flags,
   HANDLE *rethSummary,
   DWORD *retNumEntries);


.... Flags ...
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #8 am: 08.10.04 - 13:28:54 »
Sorry, ich brings einfach nicht hin.

Gibts vielleicht ne Schritt für Schritt einleitung für totale DAUs ????


Ich steh heut irgendwie den ganzen Tag voll auf der Leitung... Gott sei dank ist Freitag....

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #9 am: 08.10.04 - 13:33:02 »
Probiers mal so:

' get handle to replication history summary (sorted by date)
nRetCode%=NSFDbGetReplHistorySummary(hDb&, 2, hSummary&, lEntries&)

Habs natürlich nicht probiert, aber sollte helfen, etwa in der Mitte Deines Codes
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #10 am: 08.10.04 - 13:36:38 »
Nein geht leider nicht. Ist der Wert von dieser Variable wohl 2 ???

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #11 am: 08.10.04 - 13:39:06 »
Wäre er, ja, was passiert denn, wenn Dus so eingibst?
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #12 am: 08.10.04 - 13:41:21 »
Es ist immernoch nach Server sortiert...

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: ReplicationEntry
« Antwort #13 am: 08.10.04 - 13:45:57 »
Hier ist ein Beispielcode von Rod Whiteley (!), in der er genau dieses Flag übergibt:
http://www-10.lotus.com/ldd/46dom.nsf/0/ce9d340b65ac58e180256e23003d4c81?OpenDocument

HTH,
Bernhard

PS: Du fragtest nach einer Anleitung - hier ist eine ganz hervorragende:
http://www.ls2capi.com/normunds/ls2capihome.nsf/Content/index

Offline Semeaphoros

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.152
  • Geschlecht: Männlich
  • ho semeaphoros - agr.: der Notesträger
    • LIGONET GmbH
Re: ReplicationEntry
« Antwort #14 am: 08.10.04 - 13:51:14 »
Hast Du schon untersucht, ob das von der API immer noch falsch sortiert zurückkommt oder ob sonst im Code die Reihenfolge verändert wird? Der Debugger sollte da helfen.
Jens-B. Augustiny

Beratung und Unterstützung für Notes und Domino Infrastruktur und Anwendungen

Homepage: http://www.ligonet.ch

IBM Certified Advanced Application Developer - Lotus Notes and Domino 7 und 6
IBM Certified Advanced System Administrator - Lotus Notes and Domino 7 und 6

TomLudwig

  • Gast
Re: ReplicationEntry
« Antwort #15 am: 08.10.04 - 13:58:07 »
Mir reichts. Ich geh jetzt heim. Ich denke ich muss einfach noch mal ne Nacht drüber schlafen. Ich weiß nicht an was es liegt. Ich poste noch mal meinen Code. Da ich nichts gefunden habe wo ich die Reihenfolge verändere... Bis montag...



Function GetReplHistory(db As NotesDatabase, sList() As String, lEntries&) As Integer
' This function returns the replication history for a database in the same format as you would see
' by selecting "File - Replication - History" (and clicking Server name radio button) in the Notes R5 client.
' The function has (3) parameters:
'
' 1. db (NotesDatabase) - [Input] Indicates the database you wish to open
' 2. sList (String array) - [Output] Returns array of strings that will hold the formatted history
' 3. lEntries (Long) - [Output] Returns the number of entries returned from the NSFDbGetReplHistorySummary call
   
' The function itself returns an integer. If no errors are found, it returns a 0. Otherwise, it returns the error
' code returned by the Notes API.
   Dim hDb&, hLock&, hSummary&
   Dim nLoop%, cbReturn%, nPos%, nRetCode%
   Dim sPath$, sHold$, sRepTime$, sTemp$, sServer$, sFileName$
   Dim summary As REPLHIST_SUMMARY
   Dim entry() As HIST_ENTRY
   Dim nm As NotesName
   
' what to return if no errors are found
   GetReplHistory=0
   
' prepare a string for API call
   sPath$=Space(MAXPATH)
   
' create an API-friendly path to the db and open it
   OSPathNetConstruct "", db.Server, db.FilePath, sPath$
   nRetCode%=NSFDbOpen(sPath$, hDb&)
   
   If nRetCode% <> 0 Then
      GetReplHistory = nRetCode%
   Else
      
' get handle to replication history summary (sorted by server name)       
      
      nRetCode%=NSFDbGetReplHistorySummary(hDb&, 2, hSummary&, lEntries&)
      
      'nRetCode%=NSFDbGetReplHistorySummary(hDb&, 0, hSummary&, lEntries&)
      
      If nRetCode% <> 0 Then
         GetReplHistory = nRetCode%
      Else
         
' process only if there are entries in the history summary
         If lEntries& > 0 Then
            Redim entry(lEntries& - 1)
            sRepTime$=Space(MAXALPHATIMEDATE + 1)
            
' lock down the handle to the history summary so we can get at the data
            hLock&=OSLockObject(hSummary&)
            
            For nLoop%=0 To lEntries&-1
' extract replication history by looping over the array of REPLHIST_SUMMARY structs
               CopyMemory summary, hLock&, Lenb(summary)
               
' convert Notes TIMEDATE to a legible text string for replication time
               ConvertTIMEDATEToText 0, 0, summary.ReplicationTime, sRepTime$, MAXALPHATIMEDATE, cbReturn%
               entry(nLoop%).RepTime=Left$(sRepTime$, cbReturn%)
               
' get replication direction
               Select Case summary.Direction
               Case DIRECTION_NEVER
                  entry(nLoop%).Direction="Nie Empfangen"
                  
               Case DIRECTION_SEND
                  entry(nLoop%).Direction="Senden"
                  
               Case DIRECTION_RECEIVE
                  entry(nLoop%).Direction="Empfangen"
                  
               End Select
               
' advance offset to next REPLHIST_SUMMARY struct
               hLock&=hLock&+Lenb(summary)
            Next
            
' as server/filenames are not part of the REPLHIST_SUMMARY struct, but rather at the end of the
' array of these structs, we'll need to grab this info one char at a time (for each entry we find) in the
' format: CN=ServerA/O=OrgA!!myfile.nsf/0CN=ServerB/O=OrgAA!!myfile.nsf/0, etc.
            sHold$=""
            sTemp$=String$(1, 0)
            nLoop%=0
            Do While nLoop% < lEntries&
               CopyMemoryStr sTemp$, hLock&, 1
               If sTemp$ = Chr$(0) Then
' parse out server and filename
                  nPos%=Instr(1, sHold$, "!!")
                  entry(nLoop%).ServerName=Left$(sHold$, nPos%-1)
                  entry(nLoop%).FileName=Right$(sHold$, Len(sHold$)-nPos%-1)
                  sHold$=""
                  nLoop%=nLoop% + 1
               Else
' build the string one char at a time
                  sHold$=sHold$ & sTemp$
               End If
               
' advance the offset
               hLock& = hLock& + 1
            Loop
            
' release the lock on the history summary handle once we're done with it
            OSUnlockObject(hSummary&)
            
            Redim sList(lEntries&-1)
            For nLoop%=0 To lEntries&-1
' populate the array of entries to return to the caller
               Set nm=New NotesName(entry(nLoop%).ServerName)
               sList(nLoop%)=Trim$(entry(nLoop%).RepTime & "°~°" & entry(nLoop%).Direction & "°~°" & nm.Abbreviated & "°~°" & entry(nLoop%).FileName)               
            Next
            
         End If
         
      End If
      
' free any open handles to the history summary and/or the db
      If hSummary& <> 0 Then OSMemFree hSummary&
      If hDb& <> 0 Then NSFDbClose hDb&
   End If
End Function







               nReturn%=GetReplHistory(check_db, sList, lEntries&)         ' Protokoll holen sortiert nach dem Servernamen               
               If nReturn% = 0 Then                                             ' Falls kein Fehler vorlag --> ins Log schreiben
                  For nCt%=0 To lEntries&-1
                     exp_entries = Evaluate(|@Explode("| & sList(nCt%) & |"; "°~°")|)      ' String auseinandern nehmen und in Felder schreiben
                     Call log_date.AppendToTextList(exp_entries(0))
                     Call log_action.AppendToTextList(exp_entries(1))
                     Call log_server.AppendToTextList(exp_entries(2))
                     Call log_file.AppendToTextList(exp_entries(3))
                  Next      

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz