|  | @@ -71,6 +71,16 @@ require_once "tripal_core.schema.api.inc";
 | 
	
		
			
				|  |  |   *  The name of the chado table for inserting
 | 
	
		
			
				|  |  |   * @param $values
 | 
	
		
			
				|  |  |   *  An associative array containing the values for inserting.
 | 
	
		
			
				|  |  | + * @param $options
 | 
	
		
			
				|  |  | + *  An array of options such as:
 | 
	
		
			
				|  |  | + *    -prepare: TRUE or FALSE. Whether or not to prepare the current statement.
 | 
	
		
			
				|  |  | + *       statement_name must also be supplied.
 | 
	
		
			
				|  |  | + *    -statement_name: the name of the prepared statement to use. If prepare is TRUE,
 | 
	
		
			
				|  |  | + *       this indicates the name of the prepared statement to created; otherwise,
 | 
	
		
			
				|  |  | + *       it indicates the name of the already prepared statement to use.
 | 
	
		
			
				|  |  | + *    -skip_validation: TRUE or FALSE. If TRUE will skip all the validation steps and
 | 
	
		
			
				|  |  | + *       just try to insert as is. This is much faster but results in unhandled
 | 
	
		
			
				|  |  | + *       non user-friendly errors if the insert fails.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * @return
 | 
	
		
			
				|  |  |   *  On success this function returns TRUE. On failure, it returns FALSE.
 | 
	
	
		
			
				|  | @@ -121,6 +131,13 @@ function tripal_core_chado_insert($table, $values, $options) {
 | 
	
		
			
				|  |  |      $build_sql = TRUE;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  if (array_key_exists('skip_validation', $options)) {
 | 
	
		
			
				|  |  | +    $validate = !$options['skip_validation'];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  | +    $validate = TRUE;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // get the table description
 | 
	
		
			
				|  |  |    $table_desc = module_invoke_all('chado_' . $table . '_schema');
 | 
	
		
			
				|  |  |    if (empty($table_desc)) {
 | 
	
	
		
			
				|  | @@ -149,48 +166,52 @@ function tripal_core_chado_insert($table, $values, $options) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // check for violation of any unique constraints
 | 
	
		
			
				|  |  | -  $ukeys = $table_desc['unique keys'];
 | 
	
		
			
				|  |  | -  $ukselect_cols = array();
 | 
	
		
			
				|  |  | -  $ukselect_vals = array();
 | 
	
		
			
				|  |  | -  if ($ukeys) {
 | 
	
		
			
				|  |  | -    foreach ($ukeys as $name => $fields) {
 | 
	
		
			
				|  |  | -      foreach ($fields as $index => $field) {
 | 
	
		
			
				|  |  | -        // build the arrays for performing a select that will check the contraint
 | 
	
		
			
				|  |  | -        array_push($ukselect_cols, $field);
 | 
	
		
			
				|  |  | -        $ukselect_vals[$field] = $insert_values[$field];
 | 
	
		
			
				|  |  | +  if ($validate) {
 | 
	
		
			
				|  |  | +    dpm('validate');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // check for violation of any unique constraints
 | 
	
		
			
				|  |  | +    $ukeys = $table_desc['unique keys'];
 | 
	
		
			
				|  |  | +    $ukselect_cols = array();
 | 
	
		
			
				|  |  | +    $ukselect_vals = array();
 | 
	
		
			
				|  |  | +    if ($ukeys) {
 | 
	
		
			
				|  |  | +      foreach ($ukeys as $name => $fields) {
 | 
	
		
			
				|  |  | +        foreach ($fields as $index => $field) {
 | 
	
		
			
				|  |  | +          // build the arrays for performing a select that will check the contraint
 | 
	
		
			
				|  |  | +          array_push($ukselect_cols, $field);
 | 
	
		
			
				|  |  | +          $ukselect_vals[$field] = $insert_values[$field];
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        // now check the constraint
 | 
	
		
			
				|  |  | +        if (tripal_core_chado_select($table, $ukselect_cols, $ukselect_vals)) {
 | 
	
		
			
				|  |  | +          watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate record into $table table: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  | +          return FALSE;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -      // now check the constraint
 | 
	
		
			
				|  |  | -      if (tripal_core_chado_select($table, $ukselect_cols, $ukselect_vals)) {
 | 
	
		
			
				|  |  | -        watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate record into $table table: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // if trying to insert a field that is the primary key, make sure it also is unique
 | 
	
		
			
				|  |  | +    $pkey = $table_desc['primary key'][0];
 | 
	
		
			
				|  |  | +    if ($insert_values[$pkey]) {
 | 
	
		
			
				|  |  | +      if (tripal_core_chado_select($table, array($pkey), array($pkey => $insert_values[$pkey]))) {
 | 
	
		
			
				|  |  | +        watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate primary key into $table table: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  |          return FALSE;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  // if trying to insert a field that is the primary key, make sure it also is unique
 | 
	
		
			
				|  |  | -  $pkey = $table_desc['primary key'][0];
 | 
	
		
			
				|  |  | -  if ($insert_values[$pkey]) {
 | 
	
		
			
				|  |  | -    if (tripal_core_chado_select($table, array($pkey), array($pkey => $insert_values[$pkey]))) {
 | 
	
		
			
				|  |  | -      watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate primary key into $table table: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  | -      return FALSE;
 | 
	
		
			
				|  |  | +    // make sure required fields have a value
 | 
	
		
			
				|  |  | +    $fields = $table_desc['fields'];
 | 
	
		
			
				|  |  | +    if (!is_array($fields)) {
 | 
	
		
			
				|  |  | +      $fields = array();
 | 
	
		
			
				|  |  | +      watchdog('tripal_core', "tripal_core_chado_insert: %table not defined in tripal schema api", array('%table' => $table), 'WATCHDOG WARNING');
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  // make sure required fields have a value
 | 
	
		
			
				|  |  | -  $fields = $table_desc['fields'];
 | 
	
		
			
				|  |  | -  if (!is_array($fields)) {
 | 
	
		
			
				|  |  | -    $fields = array();
 | 
	
		
			
				|  |  | -    watchdog('tripal_core', "tripal_core_chado_insert: %table not defined in tripal schema api", array('%table' => $table), 'WATCHDOG WARNING');
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  foreach ($fields as $field => $def) {
 | 
	
		
			
				|  |  | -    // a field is considered missing if it cannot be NULL and there is no default
 | 
	
		
			
				|  |  | -    // 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) {
 | 
	
		
			
				|  |  | -      watchdog('tripal_core', "tripal_core_chado_insert: Field $table.$field cannot be NULL: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  | -      return FALSE;
 | 
	
		
			
				|  |  | +    foreach ($fields as $field => $def) {
 | 
	
		
			
				|  |  | +      // a field is considered missing if it cannot be NULL and there is no default
 | 
	
		
			
				|  |  | +      // 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) {
 | 
	
		
			
				|  |  | +        watchdog('tripal_core', "tripal_core_chado_insert: Field $table.$field cannot be NULL: " . print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  | +        return FALSE;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  } //end of validation
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Now build the insert SQL statement
 | 
	
		
			
				|  |  |    $ifields = array(); //contains the names of the fields
 |