--- user_import.module.orig 2009-04-28 17:38:16.000000000 +1200 +++ user_import.module 2009-04-28 17:35:37.000000000 +1200 @@ -535,11 +535,11 @@ $form_state['values'] = _user_import_settings_save($form_state['values']); $form_state['values']['save']['update'] = NULL; $form_state['values']['import_template_id'] = NULL; $form_state['values']['save']['name'] = NULL; $form_state['redirect'] = $form_state['values']['return_path']; - _user_import_process($form_state['values']); + _user_import_batch_run($form_state['values']); } function user_import_add_file_form(&$form, $ftp_files = NULL) { $form['browser'] = array( @@ -649,27 +649,88 @@ } function user_import_continue($import_id = NULL) { if (!empty($import_id) && is_numeric($import_id)) { - + $import = _user_import_settings_select($import_id); - _user_import_process($import); + _user_import_batch_run($import); + } + else { + drupal_goto('admin/user/user_import'); } - - drupal_goto('admin/user/user_import'); } function user_import_import($import_id = NULL) { if (!empty($import_id) && is_numeric($import_id)) { - + $import = _user_import_settings_select($import_id); _user_import_initialise_import($import); } - - drupal_goto('admin/user/user_import'); + else { + drupal_goto('admin/user/user_import'); + } +} + +/** + * Imports using Batch API + * + * @param int $import_id + */ +function _user_import_batch_run($import) { + + $batch = array( + 'operations' => array( + array('_user_import_batch_process', array($import)) + ), + 'title' => $import['setting'] == 'test' ? t('Processing user import test') : t('Processing user import'), + 'init_message' => t('Starting import'), + 'error_message' => t('Import failed') + ); + batch_set($batch); + batch_process('admin/user/user_import'); + +} + +/** + * Callback for batch processing. Ensures the import is property initialised, + * then starts (or continues) the import in batches of 100 users + * + */ +function _user_import_batch_process($import, &$context) { + + if (!isset($context['sandbox']['import'])) { + $context['sandbox']['import'] = $import; + $context['sandbox']['file_bytes'] = filesize($import['filepath']); + } + else { + $import = $context['sandbox']['import']; + } + + if (in_array($import['setting'], array('import', 'test'))) { + $import = _user_import_process($import, 100); + } + if (in_array($import['setting'], array('imported', 'tested'))) { + // finished + $context['finished'] = 1; + } + else { + // use our byte position in the file to show progress + if ($context['sandbox']['file_bytes']) { + $context['finished'] = min(array(0.99, ($import['pointer'] / ($context['sandbox']['file_bytes'])))); + } + else { + // no idea how far through we are + $context['finished'] = 0; + } + + $context['message'] = t('Imported @count users', array('@count' => $import['processed'])); + } + + $context['sandbox']['import'] = $import; + } function user_import_errors_display($import_id = NULL) { if (empty($import_id) || !is_numeric($import_id)) drupal_goto('admin/user/user_import'); @@ -1333,15 +1394,20 @@ } return FALSE; } -function _user_import_process($settings) { +function _user_import_process($settings, $import_max_override = null) { user_import_load_supported(); $line_max = variable_get('user_import_line_max', 1000); - $import_max = variable_get('user_import_max', 250); + if ($import_max_override) { + $import_max = $import_max_override; + } + else { + $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_setting_per_module = $settings['options']['update_user']; ini_set('auto_detect_line_endings', true); @@ -1512,11 +1578,11 @@ $import['pointer'] = 0; $import['processed'] = 0; $import['valid'] = 0; _user_import_errors_display_delete($import['import_id']); _user_import_settings_save($import); - _user_import_process($import); + _user_import_batch_run($import); break; case 'template': unset($import['filename']); unset($import['oldfilename']); @@ -1527,11 +1593,11 @@ $import['valid'] = 0; _user_import_settings_save($import); break; default: - _user_import_process($import); + _user_import_batch_run($import); drupal_set_message(t('Imported')); break; } return;