Changeset: ac4b3d77cedb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ac4b3d77cedb
Modified Files:
sql/backends/monet5/sql_scenario.c
sql/storage/store.c
Branch: triggers
Log Message:
wip load none tbl related triggers from sys
diffs (196 lines):
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -51,6 +51,8 @@
#include "opt_mitosis.h"
#include <unistd.h>
#include "sql_upgrades.h"
+#include "rel_semantic.h"
+#include "rel_rel.h"
#define MAX_SQL_MODULES 128
static int sql_modules = 0;
@@ -227,38 +229,81 @@ SQLepilogue(void *ret)
}
-static int
+static str
SQLexecPostLoginTriggers(Client c)
{
- int res = LOG_OK;
- char *err = NULL;
backend *be = (backend *) c->sqlcontext;
if (be) {
mvc *m = be->mvc;
sql_trans *tr = m->session->tr;
int active = tr->active;
if (active || mvc_trans(m) == 0) {
- sqlstore *store = tr->store;
- sql_table *triggers = find_sys_table(tr,
TRIGGERS_TABLE_NAME);
- sql_column *eventCol = find_sql_column(triggers,
"event");
- sql_column *timeCol = find_sql_column(triggers, "time");
- sql_column *stmtCol = find_sql_column(triggers,
"statement");
- int event = LOGIN_EVENT, time = 1;
+ sql_schema *sys = find_sql_schema(tr, "sys");
+ struct os_iter oi;
+ // triggers not related to table should have been
loaded in sys
+ os_iterator(&oi, sys->triggers, tr, NULL);
+ for (sql_base *b = oi_next(&oi); b; b = oi_next(&oi)) {
+ sql_trigger *t = (sql_trigger*) b;
+ if (t->event == LOGIN_EVENT) {
+ const char *stmt = t->statement;
+ sql_rel *r = NULL;
+ sql_allocator *sa = m->sa;
- oid rid = store->table_api.column_find_row(tr,
eventCol, &event, timeCol, &time, NULL);
- if (!is_oid_nil(rid)) {
- const char *stmt =
store->table_api.column_find_value(tr, stmtCol, rid);
- if ((err = SQLstatementIntern(c, stmt,
"sql.init", TRUE, FALSE, NULL))) {
- (void) sql_error(m, 02, SQLSTATE(42000)
"%s", err);
- freeException(err);
- res = LOG_ERR;
+ if (!(m->sa = sa_create(m->pa))) {
+ m->sa = sa;
+ throw(SQL,
"sql.SQLexecPostLoginTriggers", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ }
+ r = rel_parse(m, sys, stmt, m_deps);
+ if (r)
+ r = sql_processrelation(m, r,
0, 0, 0, 0);
+ if (r) {
+ list *blist =
rel_dependencies(m, r);
+ if (mvc_create_dependencies(m,
blist, t->base.id, TRIGGER_DEPENDENCY)) {
+ sa_destroy(m->sa);
+ m->sa = sa;
+ throw(SQL,
"sql.SQLexecPostLoginTriggers", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ }
+ }
+ sa_destroy(m->sa);
+ m->sa = sa;
+ if (!r) {
+ if (strlen(m->errstr) > 6 &&
m->errstr[5] == '!')
+ throw(SQL,
"sql.SQLexecPostLoginTriggers", "%s", m->errstr);
+ else
+ throw(SQL,
"sql.SQLexecPostLoginTriggers", SQLSTATE(42000) "%s", m->errstr);
+ }
+
+
+
+ //if ((err = SQLstatementIntern(c,
stmt, "sql.SQLexecPostLoginTriggers", TRUE, FALSE, NULL))) {
+ // (void) sql_error(m, 02,
SQLSTATE(42000) "%s", err);
+ // freeException(err);
+ // res = LOG_ERR;
+ // break;
+ //}
}
}
+
+ //sql_table *triggers = find_sys_table(tr,
TRIGGERS_TABLE_NAME);
+ //sql_column *eventCol = find_sql_column(triggers,
"event");
+ //sql_column *timeCol = find_sql_column(triggers,
"time");
+ //sql_column *stmtCol = find_sql_column(triggers,
"statement");
+ //int event = LOGIN_EVENT, time = 1;
+
+ //oid rid = store->table_api.column_find_row(tr,
eventCol, &event, timeCol, &time, NULL);
+ //if (!is_oid_nil(rid)) {
+ // const char *stmt =
store->table_api.column_find_value(tr, stmtCol, rid);
+ // if ((err = SQLstatementIntern(c, stmt,
"sql.init", TRUE, FALSE, NULL))) {
+ // (void) sql_error(m, 02, SQLSTATE(42000)
"%s", err);
+ // freeException(err);
+ // res = LOG_ERR;
+ // }
+ //}
if (!active)
sql_trans_end(m->session, SQL_OK);
}
}
- return res;
+ return MAL_SUCCEED;
}
static str
@@ -790,7 +835,7 @@ SQLinitClient(Client c, str passwd, str
throw(SQL, "SQLinitClient", SQLSTATE(42000) "Catalogue not
available");
}
if ((msg = SQLprepareClient(c, passwd, challenge, algo)) ==
MAL_SUCCEED) {
- if (c->usermodule && SQLexecPostLoginTriggers(c) < 0) {
+ if (c->usermodule && (SQLexecPostLoginTriggers(c) !=
MAL_SUCCEED)) {
throw(SQL, "SQLinitClient", SQLSTATE(42000) "Failed to
execute post login triggers");
}
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -5895,7 +5895,7 @@ sql_trans_drop_table(sql_trans *tr, sql_
return res;
t->base.deleted = 1;
-
+
if (gt && (res = os_del(s->tables, tr, gt->base.name,
dup_base(>->base))))
return res;
if (t != gt && (res =os_del(tr->localtmps, tr, t->base.name,
dup_base(&t->base))))
@@ -6725,8 +6725,8 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
return res;
}
-int
-sql_trans_create_trigger(sql_trigger **tres, sql_trans *tr, sql_table *t,
const char *name,
+static int
+sql_trans_create_table_trigger(sql_trigger **tres, sql_trans *tr, sql_table
*t, const char *name,
sht time, sht orientation, sht event, const char *old_name, const char
*new_name,
const char *condition, const char *statement )
{
@@ -6774,6 +6774,52 @@ sql_trans_create_trigger(sql_trigger **t
}
int
+sql_trans_create_trigger(sql_trigger **tres, sql_trans *tr, sql_table *t,
const char *name,
+ sht time, sht orientation, sht event, const char *old_name, const char
*new_name,
+ const char *condition, const char *statement )
+{
+ if (t)
+ return sql_trans_create_table_trigger(
+ tres, tr, t, name, time,
+ orientation, event, old_name,
+ new_name, condition, statement);
+
+ // triggers not bound to objects (e.g. table)
+
+ sqlstore *store = tr->store;
+ sql_schema *syss = find_sql_schema(tr, "sys");
+ sql_table *systrigger = find_sql_table(tr, syss, "triggers");
+ char *strnil = (char*)ATOMnilptr(TYPE_str);
+ int res = LOG_OK;
+
+ assert(name);
+
+ sql_trigger *nt = ZNEW(sql_trigger);
+ base_init(NULL, &nt->base, next_oid(tr->store), true, name);
+ nt->time = time;
+ nt->orientation = orientation;
+ nt->event = event;
+ nt->old_name = nt->new_name = nt->condition = NULL;
+ if (old_name)
+ nt->old_name =_STRDUP(old_name);
+ if (new_name)
+ nt->new_name =_STRDUP(new_name);
+ if (condition)
+ nt->condition =_STRDUP(condition);
+ nt->statement =_STRDUP(statement);
+ if ((res = os_add(syss->triggers, tr, nt->base.name,
dup_base(&nt->base))))
+ return res;
+ oid tid = oid_nil;
+
+ if ((res = store->table_api.table_insert(tr, systrigger, &nt->base.id,
&nt->base.name, &tid, &nt->time, &nt->orientation,
+ &nt->event,
(nt->old_name)?&nt->old_name:&strnil, (nt->new_name)?&nt->new_name:&strnil,
+
(nt->condition)?&nt->condition:&strnil, &nt->statement)))
+ return res;
+ *tres = nt;
+ return res;
+}
+
+int
sql_trans_drop_trigger(sql_trans *tr, sql_schema *s, sqlid id, int drop_action)
{
sqlstore *store = tr->store;
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]