Autor Thema: LS/C-API 32/64bit: für $FILE-Item SeqNr, DupID, Object-ID auslesen  (Gelesen 4686 mal)

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Hallo zusammen,
ich will mich für ein ziemlich verrücktes Problem auf Fehlersuche begeben. Dazu benötige ich Informationen über $FILE Items, an die ich mit klassischem Lotus Script (LS) nicht herankomme. Zumindest glaube ich, daß ich da nicht herankomme.

Szenario:
- Lotus Domino Server R8.53 32 und 64bit (jeweils auf Windows Server 32 bzw. 64 bit)
- zyklischer Serveragent
- der Agent prüft in der entsprechenden DB alle Dokumente, die Attachments enthalten
- je Dokument und $FILE Item werden Informationen in eine Protokoll-Datei geschrieben

Was ich schon habe:
- den LS-Agenten an sich
- Ermittlung der Object ID (in Ytria ScanEZ auch als RRV (ID) bezeichnet)
- funktioniert unter 32 Bit

Mein Problem:
- ich bin kein C-API Profi, ein Kollege hat sich vor einiger Zeit mal was "zusammengeborgt" nach diversen Recherchen im Internet, ich hab's nur angepaßt auf meine Zwecke
- Agent läuft nicht unter 64 Bit, bei Ausführung gibt's einen Servercrash
- das macht in meinen Augen auch Sinn, einige Hauptfunktionen benutzen "KERNEL32"
- diese "Bastellösung" möchte ich nicht auf die Menschheit loslassen

Mein Ziel:
- Agent soll stabil unter 32 und 64 bit laufen (64 bit sogar wichtiger als 32 bit)
- ich brauche im LS Funktionen wie "getObjectID(NotesItemName)", "getSequenceNumber" etc. mit Rückgabewert String
- perfekt wäre natürlich eine fertige ScriptLibrary
- ich bau' mir - entsprechende für einen C-API Laien verständliche Beispiele vorausgesetzt - auch gern selbst was zusammen

Ich habe bisher nichts für mich verwertbares im Netz gefunden, nicht hier im Forum, nicht in den  notes.net Foren (ja - ich weiß, die heißen jetzt anders...), Frau Google zuckt auch mit den Schultern.

Meine Fragen:
- hat sich jemand von Euch mit diesem Thema schonmal beschäftigt?
- gerade auch unter dem Aspekt 64bit? Am besten suche ich EINEN Ansatz, der auf 32- und 64bit Systemen gleichermaßen funktioniert ODER zwei Verfahren und eine Möglichkeit für mich, auf 32/64 Bit zu prüfen.
- gibt es eine "Abkürzung" für mich (und wenn ja, wie sieht sie aus) oder muß ich in den sauren Apfel beißen, 1000+ Seiten Buch lesen, Testserver aufsetzen, 100+ mal crashen und nebenher 3 Wochen das Tagesgeschäft liegenlassen?

@Tode
Ja, es geht um das $)(/O)%%&/!!!! Problem, das ich auf der Nachlese in München erwähnt habe. Ich rede mittlerweile direkt mit IBM Entwicklern in New York. Keine Aussicht auf Lösung. Frustrierend.  :-[

Offline eknori

  • @Notes Preisträger
  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Was hast du denn an Code?. In der Regel sind es unter 64Bit die Pointer, die da Probleme machen.
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
So sieht meine zusammengeborgte Mini-ScriptLib aus:
Code
Option Public


Type API_TIMEDATE
Innards(1) As Long
End Type

Type API_ORIGINATORID

File As Double
Note As Double
Sequence As Long
SequenceTime As API_TIMEDATE

End Type

Type API_TIME
Year As Long
Month As Long
Day As Long
Weekday As Long
Hour As Long
Minute As Long
Second As Long
hundredth As Long
dst As Long
zone As Long
GM As API_TIMEDATE
End Type


Declare Sub NSFNoteGetInfo Lib "nnotes" Alias "NSFNoteGetInfo" ( _
ByVal note_handle As Long, ByVal note_member As Long, value_ptr As Any)

Declare Function TimeGMToLocal Lib "nnotes" Alias "TimeGMToLocal" ( _
dtTime As API_TIME ) As Long

Const NOTE_OID = 2


Type BlockID

hPool As Long

Block As Integer

End Type



Const wAPIModule = "NNOTES"  ' Windows/32



Declare Function OSPathNetConstruct Lib wAPIModule Alias "OSPathNetConstruct" _
(  ByVal zP As Long, ByVal S As String, ByVal F As String, ByVal P As String) As Integer

Declare Function NSFDbOpen Lib wAPIModule Alias "NSFDbOpen" _
(  ByVal P As String, hDB As Long) As Integer

Declare Function NSFDbClose Lib wAPIModule Alias "NSFDbClose" _
(  ByVal hDB As Long) As Integer

Declare Function NSFNoteOpen Lib wAPIModule Alias "NSFNoteOpen" _
(  ByVal hDB As Long, ByVal N As Long, ByVal F As Integer, hNT As Long) As Integer

Declare Function NSFNoteClose Lib wAPIModule Alias "NSFNoteClose" _
(  ByVal hNT As Long) As Integer

Declare Function OSMemFree Lib wAPIModule Alias "OSMemFree" _
(  ByVal hM As Long) As Integer

Declare Function OSLoadString Lib wAPIModule Alias "OSLoadString" _
(  ByVal hM As Long, ByVal S As Integer, ByVal B As String, ByVal nB As Integer) As Integer

Declare Function OSLockObject Lib wAPIModule Alias "OSLockObject" _
(  ByVal hM As Long) As Long

Declare Sub OSUnlockObject Lib wAPIModule Alias "OSUnlockObject" _
(  ByVal hM As Long)

Declare Function NSFItemInfo Lib wAPIModule Alias "NSFItemInfo" _
(  ByVal hNT As Long, ByVal N As String, ByVal nN As Integer, iB As BlockID _
,  D As Integer, vB As BlockID, nV As Long) As Integer

Declare Function NSFItemInfoNext Lib wAPIModule Alias "NSFItemInfoNext" _
(  ByVal hNT As Long, ByVal hP As Long, ByVal B As Integer, ByVal N As String, ByVal nN As Integer, iB As BlockID _
,  D As Integer, vB As BlockID, nV As Long) As Integer

Declare Sub NSFItemQuery Lib wAPIModule Alias "NSFItemQuery" _
(  ByVal hNT As Long, ByVal hP As Long, ByVal B As Integer _
,  ByVal zN As Long, ByVal mN As Integer, nN As Integer _
,  F As Integer, T As Integer, vB As BlockID, nV As Long)



Declare Function ConvertTIMEDATEToText Lib wAPIModule Alias "ConvertTIMEDATEToText" _
(  ByVal F As Long, ByVal T As Long, ByVal P As Long, ByVal S As String _
,  ByVal nS As Integer, rS As Integer) As Integer

Declare Function NSFDbGetObjectSize Lib wAPIModule Alias "NSFDbGetObjectSize" _
(  ByVal hDB As Long, ByVal oID As Long, ByVal T As Integer, S As Long _
,  C As Integer, P As Integer) As Integer



Declare Sub Peek Lib "KERNEL32" Alias "RtlMoveMemory" _
(  D As Any, ByVal P As Long, ByVal N As Long)

Declare Sub PeekString Lib "KERNEL32" Alias "RtlMoveMemory" _
(  ByVal D As String, ByVal P As Long, ByVal N As Long)

Declare Sub CopyLS Lib "KERNEL32" Alias "RtlMoveMemory" _
(  D As Any, P As Any, ByVal N As Long)

Sub Initialize

End Sub
Function getObjectId(doc As NotesDocument) As String
	getobjectId = ""
	Const tz = "~~"
	Dim s As String
	Dim i As Long
	s = ""
	i = 0

	Dim db As NotesDatabase
	Set db = doc.ParentDatabase

	dp$ = String(1024, " ")
	OSPathNetConstruct 0, db.Server, db.FilePath, dp$

	Dim hDB As Long
	NSFDbOpen dp$, hDB
	If hDB = 0 Then Exit function

	Dim hNT As Long
	NSFNoteOpen hDB, CLng("&H" & doc.NoteID), 0, hNT

	If Not hNT = 0 Then
		Dim iB As BlockID, vB As BlockID
		NSFItemInfo hNT, "$FILE", 5, iB, dt%, vB, nV&
		While Not nV& = 0
			i = i + 1
			NSFItemQuery hNT, iB.hPool, iB.Block, 0, 0, 0, f%, dt%, vB, nV&

			If s > "" Then
				s = s & tz
			End If			
			s = s & "[$FILE Item=" & CStr(i) & "|" & PeekObjectId(f%, vB, hDB) & "]"

			NSFItemInfoNext hNT, iB.hPool, ib.Block, "$File", 5, iB, dt%, vB, nV&
		Wend
	End If

	getObjectId = s
	NSFNoteClose hNT
	NSFDbClose hDB

End Function
Function PeekObjectId(f%, vB As BlockID, hDB As Long) As String
	Const itemflags = "SIGN SEAL SUMMARY &H08 &H10 READWRITERS NAMES " _
	& "&H80 PLACEHOLDER PROTECTED READERS &H0800 UNCHANGED"
	
	PeekObjectId = ""
	If vB.hPool = 0 Then Exit function

	p& = OSLockObject(vB.hPool) + vB.Block

	' $FILE Attachment name --> fname$
	Peek nF&, p& + 8, 2
	fname$ = String$(nF&, " ")
	PeekString fname$, p& + 38, nF&

	' Object-ID
	Peek oID&, p& + 4, 4
	
	OSUnlockObject vB.hPool

	PeekObjectId = "filename=" & fname$ & "|Object-ID=" & Right$("00000000" & Hex$(oID&),8)
End Function

In meinem Agenten (den ich momentan nur vom Client ausführe), kann ich dann einfach mit

Code
getObjectId(doc)

die Object-ID's von allen $FILE-Items eines Notesdokumentes auslesen. Die Formatierung des Rückgabewertes paßt sich dem anderen Log-Drumherum an, also bitte nicht wundern.


« Letzte Änderung: 24.04.15 - 14:57:42 von thkn777 »

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Update:
- PMR immer noch offen
- ich lasse auf einem Client Agenten laufen, die DB's auf verschiedenen Servern auf die Object-ID prüfen

In dem Zusammenhang eine Frage:
Kennt jemand genauere Zusammenhänge zum Aufbau der Object-ID's? (oder auch RRV genannt) Bei uns kommen zwei Typen vor - sehr niedrige Werte (z.B. 0000012E) und sehr hohe Werte (z.B. 00069772).
Ich wüßte gern, wie dort die Zusammenhänge sind. IBM hat gesagt, es gibt keine... ich glaube da nicht so recht dran.

Offline Pfefferminz-T

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.204
Wenn es irgendwo Doku zu OID etc. gibt, dann in der C-API Hilfe...

Gruss,
Thorsten
Grüsse,
Thorsten

Offline eknori

  • @Notes Preisträger
  • Moderatoren
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 11.728
  • Geschlecht: Männlich
Egal wie tief man die Messlatte für den menschlichen Verstand auch ansetzt: jeden Tag kommt jemand und marschiert erhobenen Hauptes drunter her!

Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
Ich bin blind  :-: oder wir meinen jeweils etwas anderes.

Ich meine die Object-ID (RRV) eines File-Attachments. Siehe Screenshot.

Im verlinkten "Anatomie-Dokument" steht dazu:
Zitat
The note ID (NID) identifies a note in a database. The NID is the file position of the Record Relocation Vector (RRV) for the note. An RRV is a DWORD offset in a file. Confusion often arises because the note ID is casually referred to as "the Note's RRV in this file." In fact, the note ID is the offset in the file to the RRV, which in turn points to the record for the note. An RRV is a general structure, while a note ID is more specific. Internal to Domino and Notes, various other objects besides notes have an associated RRV.

Entscheidend ist der letzte Satz. Die RRV des Notes Documents hat mit der RRV eines $FILE Items, das dem Dokument zugeordnet ist, nichts zu tun.

Ein NotesDocument und dessen Attachments werden nicht in einer gemeinsamen Struktur in der NSF-Datei abgelegt, es sind für sich eigenständige Objekte. Im Notes Dokument wird jedoch für jedes Attachment neben ein paar weiteren Eigenschaften dessen RRV (Object-ID) geführt.

Und den Aufbau dieser Object-ID suche ich. Sorry, falls ich mich in meiner vorigen Frage zu schwammig/allgemein ausgedrückt habe.  :-[

Die Objekte, die uns hier auf dem Server kaputt gehen, haben alle eine sehr kleine Object-ID (RRV)... ich versuche mir einen Reim darauf zu machen.


Offline thkn777

  • Aktives Mitglied
  • ***
  • Beiträge: 176
UPDATE:
- Lösung für 64Bit vorerst nicht nötig. Falls da also noch jemand drauf rumkaut --> danke, aber hat sich erledigt.
- mein eigentliches Problem (PMR) scheint gelöst. Es sieht nach einem Regression Bug im Bereich Attachment Compression aus, der eigentlich "saubere" Attachments als "kaputt" erkennt. R8.5.3 Client und Server sind betroffen. Testphase für HF startet demnächst. Ich bin milde optimistisch.

Schönes Wochenende!

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz