Index: user_import.module
===================================================================
--- user_import.module	(revision 747)
+++ user_import.module	(working copy)
@@ -371,11 +371,21 @@
 
   if (is_array($update_user)) {
     
-    $form['update_user'] = array(
+    $form['update_user_fieldset'] = array(
       '#type' => 'fieldset',
       '#title' => t('Update Existing Users'),
       '#collapsible' => TRUE,
       '#collapsed' => TRUE,
+    );
+
+    $form['update_user_fieldset']['update_only'] = array(
+        '#type' => 'checkbox',
+        '#title' => t('Only Update Existing Accounts'),
+        '#default_value' => $import['update_only'],
+        '#description' => t('Select this to skip creating new accounts and only update existing accounts.'),
+    );
+
+    $form['update_user_fieldset']['update_user'] = array(
       '#tree' => TRUE,
     );
 
@@ -385,7 +395,7 @@
       if ($display['exclude_add'] == TRUE) unset($options[UPDATE_ADD]);
       if ($display['exclude_replace'] == TRUE) unset($options[UPDATE_REPLACE]);
          
-      $form['update_user'][$module] = array(
+      $form['update_user_fieldset']['update_user'][$module] = array(
         '#type' => 'radios',
         '#title' => $display['title'],
         '#options' => $options,
@@ -751,7 +761,7 @@
 
       // header labels
       $import_label = ($import['setting'] == 'tested' || $import['setting'] == 'test') ? t('importable') : t('imported');
-      $header = array(t('file'), t('started'), t('processed'), $import_label, t('errors'), t('status'));
+      $header = array(t('file'), t('started'), t('processed'), $import_label, t('skipped'), t('errors'), t('status'));
                   
       // info row
       $errors = db_result(db_query("SELECT COUNT(import_id) FROM {user_import_errors} WHERE import_id = %d", $import['import_id']));         
@@ -762,6 +772,7 @@
           format_date($import['started'], 'small'),
           array("data" => $import['processed'], "align" => 'center'),
           array("data" => $import['valid'], "align" => 'center'),
+          array("data" => $import['skipped'], "align" => 'center'),
           array("data" => $errors_link, "align" => 'center'),
           $import['setting'],
       );
@@ -1200,24 +1211,25 @@
     
     $settings['options']['activate'] = $settings['activate'];
     $settings['options']['subscribed'] = $settings['subscribed'];
+    $settings['options']['update_only'] = $settings['update_only'];
     $settings['options']['update_user'] = $settings['update_user'];
     
     // Update settings for existing import
     if ($settings['import_id']) {
     
         db_query("UPDATE {user_import} 
-            SET name = '%s', filename = '%s', oldfilename = '%s', filepath = '%s', pointer = %d, processed = %d, valid= %d, first_line_skip = %d, contact = %d, username_space = %d, send_email = %d, field_match = '%s', roles = '%s', options = '%s', setting = '%s' 
+            SET name = '%s', filename = '%s', oldfilename = '%s', filepath = '%s', pointer = %d, processed = %d, valid= %d, skipped = %d, first_line_skip = %d, contact = %d, username_space = %d, send_email = %d, field_match = '%s', roles = '%s', options = '%s', setting = '%s' 
             WHERE import_id = %d
-            ", trim($settings['name']), $settings['filename'], $settings['oldfilename'], $settings['filepath'], $settings['pointer'], $settings['processed'], $settings['valid'], $settings['first_line_skip'], $settings['contact'], $settings['username_space'], $settings['send_email'], serialize($settings['field_match']), serialize($settings['roles']), serialize($settings['options']), $settings['setting'], $settings['import_id']);
+            ", trim($settings['name']), $settings['filename'], $settings['oldfilename'], $settings['filepath'], $settings['pointer'], $settings['processed'], $settings['valid'], $settings['skipped'], $settings['first_line_skip'], $settings['contact'], $settings['username_space'], $settings['send_email'], serialize($settings['field_match']), serialize($settings['roles']), serialize($settings['options']), $settings['setting'], $settings['import_id']);
         
         // Save settings for new import
     } 
     else {
     
         db_query("INSERT INTO {user_import} 
-            (name, filename, oldfilename, filepath, started, pointer, processed, valid, first_line_skip, contact, username_space, send_email, field_match, roles, options, setting) 
-            VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s')
-            ", trim($settings['name']), $settings['filename'], $settings['oldfilename'], $settings['filepath'], time(), $settings['pointer'], $settings['processed'], $settings['valid'], $settings['first_line_skip'], $settings['contact'], $settings['username_space'], $settings['send_email'], serialize($settings['field_match']), serialize($settings['roles']), serialize($settings['options']), $settings['setting']);
+            (name, filename, oldfilename, filepath, started, pointer, processed, valid, skipped, first_line_skip, contact, username_space, send_email, field_match, roles, options, setting) 
+            VALUES ('%s', '%s', '%s', '%s', %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s')
+            ", trim($settings['name']), $settings['filename'], $settings['oldfilename'], $settings['filepath'], time(), $settings['pointer'], $settings['processed'], $settings['valid'], $settings['skipped'], $settings['first_line_skip'], $settings['contact'], $settings['username_space'], $settings['send_email'], serialize($settings['field_match']), serialize($settings['roles']), serialize($settings['options']), $settings['setting']);
 
         switch ($GLOBALS['db_type']) {
           case 'mysql':
@@ -1234,10 +1246,10 @@
 }
 
 // Update settings for existing import 
-function _user_import_settings_update($pointer, $processed, $valid, $setting, $import_id) {
+function _user_import_settings_update($pointer, $processed, $valid, $skipped, $setting, $import_id) {
 
   if (empty($import_id)) return;
-  db_query("UPDATE {user_import} SET pointer = %d, processed = %d, valid= %d, setting = '%s' WHERE import_id = %d", $pointer, $processed, $valid, $setting, $import_id);
+  db_query("UPDATE {user_import} SET pointer = %d, processed = %d, valid= %d, skipped = %d, setting = '%s' WHERE import_id = %d", $pointer, $processed, $valid, $skipped, $setting, $import_id);
 }
 
 function _user_import_errors_display_save($import_id, $data, $email, $errors) {
@@ -1341,7 +1353,8 @@
     $line_max = variable_get('user_import_line_max', 1000);
     $import_max = variable_get('user_import_max', 250);
     $field_match = _user_import_unconcatenate_field_match($settings['field_match']);
-    $update_setting = _user_import_update_user_check($settings['options']['update_user']);
+    $update_only_setting = $settings['options']['update_only'];
+    $update_setting = ($update_only_setting || _user_import_update_user_check($settings['options']['update_user']));
     $update_setting_per_module = $settings['options']['update_user'];
     
     ini_set('auto_detect_line_endings', true);
@@ -1401,6 +1414,7 @@
                 $errors = user_import_errors();
                 $account = array();
                 $existing_account = FALSE;
+                $created = FALSE;
                 $updated = FALSE;
  
                 // if we update existing users matched by email (and therefore passed validation even if this email already exists)
@@ -1425,18 +1439,26 @@
                        $account = user_save($existing_account, $account);
                        $updated = TRUE;
                      }
-                     else {
+                     else if (!$update_only_setting) {  
                        // Only set a user name if we are not updating an existing record.
                        $account['name'] = _user_import_create_username($username_order, $username_data, $username_abbreviate, $settings['username_space']);
                        $password = $account['pass'];
                        $account = user_save('', $account);
+                       $created = TRUE;
                      } 
 
-                     module_invoke_all('user_import_after_save', $settings, $account, $password, $fields, $updated, $update_setting_per_module);
-                     $send_counter++; 
+                     if ($created || $updated) {
+                       module_invoke_all('user_import_after_save', $settings, $account, $password, $fields, $updated, $update_setting_per_module);
+                       $send_counter++;
+                     }
                    }
             
-                  $settings['valid']++; 
+                  if ($created || $updated) {
+                    $settings['valid']++; 
+                  }
+                  else {
+                    $settings['skipped']++;
+                  }
                 }
             
                 $settings['processed']++;
@@ -1452,7 +1474,7 @@
     fclose ($handle);
     if ($settings['setting'] == 'import' && !$finished) $settings['setting'] = 'imported';
     if ($settings['setting'] == 'test') $settings['setting'] = 'tested';
-    _user_import_settings_update($settings['pointer'], $settings['processed'], $settings['valid'], $settings['setting'], $settings['import_id']);  
+    _user_import_settings_update($settings['pointer'], $settings['processed'], $settings['valid'], $settings['skipped'], $settings['setting'], $settings['import_id']);  
     return $settings;
 }
 
@@ -1512,6 +1534,7 @@
             $import['pointer'] = 0;
             $import['processed'] = 0;
             $import['valid'] = 0;
+            $import['skipped'] = 0;
             _user_import_errors_display_delete($import['import_id']);
             _user_import_settings_save($import);
             _user_import_process($import);
@@ -1525,6 +1548,7 @@
             $import['pointer'] = 0;
             $import['processed'] = 0;
             $import['valid'] = 0;
+            $import['skipped'] = 0;
             _user_import_settings_save($import);
             break;
             
Index: user_import.install
===================================================================
--- user_import.install	(revision 747)
+++ user_import.install	(working copy)
@@ -85,6 +85,13 @@
         'default' => 0,
         'disp-width' => '10'
       ),
+      'skipped' => array(  
+        'description' => t("Number of non-existant users skipped by an update import."), 
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'disp-width' => '10'
+      ),
       'first_line_skip' => array( 
         'description' => t("Ignore the first line of the CSV file, which are usually field headings."), 
         'type' => 'int',
@@ -223,6 +230,12 @@
   return array();
 }
 
+function user_import_update_6002() {
+  $ret = array();
+  db_add_column($ret, 'user_import', 'skipped', 'int', array('default' => '0'));
+  return $ret;
+}
+
 /**
 * Implementation of hook_uninstall().
 */
