mirror of https://github.com/citusdata/citus.git
80 lines
1.7 KiB
C
80 lines
1.7 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* deparse_seclabel_stmts.c
|
|
* All routines to deparse SECURITY LABEL statements.
|
|
*
|
|
* Copyright (c), Citus Data, Inc.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "nodes/parsenodes.h"
|
|
#include "utils/builtins.h"
|
|
|
|
#include "distributed/deparser.h"
|
|
|
|
static void AppendSecLabelStmt(StringInfo buf, SecLabelStmt *stmt);
|
|
|
|
/*
|
|
* DeparseSecLabelStmt builds and returns a string representing of the
|
|
* SecLabelStmt for application on a remote server.
|
|
*/
|
|
char *
|
|
DeparseSecLabelStmt(Node *node)
|
|
{
|
|
SecLabelStmt *secLabelStmt = castNode(SecLabelStmt, node);
|
|
StringInfoData buf = { 0 };
|
|
initStringInfo(&buf);
|
|
|
|
AppendSecLabelStmt(&buf, secLabelStmt);
|
|
|
|
return buf.data;
|
|
}
|
|
|
|
|
|
/*
|
|
* AppendSecLabelStmt generates the string representation of the
|
|
* SecLabelStmt and appends it to the buffer.
|
|
*/
|
|
static void
|
|
AppendSecLabelStmt(StringInfo buf, SecLabelStmt *stmt)
|
|
{
|
|
appendStringInfoString(buf, "SECURITY LABEL ");
|
|
|
|
if (stmt->provider != NULL)
|
|
{
|
|
appendStringInfo(buf, "FOR %s ", quote_identifier(stmt->provider));
|
|
}
|
|
|
|
appendStringInfoString(buf, "ON ");
|
|
|
|
switch (stmt->objtype)
|
|
{
|
|
case OBJECT_ROLE:
|
|
{
|
|
appendStringInfo(buf, "ROLE %s ", quote_identifier(strVal(stmt->object)));
|
|
break;
|
|
}
|
|
|
|
/* normally, we shouldn't reach this */
|
|
default:
|
|
{
|
|
ereport(ERROR, (errmsg("unsupported security label statement for"
|
|
" deparsing")));
|
|
}
|
|
}
|
|
|
|
appendStringInfoString(buf, "IS ");
|
|
|
|
if (stmt->label != NULL)
|
|
{
|
|
appendStringInfo(buf, "%s", quote_literal_cstr(stmt->label));
|
|
}
|
|
else
|
|
{
|
|
appendStringInfoString(buf, "NULL");
|
|
}
|
|
}
|