PostgreSQL Source Code  git master
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
filter.h File Reference
#include "lib/stringinfo.h"
Include dependency graph for filter.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  FilterStateData
 

Typedefs

typedef void(* exit_function) (int status)
 

Enumerations

enum  FilterCommandType { FILTER_COMMAND_TYPE_NONE , FILTER_COMMAND_TYPE_INCLUDE , FILTER_COMMAND_TYPE_EXCLUDE }
 
enum  FilterObjectType {
  FILTER_OBJECT_TYPE_NONE , FILTER_OBJECT_TYPE_TABLE_DATA , FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN , FILTER_OBJECT_TYPE_DATABASE ,
  FILTER_OBJECT_TYPE_EXTENSION , FILTER_OBJECT_TYPE_FOREIGN_DATA , FILTER_OBJECT_TYPE_FUNCTION , FILTER_OBJECT_TYPE_INDEX ,
  FILTER_OBJECT_TYPE_SCHEMA , FILTER_OBJECT_TYPE_TABLE , FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN , FILTER_OBJECT_TYPE_TRIGGER
}
 

Functions

const char * filter_object_type_name (FilterObjectType fot)
 
void filter_init (FilterStateData *fstate, const char *filename, exit_function f_exit)
 
void filter_free (FilterStateData *fstate)
 
void pg_log_filter_error (FilterStateData *fstate, const char *fmt,...) pg_attribute_printf(2
 
void bool filter_read_item (FilterStateData *fstate, char **objname, FilterCommandType *comtype, FilterObjectType *objtype)
 

Typedef Documentation

◆ exit_function

typedef void(* exit_function) (int status)

Definition at line 20 of file filter.h.

Enumeration Type Documentation

◆ FilterCommandType

Enumerator
FILTER_COMMAND_TYPE_NONE 
FILTER_COMMAND_TYPE_INCLUDE 
FILTER_COMMAND_TYPE_EXCLUDE 

Definition at line 37 of file filter.h.

38 {
FilterCommandType
Definition: filter.h:38
@ FILTER_COMMAND_TYPE_NONE
Definition: filter.h:39
@ FILTER_COMMAND_TYPE_EXCLUDE
Definition: filter.h:41
@ FILTER_COMMAND_TYPE_INCLUDE
Definition: filter.h:40

◆ FilterObjectType

Enumerator
FILTER_OBJECT_TYPE_NONE 
FILTER_OBJECT_TYPE_TABLE_DATA 
FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN 
FILTER_OBJECT_TYPE_DATABASE 
FILTER_OBJECT_TYPE_EXTENSION 
FILTER_OBJECT_TYPE_FOREIGN_DATA 
FILTER_OBJECT_TYPE_FUNCTION 
FILTER_OBJECT_TYPE_INDEX 
FILTER_OBJECT_TYPE_SCHEMA 
FILTER_OBJECT_TYPE_TABLE 
FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN 
FILTER_OBJECT_TYPE_TRIGGER 

Definition at line 47 of file filter.h.

48 {
FilterObjectType
Definition: filter.h:48
@ FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN
Definition: filter.h:51
@ FILTER_OBJECT_TYPE_SCHEMA
Definition: filter.h:57
@ FILTER_OBJECT_TYPE_INDEX
Definition: filter.h:56
@ FILTER_OBJECT_TYPE_TRIGGER
Definition: filter.h:60
@ FILTER_OBJECT_TYPE_FOREIGN_DATA
Definition: filter.h:54
@ FILTER_OBJECT_TYPE_DATABASE
Definition: filter.h:52
@ FILTER_OBJECT_TYPE_FUNCTION
Definition: filter.h:55
@ FILTER_OBJECT_TYPE_TABLE_DATA
Definition: filter.h:50
@ FILTER_OBJECT_TYPE_NONE
Definition: filter.h:49
@ FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN
Definition: filter.h:59
@ FILTER_OBJECT_TYPE_EXTENSION
Definition: filter.h:53
@ FILTER_OBJECT_TYPE_TABLE
Definition: filter.h:58

Function Documentation

◆ filter_free()

void filter_free ( FilterStateData fstate)

Definition at line 60 of file filter.c.

61 {
62  if (!fstate)
63  return;
64 
65  free(fstate->linebuff.data);
66  fstate->linebuff.data = NULL;
67 
68  if (fstate->fp && fstate->fp != stdin)
69  {
70  if (fclose(fstate->fp) != 0)
71  pg_log_error("could not close filter file \"%s\": %m", fstate->filename);
72 
73  fstate->fp = NULL;
74  }
75 }
#define free(a)
Definition: header.h:65
#define pg_log_error(...)
Definition: logging.h:106
StringInfoData linebuff
Definition: filter.h:31
const char * filename
Definition: filter.h:28
FILE * fp
Definition: filter.h:27

References StringInfoData::data, FilterStateData::filename, FilterStateData::fp, free, FilterStateData::linebuff, and pg_log_error.

Referenced by read_dump_filters(), read_dumpall_filters(), and read_restore_filters().

◆ filter_init()

void filter_init ( FilterStateData fstate,
const char *  filename,
exit_function  f_exit 
)

Definition at line 36 of file filter.c.

37 {
38  fstate->filename = filename;
39  fstate->lineno = 0;
40  fstate->exit_nicely = f_exit;
41  initStringInfo(&fstate->linebuff);
42 
43  if (strcmp(filename, "-") != 0)
44  {
45  fstate->fp = fopen(filename, "r");
46  if (!fstate->fp)
47  {
48  pg_log_error("could not open filter file \"%s\": %m", filename);
49  fstate->exit_nicely(1);
50  }
51  }
52  else
53  fstate->fp = stdin;
54 }
static char * filename
Definition: pg_dumpall.c:119
void initStringInfo(StringInfo str)
Definition: stringinfo.c:56
exit_function exit_nicely
Definition: filter.h:29

References FilterStateData::exit_nicely, FilterStateData::filename, filename, FilterStateData::fp, initStringInfo(), FilterStateData::linebuff, FilterStateData::lineno, and pg_log_error.

Referenced by read_dump_filters(), read_dumpall_filters(), and read_restore_filters().

◆ filter_object_type_name()

const char* filter_object_type_name ( FilterObjectType  fot)

Definition at line 82 of file filter.c.

83 {
84  switch (fot)
85  {
87  return "comment or empty line";
89  return "table data";
91  return "table data and children";
93  return "database";
95  return "extension";
97  return "foreign data";
99  return "function";
101  return "index";
103  return "schema";
105  return "table";
107  return "table and children";
109  return "trigger";
110  }
111 
112  /* should never get here */
113  pg_unreachable();
114 }
#define pg_unreachable()
Definition: c.h:311

References FILTER_OBJECT_TYPE_DATABASE, FILTER_OBJECT_TYPE_EXTENSION, FILTER_OBJECT_TYPE_FOREIGN_DATA, FILTER_OBJECT_TYPE_FUNCTION, FILTER_OBJECT_TYPE_INDEX, FILTER_OBJECT_TYPE_NONE, FILTER_OBJECT_TYPE_SCHEMA, FILTER_OBJECT_TYPE_TABLE, FILTER_OBJECT_TYPE_TABLE_AND_CHILDREN, FILTER_OBJECT_TYPE_TABLE_DATA, FILTER_OBJECT_TYPE_TABLE_DATA_AND_CHILDREN, FILTER_OBJECT_TYPE_TRIGGER, and pg_unreachable.

Referenced by read_dump_filters(), read_dumpall_filters(), and read_restore_filters().

◆ filter_read_item()

void bool filter_read_item ( FilterStateData fstate,
char **  objname,
FilterCommandType comtype,
FilterObjectType objtype 
)

Definition at line 389 of file filter.c.

393 {
394  if (pg_get_line_buf(fstate->fp, &fstate->linebuff))
395  {
396  const char *str = fstate->linebuff.data;
397  const char *keyword;
398  int size;
399  PQExpBufferData pattern;
400 
401  fstate->lineno++;
402 
403  /* Skip initial white spaces */
404  while (isspace((unsigned char) *str))
405  str++;
406 
407  /*
408  * Skip empty lines or lines where the first non-whitespace character
409  * is a hash indicating a comment.
410  */
411  if (*str != '\0' && *str != '#')
412  {
413  /*
414  * First we expect sequence of two keywords, {include|exclude}
415  * followed by the object type to operate on.
416  */
417  keyword = filter_get_keyword(&str, &size);
418  if (!keyword)
419  {
420  pg_log_filter_error(fstate,
421  _("no filter command found (expected \"include\" or \"exclude\")"));
422  fstate->exit_nicely(1);
423  }
424 
425  if (is_keyword_str("include", keyword, size))
426  *comtype = FILTER_COMMAND_TYPE_INCLUDE;
427  else if (is_keyword_str("exclude", keyword, size))
428  *comtype = FILTER_COMMAND_TYPE_EXCLUDE;
429  else
430  {
431  pg_log_filter_error(fstate,
432  _("invalid filter command (expected \"include\" or \"exclude\")"));
433  fstate->exit_nicely(1);
434  }
435 
436  keyword = filter_get_keyword(&str, &size);
437  if (!keyword)
438  {
439  pg_log_filter_error(fstate, _("missing filter object type"));
440  fstate->exit_nicely(1);
441  }
442 
443  if (!get_object_type(keyword, size, objtype))
444  {
445  pg_log_filter_error(fstate,
446  _("unsupported filter object type: \"%.*s\""), size, keyword);
447  fstate->exit_nicely(1);
448  }
449 
450  initPQExpBuffer(&pattern);
451 
452  str = read_pattern(fstate, str, &pattern);
453  *objname = pattern.data;
454  }
455  else
456  {
457  *objname = NULL;
458  *comtype = FILTER_COMMAND_TYPE_NONE;
459  *objtype = FILTER_OBJECT_TYPE_NONE;
460  }
461 
462  return true;
463  }
464 
465  if (ferror(fstate->fp))
466  {
467  pg_log_error("could not read from filter file \"%s\": %m", fstate->filename);
468  fstate->exit_nicely(1);
469  }
470 
471  return false;
472 }
#define _(x)
Definition: elog.c:90
static bool get_object_type(const char *keyword, int size, FilterObjectType *objtype)
Definition: filter.c:122
#define is_keyword_str(cstr, str, bytes)
Definition: filter.c:22
void pg_log_filter_error(FilterStateData *fstate, const char *fmt,...)
Definition: filter.c:154
static const char * filter_get_keyword(const char **line, int *size)
Definition: filter.c:180
static const char * read_pattern(FilterStateData *fstate, const char *str, PQExpBuffer pattern)
Definition: filter.c:299
const char * str
bool pg_get_line_buf(FILE *stream, StringInfo buf)
Definition: pg_get_line.c:95
void initPQExpBuffer(PQExpBuffer str)
Definition: pqexpbuffer.c:90
static pg_noinline void Size size
Definition: slab.c:607

References _, StringInfoData::data, PQExpBufferData::data, FilterStateData::exit_nicely, FilterStateData::filename, FILTER_COMMAND_TYPE_EXCLUDE, FILTER_COMMAND_TYPE_INCLUDE, FILTER_COMMAND_TYPE_NONE, filter_get_keyword(), FILTER_OBJECT_TYPE_NONE, FilterStateData::fp, get_object_type(), initPQExpBuffer(), is_keyword_str, FilterStateData::linebuff, FilterStateData::lineno, pg_get_line_buf(), pg_log_error, pg_log_filter_error(), read_pattern(), size, and str.

Referenced by read_dump_filters(), read_dumpall_filters(), and read_restore_filters().

◆ pg_log_filter_error()

void pg_log_filter_error ( FilterStateData fstate,
const char *  fmt,
  ... 
)