postgresql/src/include/nodes/extensible.h

73 lines
2.5 KiB
C
Raw Normal View History

/*-------------------------------------------------------------------------
*
* extensible.h
* Definitions for extensible node type
*
*
* Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* src/include/nodes/extensible.h
*
*-------------------------------------------------------------------------
*/
#ifndef EXTENSIBLE_H
#define EXTENSIBLE_H
#include "nodes/nodes.h"
#define EXTNODENAME_MAX_LEN 64
/*
* An extensible node is a new type of node defined by an extension. The
* type is always T_ExtensibleNode, while the extnodename identifies the
* specific type of node. extnodename can be looked up to find the
* ExtensibleNodeMethods for this node type.
*/
typedef struct ExtensibleNode
{
NodeTag type;
const char *extnodename; /* identifier of ExtensibleNodeMethods */
} ExtensibleNode;
/*
* node_size is the size of an extensible node of this type in bytes.
*
* nodeCopy is a function which performs a deep copy from oldnode to newnode.
* It does not need to copy type or extnodename, which are copied by the
* core system.
*
* nodeEqual is a function which performs a deep equality comparison between
* a and b and returns true or false accordingly. It does not need to compare
* type or extnodename, which are compared by the core system.
*
* nodeOut is a serialization function for the node type. It should use the
* output conventions typical for outfuncs.c. It does not need to output
* type or extnodename; the core system handles those.
*
* nodeRead is a deserialization function for the node type. It does not need
* to read type or extnodename; the core system handles those. It should fetch
* the next token using pg_strtok() from the current input stream, and then
* reconstruct the private fields according to the manner in readfuncs.c.
*
* All callbacks are mandatory.
*/
typedef struct ExtensibleNodeMethods
{
const char *extnodename;
Size node_size;
void (*nodeCopy)(struct ExtensibleNode *newnode,
const struct ExtensibleNode *oldnode);
bool (*nodeEqual)(const struct ExtensibleNode *a,
const struct ExtensibleNode *b);
void (*nodeOut)(struct StringInfoData *str,
const struct ExtensibleNode *node);
void (*nodeRead)(struct ExtensibleNode *node);
} ExtensibleNodeMethods;
extern void RegisterExtensibleNodeMethods(const ExtensibleNodeMethods *method);
extern const ExtensibleNodeMethods *GetExtensibleNodeMethods(const char *name,
bool missing_ok);
#endif /* EXTENSIBLE_H */