Index: user_relationships.install
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships.install,v
retrieving revision 1.2
diff -u -r1.2 user_relationships.install
--- user_relationships.install	9 Sep 2007 07:52:35 -0000	1.2
+++ user_relationships.install	12 Sep 2007 00:39:07 -0000
@@ -11,6 +11,7 @@
           name varchar(255) NOT NULL default '',
           is_oneway tinyint(1) NOT NULL default 0,
           requires_approval tinyint(1) NOT NULL default 0,
+          expire_days smallint unsigned NOT NULL default 0,
           PRIMARY KEY (rtid),
           UNIQUE KEY name (name)
         ) /*!40100 DEFAULT CHARACTER SET utf8*/;
@@ -96,3 +97,31 @@
     drupal_set_message(t('The update of the User Relationships module was unsuccessful.'), 'error');
   }
 }
+
+/**
+ * Update 2: Add expiration of relationship requests
+ */
+function user_relationships_update_2() {
+  $result = FALSE;
+
+  switch ($GLOBALS['db_type']) {
+  case 'mysql':
+  case 'mysqli':
+    $result = db_query("
+      ALTER TABLE {user_relationship_types}
+        ADD expire_days smallint unsigned NOT NULL default 0;
+    ");
+    break;
+
+  default:
+    drupal_set_message(t('Unsupported database.'));
+    break;
+  }
+
+  if ($result) {
+    drupal_set_message(t('User Relationships module updated successfully.'));
+  }
+  else {
+    drupal_set_message(t('The update of the User Relationships module was unsuccessful.'), 'error');
+  }
+}
Index: user_relationships_forms.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_forms.inc,v
retrieving revision 1.4
diff -u -r1.4 user_relationships_forms.inc
--- user_relationships_forms.inc	11 Sep 2007 00:03:42 -0000	1.4
+++ user_relationships_forms.inc	12 Sep 2007 00:39:07 -0000
@@ -72,6 +72,14 @@
     '#description'    => t('Check this if the requestee must approve the relationship'),
     '#weight'         => -9
   );
+  $form['expire_days'] = array(
+    '#title'          => t('Requests for relationships of this type should expire after how many days (0 for never)?'),
+    '#type'           => 'textfield',
+    '#size'           => 4,
+    '#default_value'  => (isset($relationship_type->expire_days) ? $relationship_type->expire_days : 0),
+    '#description'    => t('If a request for this relationship type has been neither approved nor denied within this many days, delete the request.'),
+    '#weight'         => -5,
+  );
   $form['relationship_type'] = array(
     '#type'   => 'value',
     '#value'  => $relationship_type,
Index: user_relationships_actions.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/user_relationships/user_relationships_actions.inc,v
retrieving revision 1.3
diff -u -r1.3 user_relationships_actions.inc
--- user_relationships_actions.inc	6 Sep 2007 19:34:19 -0000	1.3
+++ user_relationships_actions.inc	12 Sep 2007 00:39:08 -0000
@@ -13,6 +13,11 @@
   if (arg(3) == 'add' && db_result(db_query("SELECT name FROM {user_relationship_types} WHERE LOWER(`name`) = LOWER('%s')", $form_values['name']))) {
     form_set_error('name', t('%name has already been used.', array('%name' => $form_values['name'])));
   }
+
+  $expire = $form_values['expire_days'];
+  if (!is_numeric($expire) || (int)$expire != $form_values['expire_days'] || (int)$expire < 0) {
+    form_set_error('expire_days', t('Expiration period must be an integer greater than or equal to 0.'));
+  } 
 }
 
 /***
@@ -38,11 +43,12 @@
   if (arg(3) == 'add') {
     $form_values['rtid'] = db_next_id('{user_relationship_types}_id');
     db_query(
-      "INSERT INTO {user_relationship_types} (rtid, name, is_oneway, requires_approval) VALUES (%d, '%s', %d, %d)", 
+      "INSERT INTO {user_relationship_types} (rtid, name, is_oneway, requires_approval, expire_days) VALUES (%d, '%s', %d, %d, %d)", 
       $form_values['rtid'],
       $form_values['name'],
       $form_values['is_oneway'],
-      $form_values['requires_approval']
+      $form_values['requires_approval'],
+      $form_values['expire_days']
     );
 
     $relationship_type = user_relationships_relationship_type_load(array('rtid' => $form_values['rtid']));
@@ -53,10 +59,11 @@
   }
   else {
     db_query(
-      "UPDATE {user_relationship_types} SET name = '%s', is_oneway = %d, requires_approval = %d WHERE rtid = %d", 
+      "UPDATE {user_relationship_types} SET name = '%s', is_oneway = %d, requires_approval = %d, expire_days = %d WHERE rtid = %d", 
       $form_values['name'], 
       $form_values['is_oneway'], 
       $form_values['requires_approval'], 
+      $form_values['expire_days'],
       $form_values['relationship_type']->rtid
     );
 
@@ -201,3 +208,36 @@
 
   return 'relationships/'. $form_values['viewed_id'];
 }
+
+/**
+ * hook_cron()
+ *
+ * Expire unanswered relationship requests
+ */
+function user_relationships_cron() {
+  if ($GLOBALS['db_type'] != 'mysql' && $GLOBALS['db_type'] != 'mysqli') {
+    return FALSE; // Expire uses MySQL-specific SQL
+  }
+
+  $now = time();
+  $day = 24 * 60 * 60; // number of seconds in a day
+
+  // only expire relationships once a day
+  $last_cron = variable_get('user_relationships_last_expire', 0);
+  if ($last_cron > $now - $day) {
+    return FALSE;
+  }
+
+  // expire relationships
+  $rtypes = user_relationships_relationship_types_load();
+  foreach ($rtypes as $rtype) {
+    if ($rtype->expire_days > 0) {
+      $cutoff = date('Y-m-d H:i:s', $now - ($day * $rtype->expire_days)); // get date in MySQL format
+      db_query("DELETE FROM {user_relationships} WHERE approved=0 AND rtid=%d AND created_at <= '%s'", $rtype->rtid, $cutoff);
+    } // if ($rtype->expire_days > 0)
+  } // foreach ($rtypes as $rtype)
+
+  // remember when we last expired relationships
+  variable_set('user_relationships_last_expire', $now);
+  return TRUE;
+} // user_relationships_cron()
