Funktionalität eines benutzerdefinierten C-Parsers erweitern

Wenn Sie einen C-Parser erstellt haben, können Sie seine Funktionen erweitern.

Vorbereitungen:
Stellen Sie sicher, dass Sie folgenden Abschnitt gelesen und verstanden haben:

Parser-Funktionen implementieren

Ein Parser muss folgende Implementierungsfunktionstypen implementieren:
  1. Eingabefunktionen
  2. Syntaxanalysefunktionen
  3. Ausgabefunktionen

Eingabefunktionen implementieren

Der Parser muss eine einzige (nicht mehr) der folgenden Eingabefunktionen implementieren:

Der Broker ruft die Eingabefunktion auf, wenn der benutzerdefinierte Parser eine Eingabenachricht parsen muss. Der Parser muss dem Broker mitteilen, welchen Anteil des Eingabebitstrompuffers er für sich reklamiert. Wenn der Header eine feste Größe hat, fordert der Parser die Größe des Headers. Wenn der Parser die gesamte Nachricht verarbeiten soll, reklamiert er den verbleibenden Puffer.

Beispiel:
  1. Der Broker ruft die Eingabefunktion cpiParseBufferEncoded auf:
    int cpiParseBufferEncoded(
      CciParser*      parser,
      CciContext* context,
      int            encoding,
      int         ccsid
    ){
      PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
      int             rc;
  2. Rufen Sie einen Verweis auf den Nachrichtenpuffer ab, und legen Sie mit der Dienstprogrammfunktion cpiBufferPointer die relative Position fest:
      pc->iBuffer = (void *)cpiBufferPointer(&rc, parser);
      pc->iIndex = 0;
  3. Speichern Sie das Format des Puffers:
      pc->iEncoding = encoding;
      pc->iCcsid = ccsid;
  4. Speichern Sie die Größe des Puffers mit der Dienstprogrammfunktion cpiBufferSize:
      pc->iSize = cpiBufferSize(&rc, parser);
  5. Setzen Sie das erste Byte im Datenstrom mit der Dienstprogrammfunktion cpiBufferByte ein:
      pc->iCurrentCharacter = cpiBufferByte(&rc, parser, pc->iIndex);
  6. Setzen Sie das aktuelle Element mit der Dienstprogrammfunktion cpiRootElement auf das Stammelement:
      pc->iCurrentElement = cpiRootElement(&rc, parser);
  7. Setzen Sie das Flag zurück, um sicherzustellen, dass die Syntaxanalyse richtig zurückgesetzt wird:
      pc->iInTag = 0;
  8. Reklamieren Sie den verbleibenden Puffer für sich:
      return(pc->iSize);
    }

Syntaxanalysefunktionen implementieren

Allgemeine Syntaxanalysefunktionen (z. B. cpiParseFirstChild) werden vom Broker aufgerufen, wenn die Syntaxelement-Baumstruktur erstellt werden muss, damit ein ESQL- oder Java-Ausdruck ausgewertet werden kann. Ein Filter-Knoten verwendet z. B. einen ESQL-Feldverweis in einem ESQL-Ausdruck. Dieser Feldverweis muss aufgelöst werden, damit der Ausdruck ausgewertet werden kann. Die allgemeine Syntaxanalysefunktion Ihres Parsers wird möglicherweise wiederholt aufgerufen, bis das angeforderte Element erstellt wird oder vom Parser erkannt wird, dass es nicht vorhanden ist.

Beispiel:
void cpiParseFirstChild(
  CciParser*      parser,
  CciContext* context,
  CciElement* element
){
  PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
  int             rc;

  if ((!cpiElementCompleteNext(&rc, element)) &&
      (cpiElementType(&rc, element) == CCI_ELEMENT_TYPE_NAME)) {

    while ((!cpiElementCompleteNext(&rc, element))     &&
           (!cpiFirstChild(&rc, element)) &&
           (pc->iCurrentElement))
    {
      pc->iCurrentElement = parseNextItem(parser, context, pc->iCurrentElement);
    }
  }
  return;
}

Ausgabefunktionen implementieren

Der Parser muss eine einzige (nicht mehr) der folgenden Ausgabefunktionen implementieren:

Der Broker ruft die Ausgabefunktion auf, wenn der benutzerdefinierte Parser eine Syntaxelement-Baumstruktur für einen Ausgabebitstrom serialisieren muss. Beispielsweise kann ein Compute-Knoten eine Baumstruktur in der Domäne Ihres benutzerdefinierten Parsers erstellt haben. Wenn diese Baumstruktur von einem Knoten, z. B. von einem MQOutput-Knoten, serialisiert werden muss, muss der Parser zum Ausgabebitstrompuffer Daten hinzufügen, die die erstellte Baumstruktur darstellen.

Beispiel:
int cpiWriteBufferEncoded(
  CciParser*      parser,
  CciContext* context,
  int            encoding,
  int         ccsid
){
  PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
  int                initialSize = 0;
  int                rc = 0;
  const void* a;
  CciByte b;

  initialSize = cpiBufferSize(&rc, parser);
  a = cpiBufferPointer(&rc, parser);
  b = cpiBufferByte(&rc, parser, 0);

  cpiAppendToBuffer(&rc, parser, (char *)"Some test data", 14);

  return cpiBufferSize(0, parser) - initialSize;
}

Nachrichtenheaderparser implementieren

Normalerweise haben die eingehenden Nachrichtendaten nur ein Nachrichtenformat, so dass ein Parser für die Syntaxanalyse des gesamten Inhalts der Nachricht zuständig ist. Der Klassenname des Parsers, der benötigt wird, ist im Feld Format im MQMD- oder MQRFH2-Header der Eingabenachricht definiert.

Die Nachricht besteht jedoch möglicherweise aus mehreren Formaten, z. B. wenn ein Header in einem Format und die nachfolgenden Daten in einem anderen Format vorliegen. In diesem Fall muss der erste Parser den Klassennamen des Parsers identifizieren, der für das nächste Format in der Kette zuständig ist usw. In einem benutzerdefinierten Parser wird die Implementierungsfunktion cpiNextParserClassName von dem Broker aufgerufen, wenn er für eine Nachricht, die aus mehreren Nachrichtenformaten besteht, durch eine Kette von Parser-Klassen navigiert.

Wenn Ihr benutzerdefinierter Parser die Syntaxanalyse eines Nachrichtenformats unterstützt, das Teil einer Nachricht mit mehreren Nachrichtenformaten ist, muss der benutzerdefinierte Parser die Funktion cpiNextParserClassName implementieren.

Beispiel:
  1. Rufen Sie die Funktion cpiNextParserClassName auf:
    void cpiNextParserClassName(
      CciParser*      parser,
      CciContext* context,
      CciChar*    buffer,
      int         size
    ){
      PARSER_CONTEXT_ST* pc = (PARSER_CONTEXT_ST *)context ;
      int                rc = 0;
  2. Kopieren Sie den Namen der nächsten Parser-Klasse in den Broker:
      CciCharNCpy(buffer, pc->iNextParserClassName, size);
    
      return;
    }
Zugehörige Verweise
Benutzerdefinierte C-Parser-API
Bemerkungen | Marken | Downloads | Bibliothek | Unterstützung | Feedback

Copyright IBM Corporation 1999, 2009Copyright IBM Corporation 1999, 2009.
Letzte Aktualisierung : 2009-02-17 15:30:03

as24980_