Deletion Stubs auslesen, sonderbarer Fehler?

  • Mahlzeit,


    ich mal wieder....


    Ich hab irgendwie ein Problem mit der C-API. Ich beschreibe als erstes mal die Umgebung:


    Installierter Notes Client Version 8.5
    Domino: 8.0.2
    Syncdienst für Drittanwendung


    Problem:


    Die Deletion Stubs.
    Ich teste die Schnittstelle grade gegen mehrere Templates. Bisher war ich so naiv, das die deltetion Stubs halt deletion stubs sind und in jeder DB gleich behandelt werden.
    Leider sieht es so aus, das ich mit einer bestimmten Datenbank probleme habe, diese deletion Stubs zu lesen.
    Hier bekomme ich bei dem AUfruf der Funktion:


    NSFDbGetModifiedNoteTable


    den Fehler: ungültige Parameter


    Gibt es beim öffnen von Datenbanken, deren Besitzer eine OU haben einen Unterschied zu Datenbanken ohne OU?


    Ich bin für jede Hilfe Dankbar. Sollte jemand ein kleines Tool haben, mit dem sich die DelStubs auslesen lassen, würde ich dieses gern nutzen um einfach mal auf die Datenbanekn zu schauen.
    Noch besser wäre es, wenn das ganze in vb.net verfasst ist :)


    mit rauchendem Kopf und hoffnung auf wertolle tips


    Michaelz

  • Also Deletion Stubs sind in allen DBs gleich.
    D.h. die Ursache muss woanders liegen.
    Und wenn da die Meldung ungültiger Parameter kommt liegt es wohl eher am Aufruf.


    Auslesen kannst du die z.B. mit NotesPeek oder auch der kostenlosen Version von Ytria ScanEZ


    Besitzer gibt es nur bei MailDBs und das hat nur was mit dem Design zu tun aber nicht mit den grundsätzlichen Strukturen.


    Zugriffsrechte hast du aber schon die richtigen auf die DB ?

  • Ja, ich kann darauf zugreifen.
    Zum Ablauf:
    Erst werden die ncih gelöschten Dokumente gehohlt. Geht einwandfrei über die Domino Object Library
    Dann werden noch die gelöschten Documente (deletion Stubs) gehohlt.
    Über die CAPI. Geht mal und geht mal nicht.
    Also je nach datenbank.
    Wie sieht es denn aus mit den Berechtigungen des Registrationsserver in den Dantenbanken? Der darf doch alle und gibt es unterschiede an en Rechten zum lesen von Documenten und lesen von Deletion stubs?

  • Dann habe ich ganz klar das recht auf der DB zu arbeiten. Manager. Sollte reichen um die zu lesen
    Was mir bei meiner weiteren Recherche aufgefallen ist, das das DB Handle gar nicht richtig übergeben wird. Ich gehe davon aus das ein DB´Handle von 0 nicht grade eine geöffnete Datenbank ist.
    Da stellt sich mir dann aber die frage, warum die eine Datenbank geht und die andere nicht.
    Beide liegen in mal und haben keine SOnderzeichen oder lange dateinamen.
    der aufbau für die anfrage ist:
    svr!!mail/ntest
    svr!!mail/ntest1


    bei ntest1 geht es bei der zweiten nicht
    Der Fehler trat bei mir erst nach dem ich eine OU angelegt habe auf.
    Noch ideen zu später stunde?

  • Wenn du kein gültiges DBHandle bekommst dann sollte dir ja die Open Function eine entsprechende Fehlermeldung zurückliefern.
    Und was sagt diese aus ?


    Wie wäre es wenn du mal den Code dazu lieferst, dann kann man vielleicht mehr dazu sagen

  • Hier der Code. Zusätzliche Erläuterungen in [color=0066FF]BLAU[/color] im Code.


    Code
    Public Shared Function GetDeletedObjectsUNIDs(ByVal serverName As String, _            ByVal dbName As String, ByVal todayMinusDays As Int32) As ArrayList            Dim databasePath As String            Dim returnStringBuffer As StringBuilder            Dim status As IntPtr            Dim databaseHandle As IntPtr            Dim stubs As ArrayList = New ArrayList            Dim resultStringRef As IntPtr            Dim currentNlsInfo As IntPtrTry                returnStringBuffer = New StringBuilder(256)                ' --- build an API-friendly path to the current database (i.e., <Server>!!<FilePath>)                OSPathNetConstruct("", serverName, dbName, returnStringBuffer)                databasePath = returnStringBuffer.ToString

    [color=0066FF]Der Pfad sieht bei allen Datenbank von der Syntax gleich aus. server!!mailordner\mailfilename ohne nsf[/color]

    Code
    ' Holen eines Pointers auf eine (unmanaged) Struktur vom Typ NLS_INFO                currentNlsInfo = OSGetLMBCSCLS()                ' Pointer auf einen String im unverwalteten Speicherbereich, der später das Ergebnis aufnimmt holen                resultStringRef = Marshal.StringToHGlobalUni(databasePath)                ' Nimmt den Rückgabewert des Funktionsaufrufs von NLS_translate(...) auf                Dim nlsStatus As UInt16                ' Länge des Ergebnisstrings                Dim returnLength As Int16 = databasePath.Length * 2                ' Konvertieren des Datenbankpfads in das LMBCS-Format (eigenes Format von Lotus-Notes)                nlsStatus = NLS_translate(databasePath, -1, resultStringRef, returnLength, (NlsTranslateFlags.TARGETISLMBCS Or NlsTranslateFlags.SOURCEISUNICODE), currentNlsInfo)

    [color=0066FF]
    ' Hier ist der Status bei beiden Datenbaken 0, DatabasePath ist gefüllt[/color]


    Da sich zwei Datenbanken unterschiedlich verhalten, stellt sich mir die Frage warum ist das so. Ich versuche die DB zu öffnen und der DB Handle ist null. Was mich total kirre macht ist die Tatsache, das ich bei einer DB einen Handle bekomme und bei einer anderen nicht.

  • Sory, ich vergaß die definition:

    Code
    <DllImport("nnotes.dll")> Private Shared Function _
                OSPathNetConstruct( _
                ByVal portName As String, _
                ByVal ServerName As String, _
                ByVal FileName As String, _
                ByVal retPathName As StringBuilder _
                ) As UInteger
            End Function
  • Irgendwie passt die Definition nach meinem Wissen aber nicht zu der eigentlichen C-API Definition.


    Korrigiere mich falls ich mich irre aber far-Pointer in C sind doch immer IntPtr in C# und eben keine Strings wie hier in der Definition

  • Du hast recht, aber nach meinem Verständnis ist hier die Brücke zwischen C und C#/VB.net.
    Die Definition sagt, er soll die Funktion aus der DLL nehmen und als Übergabeparameter die verwalteten Parameter die angegeben sind.


    Aber ich denke das hier auch nicht wirklich das Problem liegt.


    Ich habe eben mal folgendes probiert:


    Datenabnk, die nicht geht in eine Datenbank umbenenannt (im Filesystem) die geht. Und siehe da, sie geht.


    Danach habe ich dann wieder umbenannt und sie da, es geht nicht mehr. Es liegt also nicht an der DB, oder siehst du das anders?
    Vielleicht noch als Hinweis, wobei ich erstmal nicht glaube das das was damit zu tun hat.


    Ich habe als letzten SChritt bevor ich diesen Fehler bekommen ahbe eine OU hinzugefügt. Seitdem klappt das ganze nicht mehr, egal, ob ich nun einen User mit OU anlege oder ohne. Ist da vll etwas was zu beachten wäre?
    Ich denke mal nicht, denn Notespeek nutzt ja die selben Funktionen.


    Und zusatz:
    Als Fehlermeldung von DBOpen kommt: Datei nicht gefunden.
    Aber die Datei ist definitv da.....


    Ich verzweifel grade echt. Das kost mich dermasen viel Zeit....
    Und dann so ein nicht wirklich nachvollziehbarer Fehler.
    Hat denn wirklich keiner ein Stück Code in VB.Net der Funktioniert um die DelStubs zu lesen?


    Alternativ C#, liesst sich ähnlich wie VB :)


    gruß Michael

  • Das mit der OU hatte ich dir schon beantwortet. Solltest du vielleicht auch mal lesen.


    Ja NotesPeek verwendet auch nur die API Funktionen, also liegt es entweder am falschen Pfad oder ein Pfad mit dem VB.net nichts anfangen kann oder ihn falsch konvertiert oder aber eben daran daß die Parameter nicht korrekt sind

  • Okay, wenn dem so ist, wie Du sagtst, verstehe ich nciht, das exakt der selbe Aufruf bei einer Datenbank funktioniert und bei der nächsten nicht.


    Das Programm geht mehrere Datenbanken nacheinander durch. EIne funzt eine nicht. Wie kann da dann der Aufruf falsch sein?
    Die Datenbanekn werden in einem anderen Teil des Programms über die DOmObject ausgelesen. ALso mit dem gleichen Daten die aus der Konfiguration der Software stammen gefüttert. Dort kann ich nur den Servernamen und den Filenamen angeben.
    Mehr nicht.
    Also habe ich derzeit folgendes Konstrukt:
    Datenbank a:
    Geänderte Dokumente seit dem xxx werden gelesen
    Geänderte Deletionstubs seit dem xxx werden gelesen


    Datenbank b:
    Geänderte Dokumente seit dem xxx werden gelesen
    Geänderte DeletionStubs seit dem xxx werden nicht gelesen weil eine Datei nicht gefunden wird.


    Wenn ich Datenbank a den namen der Datenbank b gebe, funktioniert es wieder.

  • z.B. Groß und Kleinschreibung, Sonderzeichen, die anders codiert werden, falsches Format des Servers/Pfad,....


    Es gibt da x Möglichkeiten woran es liegen kann.
    Und wenn es grundsätzlich geht, dann liegt es vermutlich an einem der übergebenen Parameter.


    Und bei der verwendung unterschiedlicher Schnittstellen zum gleichen System, bei dir also C-API und COM, kann es immer zu Problemen kommen, da dann die Daten mindestens 2 Mal konvertiert werden.

  • Was willst du überhaupt mit den Deletion Stubs anfangen? Außer dem Löschdatum steht da doch nichts drin. Und das können die auch NotesPeek oder scanEZ verraten.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Ganz einfach. Gibt es zu einer DocID ein DelStub, wurde dieses Dokument gelöscht.


    Und da es hier um einen automatismus geht, kann ich keine andere Softeware nutzen um das zu prüfen.


    Ich habe aber eine weitere Idee um die CAPI zu umschiffen.


    Wenn nun jedesmal wenn ein Dokument gelöscht wird, in eienr weiterne Datenbank ein Dokument angelegt wird, wo halt die Originale ID und der Username und das Löschdatum drin steht, habe ich darauf ja Zugriff ohne Com.
    Ich muß nur einmalig wissen das ein Dokument gelöscht ist. Danach wird es nicht mehr berüksichtigt.


    Wie klingt das?


    Kann mir jemand aus dem Stehgreif sagen wo ich den Punkt in den Templates (8.5) finde, wo ein Dokument gelöscht wird? ALso genau den Punkt bevor das löschen gestartet wird. Damit müsste ich nach meinem empfinden alle möglichen Löschwege abgefangen haben.

  • Im Datenbankschript, das QueryDocumentDelete Event. Und das zu nutzen würde ich auch vorschlagen, da in den Deletion Stubs nicht die zusätzliche von dir gewünschte Information ("Wer wars?") zu finden ist.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl

  • Ich hatte mir gedacht, ich such mir die Stelle, BEVOR definitiv gelöscht wird,ruf eine eigene Routine auf, die in eine gesonderte Datenbak die Daten in jeweils einem Dokument ablegt, die ich brauche (das wer war es habe ich ja da ich weiß wer löschen will) und habe damit eine Datenbank it "myDeletionStubs" die für mich aber auch immer zugänglich sind.


    Sieht da noch jemand irgendwelche Stolperfallen bei der IDee?


    Gruß Michael

  • Du brauchst nicht zwangsläufig eine weitere DB. Wenn du das Doc einfach nur flagst, kann es in der DB bleiben und wird nur in einer adminsitrativen View angezeigt.

    Life is not a journey to the grave with the intention of arriving safely in a pretty and well-preserved body, but rather to skid in broadside, thoroughly used up, totally worn out, and loudly proclaiming "Wow, what a ride!!! :evil:
    Beschleunigung ist, wenn die Tränen der Ergriffenheit waagrecht zum Ohr hin abfliessen - Walter Röhrl