Domino 9 und frühere Versionen > ND8: Entwicklung

Verständnisproblem mit Lotus-Script und persönlichen Profilen

(1/3) > >>

sudsaat:
Hallo Community,

wie der Titel bereits besagt, habe ich ein Problem mit Lotus-Script und persönlichen Profilen.

Kurz zum Sachverhalt:
In einer bestehenden Datenbank müssen alle Benutzer auf fremde persönliche Profile zugreifen (das sieht der Prozess innerhalb der Datenbank vor). Ich bin aktuell damit beauftragt, die Performance dieser Datenbank zu verbessern und bin auf einen "bösen" Code zum Auslesen der Profil-Dokumente gestoßen:


--- Code: ---Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument
Dim tmpPersonalConfigDoc As NotesDocument
Dim personalConfigDocs As NotesDocumentCollection

Set session = New NotesSession
Set db = Session.CurrentDataBase
Set personalConfigDocs = db.Getprofiledoccollection("(ProfilePersonal)")
Set tmpPersonalConfigDoc = personalConfigDocs.Getfirstdocument()

While (Not tmpPersonalConfigDoc Is Nothing)
If (tmpPersonalConfigDoc.DocumentAutor(0) = userName) Then
Set personalConfigDoc = tmpPersonalConfigDoc
End If
Set tmpPersonalConfigDoc = personalConfigDocs.Getnextdocument(tmpPersonalConfigDoc)
Wend

Set getPersonalProfileFromName = personalConfigDoc

End Function

--- Ende Code ---

Dieser Code funktioniert zwar, hat jedoch offensichtlich 2 Schwachstellen:
- er iteriert immer über alle vorhandenen Profildokumente
- der Code bricht nicht ab, sobald er das gesuchte Profil gefunden hat

Somit steigen die Dokumenten-Zugriffe mit jedem neuen Profildokument immens an.

Folgende Änderung habe ich vorgenommen:


--- Code: ---Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument

Set db = Session.CurrentDataBase
Set personalConfigDoc = db.Getprofiledocument("(ProfilePersonal)", userName)

If (Not personalConfigDoc.Isnewnote) Then
Set getPersonalProfileFromName = personalConfigDoc
Else
Set getPersonalProfileFromName = Nothing
End If
End Function

--- Ende Code ---

Und genau an dieser Stelle geht mein Verständnisproblem los.

Laut der API-Beschreibung gibt die Function "db.getProfileDokument( ... )" ein existierendes Dokument zurück, oder legt es neu an (warum auch immer?).
Weiter kann über die Eigenschaft "isNewNote" geprüft werden, ob ein Dokument neu ist oder bereits im Backend gespeichert wurde.

Falls ein persönliches Profil existiert, wird dieses zurückgegeben. Existiert noch kein persönliches Profil, sollte die Function "Nothing" liefern.

Beim ersten Durchlauf ohne existierendes Profil klappt die Prüfung auf "isNewNote" und die Function liefert "Nothing". Führe ich anschließend die gleiche Function nochmals aus, liefert die Eigenschaft "isNewNote" false und ich erhalte ein Profil.

Wie ist hier der Zusammenhang zu verstehen, bzw. wo wurde das Profil jemals gespeichert?

Falls die Function "db.getProfileDokument( ... )" das Dokument speichern sollte, würde doch die "isNewNote"-Eigenschaft bereits beim ersten Durchlauf "false" liefern?
Da  ich das "neue" Profil im Anschluss selbst nicht speichere, müsste "isNewNote" beim 2. Durchlauf ebenfalls "false" liefern (macht sie aber nicht).

Ich habe den Code dann um eine Zeile erweitert:

--- Code: ---Public Function getPersonalProfileFromName( userName As String) As NotesDocument
Dim session As New NotesSession
Dim db As NotesDatabase
Dim personalConfigDoc As NotesDocument

Set db = Session.CurrentDataBase
Set personalConfigDoc = db.Getprofiledocument("(ProfilePersonal)", userName)

If (Not personalConfigDoc.Isnewnote) Then
Set getPersonalProfileFromName = personalConfigDoc
Else
                'Hier die kleine Erweiterung:
personalConfigDoc.Remove(true)
Set getPersonalProfileFromName = Nothing
End If
End Function

--- Ende Code ---

Und damit scheint die Function so zu funktionieren, wie sie sollte (zumindest aus einem Schnelltest heraus scheint es zu klappen).

Ist an dieser Stelle die API-Beschreibung falsch, ist es ein Bug oder verstehe ich das was komplett falsch?

Ich freue mich auf euer Feedback.

Grüße Thomas :-)

umi:
Hallo

GetProfiledocument erstellt immer ein neues Profile Dokument, falls noch keins vorhanden ist.
Ich würde jetzt auf ein separates Feld im Profil prüfen, ob dies ein gültiges Profil ist oder nicht.

Peter Klett:
Ich verstehe es so, dass ein nicht existierendes Profildokument beim Aufruf automatisch angelegt und gespeichert wird. Dass IsNewNotes beim ersten Mal True ist, kann ich nachvollziehen, da das Profildokument möglicherweise erst beim Verlassen der Datenbank oder des aufrufenden Dokuments oder zeitgesteuert später (-> keine Ahnung) gespeichert wird.

Die Lösung, die Du eingebaut hast, solltest Du sofort wieder vergessen. Um das Profildokument zu löschen, benötigt der User Editor und Löschrecht, denn das Profil wird kein Autorenfeld haben. Und Du willst NIE !!! eine Datenbank bauen, bei der ein gewöhnlicher Benutzer diese hohen Rechte aus technischen Gründen haben MUSS. Das funktioniert bei Dir mit Designerrechten, aber knallt später, oder die Benutzer haben jetzt schon das Recht, jedes Dokument beliebig zu ändern und zu löschen. Dann knallt es halt an einer anderen Stelle.

Ich würde, wenn ich schon mit Profilen arbeite, auf die "kreuz und quer" zugegriffen werden muss, eine eigene Steuerung einbauen, mit der bei bewusster Anlage des Profiles ein Flag hineingesetzt wird, mit dem klar ist, dass dieses Profil in Benutzung ist (unabhängig davon, dass es vielleicht durch den Zugriff automatisch angelegt wurde). Anstelle der Abfrage auf IsNewDoc prüfst Du das eigene Flag ab.

Ich persönlich würde auf Profildokumente an der Stelle verzichten, normale Dokumente verwenden und auf diese mit "normalen" Methoden zugreifen.

sudsaat:
Vielen Dank für die schnellen Antworten :-)

@umi: Das ein neues angelegt wird, ist ja so in der Doku beschrieben, nur in Verbindung mit "isNewNote" war mir das ganze nicht klar (warum erstmal "true" wobei das Dokument scheinbar schon gespeichert wurde, die Erläuterung von Peter würde das allerdings erklären).

@Peter: Das mit "isNewNote" muss ich wohl als gegeben hinnehmen :-) Danke für den Hinweis mit dem Editoren-Rechten, das werde ich mal prüfen, aber soweit ich weiß, ist das sogar der "default"-Zugriff. Dann würde der Code ja funktionieren (das grundlegende Design will ich nicht anzweifeln, da habe ich keinen Einfluss drauf).

Die Umstellung auf normale Dokumente war auch mein erster Gedanke, wurde aber schnell eines besseren belehrt, da ansonsten alle Kunden-Instanzen migriert werden müssten, die aber nicht alle auf dem gleichen Template-Stand sind und die Migration auch nicht bezahlen würden... fällt also leider flach :-(.

Ich denke das mit dem eigenen Flag könnte die Lösung werden, wobei ich dann noch das Problem habe, dass die Function "db.getProfileDocument()" pro Benutzer je ein "ungültiges" Profil in der Datenbank erzeugen würde, oder?

Grüße Thomas :-)

Peter Klett:
Ja, bei jedem Nachschauen, ob ein Profildokument für einen Benutzer exisitiert, besteht danach eines.

Ihr habt als Default Editor und Löschrecht? Damit mag Dein Code funktionieren, aber das ganze System nicht. Lass mal einen Benutzer STRG-A + Entf drücken. Tolle Sache. Für sowas habt Ihr Kunden finden können?

In meiner Branche gehört man dafür zu Recht an die Wand gestellt ...

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln