You are here

function hosting_client_update_6000 in Hostmaster (Aegir) 6

Cleanup the hosting_client fields

This rewrites the client node title based on the organization, name or email field (in that order).

It also populates the new, unique, uname field in the hosting_client table.

Note that this request will fail if you have more than 100 clients with the same title.

https://drupal.org/node/962330 https://drupal.org/node/461840

File

modules/hosting/client/hosting_client.install, line 230
Install, update and uninstall for the clients module.

Code

function hosting_client_update_6000() {
  $ret = array();
  db_add_field($ret, 'hosting_client', 'uname', array(
    'type' => 'varchar',
    'length' => 255,
    'not null' => TRUE,
    'default' => '',
  ));

  // populate the unique uname field
  $result = db_query("SELECT n.nid,n.vid,n.title,hc.organization,hc.name,hc.email FROM {node} n JOIN {hosting_client} hc ON hc.nid = n.nid WHERE n.type = 'client'");
  while ($client = db_fetch_object($result)) {

    // try to find a proper name for the client
    if ($client->organization) {

      // we arbitrarily choose the organisation as the base parameter
      $name = $client->organization;
    }
    elseif ($client->name) {

      // fallback on the name of the "contact"
      $name = $client->name;
    }
    else {

      // fallback - use the email
      $name = $client->email;
    }
    $unique = preg_replace("/[!\\W\\.\\-]/", "", $name);
    $failed_client = FALSE;
    $newname = $name;
    for ($i = ''; $i < 100; $i++) {
      if ($nid = db_result(db_query("SELECT nid FROM {hosting_client} WHERE uname = '%s'", $unique))) {
        drupal_set_message("nid {$nid} dupes this client ({$client->nid}) unique: {$unique}");
      }
      else {
        drupal_set_message("setting client {$name} to " . $newname . " ({$unique})");
        db_query("UPDATE {hosting_client} SET uname = '%s' WHERE nid = %d AND vid = %d", $unique, $client->nid, $client->vid);
        db_query("UPDATE {node} SET title = '%s' WHERE nid = %d", $newname, $client->nid);
        db_query("UPDATE {node_revisions} SET title = '%s' WHERE nid = %d AND vid = %d", $name, $client->nid, $client->vid);
        $failed_client = FALSE;
        break;
      }
      $failed_client = $name;
      $unique = hosting_client_sanitize($name) . $i;
      $newname = $name . $i;
    }
    if ($failed_client) {
      $ret['#abort'] = array(
        'success' => FALSE,
        'query' => t('Could not find a unique client name for client @client (nid: @nid)', array(
          '@client' => $failed_client,
          '@nid' => $client->nid,
        )),
      );
      break;
    }
  }
  db_add_unique_key($ret, 'hosting_client', 'uname_unq', array(
    'uname',
  ));
  return $ret;
}