Index: devel_generate.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel_generate.inc,v
retrieving revision 1.14
diff -u -u -p -r1.14 devel_generate.inc
--- devel_generate.inc	15 Dec 2007 01:56:31 -0000	1.14
+++ devel_generate.inc	11 May 2008 22:02:24 -0000
@@ -30,75 +30,26 @@ function devel_create_users($num, $kill)
   drupal_set_message(t('!num_users created.', array('!num_users' => format_plural($num, '1 user', '@count users'))));
 }
 
+/**
+ * Provide backward compatible API function to generate content
+ */
 function devel_generate_content($num_nodes, $num_comments, $title_length, $kill, $add_upload = FALSE, $add_terms = FALSE, $add_alias = FALSE, $node_types) {
+  $results = compact('num_comments', 'title_length', 'add_upload', 'add_terms', 'add_alias', 'node_types');
+
+  // Kill existing content.
   if ($kill) {
-    $sql = 'SELECT nid FROM {node} WHERE type IN ('. db_placeholders($node_types, 'text'). ')';
-    $result = db_query($sql, $node_types);
-    while ($row = db_fetch_object($result)) {
-      node_delete($row->nid);
-    }
+    devel_generate_content_kill($results);
   }
 
-  // Get user id.
-  $users = devel_get_users();
-
-  // Create $num_nodes pseudo-random nodes and comments (if specified)
-  devel_create_nodes($num_nodes, $users, $title_length, $add_upload, $add_terms, $num_comments, $add_alias, $node_types);
-  drupal_set_message(format_plural($num_nodes, '1 node created.', '@count nodes created'));
-}
-
-function devel_create_nodes($records, $users, $title_length = 8, $add_upload = FALSE, $add_terms = FALSE, $num_comments = 0, $add_alias = FALSE, $node_types = array()) {
-  
-  $users = array_merge($users, array('0'));
-  // $nids = array();
-
   if (count($node_types)) {
-    // Insert new data:
-    for ($i = 1; $i <= $records; $i++) {
-      $node->type = $node_types[array_rand($node_types)];
-      require_once './modules/node/node.pages.inc';
-      node_object_prepare($node);
-      $node->uid = $users[array_rand($users)];
-
-      $node->title = devel_create_greeking(rand(1, $title_length), TRUE);
-      $node->body = "node ($node->type) - ". devel_create_content();
-      $node->teaser = node_teaser($node->body);
-      $node->filter = variable_get('filter_default_format', 1);
-      $node->format = FILTER_FORMAT_DEFAULT;
-      $node->language = '';
-      $node->revision = rand(0,1);
-      $node->promote = rand(0, 1);
-      $node->created = time();
-      
-      // Add an url alias
-      // TODO: the nid is not known yet. move back to post creation.
-      // if ($add_alias) {
-      //   $node->path = "node-$node->nid-$node->type";
-      // }
-      
-      if ($add_upload) {
-        devel_generate_add_upload($node);
-      }
-      
-      if ($add_terms) {
-        devel_generate_add_terms($node);
-      }
-      
-      // Populate any CCK fields in the content type
-      if (module_exists("content")) {
-        devel_generate_fields($node);
-      }
-      
-      // Save the node:
-      node_save($node);
-      
-      if ($num_comments) {
-        devel_generate_add_comments($node, $users, $num_comments, $title_length);
-      }
-
-      unset($node);
+    // Generate nodes.
+    devel_generate_content_pre_node($results);
+    for ($i = 1; $i <= $num_nodes; $i ++) {
+      devel_generate_content_add_node($results);
     }
   }
+
+  drupal_set_message(format_plural($num_nodes, '1 node created.', '@count nodes created'));
 }
 
 function devel_generate_add_comments($node, $users, $num_comments, $title_length = 8) {
@@ -460,4 +411,64 @@ function devel_generate_fields(&$node) {
       $node->$field['field_name'] = $return;
     }
   }
-}
\ No newline at end of file
+}
+
+function devel_generate_content_kill(&$results) {
+  $sql = 'SELECT nid FROM {node} WHERE type IN ('. db_placeholders($results['node_types'], 'text'). ')';
+  $result = db_query($sql, $results['node_types']);
+  while ($row = db_fetch_object($result)) {
+    node_delete($row->nid);
+  }
+}
+
+function devel_generate_content_pre_node(&$results) {
+  // Get user id.
+  $users = devel_get_users();
+  $users = array_merge($users, array('0'));
+  $results['users'] = $users;
+}
+
+function devel_generate_content_add_node(&$results) {
+  // Insert new data:
+  $node->type = array_rand($results['node_types']);
+  require_once './modules/node/node.pages.inc';
+  node_object_prepare($node);
+  $users = $results['users'];
+  $node->uid = $users[array_rand($users)];
+
+  $node->title = devel_create_greeking(rand(1, $results['title_length']), TRUE);
+  $node->body = "node ($node->type) - ". devel_create_content();
+  $node->teaser = node_teaser($node->body);
+  $node->filter = variable_get('filter_default_format', 1);
+  $node->format = FILTER_FORMAT_DEFAULT;
+  $node->language = '';
+  $node->revision = rand(0,1);
+  $node->promote = rand(0, 1);
+  $node->created = time();
+      
+  // Add an url alias
+  // TODO: the nid is not known yet. move back to post creation.
+  // if ($add_alias) {
+  //   $node->path = "node-$node->nid-$node->type";
+  // }
+      
+  if ($results['add_upload']) {
+    devel_generate_add_upload($node);
+  }
+      
+  if ($results['add_terms']) {
+    devel_generate_add_terms($node);
+  }
+      
+  // Populate any CCK fields in the content type
+  if (module_exists("content")) {
+    devel_generate_fields($node);
+  }
+      
+  // Save the node:
+  node_save($node);
+      
+  if ($results['num_comments']) {
+    devel_generate_add_comments($node, $results['users'], $results['num_comments'], $results['title_length']);
+  }
+}
Index: devel_generate.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/devel/devel_generate.module,v
retrieving revision 1.11
diff -u -u -p -r1.11 devel_generate.module
--- devel_generate.module	14 Jan 2008 13:05:13 -0000	1.11
+++ devel_generate.module	11 May 2008 22:02:24 -0000
@@ -1,6 +1,8 @@
 <?php
 // $Id: devel_generate.module,v 1.11 2008/01/14 13:05:13 weitzman Exp $
 
+require_once('devel_generate_batch.inc');
+
 /**
  * Implementation of hook_menu().
  */
@@ -144,8 +146,13 @@ function devel_generate_content_form() {
 }
 
 function devel_generate_content_form_submit($form_id, &$form_state) {
-  require_once('devel_generate.inc');
-  devel_generate_content($form_state['values']['num_nodes'], $form_state['values']['num_comments'], $form_state['values']['title_length'], $form_state['values']['kill_content'], $form_state['values']['add_upload'], $form_state['values']['add_terms'], $form_state['values']['add_alias'], array_filter($form_state['values']['node_types']));
+  if ($form_state['values']['num_nodes'] <= 50 && $form_state['values']['num_comments'] <= 10) {
+    require_once('devel_generate.inc');
+    devel_generate_content($form_state['values']['num_nodes'], $form_state['values']['num_comments'], $form_state['values']['title_length'], $form_state['values']['kill_content'], $form_state['values']['add_upload'], $form_state['values']['add_terms'], $form_state['values']['add_alias'], array_filter($form_state['values']['node_types']));
+  }
+  else {
+    devel_batch_generate_content($form_state['values']['num_nodes'], $form_state['values']['num_comments'], $form_state['values']['title_length'], $form_state['values']['kill_content'], $form_state['values']['add_upload'], $form_state['values']['add_terms'], $form_state['values']['add_alias'], array_filter($form_state['values']['node_types']));
+  }
 }
 
 function devel_generate_taxonomy_form() {
Index: devel_generate_batch.inc
===================================================================
RCS file: devel_generate_batch.inc
diff -N devel_generate_batch.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ devel_generate_batch.inc	11 May 2008 22:02:24 -0000
@@ -0,0 +1,68 @@
+<?php
+// $Id$
+
+/**
+ * Devel Generate batch handling functions using the BatchAPI
+ * included by devel_generate.module
+ */
+
+/**
+ * Functions called from FAPI:
+ */
+
+function devel_batch_generate_content($num_nodes, $num_comments, $title_length, $kill_content, $add_upload, $add_terms, $add_alias, $node_types) {
+  $operations = array();
+
+  // add the kill operation
+  if ($kill_content) {
+    $operations = array('devel_batch_generate_content_kill', array());
+  }
+
+  // add the operations to create the nodes
+  $vars = compact('num_comments', 'title_length', 'add_upload', 'add_terms', 'add_alias', 'node_types');
+  $operations[] = array('devel_batch_generate_content_pre_node', array($vars));
+  for ($num = 0; $num < $num_nodes; $num ++) {
+    $operations[] = array('devel_batch_generate_content_add_node', array());
+  }
+
+  // start the batch
+  $batch = array(
+    'title' => t('Generating Content'),
+    'operations' => $operations,
+    'finished' => 'devel_generate_batch_finished',
+  );
+  batch_set($batch);
+}
+
+/**
+ * Create Content Batch Functions:
+ */
+
+function devel_batch_generate_content_kill(&$context) {
+  require_once('devel_generate.inc');
+  devel_generate_content_kill($context['results']);
+}
+
+function devel_batch_generate_content_pre_node($vars, &$context) {
+  $context['results'] = $vars;
+  $context['results']['num_nids'] = 0;
+  require_once('devel_generate.inc');
+  devel_generate_content_pre_node($context['results']);
+}
+
+function devel_batch_generate_content_add_node(&$context) {
+  require_once('devel_generate.inc');
+  devel_generate_content_add_node($context['results']);
+  $context['results']['num_nids'] ++;
+}
+
+function devel_generate_batch_finished($success, $results, $operations) {
+  if ($success) {
+    $message = t('Finished @num_nids nodes created successfully.', array('@num_nids' => $results['num_nids']));
+  }
+  else {
+    $message = t('Finished with an error.');
+  }
+  drupal_set_message($message);
+}
+
