mirror of https://github.com/citusdata/citus.git
112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* deparse_seclabel_stmts.c
|
|
* All routines to deparse SECURITY LABEL statements.
|
|
*
|
|
* Copyright (c), Citus Data, Inc.
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "catalog/namespace.h"
|
|
#include "nodes/parsenodes.h"
|
|
#include "utils/builtins.h"
|
|
|
|
#include "distributed/deparser.h"
|
|
|
|
static void
|
|
BeginSecLabel(StringInfo buf, SecLabelStmt *stmt)
|
|
{
|
|
initStringInfo(buf);
|
|
appendStringInfoString(buf, "SECURITY LABEL ");
|
|
|
|
if (stmt->provider != NULL)
|
|
{
|
|
appendStringInfo(buf, "FOR %s ", quote_identifier(stmt->provider));
|
|
}
|
|
|
|
appendStringInfoString(buf, "ON ");
|
|
}
|
|
|
|
|
|
static void
|
|
EndSecLabel(StringInfo buf, SecLabelStmt *stmt)
|
|
{
|
|
appendStringInfo(buf, "IS %s", (stmt->label != NULL) ?
|
|
quote_literal_cstr(stmt->label) : "NULL");
|
|
}
|
|
|
|
|
|
/*
|
|
* DeparseRoleSecLabelStmt builds and returns a string representation of the
|
|
* SecLabelStmt for application on a remote server. The SecLabelStmt is for
|
|
* a role object.
|
|
*/
|
|
char *
|
|
DeparseRoleSecLabelStmt(Node *node)
|
|
{
|
|
SecLabelStmt *secLabelStmt = castNode(SecLabelStmt, node);
|
|
char *role_name = strVal(secLabelStmt->object);
|
|
StringInfoData buf = { 0 };
|
|
|
|
BeginSecLabel(&buf, secLabelStmt);
|
|
appendStringInfo(&buf, "ROLE %s ", quote_identifier(role_name));
|
|
EndSecLabel(&buf, secLabelStmt);
|
|
|
|
return buf.data;
|
|
}
|
|
|
|
|
|
/*
|
|
* DeparseTableSecLabelStmt builds and returns a string representation of the
|
|
* SecLabelStmt for application on a remote server. The SecLabelStmt is for a
|
|
* table.
|
|
*/
|
|
char *
|
|
DeparseTableSecLabelStmt(Node *node)
|
|
{
|
|
SecLabelStmt *secLabelStmt = castNode(SecLabelStmt, node);
|
|
List *names = (List *) secLabelStmt->object;
|
|
StringInfoData buf = { 0 };
|
|
|
|
BeginSecLabel(&buf, secLabelStmt);
|
|
appendStringInfo(&buf, "TABLE %s", quote_identifier(strVal(linitial(names))));
|
|
if (list_length(names) > 1)
|
|
{
|
|
appendStringInfo(&buf, ".%s", quote_identifier(strVal(lsecond(names))));
|
|
}
|
|
appendStringInfoString(&buf, " ");
|
|
EndSecLabel(&buf, secLabelStmt);
|
|
|
|
return buf.data;
|
|
}
|
|
|
|
|
|
/*
|
|
* DeparseColumnSecLabelStmt builds and returns a string representation of the
|
|
* SecLabelStmt for application on a remote server. The SecLabelStmt is for a
|
|
* column of a distributed table.
|
|
*/
|
|
char *
|
|
DeparseColumnSecLabelStmt(Node *node)
|
|
{
|
|
SecLabelStmt *secLabelStmt = castNode(SecLabelStmt, node);
|
|
List *names = (List *) secLabelStmt->object;
|
|
StringInfoData buf = { 0 };
|
|
|
|
BeginSecLabel(&buf, secLabelStmt);
|
|
appendStringInfo(&buf, "COLUMN %s.%s",
|
|
quote_identifier(strVal(linitial(names))),
|
|
quote_identifier(strVal(lsecond(names))));
|
|
if (list_length(names) > 2)
|
|
{
|
|
appendStringInfo(&buf, ".%s", quote_identifier(strVal(lthird(names))));
|
|
}
|
|
appendStringInfoString(&buf, " ");
|
|
EndSecLabel(&buf, secLabelStmt);
|
|
|
|
return buf.data;
|
|
}
|