db: added triggers for cleanup of methods, mechanisms and secctx tables
authorImran Zaman <imran.zaman@linux.intel.com>
Tue, 28 May 2013 12:10:51 +0000 (15:10 +0300)
committerImran Zaman <imran.zaman@linux.intel.com>
Wed, 29 May 2013 10:16:35 +0000 (13:16 +0300)
src/daemon/db/gsignond-db-metadata-database.c
test/db/dbtest.c

index f51c42a..d5f3cda 100644 (file)
@@ -535,13 +535,36 @@ _gsignond_db_metadata_database_create (
     const gchar *queries = NULL;
     g_return_val_if_fail (GSIGNOND_DB_IS_METADATA_DATABASE (obj), FALSE);
     RETURN_IF_NOT_OPEN (obj, FALSE);
+    gint fk_enabled = 0;
+    gint version = 0;
 
-    if (gsignond_db_sql_database_get_db_version(obj,
-            "PRAGMA user_version;") > 0) {
-        DBG ("Metadata DB is already created");
+    queries = "PRAGMA foreign_keys = 1;";
+    if (!gsignond_db_sql_database_exec (obj, queries)) {
+        DBG ("Metadata DB enabling foreign keys failed");
+        return FALSE;
+    }
+
+    gsignond_db_sql_database_query_exec_int (obj, "PRAGMA foreign_keys;",
+            &fk_enabled);
+    version = gsignond_db_sql_database_get_db_version(obj,
+                "PRAGMA user_version;");
+    if (version > 0) {
+        DBG ("Metadata DB is already created with with version (%d) and "
+                "foreign keys enabled (%d)", version, fk_enabled);
         return TRUE;
     }
 
+    queries = "PRAGMA user_version = 1;";
+    if (!gsignond_db_sql_database_exec (obj, queries)) {
+        DBG ("Metadata DB setting version failed");
+        return FALSE;
+    }
+
+    version = gsignond_db_sql_database_get_db_version(obj,
+            "PRAGMA user_version;");
+    DBG ("Metadata DB is to be created with version (%d) and foreign keys "
+            "enabled(%d)", version, fk_enabled);
+
     queries = ""
             "CREATE TABLE IDENTITY"
             "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
@@ -579,17 +602,17 @@ _gsignond_db_metadata_database_create (
             "identity_id INTEGER CONSTRAINT fk_identity_id REFERENCES "
             "IDENTITY(id) ON DELETE CASCADE,"
             "method_id INTEGER CONSTRAINT fk_method_id REFERENCES "
-            "METHODS(id) ON DELETE CASCADE,"
+            "METHODS(id),"
             "mechanism_id INTEGER CONSTRAINT fk_mechanism_id "
-            "REFERENCES MECHANISMS(id) ON DELETE CASCADE,"
+            "REFERENCES MECHANISMS(id),"
             "secctx_id INTEGER CONSTRAINT fk_secctx_id REFERENCES "
-            "SECCTX(id) ON DELETE CASCADE);"
+            "SECCTX(id));"
 
             "CREATE TABLE REFS"
             "(identity_id INTEGER CONSTRAINT fk_identity_id "
             "REFERENCES IDENTITY(id) ON DELETE CASCADE,"
             "secctx_id INTEGER CONSTRAINT fk_secctx_id REFERENCES "
-            "SECCTX(id) ON DELETE CASCADE,"
+            "SECCTX(id),"
             "ref TEXT,"
             "PRIMARY KEY (identity_id, secctx_id, ref));"
 
@@ -598,7 +621,7 @@ _gsignond_db_metadata_database_create (
             "identity_id INTEGER CONSTRAINT fk_identity_id "
             "REFERENCES IDENTITY(id) ON DELETE CASCADE,"
             "secctx_id INTEGER CONSTRAINT fk_secctx_id REFERENCES SECCTX(id) "
-            "ON DELETE CASCADE);"
+            ");"
 
             // Triggers for deleting orphan SECCTX entries
             "CREATE TRIGGER fkdstale_ACL_secctx_id_SECCTX_id"
@@ -675,13 +698,6 @@ _gsignond_db_metadata_database_create (
             "IDENTITY WHERE id = NEW.identity_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_REALMS_identity_id_IDENTITY_id"
-            "BEFORE DELETE ON [IDENTITY]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM REALMS WHERE REALMS.identity_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_ACL_identity_id_IDENTITY_id"
             "BEFORE INSERT ON [ACL]"
@@ -702,13 +718,6 @@ _gsignond_db_metadata_database_create (
             "IDENTITY WHERE id = NEW.identity_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_ACL_identity_id_IDENTITY_id"
-            "BEFORE DELETE ON [IDENTITY]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM ACL WHERE ACL.identity_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_ACL_method_id_METHODS_id"
             "BEFORE INSERT ON [ACL]"
@@ -729,13 +738,6 @@ _gsignond_db_metadata_database_create (
             "WHERE id = NEW.method_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_ACL_method_id_METHODS_id"
-            "BEFORE DELETE ON [METHODS]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM ACL WHERE ACL.method_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_ACL_mechanism_id_MECHANISMS_id"
             "BEFORE INSERT ON [ACL]"
@@ -756,13 +758,6 @@ _gsignond_db_metadata_database_create (
             "MECHANISMS WHERE id = NEW.mechanism_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_ACL_mechanism_id_MECHANISMS_id"
-            "BEFORE DELETE ON [MECHANISMS]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM ACL WHERE ACL.mechanism_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_ACL_secctx_id_SECCTX_id"
             "BEFORE INSERT ON [ACL]"
@@ -783,13 +778,6 @@ _gsignond_db_metadata_database_create (
             "WHERE id = NEW.secctx_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_ACL_secctx_id_SECCTX_id"
-            "BEFORE DELETE ON [SECCTX]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM ACL WHERE ACL.secctx_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_REFS_identity_id_IDENTITY_id"
             "BEFORE INSERT ON [REFS]"
@@ -810,13 +798,6 @@ _gsignond_db_metadata_database_create (
             "IDENTITY WHERE id = NEW.identity_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_REFS_identity_id_IDENTITY_id"
-            "BEFORE DELETE ON [IDENTITY]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM REFS WHERE REFS.identity_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_REFS_secctx_id_SECCTX_id"
             "BEFORE INSERT ON [REFS]"
@@ -837,13 +818,6 @@ _gsignond_db_metadata_database_create (
             "WHERE id = NEW.secctx_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_REFS_secctx_id_SECCTX_id"
-            "BEFORE DELETE ON [SECCTX]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM REFS WHERE REFS.secctx_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_OWNER_identity_id_IDENTITY_id"
             "BEFORE INSERT ON [OWNER]"
@@ -864,13 +838,6 @@ _gsignond_db_metadata_database_create (
             "IDENTITY WHERE id = NEW.identity_id) IS NULL;"
             "END;"
 
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_OWNER_identity_id_IDENTITY_id"
-            "BEFORE DELETE ON [IDENTITY]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM OWNER WHERE OWNER.identity_id = OLD.id;"
-            "END;"
-
             // Foreign Key Preventing insert
             "CREATE TRIGGER fki_OWNER_secctx_id_SECCTX_id"
             "BEFORE INSERT ON [OWNER]"
@@ -890,15 +857,7 @@ _gsignond_db_metadata_database_create (
             "    WHERE NEW.secctx_id IS NOT NULL AND (SELECT id FROM SECCTX "
             "WHERE id = NEW.secctx_id) IS NULL;"
             "END;"
-
-            // Cascading Delete
-            "CREATE TRIGGER fkdc_OWNER_secctx_id_SECCTX_id"
-            "BEFORE DELETE ON [SECCTX]"
-            "FOR EACH ROW BEGIN"
-            "    DELETE FROM OWNER WHERE OWNER.secctx_id = OLD.id;"
-            "END;"
-
-            "PRAGMA user_version = 1;";
+            ;
 
     return gsignond_db_sql_database_transaction_exec (obj, queries);
 }
index f04e19a..0aab49f 100644 (file)
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <sqlite3.h>
+#include <glib/gstdio.h>
 
 #include "gsignond/gsignond-config.h"
 #include "gsignond/gsignond-log.h"
@@ -146,21 +147,21 @@ _get_filled_identity_info_2 (
                 (GEqualFunc)g_str_equal,
                 (GDestroyNotify)NULL,
                 (GDestroyNotify)g_sequence_free);
-        seq1 = _sequence_new("mech11"); g_sequence_append (seq1, "mech12");
+        seq1 = _sequence_new("mech11"); //g_sequence_append (seq1, "mech12");
         g_hash_table_insert (methods, "method1", seq1);
         g_hash_table_insert (methods, "method2", _sequence_new("mech21"));
-        g_hash_table_insert (methods, "method3", _sequence_new("mech31"));
+        //g_hash_table_insert (methods, "method3", _sequence_new("mech31"));
         gsignond_identity_info_set_methods (identity, methods);
         g_hash_table_unref (methods);
     }
 
     /*acl*/
     ctx1 = gsignond_security_context_new_from_values ("sysctx1", "appctx1");
-    ctx2 = gsignond_security_context_new_from_values ("sysctx2", "appctx2");
-    ctx3 = gsignond_security_context_new_from_values ("sysctx3", "appctx3");
+    //ctx2 = gsignond_security_context_new_from_values ("sysctx2", "appctx2");
+    //ctx3 = gsignond_security_context_new_from_values ("sysctx3", "appctx3");
     ctx_list = g_list_append (ctx_list,ctx1);
-    ctx_list = g_list_append (ctx_list,ctx2);
-    ctx_list = g_list_append (ctx_list,ctx3);
+    //ctx_list = g_list_append (ctx_list,ctx2);
+    //ctx_list = g_list_append (ctx_list,ctx3);
     if (add_acl) {
         gsignond_identity_info_set_access_control_list (identity, ctx_list);
     }
@@ -395,7 +396,7 @@ _gsignond_query_read_string (
     return TRUE;
 }
 
-START_TEST (test_secret_database)
+START_TEST (test_sql_database)
 {
     GSignondDbSecretDatabase *database = NULL;
     GSignondConfig *config = NULL;
@@ -436,11 +437,12 @@ START_TEST (test_secret_database)
 
     config = gsignond_config_new ();
     dir = gsignond_config_get_string (config,
-            GSIGNOND_CONFIG_GENERAL_SECURE_DIR);
+            GSIGNOND_CONFIG_GENERAL_STORAGE_PATH);
     if (!dir) {
         dir = g_get_user_data_dir ();
     }
-    filename = g_build_filename (dir, "secret_test.db", NULL);
+    g_mkdir_with_parents (dir, S_IRWXU);
+    filename = g_build_filename (dir, "sql_db_test.db", NULL);
     fail_unless (gsignond_db_sql_database_open (sqldb, filename,
             SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE) == TRUE);
     /* don't open the db again if its already open */
@@ -605,6 +607,7 @@ START_TEST (test_secret_storage)
     GHashTable *data = NULL;
     GHashTable *data2 = NULL;
     Data input;
+    const gchar *dir = NULL;
 
     config = gsignond_config_new ();
     /* Secret Storage */
@@ -613,6 +616,13 @@ START_TEST (test_secret_storage)
     g_object_unref(config);
     fail_if (storage == NULL);
 
+    dir = gsignond_config_get_string (config,
+            GSIGNOND_CONFIG_GENERAL_SECURE_DIR);
+    if (!dir) {
+        dir = g_get_user_data_dir ();
+    }
+    g_mkdir_with_parents (dir, S_IRWXU);
+
     fail_unless (gsignond_secret_storage_get_last_error (storage) == NULL);
     fail_unless (gsignond_secret_storage_clear_db (storage) == FALSE);
     fail_unless (gsignond_secret_storage_is_open_db (storage) == FALSE);
@@ -1068,7 +1078,8 @@ Suite* db_suite (void)
 
     TCase *tc_core = tcase_create ("Tests");
     tcase_add_test (tc_core, test_identity_info);
-    tcase_add_test (tc_core, test_secret_database);
+
+    tcase_add_test (tc_core, test_sql_database);
     tcase_add_test (tc_core, test_secret_storage);
     tcase_add_test (tc_core, test_metadata_database);
     tcase_add_test (tc_core, test_credentials_database);