Eine aufbereitete Darstellung der Quelle

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

Benutzer

Quelle  expandeddatum.c

  Sprache: C
 

/*-------------------------------------------------------------------------
 *
 * expandeddatum.c
 *   Support functions for "expanded" value representations.
 *
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *   src/backend/utils/adt/expandeddatum.c
 *
 *-------------------------------------------------------------------------
 */

#include "postgres.h"

#include "utils/expandeddatum.h"
#include "utils/memutils.h"

/*
 * DatumGetEOHP
 *
 * Given a Datum that is an expanded-object reference, extract the pointer.
 *
 * This is a bit tedious since the pointer may not be properly aligned;
 * compare VARATT_EXTERNAL_GET_POINTER().
 */

ExpandedObjectHeader *
DatumGetEOHP(Datum d)
{
 varattrib_1b_e *datum = (varattrib_1b_e *) DatumGetPointer(d);
 varatt_expanded ptr;

 Assert(VARATT_IS_EXTERNAL_EXPANDED(datum));
 memcpy(&ptr, VARDATA_EXTERNAL(datum), sizeof(ptr));
 Assert(VARATT_IS_EXPANDED_HEADER(ptr.eohptr));
 return ptr.eohptr;
}

/*
 * EOH_init_header
 *
 * Initialize the common header of an expanded object.
 *
 * The main thing this encapsulates is initializing the TOAST pointers.
 */

void
EOH_init_header(ExpandedObjectHeader *eohptr,
    const ExpandedObjectMethods *methods,
    MemoryContext obj_context)
{
 varatt_expanded ptr;

 eohptr->vl_len_ = EOH_HEADER_MAGIC;
 eohptr->eoh_methods = methods;
 eohptr->eoh_context = obj_context;

 ptr.eohptr = eohptr;

 SET_VARTAG_EXTERNAL(eohptr->eoh_rw_ptr, VARTAG_EXPANDED_RW);
 memcpy(VARDATA_EXTERNAL(eohptr->eoh_rw_ptr), &ptr, sizeof(ptr));

 SET_VARTAG_EXTERNAL(eohptr->eoh_ro_ptr, VARTAG_EXPANDED_RO);
 memcpy(VARDATA_EXTERNAL(eohptr->eoh_ro_ptr), &ptr, sizeof(ptr));
}

/*
 * EOH_get_flat_size
 * EOH_flatten_into
 *
 * Convenience functions for invoking the "methods" of an expanded object.
 */


Size
EOH_get_flat_size(ExpandedObjectHeader *eohptr)
{
 return eohptr->eoh_methods->get_flat_size(eohptr);
}

void
EOH_flatten_into(ExpandedObjectHeader *eohptr,
     void *result, Size allocated_size)
{
 eohptr->eoh_methods->flatten_into(eohptr, result, allocated_size);
}

/*
 * If the Datum represents a R/W expanded object, change it to R/O.
 * Otherwise return the original Datum.
 *
 * Caller must ensure that the datum is a non-null varlena value.  Typically
 * this is invoked via MakeExpandedObjectReadOnly(), which checks that.
 */

Datum
MakeExpandedObjectReadOnlyInternal(Datum d)
{
 ExpandedObjectHeader *eohptr;

 /* Nothing to do if not a read-write expanded-object pointer */
 if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
  return d;

 /* Now safe to extract the object pointer */
 eohptr = DatumGetEOHP(d);

 /* Return the built-in read-only pointer instead of given pointer */
 return EOHPGetRODatum(eohptr);
}

/*
 * Transfer ownership of an expanded object to a new parent memory context.
 * The object must be referenced by a R/W pointer, and what we return is
 * always its "standard" R/W pointer, which is certain to have the same
 * lifespan as the object itself.  (The passed-in pointer might not, and
 * in any case wouldn't provide a unique identifier if it's not that one.)
 */

Datum
TransferExpandedObject(Datum d, MemoryContext new_parent)
{
 ExpandedObjectHeader *eohptr = DatumGetEOHP(d);

 /* Assert caller gave a R/W pointer */
 Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));

 /* Transfer ownership */
 MemoryContextSetParent(eohptr->eoh_context, new_parent);

 /* Return the object's standard read-write pointer */
 return EOHPGetRWDatum(eohptr);
}

/*
 * Delete an expanded object (must be referenced by a R/W pointer).
 */

void
DeleteExpandedObject(Datum d)
{
 ExpandedObjectHeader *eohptr = DatumGetEOHP(d);

 /* Assert caller gave a R/W pointer */
 Assert(VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)));

 /* Kill it */
 MemoryContextDelete(eohptr->eoh_context);
}

Messung V0.5 in Prozent
C=93 H=94 G=93

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

*© 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=141584
#Domains=752002