pgLab/pglablib/catalog/PgServerObject.cpp
eelke c2c01cf431 Generic GRANT/REVOKE generation from ACL's complete.
Moved the owned concept to PgServerObject as it is needed for the generic
acl functionality that is also in PgServerObject.
2018-12-25 14:25:15 +01:00

87 lines
1.8 KiB
C++

#include "PgServerObject.h"
#include "ArrayParser.h"
#include "PgAuthIdContainer.h"
#include "PgDatabaseCatalog.h"
#include "SqlFormattingUtils.h"
#include <QStringBuilder>
void PgServerObject::setOwnerOid(Oid oid)
{
m_ownerOid = oid;
m_owner = catalog().authIds()->getByKey(oid);
}
Oid PgServerObject::ownerOid() const
{
return m_ownerOid;
}
QString PgServerObject::ownerName() const
{
return m_owner->name;
}
const PgAuthId* PgServerObject::owner() const
{
return m_owner;
}
QString PgServerObject::alterOwnerSql(const QString& ident) const
{
return QString("\nALTER %1 OWNER TO %2;").arg(ident, quoteIdent(ownerName()));
}
void PgServerObject::setAcls(boost::optional<AclList> acls)
{
m_acls = std::move(acls);
}
QString PgServerObject::aclString() const
{
QString result;
if (m_acls) {
for (auto&& acl : *m_acls) {
if (result.isEmpty()) result += "{";
else result += ",";
result += acl.singleString();
}
if (!result.isEmpty())
result += "}";
}
return result;
}
QString PgServerObject::grantSql() const
{
// object_type_and_name => TABLE X
// GRANT ??? ON object_type_and_name TO ...
const QString column; ///< \todo should be set when called on a column object
QString all_pattern = aclAllPattern();
if (all_pattern.isEmpty())
return {};
QString grant;
auto grant_on_object = QString("%1 %2").arg(typeName(), fullyQualifiedQuotedObjectName());
if (m_acls) {
for (auto&& acl : *m_acls) {
grant += acl.sql(all_pattern, grant_on_object, column);
}
}
else {
// PUBLIC, no priviliges
grant += PgAcl("=").sql(all_pattern, grant_on_object, column);
// owner no privileges
grant += PgAcl(ownerName() + "=").sql(all_pattern, grant_on_object, column);
}
return grant;
}
QString PgServerObject::aclAllPattern() const
{
return {};
}