mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-30 01:41:27 +02:00
73 lines
2.5 KiB
C
73 lines
2.5 KiB
C
|
/*-------------------------------------------------------------------------
|
||
|
*
|
||
|
* 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 */
|