瀏覽代碼

Bulk loader now has configuration option to choose whether to use prepared statements or not.

Lacey Sanderson 13 年之前
父節點
當前提交
bc8dbbed99

文件差異過大導致無法顯示
+ 179 - 143
tripal_bulk_loader/tripal_bulk_loader.admin.inc


+ 103 - 96
tripal_bulk_loader/tripal_bulk_loader.loader.inc

@@ -3,27 +3,27 @@
 /**
  * Add Loader Job Form
  *
- * This form is meant to be included on the node page to allow users to submit/re-submit 
+ * This form is meant to be included on the node page to allow users to submit/re-submit
  * loading jobs
  */
 function tripal_bulk_loader_add_loader_job_form ($form_state, $node) {
   $form = array();
-  
+
   $form['nid'] = array(
     '#type' => 'hidden',
     '#value' => $node->nid,
-  ); 
-  
+  );
+
   $form['file'] = array(
   	'#type' => 'hidden',
   	'#value' => $node->file
   );
-  
+
   $form['job_id'] = array(
     '#type' => 'hidden',
     '#value' => $node->job_id,
   );
-  
+
   $form['submit'] = array(
     '#type' => 'submit',
     '#value' => ($node->job_id) ? 'Re-Submit Job' : 'Submit Job',
@@ -33,12 +33,12 @@ function tripal_bulk_loader_add_loader_job_form ($form_state, $node) {
     '#type' => ($node->job_id)? 'submit' : 'hidden',
     '#value' => 'Cancel Job',
   );
-  
+
   $form['submit-revert'] = array(
     '#type' => ($node->job_id) ? 'submit' : 'hidden',
     '#value' => 'Revert',
-  );  
-  
+  );
+
   return $form;
 }
 
@@ -47,22 +47,22 @@ function tripal_bulk_loader_add_loader_job_form ($form_state, $node) {
  */
 function tripal_bulk_loader_add_loader_job_form_submit ($form, $form_state) {
   global $user;
-  
+
   if (preg_match('/Submit Job/', $form_state['values']['op'])) {
     //Submit Tripal Job
 		$job_args[1] = $form_state['values']['nid'];
 		if (is_readable($form_state['values']['file'])) {
 			$fname = basename($form_state['values']['file']);
 			$job_id = tripal_add_job("Bulk Loading Job: $fname",'tripal_bulk_loader', 'tripal_bulk_loader_load_data', $job_args, $user->uid);
-			
+
 			// add job_id to bulk_loader node
       $success = db_query("UPDATE {tripal_bulk_loader} SET job_id=%d WHERE nid=%d", $job_id, $form_state['values']['nid']);
-      
+
       // change status
       db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",'Submitted to Queue', $form_state['values']['nid']);
 		} else {
 			drupal_set_message("Can not open ".$form_state['values']['file'].". Job not scheduled.");
-		}    
+		}
   } elseif (preg_match('/Re-Submit Job/', $form_state['values']['op'])) {
     tripal_jobs_rerun($form_state['values']['job_id']);
     db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",'Submitted to Queue', $form_state['values']['nid']);
@@ -70,7 +70,7 @@ function tripal_bulk_loader_add_loader_job_form_submit ($form, $form_state) {
     db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",'Job Cancelled', $form_state['values']['nid']);
     tripal_jobs_cancel($form_state['values']['job_id']);
   } elseif (preg_match('/Revert/', $form_state['values']['op'])) {
-  
+
     // Remove the records from the database that were already inserted
     $resource = db_query('SELECT * FROM {tripal_bulk_loader_inserted} WHERE nid=%d ORDER BY tripal_bulk_loader_inserted_id DESC', $form_state['values']['nid']);
     while ($r = db_fetch_object($resource)) {
@@ -84,7 +84,7 @@ function tripal_bulk_loader_add_loader_job_form_submit ($form, $form_state) {
         drupal_set_message('Unable to remove data Inserted into the '.$r->table_inserted_into.' table!', 'error');
       }
     }
-    
+
     // reset status
     db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",'Reverted -Data Deleted', $form_state['values']['nid']);
   }
@@ -97,30 +97,30 @@ function tripal_bulk_loader_add_loader_job_form_submit ($form, $form_state) {
  * This is the function that's run by tripal_launch_jobs to bulk load chado data.
  *
  * @param $nid
- *   The Node ID of the bulk loading job node to be loaded. All other needed data is expected to be 
+ *   The Node ID of the bulk loading job node to be loaded. All other needed data is expected to be
  *   in the node (ie: template ID and file)
  *
  * Note: Instead of returning a value this function updates the tripal_bulk_loader.status.
  *   Errors are thrown through watchdog and can be viewed at admin/reports/dblog.
  */
 function tripal_bulk_loader_load_data($nid) {
-  
+
   // ensure no timeout
   set_time_limit(0);
-  
+
   // set the status of the job (in the node not the tripal jobs)
   db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",'Loading...', $nid);
 
-  
+
   $node = node_load($nid);
   print "Template: ".$node->template->name." (".$node->template_id.")\n";
 
   $total_lines = trim(`wc --lines < $node->file`);
   print "File: ".$node->file." (".$total_lines." lines)\n";
-  
+
   // Prep Work ==================================================================================
   $loaded_without_errors = TRUE;
-  
+
   // Generate default values array
   $default_data = array();
   $field2column = array();
@@ -130,42 +130,42 @@ function tripal_bulk_loader_load_data($nid) {
     if (!is_array($record_array)) { continue; }
 
     //watchdog('T_bulk_loader','1)'.$record_array['record_id']." => \n<pre>".print_r($record_array,TRUE).'</pre>', array(), WATCHDOG_NOTICE);
-    
+
     foreach ($record_array['fields'] as $field_index => $field_array) {
-      
+
       $default_data[$priority]['table'] = $record_array['table'];
       $default_data[$priority]['mode'] = ($record_array['mode']) ? $record_array['mode'] : 'insert_unique';
       $default_data[$priority]['record_id'] = $record_array['record_id'];
       $record2priority[$record_array['record_id']] = $priority;
       $default_data[$priority]['required'][$field_array['field']] = $field_array['required'];
-      
+
       $one = $default_data[$priority];
       if (isset($field_array['regex'])) {
         $default_data[$priority]['regex_transform'][$field_array['field']] = $field_array['regex'];
       }
-      
+
       $two = $default_data[$priority];
-      
+
       if (preg_match('/table field/', $field_array['type'])) {
         $default_data[$priority]['values_array'][$field_array['field']] = '';
         $default_data[$priority]['need_further_processing'] = TRUE;
         $field2column[$priority][$field_array['field']] = $field_array['spreadsheet column'];
-        
+
       } elseif (preg_match('/constant/', $field_array['type'])) {
         $default_data[$priority]['values_array'][$field_array['field']] = $field_array['constant value'];
-        
+
       } elseif (preg_match('/foreign key/', $field_array['type'])) {
         $default_data[$priority]['values_array'][$field_array['field']] = array();
         $default_data[$priority]['values_array'][$field_array['field']]['foreign record'] = $field_array['foreign key'];
         $default_data[$priority]['need_further_processing'] = TRUE;
-        
+
       } else {
         print 'WARNING: Unsupported type: '. $field_array['type'] . ' for ' . $table . '.' . $field_array['field']."!\n";
-      }   
-      
+      }
+
       $three = $default_data[$priority];
       //watchdog('T_bulk_loader','A)'.$field_index.':<pre>Field Array =>'.print_r($field_array,TRUE)."Initial => \n".print_r($one, TRUE)."\nAfter Regex =>".print_r($two, TRUE)."Final =>\n".print_r($three,TRUE).'</pre>', array(), WATCHDOG_NOTICE);
-      
+
     } // end of foreach field
     //watchdog('T_bulk_loader','2)'.$record_array['record_id'].':<pre>'.print_r($default_data[$priority], TRUE).'</pre>', array(), WATCHDOG_NOTICE);
   } //end of foreach record
@@ -180,15 +180,15 @@ function tripal_bulk_loader_load_data($nid) {
     // revert default data array for next set of constants
     $default_data = $original_default_data;
     $group_index++;
-    
+
     // Add constants
     if (!empty($set)) {
       print "Constants:\n";
       foreach ($set as $priority => $record) {
         foreach ($record as $field_id => $field) {
-        
+
           print "\t- ".$field['chado_table'].'.'.$field['chado_field'].' = '.$field['value']."\n";
-          
+
           if ($default_data[$priority]['table'] == $field['chado_table']) {
             if (isset($default_data[$priority]['values_array'][$field['chado_field']])) {
               if (isset($field2column[$priority][$field['chado_field']])) {
@@ -209,13 +209,13 @@ function tripal_bulk_loader_load_data($nid) {
         }
       }
     }
-    
+
     //print "Default Data:".print_r($default_data,TRUE)."\n";
     //watchdog('T_bulk_loader','Default Data:<pre>'.print_r($default_data, TRUE).'</pre>', array(), WATCHDOG_NOTICE);
-    
+
     //print "\nDefault Values Array: ".print_r($default_data, TRUE)."\n";
     //print "\nField to Column Mapping: ".print_r($field2column, TRUE)."\n";
-    
+
     // Parse File adding records as we go ========================================================
     $file_handle = fopen($node->file, 'r');
     if (preg_match('/(t|true|1)/', $node->file_has_header)) { fgets($file_handle, 4096); }
@@ -225,55 +225,55 @@ function tripal_bulk_loader_load_data($nid) {
     $interval = intval($total_lines * 0.10);
     if($interval == 0){ $interval = 1; }
     while (!feof($file_handle)) {
-  
+
       // Clear variables
       // Was added to fix memory leak
       unset($line);                     unset($raw_line);
       unset($data);                     unset($data_keys);
       unset($priority);                 unset($sql);
-      unset($result);                   
-      
+      unset($result);
+
       $raw_line = fgets($file_handle, 4096);
       $raw_line = trim($raw_line);
       if (empty($raw_line)) { continue; } // skips blank lines
       $line = explode("\t", $raw_line);
       $num_lines++;
-      
+
       // update the job status every 10% of lines processed for the current group
       if($node->job_id and $num_lines % $interval == 0){
         // percentage of lines processed for the current group
         $group_progress = round(($num_lines/$total_lines)*100);
-        
+
         // percentage of lines processed for all groups
         // <previous group index> * 100 + <current group progress>
         // --------------------------------------------------------
         //               <total number of groups>
-        // For example, if you were in the third group of 3 constant sets 
+        // For example, if you were in the third group of 3 constant sets
         // and had a group percentage of 50% then the job progress would be
         // (2*100 + 50%) / 3 = 250%/3 = 83%
         $job_progress = round(((($group_index-1)*100)+$group_progress)/$total_num_groups);
-        
+
         /**
           print "\nProgress Update:\n"
             ."\t- ".$num_lines." lines have been processed for the current constant set.\n"
             ."\t- ".$group_progress."% of the lines in the file have been processed for the current constant set.\n"
             ."\t- ".$job_progress."% of the current job has been completed.\n";
         */
-         
+
         tripal_job_set_progress($node->job_id,$job_progress);
-      }    
-  
+      }
+
       $data = $default_data;
-  
-      $data_keys = array_keys($data); 
+
+      $data_keys = array_keys($data);
       foreach ($data_keys as $priority) {
         $status = process_data_array_for_line($priority, $data, $default_data, $field2column, $record2priority, $line, $nid, $num_lines, $group_index);
         if (!$status ) { $loaded_without_errors = FALSE; }
       } // end of foreach table in default data array
-      
+
     } //end of foreach line of file
   } //end of foreach constant set
-    
+
   // check that data was inserted and update job_status
   $sql = 'SELECT count(*) as num_tables FROM {tripal_bulk_loader_inserted} WHERE nid=%d GROUP BY nid';
   $result = db_fetch_object(db_query($sql, $nid));
@@ -281,7 +281,7 @@ function tripal_bulk_loader_load_data($nid) {
     $node->job_status = 'Data Inserted';
     drupal_write_record('node',$node,'nid');
   }
-  
+
   // set the status of the job (in the node not the tripal jobs)
   if ($loaded_without_errors) { $status = 'Loading Completed Successfully'; } else { $status = 'Errors Encountered'; }
   db_query("UPDATE tripal_bulk_loader SET job_status='%s' WHERE nid=%d",$status, $nid);
@@ -289,7 +289,7 @@ function tripal_bulk_loader_load_data($nid) {
 }
 
 /**
- * 
+ *
  *
  */
 function process_data_array_for_line ($priority, &$data, &$default_data, $field2column, $record2priority, $line, $nid, $line_num, $group_index) {
@@ -299,16 +299,16 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
 
   $table = $table_data['table'];
   $values = $table_data['values_array'];
-  
+
   //watchdog('T_bulk_loader','Original:<pre>'.print_r($table_data, TRUE).'</pre>', array(), WATCHDOG_NOTICE);
-  
+
   //print 'default values:'.print_r($values,TRUE)."\n";
   if ($table_data['need_further_processing']) {
     $values = tripal_bulk_loader_add_spreadsheetdata_to_values ($values, $line, $field2column[$priority]);
     if (!$values) {
       watchdog('T_bulk_loader','Line '.$line_num.' Spreadsheet Added:'.print_r($values, TRUE), array(), WATCHDOG_NOTICE);
     }
-    
+
     $values = tripal_bulk_loader_add_foreignkey_to_values($values, $data, $record2priority);
     if (!$values) {
       watchdog('T_bulk_loader','Line '.$line_num.' FK Added:<pre>'.print_r($values, TRUE).print_r($data[$priority],TRUE).'</pre>', array(), WATCHDOG_NOTICE);
@@ -321,12 +321,12 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
 
   if (!$values) {
     $msg = 'Line '.$line_num.' '.$table_data['record_id'].' ('.$table_data['mode'].') Aborted due to error in previous record. Values of current record:'.print_r($table_data['values_array'],TRUE);
-    watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING); 
+    watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING);
     print "ERROR: ".$msg."\n";
     $data[$priority]['error'] = TRUE;
     $no_errors = FALSE;
   }
-  
+
   $table_desc = module_invoke_all('chado_'.$table.'_schema');
   if (preg_match('/optional/', $table_array['mode'])) {
     // Check all db required fields are set
@@ -336,44 +336,44 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
       // value for it or it is of type 'serial'
       if($def['not null'] == 1 and !array_key_exists($field,$insert_values) and !isset($def['default']) and strcmp($def['type'],serial)!=0){
          $msg = 'Line '.$line_num.' '.$table_data['record_id'].' ('.$table_data['mode'].') Missing Database Required Value: '.$table.'.'.$field;
-         watchdog('T_bulk_loader', $msg, array(), WATCHDOG_NOTICE); 
+         watchdog('T_bulk_loader', $msg, array(), WATCHDOG_NOTICE);
          $data[$priority]['error'] = TRUE;
       }
     }
   } //end of if optional record
-  
+
   // Check required fields are present
   foreach ($table_data['required'] as $field => $required) {
     if ($required) {
       if (!isset($values[$field])) {
         $msg = 'Line '.$line_num.' '.$table_data['record_id'].' ('.$table_data['mode'].') Missing Template Required Value: '.$table.'.'.$field;
-        watchdog('T_bulk_loader', $msg, array(), WATCHDOG_NOTICE); 
-        $data[$priority]['error'] = TRUE;  
+        watchdog('T_bulk_loader', $msg, array(), WATCHDOG_NOTICE);
+        $data[$priority]['error'] = TRUE;
       }
     }
   }
-  
+
   // add new values array into the data array
   $data[$priority]['values_array'] = $values;
-  
+
   // check if it is already inserted
   if ($table_data['inserted']) {
     //watchdog('T_bulk_loader','Already Inserted:'.print_r($values,TRUE),array(),WATCHDOG_NOTICE);
     return $no_errors;
   }
-  
+
   // if there was an error already -> don't insert
   if ($data[$priority]['error']) {
     return $no_errors;
   }
-  
+
   $header = '';
   if (isset($values['feature_id'])) {
     $header = $values['feature_id']['uniquename'] .' '. $table_data['record_id'];
   } else {
     $header = $values['uniquename'] .' '. $table_data['record_id'];
   }
-  
+
   // if insert unique then check to ensure unique
   if (preg_match('/insert_unique/',$table_data['mode'])) {
     $unique = tripal_core_chado_select($table, array_keys($table_desc['fields']), $values, array('has_record'=>TRUE));
@@ -384,31 +384,38 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
       return $no_errors;
     }
   }
-  
-    
+
+
   if (!preg_match('/select/',$table_data['mode'])) {
     //watchdog('T_bulk_loader',$header.': Inserting:'.print_r($values, TRUE), array(), WATCHDOG_NOTICE);
-    $options = array('statement_name' => $priority);
-    if ($line_num == 1 && $group_index == 1) {
-      $options['prepare'] = TRUE;
+    if (variable_get('tripal_bulk_loader_prepare',TRUE)) {
+      $options = array('statement_name' => $priority);
+      if ($line_num == 1 && $group_index == 1) {
+        $options['prepare'] = TRUE;
+      }
     }
+    else {
+      $options = array();
+    }
+
     $record = tripal_core_chado_insert($table, $values, $options);
+
     if (!$record) {
       $msg = 'Line '.$line_num.' '.$table_data['record_id'].' ('.$table_data['mode'].') Unable to insert record into '.$table.' where values:'.print_r($values,TRUE);
-      watchdog('T_bulk_loader', $msg, array(), WATCHDOG_ERROR); 
-      print "ERROR: ".$msg."\n";  
+      watchdog('T_bulk_loader', $msg, array(), WATCHDOG_ERROR);
+      print "ERROR: ".$msg."\n";
       $data[$priority]['error'] = TRUE;
       $no_errors = FALSE;
     } else {
       //add changes back to values array
       $data[$priority]['values_array'] = $record;
       $values = $record;
-      
+
       // if mode=insert_once then ensure we only insert it once
       if (preg_match('/insert_once/',$table_data['mode'])) {
         $default_data[$priority]['inserted'] = TRUE;
       }
-      
+
       // add to tripal_bulk_loader_inserted
       $insert_record = db_fetch_object(db_query(
         "SELECT * FROM {tripal_bulk_loader_inserted} WHERE table_inserted_into='%s' AND nid=%d",
@@ -431,15 +438,15 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
         $success = drupal_write_record('tripal_bulk_loader_inserted', $insert_record);
         return $no_errors;
       }//end of if insert record
-      
+
     } //end of if insert was successful
   } else {
     $exists = tripal_core_chado_select($table, array_keys($table_desc['fields']), $values, array('has_record'=>TRUE));
     if (!$exists) {
       // No record on select
       $msg = 'Line '.$line_num.' '.$table_data['record_id'].' ('.$table_data['mode'].') No Matching record in '.$table.' where values:'.print_r($values,TRUE);
-      watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING); 
-      $data[$priority]['error'] = TRUE;  
+      watchdog('T_bulk_loader', $msg, array(), WATCHDOG_WARNING);
+      $data[$priority]['error'] = TRUE;
     }
   }
   return $no_errors;
@@ -454,24 +461,24 @@ function process_data_array_for_line ($priority, &$data, &$default_data, $field2
  *   An array of values for the current line
  * @param $field2column
  *   An array mapping values fields to line columns
- * @return 
+ * @return
  *   Supplemented values array
  */
 function tripal_bulk_loader_add_spreadsheetdata_to_values ($values, $line, $field2column) {
 
   foreach ($values as $field => $value) {
     if (is_array($value)) { continue; }
-    
+
     $column = $field2column[$field] - 1;
     if ($column < 0) { continue; }
-    
+
     if (preg_match('/\S+/',$line[$column])) {
       $values[$field] = $line[$column];
     } else {
       unset($values[$field]);
     }
   }
-  
+
   return $values;
 }
 
@@ -490,7 +497,7 @@ function tripal_bulk_loader_add_foreignkey_to_values($values, $data, $record2pri
       $foreign_record = $value['foreign record'];
       $foreign_priority = $record2priority[$foreign_record];
       $foreign_values = $data[$foreign_priority]['values_array'];
-      
+
       // add to current values array
       $values[$field] = $foreign_values;
     }
@@ -510,16 +517,16 @@ function tripal_bulk_loader_add_foreignkey_to_values($values, $data, $record2pri
 function tripal_bulk_loader_regex_tranform_values ($values, $table_data, $line) {
 
   if (empty($table_data['regex_transform']) OR !is_array($table_data['regex_transform'])) { return $values; }
-  
+
   //watchdog('T_bulk_loader','Regex Transformation:<pre>'.print_r($table_data['regex_transform'], TRUE).'</pre>', array(), WATCHDOG_NOTICE);
-  
+
   foreach ($table_data['regex_transform'] as $field => $regex_array) {
     if (!is_array($regex_array['replace'])) { continue; }
-    
+
     //print 'Match:'.print_r($regex_array['pattern'],TRUE)."\n";
     //print 'Replace:'.print_r($regex_array['replace'],TRUE)."\n";
     //print 'Was:'.$values[$field]."\n";
-    
+
     // Check for <#column:\d+#> notation
     // if present replace with that column in the current line
     foreach ($regex_array['replace'] as $key => $replace) {
@@ -530,19 +537,19 @@ function tripal_bulk_loader_regex_tranform_values ($values, $table_data, $line)
         $regex_array['replace'][$key] = $replace;
       }
     }
-    
+
     // do the full replacement
     $old_value = $values[$field];
     $new_value = preg_replace($regex_array['pattern'], $regex_array['replace'], $old_value);
     $values[$field] = $new_value;
-    
+
     if ($values[$field] === '') {
-      unset($values[$field]); 
+      unset($values[$field]);
     }
     //print 'Now:'.$values[$field]."\n";
   }
-  
-  
+
+
 
   return $values;
 }
@@ -553,7 +560,7 @@ function tripal_bulk_loader_regex_tranform_values ($values, $table_data, $line)
  */
 function tripal_bulk_loader_flatten_array ($values) {
   $flattened_values = array();
-  
+
   foreach ($values as $k => $v) {
     if (is_array($v)) {
       $vstr = array();
@@ -570,6 +577,6 @@ function tripal_bulk_loader_flatten_array ($values) {
     }
     $flattened_values[] = $k .'=>'. $v;
   }
-  
+
   return implode(', ',$flattened_values);
 }

+ 68 - 57
tripal_bulk_loader/tripal_bulk_loader.module

@@ -33,7 +33,7 @@ function tripal_bulk_loader_menu() {
     	'page callback' => 'drupal_get_form',
     	'page arguments' => array('tripal_bulk_loader_edit_constant_set_form',1,3),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
+      'type' => MENU_CALLBACK,
 		  'file' => 'tripal_bulk_loader.constants.inc',
    );
    $items['node/%node/constants/%/delete'] = array(
@@ -42,18 +42,29 @@ function tripal_bulk_loader_menu() {
     	'page callback' => 'drupal_get_form',
     	'page arguments' => array('tripal_bulk_loader_delete_constant_set_form',1,3),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
+      'type' => MENU_CALLBACK,
 		  'file' => 'tripal_bulk_loader.constants.inc',
    );
+
    // Admin page to create the template
    $items['admin/tripal/tripal_bulk_loader_template'] = array(
       'title' => 'Bulk Loader Template',
       'description' => 'Templates for loading tab-delimited data',
     	'page callback' => 'tripal_bulk_loader_admin_template',
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
+      'type' => MENU_NORMAL_ITEM,
+		  'file' => 'tripal_bulk_loader.admin.inc',
+	);
+   $items['admin/tripal/tripal_bulk_loader_template/configure'] = array(
+      'title' => 'Configuration',
+      'description' => 'Configure the Tripal Bulk Loader Module',
+    	'page callback' => 'drupal_get_form',
+    	'page arguments' => array('tripal_bulk_loader_configuration_form'),
+      'access arguments' => array('administer site configuration'),
+      'type' => MENU_NORMAL_ITEM,
 		  'file' => 'tripal_bulk_loader.admin.inc',
 	);
+
 	// Create/Edit Template -------
   $items['admin/tripal/tripal_bulk_loader_template/create'] = array(
       'title' => 'Create Bulk Loader Template',
@@ -61,7 +72,7 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_modify_template_base_form', 'create'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
+      'type' => MENU_NORMAL_ITEM,
 		'file' => 'tripal_bulk_loader.admin.inc',
   );
   $items['admin/tripal/tripal_bulk_loader_template/edit'] = array(
@@ -70,8 +81,8 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_modify_template_base_form', 'edit'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
-		  'file' => 'tripal_bulk_loader.admin.inc',  
+      'type' => MENU_NORMAL_ITEM,
+		  'file' => 'tripal_bulk_loader.admin.inc',
   );
 	$items['admin/tripal/tripal_bulk_loader_template/edit_record'] = array(
       'title' => 'Edit Template Record',
@@ -79,7 +90,7 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_edit_template_record_form'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
+      'type' => MENU_CALLBACK,
 		'file' => 'tripal_bulk_loader.admin.inc',
 	);
 	$items['admin/tripal/tripal_bulk_loader_template/add_field'] = array(
@@ -88,7 +99,7 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_add_template_field_form'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
+      'type' => MENU_CALLBACK,
 		'file' => 'tripal_bulk_loader.admin.inc',
 	);
 	$items['admin/tripal/tripal_bulk_loader_template/edit_field'] = array(
@@ -97,7 +108,7 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_edit_template_field_form'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
+      'type' => MENU_CALLBACK,
 		'file' => 'tripal_bulk_loader.admin.inc',
 	);
 	// Delete Template -----
@@ -107,7 +118,7 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_delete_template_base_form'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
+      'type' => MENU_NORMAL_ITEM,
 		'file' => 'tripal_bulk_loader.admin.inc',
 	);
 	// Import/Export ---------
@@ -117,32 +128,32 @@ function tripal_bulk_loader_menu() {
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_import_export_template_form', 'import'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
-		  'file' => 'tripal_bulk_loader.admin.inc',  
-  );	
+      'type' => MENU_NORMAL_ITEM,
+		  'file' => 'tripal_bulk_loader.admin.inc',
+  );
   $items['admin/tripal/tripal_bulk_loader_template/export'] = array(
       'title' => 'Export Bulk Loader Template',
       'description' => 'Export Loaders',
       'page callback' => 'drupal_get_form',
       'page arguments' => array('tripal_bulk_loader_import_export_template_form', 'export'),
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_NORMAL_ITEM,   
-		  'file' => 'tripal_bulk_loader.admin.inc',  
-  );	
+      'type' => MENU_NORMAL_ITEM,
+		  'file' => 'tripal_bulk_loader.admin.inc',
+  );
 	// AHAH ---------
 	$items['admin/tripal/tripal_bulk_loader_template/add_field_ahah'] = array(
       'page callback' => 'tripal_bulk_loader_add_field_ahah',
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
-		  'file' => 'tripal_bulk_loader.admin.inc',	
+      'type' => MENU_CALLBACK,
+		  'file' => 'tripal_bulk_loader.admin.inc',
 	);
 	$items['admin/tripal/tripal_bulk_loader_template/edit_field_ahah'] = array(
       'page callback' => 'tripal_bulk_loader_edit_field_ahah',
       'access arguments' => array('administer site configuration'),
-      'type' => MENU_CALLBACK,   
-		  'file' => 'tripal_bulk_loader.admin.inc',	
+      'type' => MENU_CALLBACK,
+		  'file' => 'tripal_bulk_loader.admin.inc',
 	);
-	
+
   return $items;
 }
 
@@ -219,10 +230,10 @@ function tripal_bulk_loader_perm(){
 function tripal_bulk_loader_list () {
   $num_results_per_page = 50;
   $output = '';
-  
+
   $header = array('','Status','Loader','File');
   $rows = array();
-  
+
   $query = 'SELECT * FROM {tripal_bulk_loader} l '
     .'LEFT JOIN {node} n ON n.nid = l.nid '
     .'LEFT JOIN {tripal_bulk_loader_template} t ON t.template_id = cast(l.template_id as integer)';
@@ -236,10 +247,10 @@ function tripal_bulk_loader_list () {
     );
     $rows[] = $row;
   }
-  
+
   $output .= theme('table', $header, $rows);
   return $output;
-  
+
 }
 
 //////////////////////////////////////////////////////////////////////////////////////////////
@@ -268,34 +279,34 @@ function tripal_bulk_loader_node_info() {
  */
 function tripal_bulk_loader_form ($node, $form_state){
   $form = array();
-  
+
   if (isset($form_state['values'])) {
     $node = $form_state['values'] + (array)$node;
     $node = (object) $node;
   }
-  
+
   $sql = "SELECT * FROM {tripal_bulk_loader_template}";
   $results = db_query($sql);
   $templates = array ();
   while ($template = db_fetch_object ($results)) {
     $templates [$template->template_id] = $template->name;
   }
-  
+
   if (!$templates) {
     $form['label'] = array(
     '#type' => 'item',
       '#description' => t("Loader template needs to be created before any bulk loader can be added. Go to 'Tripal Management > Bulk Loader Template' to create the template."),
       '#weight'        => -10,
     );
-    
+
     return $form;
   }
-  
+
   $form['loader'] = array(
     '#type' => 'fieldset',
     '#title' => t('Basic Details'),
   );
-  
+
   $form['loader']['loader_name'] = array(
     '#type'          => 'textfield',
     '#title'         => t('Loading Job Name'),
@@ -303,7 +314,7 @@ function tripal_bulk_loader_form ($node, $form_state){
     '#required'      => TRUE,
     '#default_value' => $node->loader_name
   );
-  
+
   $form['loader']['template_id'] = array(
     '#type' => 'select',
     '#title' => t('Template'),
@@ -313,7 +324,7 @@ function tripal_bulk_loader_form ($node, $form_state){
     '#required'      => TRUE,
     '#default_value' => $node->template_id,
   );
-  
+
   $form['loader']['file']= array(
     '#type'          => 'textfield',
     '#title'         => t('Data File'),
@@ -321,7 +332,7 @@ function tripal_bulk_loader_form ($node, $form_state){
     '#weight'        => -8,
     '#default_value' => $node->file
   );
-  
+
   $form['loader']['has_header'] = array(
     '#type' => 'radios',
     '#title' => t('File has a Header'),
@@ -329,7 +340,7 @@ function tripal_bulk_loader_form ($node, $form_state){
     '#weight' => -7,
     '#default_value' => $node->file_has_header,
   );
-  
+
   return $form;
 }
 
@@ -342,7 +353,7 @@ function tripal_bulk_loader_load($node){
 	$node = db_fetch_object(db_query($sql, $node->nid));
 
 	$node->title = 'Bulk Loading Job: '.$node->loader_name;
-	
+
 	// Add the loader template
 	$sql = "SELECT * FROM {tripal_bulk_loader_template} WHERE template_id=%d";
 	$results = db_fetch_object(db_query($sql, $node->template_id));
@@ -354,7 +365,7 @@ function tripal_bulk_loader_load($node){
   $sql = 'SELECT * FROM {tripal_bulk_loader_inserted} WHERE nid=%d';
   $resource = db_query($sql,$node->nid);
   while ($r = db_fetch_object($resource)) {
-    $r->num_inserted = sizeof(preg_split('/,/',$r->ids_inserted)); 
+    $r->num_inserted = sizeof(preg_split('/,/',$r->ids_inserted));
     $node->inserted_records->{$r->table_inserted_into} = $r;
   }
 
@@ -372,13 +383,13 @@ function tripal_bulk_loader_load($node){
         }
       }
     }
-    
+
     if (empty($node->exposed_fields)) {
       $node->exposed_fields[] = array();
     }
   }
 
-  
+
   // Add constants
   $sql = 'SELECT * FROM {tripal_bulk_loader_constants} WHERE nid=%d ORDER BY group_id, record_id, field_id';
   $resource = db_query($sql,$node->nid);
@@ -386,17 +397,17 @@ function tripal_bulk_loader_load($node){
     $node->constants[$r->group_id][$r->record_id][$r->field_id] = array(
       'constant_id' => $r->constant_id,
       'group_id' => $r->group_id,
-      'chado_table'=>$r->chado_table, 
-      'chado_field'=>$r->chado_field, 
-      'record_id'=>$r->record_id, 
-      'field_id'=>$r->field_id, 
+      'chado_table'=>$r->chado_table,
+      'chado_field'=>$r->chado_field,
+      'record_id'=>$r->record_id,
+      'field_id'=>$r->field_id,
       'value'=>$r->value
     );
   }
   if (!$node->constants) {
     $node->constants[] = array();
   }
-  
+
 	return $node;
 }
 
@@ -405,18 +416,18 @@ function tripal_bulk_loader_load($node){
  * Insert the data from the node form on Create content
  */
 function tripal_bulk_loader_insert ($node) {
-  
+
   // Insert into tripal_bulk_loader
   $sql = "INSERT INTO {tripal_bulk_loader} (nid, loader_name, template_id, file, file_has_header, job_status) VALUES (%d, '%s', %d, '%s', %d, '%s')";
   db_query($sql, $node->nid, $node->loader_name, $node->template_id, $node->file, $node->has_header, 'Initialized');
-	
+
 	// Update title
 	$node->title =$node->loader_name;
 	drupal_write_record('node',$node,'nid');
-	drupal_write_record('node_revision',$node,'nid');	
-  
+	drupal_write_record('node_revision',$node,'nid');
+
   drupal_set_message('After reviewing the details, please Submit this Job (by clicking the "Submit Job" button below). No data will be loaded until the submitted job is reached in the queue.');
-  
+
 }
 
 /**
@@ -433,11 +444,11 @@ function tripal_bulk_loader_delete ($node) {
  * Updates the data submitted by the node form on edit
  */
 function tripal_bulk_loader_update ($node) {
-  
+
   // Update tripal_bulk_loader
 	$sql = "UPDATE {tripal_bulk_loader} SET nid = %d, loader_name = '%s', template_id = %d, file = '%s', file_has_header = '%s' WHERE nid = %d";
 	db_query($sql, $node->nid, $node->loader_name, $node->template_id, $node->file, $node->has_header, $node->nid);
-	
+
 	// Add a job if the user want to load the data
 	global $user;
 	if($node->job) {
@@ -451,7 +462,7 @@ function tripal_bulk_loader_update ($node) {
 			drupal_set_message("Can not open $node->file. Job not scheduled.");
 		}
 	}
-  
+
 }
 
 ///////////////////////////////////////////////////////////
@@ -463,9 +474,9 @@ function tripal_bulk_loader_preprocess_tripal_bulk_loader_template (&$variables)
 
 	$sql = "SELECT * FROM {tripal_bulk_loader_template} WHERE template_id=%d";
 	$template = db_fetch_object(db_query($sql, $variables['template_id']));
-	$template->template_array = unserialize($template->template_array);	
+	$template->template_array = unserialize($template->template_array);
 	$variables['template'] = $template;
-	
+
 }
 
 /**
@@ -476,8 +487,8 @@ function tripal_bulk_loader_preprocess_tripal_bulk_loader_template (&$variables)
  *   The callback passed into tripal_add_job()
  * @param $args
  *   The arguements passed into tripal_add_job()
- * @return 
- *   An array where keys are the human readable headers describing each arguement 
+ * @return
+ *   An array where keys are the human readable headers describing each arguement
  *   and the value is the aguement passed in after formatting
  */
 function tripal_bulk_loader_job_describe_args($callback,$args){
@@ -489,6 +500,6 @@ function tripal_bulk_loader_job_describe_args($callback,$args){
     $new_args['Bulk Loading Job'] = l($node->title, 'node/'.$args[0]);
     return $new_args;
   }
-  
+
 }
 

部分文件因文件數量過多而無法顯示