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(&gt->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]

Reply via email to