PostgreSQL Source Code git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
extensible.c File Reference
#include "postgres.h"
#include "nodes/extensible.h"
#include "utils/hsearch.h"
Include dependency graph for extensible.c:

Go to the source code of this file.

Data Structures

struct  ExtensibleNodeEntry
 

Functions

static void RegisterExtensibleNodeEntry (HTAB **p_htable, const char *htable_label, const char *extnodename, const void *extnodemethods)
 
void RegisterExtensibleNodeMethods (const ExtensibleNodeMethods *methods)
 
void RegisterCustomScanMethods (const CustomScanMethods *methods)
 
static const void * GetExtensibleNodeEntry (HTAB *htable, const char *extnodename, bool missing_ok)
 
const ExtensibleNodeMethodsGetExtensibleNodeMethods (const char *extnodename, bool missing_ok)
 
const CustomScanMethodsGetCustomScanMethods (const char *CustomName, bool missing_ok)
 

Variables

static HTABextensible_node_methods = NULL
 
static HTABcustom_scan_methods = NULL
 

Function Documentation

◆ GetCustomScanMethods()

const CustomScanMethods * GetCustomScanMethods ( const char *  CustomName,
bool  missing_ok 
)

Definition at line 137 of file extensible.c.

138{
139 return (const CustomScanMethods *)
141 CustomName,
142 missing_ok);
143}
static const void * GetExtensibleNodeEntry(HTAB *htable, const char *extnodename, bool missing_ok)
Definition: extensible.c:100
static HTAB * custom_scan_methods
Definition: extensible.c:27

References custom_scan_methods, and GetExtensibleNodeEntry().

◆ GetExtensibleNodeEntry()

static const void * GetExtensibleNodeEntry ( HTAB htable,
const char *  extnodename,
bool  missing_ok 
)
static

Definition at line 100 of file extensible.c.

101{
102 ExtensibleNodeEntry *entry = NULL;
103
104 if (htable != NULL)
105 entry = (ExtensibleNodeEntry *) hash_search(htable,
106 extnodename,
107 HASH_FIND, NULL);
108 if (!entry)
109 {
110 if (missing_ok)
111 return NULL;
113 (errcode(ERRCODE_UNDEFINED_OBJECT),
114 errmsg("ExtensibleNodeMethods \"%s\" was not registered",
115 extnodename)));
116 }
117
118 return entry->extnodemethods;
119}
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
Definition: dynahash.c:956
int errcode(int sqlerrcode)
Definition: elog.c:854
int errmsg(const char *fmt,...)
Definition: elog.c:1071
#define ERROR
Definition: elog.h:39
#define ereport(elevel,...)
Definition: elog.h:149
@ HASH_FIND
Definition: hsearch.h:113
const void * extnodemethods
Definition: extensible.c:32

References ereport, errcode(), errmsg(), ERROR, ExtensibleNodeEntry::extnodemethods, HASH_FIND, and hash_search().

Referenced by GetCustomScanMethods(), and GetExtensibleNodeMethods().

◆ GetExtensibleNodeMethods()

const ExtensibleNodeMethods * GetExtensibleNodeMethods ( const char *  extnodename,
bool  missing_ok 
)

Definition at line 125 of file extensible.c.

126{
127 return (const ExtensibleNodeMethods *)
129 extnodename,
130 missing_ok);
131}
static HTAB * extensible_node_methods
Definition: extensible.c:26

References extensible_node_methods, and GetExtensibleNodeEntry().

Referenced by _copyExtensibleNode(), _equalExtensibleNode(), _outExtensibleNode(), and _readExtensibleNode().

◆ RegisterCustomScanMethods()

void RegisterCustomScanMethods ( const CustomScanMethods methods)

Definition at line 88 of file extensible.c.

89{
91 "Custom Scan Methods",
92 methods->CustomName,
93 methods);
94}
static void RegisterExtensibleNodeEntry(HTAB **p_htable, const char *htable_label, const char *extnodename, const void *extnodemethods)
Definition: extensible.c:39
const char * CustomName
Definition: extensible.h:114

References custom_scan_methods, CustomScanMethods::CustomName, and RegisterExtensibleNodeEntry().

◆ RegisterExtensibleNodeEntry()

static void RegisterExtensibleNodeEntry ( HTAB **  p_htable,
const char *  htable_label,
const char *  extnodename,
const void *  extnodemethods 
)
static

Definition at line 39 of file extensible.c.

42{
44 bool found;
45
46 if (*p_htable == NULL)
47 {
49
50 ctl.keysize = EXTNODENAME_MAX_LEN;
51 ctl.entrysize = sizeof(ExtensibleNodeEntry);
52
53 *p_htable = hash_create(htable_label, 100, &ctl,
55 }
56
57 if (strlen(extnodename) >= EXTNODENAME_MAX_LEN)
58 elog(ERROR, "extensible node name is too long");
59
60 entry = (ExtensibleNodeEntry *) hash_search(*p_htable,
61 extnodename,
62 HASH_ENTER, &found);
63 if (found)
66 errmsg("extensible node type \"%s\" already exists",
67 extnodename)));
68
69 entry->extnodemethods = extnodemethods;
70}
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
Definition: dynahash.c:352
#define elog(elevel,...)
Definition: elog.h:225
#define EXTNODENAME_MAX_LEN
Definition: extensible.h:24
#define HASH_STRINGS
Definition: hsearch.h:96
@ HASH_ENTER
Definition: hsearch.h:114
#define HASH_ELEM
Definition: hsearch.h:95
tree ctl
Definition: radixtree.h:1838
#define ERRCODE_DUPLICATE_OBJECT
Definition: streamutil.c:30

References ctl, elog, ereport, errcode(), ERRCODE_DUPLICATE_OBJECT, errmsg(), ERROR, ExtensibleNodeEntry::extnodemethods, EXTNODENAME_MAX_LEN, hash_create(), HASH_ELEM, HASH_ENTER, hash_search(), and HASH_STRINGS.

Referenced by RegisterCustomScanMethods(), and RegisterExtensibleNodeMethods().

◆ RegisterExtensibleNodeMethods()

void RegisterExtensibleNodeMethods ( const ExtensibleNodeMethods methods)

Definition at line 76 of file extensible.c.

77{
79 "Extensible Node Methods",
80 methods->extnodename,
81 methods);
82}
const char * extnodename
Definition: extensible.h:64

References extensible_node_methods, ExtensibleNodeMethods::extnodename, and RegisterExtensibleNodeEntry().

Variable Documentation

◆ custom_scan_methods

HTAB* custom_scan_methods = NULL
static

Definition at line 27 of file extensible.c.

Referenced by GetCustomScanMethods(), and RegisterCustomScanMethods().

◆ extensible_node_methods

HTAB* extensible_node_methods = NULL
static

Definition at line 26 of file extensible.c.

Referenced by GetExtensibleNodeMethods(), and RegisterExtensibleNodeMethods().