Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  libpq-events.c

  Sprache: C
 

/*-------------------------------------------------------------------------
 *
 * libpq-events.c
 *   functions for supporting the libpq "events" API
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *   src/interfaces/libpq/libpq-events.c
 *
 *-------------------------------------------------------------------------
 */

#include "postgres_fe.h"

#include "libpq-fe.h"
#include "libpq-int.h"


/*
 * Registers an event proc with the given PGconn.
 *
 * The same proc can't be registered more than once in a PGconn.  This
 * restriction is required because we use the proc address to identify
 * the event for purposes such as PQinstanceData().
 *
 * The name argument is used within error messages to aid in debugging.
 * A name must be supplied, but it needn't be unique.  The string is
 * copied, so the passed value needn't be long-lived.
 *
 * The passThrough argument is an application specific pointer and can be set
 * to NULL if not required.  It is passed through to the event proc whenever
 * the event proc is called, and is not otherwise touched by libpq.
 *
 * The function returns a non-zero if successful.  If the function fails,
 * zero is returned.
 */

int
PQregisterEventProc(PGconn *conn, PGEventProc proc,
     const char *name, void *passThrough)
{
 int   i;
 PGEventRegister regevt;

 if (!proc || !conn || !name || !*name)
  return false;   /* bad arguments */

 for (i = 0; i < conn->nEvents; i++)
 {
  if (conn->events[i].proc == proc)
   return false;  /* already registered */
 }

 if (conn->nEvents >= conn->eventArraySize)
 {
  PGEvent    *e;
  int   newSize;

  newSize = conn->eventArraySize ? conn->eventArraySize * 2 : 8;
  if (conn->events)
   e = (PGEvent *) realloc(conn->events, newSize * sizeof(PGEvent));
  else
   e = (PGEvent *) malloc(newSize * sizeof(PGEvent));

  if (!e)
   return false;

  conn->eventArraySize = newSize;
  conn->events = e;
 }

 conn->events[conn->nEvents].proc = proc;
 conn->events[conn->nEvents].name = strdup(name);
 if (!conn->events[conn->nEvents].name)
  return false;
 conn->events[conn->nEvents].passThrough = passThrough;
 conn->events[conn->nEvents].data = NULL;
 conn->events[conn->nEvents].resultInitialized = false;
 conn->nEvents++;

 regevt.conn = conn;
 if (!proc(PGEVT_REGISTER, ®evt, passThrough))
 {
  conn->nEvents--;
  free(conn->events[conn->nEvents].name);
  return false;
 }

 return true;
}

/*
 * Set some "instance data" for an event within a PGconn.
 * Returns nonzero on success, zero on failure.
 */

int
PQsetInstanceData(PGconn *conn, PGEventProc proc, void *data)
{
 int   i;

 if (!conn || !proc)
  return false;

 for (i = 0; i < conn->nEvents; i++)
 {
  if (conn->events[i].proc == proc)
  {
   conn->events[i].data = data;
   return true;
  }
 }

 return false;
}

/*
 * Obtain the "instance data", if any, for the event.
 */

void *
PQinstanceData(const PGconn *conn, PGEventProc proc)
{
 int   i;

 if (!conn || !proc)
  return NULL;

 for (i = 0; i < conn->nEvents; i++)
 {
  if (conn->events[i].proc == proc)
   return conn->events[i].data;
 }

 return NULL;
}

/*
 * Set some "instance data" for an event within a PGresult.
 * Returns nonzero on success, zero on failure.
 */

int
PQresultSetInstanceData(PGresult *result, PGEventProc proc, void *data)
{
 int   i;

 if (!result || !proc)
  return false;

 for (i = 0; i < result->nEvents; i++)
 {
  if (result->events[i].proc == proc)
  {
   result->events[i].data = data;
   return true;
  }
 }

 return false;
}

/*
 * Obtain the "instance data", if any, for the event.
 */

void *
PQresultInstanceData(const PGresult *result, PGEventProc proc)
{
 int   i;

 if (!result || !proc)
  return NULL;

 for (i = 0; i < result->nEvents; i++)
  if (result->events[i].proc == proc)
   return result->events[i].data;

 return NULL;
}

/*
 * Fire RESULTCREATE events for an application-created PGresult.
 *
 * The conn argument can be NULL if event procedures won't use it.
 */

int
PQfireResultCreateEvents(PGconn *conn, PGresult *res)
{
 int   result = true;
 int   i;

 if (!res)
  return false;

 for (i = 0; i < res->nEvents; i++)
 {
  /* It's possible event was already fired, if so don't repeat it */
  if (!res->events[i].resultInitialized)
  {
   PGEventResultCreate evt;

   evt.conn = conn;
   evt.result = res;
   if (res->events[i].proc(PGEVT_RESULTCREATE, &evt,
         res->events[i].passThrough))
    res->events[i].resultInitialized = true;
   else
    result = false;
  }
 }

 return result;
}

Messung V0.5 in Prozent
C=96 H=87 G=91

¤ Dauer der Verarbeitung: 0.18 Sekunden  (vorverarbeitet am  2026-08-06) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=277311
#Domains=752002