? nodefamily_update_relations.patch
Index: nodefamily.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodefamily/nodefamily.install,v
retrieving revision 1.4.2.1
diff -u -r1.4.2.1 nodefamily.install
--- nodefamily.install	3 Feb 2007 17:01:06 -0000	1.4.2.1
+++ nodefamily.install	5 Feb 2007 19:08:57 -0000
@@ -25,8 +25,11 @@
 function nodefamily_uninstall() {
   include_once('nodefamily.module');
 
+  // relations
+  variable_del('nodefamily_relations');
   db_query("DROP TABLE {nodefamily}");
 
+  // maximum population
   foreach (node_get_types('names') as $typename) {
     _nodefamily_content_type_del_max($typename);
   }
Index: nodefamily.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodefamily/nodefamily.module,v
retrieving revision 1.19.2.3
diff -u -r1.19.2.3 nodefamily.module
--- nodefamily.module	3 Feb 2007 17:16:58 -0000	1.19.2.3
+++ nodefamily.module	5 Feb 2007 19:08:57 -0000
@@ -306,20 +306,33 @@
 
 /**
  * Implementation of hook_node_type():
- * Rename or delete the maximum population variable if a type name changes.
+ * If a content type changes, rename or delete the concerned relations
+ * and the maximum population variable.
  */
 function nodefamily_node_type($op, $info) {
   switch ($op){
     case 'delete':
-      _nodefamily_content_type_del_max($info->type);
+      _nodefamily_content_type_del_max($info->type); // maximum population
+      nodefamily_ct_relation_remove_all($info->type); // relations
       break;
     case 'update':
       if (!empty($info->old_type) && $info->old_type != $info->type) {
+        // maximum population
         $type_max_population = variable_get('nodefamily_max_'. $info->old_type, -1);
         if ($type_max_population != -1) {
           _nodefamily_content_type_del_max($info->old_type);
           nodefamily_content_type_set_max($info->type, $type_max_population);
         }
+
+        // relations
+        foreach (nodefamily_get_parent_types($info->old_type) as $parent_typename) {
+          nodefamily_ct_relation_remove($parent_typename, $info->old_type);
+          nodefamily_ct_relation_add($parent_typename, $info->type);
+        }
+        foreach (nodefamily_get_child_types($info->old_type) as $child_typename) {
+          nodefamily_ct_relation_remove($info->old_type, $child_typename);
+          nodefamily_ct_relation_add($info->type, $child_typename);
+        }
       }
       break;
   }
@@ -336,17 +349,17 @@
  */
 function nodefamily_ct_relation_add($parent_typename, $child_typename) {
 
-  $relations = variable_get('nodefamily_relations',array());
-  
+  $relations = variable_get('nodefamily_relations', array());
+
   if (array_key_exists($parent_typename, $relations)) {
       $relations[$parent_typename][$child_typename] = array();
   }
   else {
     $relations[$parent_typename] = array($child_typename => array());
   }
-  variable_set('nodefamily_relations', $relations);    
-  
-  //add node-node relations
+  variable_set('nodefamily_relations', $relations);
+
+  // add node-node relations
   nodefamily_relation_add_by_type($parent_typename, $child_typename);
 }
 
@@ -355,15 +368,15 @@
  */
 function nodefamily_ct_relation_remove($parent_typename, $child_typename) {
 
-  $relations = variable_get('nodefamily_relations',array());
-  if ((array_key_exists($parent_typename, $relations))) {
+  $relations = variable_get('nodefamily_relations', array());
+  if (array_key_exists($parent_typename, $relations)) {
     unset($relations[$parent_typename][$child_typename]);
     if (!$relations[$parent_typename]) {
       unset($relations[$parent_typename]);
     }
     variable_set('nodefamily_relations', $relations);
-    
-    //remove existing node relations
+
+    // remove existing node relations
     nodefamily_relation_remove_by_type($parent_typename, $child_typename);
   }
 }
@@ -373,7 +386,19 @@
  */
 function nodefamily_ct_get_relations() {
 
-  return variable_get('nodefamily_relations',array());
+  return variable_get('nodefamily_relations', array());
+}
+
+/**
+ * Remove all relations that involve the given content type.
+ */
+function nodefamily_ct_relation_remove_all($typename) {
+  foreach (nodefamily_get_parent_types($typename) as $parent_typename) {
+    nodefamily_ct_relation_remove($parent_typename, $typename);
+  }
+  foreach (nodefamily_get_child_types($typename) as $child_typename) {
+    nodefamily_ct_relation_remove($typename, $child_typename);
+  }
 }
 
 
@@ -381,23 +406,23 @@
  * Return an array of all parent content types for the given child content type.
  */
 function nodefamily_get_parent_types($typename = NULL) {
-  $relations = variable_get('nodefamily_relations',array());
-  
-  $parents = array();
-  foreach($relations as $parent => $children) {
+  $relations = variable_get('nodefamily_relations', array());
+
+  $parent_typenames = array();
+  foreach($relations as $parent_typename => $children) {
     if ($typename == NULL || in_array($typename, array_keys($children))) {
-      $parents[] = $parent;
+      $parent_typenames[] = $parent_typename;
     }
   }
-  return $parents;    
+  return $parent_typenames;
 }
 
 /**
  * Return an array of all child content types for the given parent content type.
  */
 function nodefamily_get_child_types($typename = NULL) {
-  $relations = variable_get('nodefamily_relations',array());
-  
+  $relations = variable_get('nodefamily_relations', array());
+
   if ($typename == NULL || array_key_exists($typename, $relations)) {
     return array_keys($relations[$typename]);
   }
@@ -415,7 +440,7 @@
 
   $result = db_query("SELECT nid FROM {node} WHERE uid=%d AND type='%s'",
                      $uid, $parent_typename);
-  
+
   while ($node = db_fetch_object($result)) {
     nodefamily_relation_add($node, $childnode);
   }
@@ -429,7 +454,7 @@
 
   $result = db_query("SELECT nid FROM {node} WHERE uid=%d AND type='%s'",
                      $uid, $child_typename);
-  
+
   while ($node = db_fetch_object($result)) {
     nodefamily_relation_add($parentnode, $node);
   }
