lua-decision: support for table dependencies
authorJanos Kovacs <jankovac503@gmail.com>
Wed, 14 Nov 2012 01:31:19 +0000 (03:31 +0200)
committerJanos Kovacs <jankovac503@gmail.com>
Wed, 14 Nov 2012 01:31:19 +0000 (03:31 +0200)
src/core/lua-decision/mdb.c
src/core/lua-decision/mdb.h

index e7bcd16..fb9ec46 100644 (file)
@@ -50,6 +50,7 @@
 
 #define TABLE_CLASS         MRP_LUA_CLASS(mdb, table)
 #define SELECT_CLASS        MRP_LUA_CLASS(mdb, select)
+#define DEPENDENCY_CLASS    MRP_LUA_CLASS(mdb, dependency)
 
 #define TABLE_ROW_CLASSID   MRP_LUA_CLASSID_ROOT "table_row"
 #define SELECT_ROW_CLASSID  MRP_LUA_CLASSID_ROOT "select_row"
@@ -97,6 +98,10 @@ struct mrp_lua_mdb_select_s {
     size_t nrow;
 };
 
+struct mrp_lua_mdb_dependency_s {
+    int refcnt;
+};
+
 struct row_s {
     int index;
     void *data;
@@ -107,6 +112,8 @@ struct const_def_s {
     mqi_data_type_t value;
 };
 
+
+
 static int  table_create_from_lua(lua_State *);
 static int  table_getfield(lua_State *);
 static int  table_setfield(lua_State *);
@@ -136,6 +143,10 @@ static int  select_row_setfield(lua_State *);
 static int  select_row_getlength(lua_State *);
 static mrp_lua_mdb_select_t *select_row_check(lua_State *, int, int *);
 
+static int  dependency_getfield(lua_State *);
+static int  dependency_setfield(lua_State *);
+static void dependency_destroy(void *);
+
 static bool define_constants(lua_State *);
 
 static field_t field_check(lua_State *, int, const char **);
@@ -170,6 +181,10 @@ MRP_LUA_METHOD_LIST_TABLE (
 );
 
 MRP_LUA_METHOD_LIST_TABLE (
+    dependency_methods,      /* methodlist name */
+);
+
+MRP_LUA_METHOD_LIST_TABLE (
     table_overrides,         /* methodlist name */
     MRP_LUA_OVERRIDE_CALL       (table_create_from_lua)
     MRP_LUA_OVERRIDE_GETFIELD   (table_getfield)
@@ -199,6 +214,12 @@ MRP_LUA_METHOD_LIST_TABLE (
     MRP_LUA_OVERRIDE_GETLENGTH  (select_row_getlength)
 );
 
+MRP_LUA_METHOD_LIST_TABLE (
+    dependency_overrides,    /* methodlist name */
+    MRP_LUA_OVERRIDE_GETFIELD   (dependency_getfield)
+    MRP_LUA_OVERRIDE_SETFIELD   (dependency_setfield)
+);
+
 MRP_LUA_CLASS_DEF (
    mdb,                      /* class name */
    table,                    /* constructor name */
@@ -217,11 +238,20 @@ MRP_LUA_CLASS_DEF (
    select_overrides          /* override methods */
 );
 
+MRP_LUA_CLASS_DEF (
+   mdb,                      /* class name */
+   dependency,               /* constructor name */
+   mrp_lua_mdb_dependency_t, /* userdata type */
+   dependency_destroy,       /* userdata destructor */
+   dependency_methods,       /* class methods */
+   dependency_overrides      /* override methods */
+);
 
 void mrp_lua_create_mdb_class(lua_State *L)
 {
     mrp_lua_create_object_class(L, TABLE_CLASS);
     mrp_lua_create_object_class(L, SELECT_CLASS);
+    mrp_lua_create_object_class(L, DEPENDENCY_CLASS);
 
     table_row_class_create(L);
     select_row_class_create(L);
@@ -311,6 +341,37 @@ const char * mrp_lua_select_name(mrp_lua_mdb_select_t *sel)
     return (sel && sel->name) ? sel->name : "<unknown>";
 }
 
+int mrp_lua_dependency_add(lua_State *L, const char *name)
+{
+    mrp_lua_mdb_dependency_t *dep;
+    int refcnt = 0;
+
+    MRP_LUA_ENTER;
+
+    if (name) {
+        mrp_lua_find_object(L, DEPENDENCY_CLASS, name);
+
+        if (lua_isnil(L, -1)) {
+            lua_pop(L, 1);
+
+            if ((dep = mrp_lua_create_object(L, DEPENDENCY_CLASS, name)))
+                refcnt = dep->refcnt = 1;
+            else
+                luaL_error(L, "failed to create MDB dependency '%s'", name);
+        }
+        else {
+            if ((dep = mrp_lua_to_object(L, DEPENDENCY_CLASS, -1)))
+                refcnt = ++(dep->refcnt);
+            else
+                luaL_error(L, "MDB dependency '%s' has invalid type", name);
+        }
+
+        lua_pop(L, 1);
+    }
+
+    MRP_LUA_LEAVE(refcnt);
+}
+
 static int table_create_from_lua(lua_State *L)
 {
     mrp_lua_mdb_table_t *tbl;
@@ -829,21 +890,26 @@ static void select_install(lua_State *L, mrp_lua_mdb_select_t *sel)
 
 
     if (!mrp_resolver_add_prepared_target(ctx->r, target, &depends, 1,
-                                          &select_updater, NULL, sel)) {
+                                          &select_updater, NULL, sel))
+    {
         printf("Failed to install resolver target for element '%s'.\n",
                sel->name);
     }
 
-    snprintf(fact, sizeof(fact), "$%s", sel->table_name);
+    if (mrp_lua_dependency_add(L, table+1) == 1) {
 
-    table_depends = fact;
-    if (!mrp_resolver_add_prepared_target(ctx->r, table, &table_depends, 1,
-                                          NULL, NULL, NULL)) {
-        printf("Failed to install table fact dependency for table '%s'.\n",
-               sel->table_name);
-    }
+        snprintf(fact, sizeof(fact), "$%s", sel->table_name);
+        table_depends = fact;
 
-    printf("\n%s: %s\n\tupdate(%s)\n", table, table_depends, sel->name);
+        if (!mrp_resolver_add_prepared_target(ctx->r, table, &table_depends, 1,
+                                              NULL, NULL, NULL))
+        {
+            printf("Failed to install table fact dependency for table '%s'.\n",
+                   sel->table_name);
+        }
+
+        printf("\n%s: %s\n\tupdate(%s)\n", table, table_depends, sel->name);
+    }
 
     MRP_LUA_LEAVE_NOARG;
 }
@@ -979,6 +1045,33 @@ static mrp_lua_mdb_select_t *select_row_check(lua_State *L,
     return (mrp_lua_mdb_select_t *)row->data;
 }
 
+static int dependency_getfield(lua_State *L)
+{
+    MRP_LUA_ENTER;
+
+    luaL_error(L, "dependencies have no fields");
+
+    MRP_LUA_LEAVE(0);
+}
+
+static int dependency_setfield(lua_State *L)
+{
+    MRP_LUA_ENTER;
+
+    luaL_error(L, "dependencies are read-only");
+
+    MRP_LUA_LEAVE(0);
+}
+
+static void dependency_destroy(void *data)
+{
+    /* mrp_lua_mdb_dependency_t *sel = (mrp_lua_mdb_dependency_t *)data; */
+
+    MRP_LUA_ENTER;
+
+    MRP_LUA_LEAVE_NOARG;
+}
+
 static bool define_constants(lua_State *L)
 {
     static const_def_t const_defs[] = {
index ee9fe19..6c7adbb 100644 (file)
@@ -32,9 +32,9 @@
 
 #include <murphy-db/mqi.h>
 
-typedef struct mrp_lua_mdb_table_s   mrp_lua_mdb_table_t;
-typedef struct mrp_lua_mdb_select_s  mrp_lua_mdb_select_t;
-
+typedef struct mrp_lua_mdb_table_s        mrp_lua_mdb_table_t;
+typedef struct mrp_lua_mdb_select_s       mrp_lua_mdb_select_t;
+typedef struct mrp_lua_mdb_dependency_s   mrp_lua_mdb_dependency_t;
 
 void mrp_lua_create_mdb_class(lua_State *L);
 mrp_lua_mdb_table_t *mrp_lua_create_builtin_table(lua_State *L,
@@ -49,6 +49,8 @@ mrp_lua_mdb_select_t *mrp_lua_to_select(lua_State *L, int idx);
 int mrp_lua_push_select(lua_State *L,mrp_lua_mdb_select_t *sel,bool singleval);
 const char * mrp_lua_select_name(mrp_lua_mdb_select_t *sel);
 
+int mrp_lua_dependency_add(lua_State *L, const char *name);
+
 
 #endif  /* __MURPHY_LUA_MDB_H__ */