pgLab/pglablib/catalog/PgTrigger.cpp
eelke f0c1035378 Reorganize files in pglablib
The enitities and containers of the catalog now go into catalog subfolder
Models go into model
2018-12-16 11:31:33 +01:00

156 lines
3.5 KiB
C++

#include "PgTrigger.h"
#include "PgClassContainer.h"
#include "PgDatabaseCatalog.h"
#include "PgProcContainer.h"
#include "SqlFormattingUtils.h"
#include <QStringBuilder>
QString PgTrigger::dropSql()
{
if (m_dropSql.isEmpty()) {
auto&& fqtablename = catalog().classes()->getByKey(relid)->fullyQualifiedQuotedObjectName(); // genFQTableName(catalog(), *catalog().classes()->getByKey(relid));
m_dropSql = "DROP TRIGGER " % quotedObjectName()
% " ON " % fqtablename % ";";
}
return m_dropSql;
}
QString PgTrigger::createSql()
{
if (m_createSql.isEmpty()) {
auto&& fqtablename = catalog().classes()->getByKey(relid)->fullyQualifiedQuotedObjectName(); //genFQTableName(catalog(), *catalog().classes()->getByKey(relid));
auto&& triggername = quotedObjectName();
if (constraint != InvalidOid)
m_createSql += "CREATE CONSTRAINT TRIGGER ";
else
m_createSql += "CREATE TRIGGER ";
m_createSql += triggername + "\n "
+ typeFireWhen()
+ " " + event();
m_createSql += "\n ON " + fqtablename;
if (deferrable) {
m_createSql += "\n DEFERRABLE INITIALLY ";
if (initdeferred)
m_createSql += "DEFERRED";
else
m_createSql += "IMMEDIATE";
}
m_createSql += "\n FOR EACH " + forEach();
// requires atleast 8.5 don;t think we have to support older
if (!whenclause.isEmpty())
m_createSql += "\n WHEN (" + whenclause + ")";
m_createSql += QString("\n EXECUTE PROCEDURE %1;\n").arg(procedure());
if (!enabled)
m_createSql += QString("ALTER TABLE %1 DISABLE TRIGGER %2;\n").arg(fqtablename, triggername);
// if (!GetComment().IsEmpty())
// sql += wxT("COMMENT ON TRIGGER ") + GetQuotedIdentifier() + wxT(" ON ") + GetQuotedFullTable()
// + wxT(" IS ") + qtDbString(GetComment()) + wxT(";\n");
}
return m_createSql;
}
QString PgTrigger::typeFireWhen() const
{
QString when;
if (type & TriggerTypeBefore)
when = "BEFORE";
else if (type & TriggerTypeInstead)
when = "INSTEAD OF";
else
when = "AFTER";
return when;
}
QString PgTrigger::eventAbbr() const
{
QString event;
if (type & TriggerTypeInsert)
event += "I";
if (type & TriggerTypeUpdate)
event += "U";
if (type & TriggerTypeDelete)
event += "D";
if (type & TriggerTypeTruncate)
event += "T";
return event;
}
QString PgTrigger::event() const
{
QString event;
if (type & TriggerTypeInsert)
event += "INSERT ";
if (type & TriggerTypeUpdate)
event += "UPDATE ";
if (type & TriggerTypeDelete)
event += "DELETE ";
if (type & TriggerTypeTruncate)
event += "TRUNCATE";
return event.trimmed();
}
QString PgTrigger::forEach() const
{
if (isRow())
return "ROW";
else
return "STATEMENT";
}
QString PgTrigger::procedure() const
{
const PgProc *proc = catalog().procs()->getByKey(foid);
QString func_name = proc->fullyQualifiedQuotedObjectName();
return QString("%1(%2)").arg(func_name, arguments());
}
QString PgTrigger::arguments() const
{
QString arglist;
if (nargs > 0)
arglist = args;
QString output;
while (!arglist.isEmpty()) {
int pos = arglist.indexOf(QChar::Null);
if (pos != 0) {
QString arg;
if (pos > 0)
arg = arglist.left(pos);
else
arg = arglist;
if (!output.isEmpty())
output += ", ";
bool conversion_ok = false;
arg.toLongLong(&conversion_ok);
if (conversion_ok)
output += arg;
else
output += escapeLiteral(arg);
}
else {
if (!output.isEmpty())
output += ", ";
output += escapeLiteral(QString());
}
if (pos >= 0)
arglist = arglist.mid(pos + 4);
else
break;
}
return output;
}