|  | @@ -143,7 +143,7 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |      // will not recreate it, but if not it will create one and store it in
 | 
	
		
			
				|  |  |      // a Drupal variable for reuse later.
 | 
	
		
			
				|  |  |      $connection = tripal_db_persistent_chado();
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // if we cannot get a connection the abandon the prepared statement
 | 
	
		
			
				|  |  |      if (!$connection) {
 | 
	
		
			
				|  |  |         $prepared = FALSE;
 | 
	
	
		
			
				|  | @@ -172,15 +172,15 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |    // that has all the values needed for insert with all foreign relationsihps
 | 
	
		
			
				|  |  |    // resolved.
 | 
	
		
			
				|  |  |    foreach ($values as $field => $value) {
 | 
	
		
			
				|  |  | -    // make sure the field is in the table description. If not then return an error 
 | 
	
		
			
				|  |  | +    // make sure the field is in the table description. If not then return an error
 | 
	
		
			
				|  |  |      // message
 | 
	
		
			
				|  |  |      if (!array_key_exists($field, $table_desc['fields'])) {
 | 
	
		
			
				|  |  |        watchdog('tripal_core', "tripal_core_chado_insert: The field '%field' does not exist ".
 | 
	
		
			
				|  |  | -        "for the table '%table'.  Cannot perform insert. Values: %array", 
 | 
	
		
			
				|  |  | +        "for the table '%table'.  Cannot perform insert. Values: %array",
 | 
	
		
			
				|  |  |          array('%field' => $field, '%table' => $table, '%array' => print_r($values, 1)), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |        return FALSE;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      if (is_array($value)) {
 | 
	
		
			
				|  |  |        $foreign_options = array();
 | 
	
		
			
				|  |  |        if ($options['statement_name']) {
 | 
	
	
		
			
				|  | @@ -210,7 +210,7 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |        $insert_values[$field] = $value;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if ($validate) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      // check for violation of any unique constraints
 | 
	
	
		
			
				|  | @@ -240,13 +240,13 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |            $coptions = array('statement_name' => 'uqsel_' . $table . '_' . $name);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (tripal_core_chado_select($table, $ukselect_cols, $ukselect_vals, $coptions)) {
 | 
	
		
			
				|  |  | -          watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate record into $table table: " . 
 | 
	
		
			
				|  |  | +          watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate record 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
 | 
	
		
			
				|  |  |      if (array_key_exists('primary key', $table_desc)) {
 | 
	
		
			
				|  |  |        $pkey = $table_desc['primary key'][0];
 | 
	
	
		
			
				|  | @@ -259,21 +259,21 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    // make sure required fields have a value     
 | 
	
		
			
				|  |  | +    // make sure required fields have a value
 | 
	
		
			
				|  |  |      if (!is_array($table_desc['fields'])) {
 | 
	
		
			
				|  |  |        $table_desc['fields'] = array();
 | 
	
		
			
				|  |  | -      watchdog('tripal_core', "tripal_core_chado_insert: %table missing fields: \n %schema", 
 | 
	
		
			
				|  |  | +      watchdog('tripal_core', "tripal_core_chado_insert: %table missing fields: \n %schema",
 | 
	
		
			
				|  |  |          array('%table' => $table, '%schema' => print_r($table_desc, 1)), WATCHDOG_WARNING);
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      foreach ($table_desc['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 (array_key_exists('NOT NULL', $def) and 
 | 
	
		
			
				|  |  | -          !array_key_exists($field, $insert_values) and 
 | 
	
		
			
				|  |  | +      if (array_key_exists('NOT NULL', $def) and
 | 
	
		
			
				|  |  | +          !array_key_exists($field, $insert_values) and
 | 
	
		
			
				|  |  |            !array_key_exists('default', $def) and
 | 
	
		
			
				|  |  |            strcmp($def['type'], serial) != 0) {
 | 
	
		
			
				|  |  | -        watchdog('tripal_core', "tripal_core_chado_insert: Field $table.$field cannot be NULL: " . 
 | 
	
		
			
				|  |  | +        watchdog('tripal_core', "tripal_core_chado_insert: Field $table.$field cannot be NULL: " .
 | 
	
		
			
				|  |  |            print_r($values, 1), array(), 'WATCHDOG_ERROR');
 | 
	
		
			
				|  |  |          return FALSE;
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -315,7 +315,7 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
 | 
	
		
			
				|  |  |        $idatatypes[] = 'text';
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // create the SQL
 | 
	
		
			
				|  |  |    $sql = "INSERT INTO {$table} (" . implode(", ", $ifields) . ") VALUES (" . implode(", ", $itypes) . ")";
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -452,7 +452,7 @@ function tripal_core_chado_update($table, $match, $values, $options = NULL) {
 | 
	
		
			
				|  |  |      // will not recreate it, but if not it will create one and store it in
 | 
	
		
			
				|  |  |      // a Drupal variable for reuse later.
 | 
	
		
			
				|  |  |      $connection = tripal_db_persistent_chado();
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // if we cannot get a connection the abandon the prepared statement
 | 
	
		
			
				|  |  |      if (!$connection ) {
 | 
	
		
			
				|  |  |         $prepared = FALSE;
 | 
	
	
		
			
				|  | @@ -962,7 +962,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |      // will not recreate it, but if not it will create one and store it in
 | 
	
		
			
				|  |  |      // a Drupal variable for reuse later.
 | 
	
		
			
				|  |  |      $connection = tripal_db_persistent_chado();
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // if we cannot get a connection the abandon the prepared statement
 | 
	
		
			
				|  |  |      if (!$connection) {
 | 
	
		
			
				|  |  |        $prepared = FALSE;
 | 
	
	
		
			
				|  | @@ -973,7 +973,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |      //print "NO STATEMENT (select): $table\n";
 | 
	
		
			
				|  |  |      //debug_print_backtrace();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // check that our columns and values arguments are proper arrays
 | 
	
		
			
				|  |  |    if (!is_array($columns)) {
 | 
	
		
			
				|  |  |      watchdog('tripal_core', 'the $columns argument for tripal_core_chado_select must be an array.');
 | 
	
	
		
			
				|  | @@ -996,7 +996,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |    if ($options['is_duplicate'] and array_key_exists('unique keys', $table_desc)) {
 | 
	
		
			
				|  |  |      $ukeys = $table_desc['unique keys'];
 | 
	
		
			
				|  |  |      $has_results = 0;
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // iterate through the unique constraints and reset the values and columns
 | 
	
		
			
				|  |  |      // arrays to only include these fields
 | 
	
		
			
				|  |  |      foreach ($ukeys as $cname => $fields) {
 | 
	
	
		
			
				|  | @@ -1008,8 +1008,8 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |        $new_options = array();
 | 
	
		
			
				|  |  |        $uq_sname = "uq_" . $table . "_";
 | 
	
		
			
				|  |  |        $has_pkey = 0;
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        // include the primary key in the results returned
 | 
	
		
			
				|  |  |        if (array_key_exists('primary key', $table_desc)) {
 | 
	
		
			
				|  |  |          $has_pkey = 1;
 | 
	
	
		
			
				|  | @@ -1018,8 +1018,8 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |            array_push($new_columns, $key);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | -      // recreate the $values and $columns arrays 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      // recreate the $values and $columns arrays
 | 
	
		
			
				|  |  |        foreach ($fields as $field) {
 | 
	
		
			
				|  |  |          if (array_key_exists($field, $values)) {
 | 
	
		
			
				|  |  |            $new_values[$field] = $values[$field];
 | 
	
	
		
			
				|  | @@ -1029,7 +1029,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |              array_push($new_columns, $field);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        // if the field doesn't exist in the values array then 
 | 
	
		
			
				|  |  | +        // if the field doesn't exist in the values array then
 | 
	
		
			
				|  |  |          // substitute any default values
 | 
	
		
			
				|  |  |          elseif (array_key_exists('default', $table_desc['fields'][$field])) {
 | 
	
		
			
				|  |  |            $new_values[$field] = $table_desc['fields'][$field]['default'];
 | 
	
	
		
			
				|  | @@ -1038,41 +1038,54 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |              array_push($new_columns, $field);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +        // if there is no value (default or otherwise) check if this field is
 | 
	
		
			
				|  |  | +        // allowed to be null
 | 
	
		
			
				|  |  | +        elseif (!$table_desc['fields'][$field]['not null']) {
 | 
	
		
			
				|  |  | +        	$new_values[$field] = NULL;
 | 
	
		
			
				|  |  | +          $uq_sname .= "n".substr($field, 0, 2);
 | 
	
		
			
				|  |  | +          if (!$has_pkey) {
 | 
	
		
			
				|  |  | +            array_push($new_columns, $field);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |          // if the array key doesn't exist in the values given by the caller
 | 
	
		
			
				|  |  |          // and there is no default value then we cannot check if the record
 | 
	
		
			
				|  |  |          // is a duplicate so return FALSE
 | 
	
		
			
				|  |  |          else {
 | 
	
		
			
				|  |  | +        	watchdog('tripal_core', "tripal_core_chado_select: There is no value for %field"
 | 
	
		
			
				|  |  | +        		." thus we cannot check if this record is unique",
 | 
	
		
			
				|  |  | +        		array('%field' => $field), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |            return FALSE;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        $new_options['statement_name'] = $uq_sname;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        $results = tripal_core_chado_select($table, $new_columns, $new_values, $new_options);
 | 
	
		
			
				|  |  |        // if we have a duplicate record then return the results
 | 
	
		
			
				|  |  |        if (count($results) > 0) {
 | 
	
		
			
				|  |  |          $has_results = 1;
 | 
	
		
			
				|  |  | -      } 
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        unset($new_columns);
 | 
	
		
			
				|  |  |        unset($new_values);
 | 
	
		
			
				|  |  |        unset($new_options);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      if ($options['has_record'] and $has_results) {
 | 
	
		
			
				|  |  |        return TRUE;
 | 
	
		
			
				|  |  | -    } 
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  |        return $results;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    foreach ($values as $field => $value) {
 | 
	
		
			
				|  |  | -    // make sure the field is in the table description. If not then return an error 
 | 
	
		
			
				|  |  | +    // make sure the field is in the table description. If not then return an error
 | 
	
		
			
				|  |  |      // message
 | 
	
		
			
				|  |  |      if (!array_key_exists($field, $table_desc['fields'])) {
 | 
	
		
			
				|  |  |        watchdog('tripal_core', "tripal_core_chado_select: The field '%field' does not exist ".
 | 
	
		
			
				|  |  | -        "for the table '%table'.  Cannot perform query. Values: %array", 
 | 
	
		
			
				|  |  | +        "for the table '%table'.  Cannot perform query. Values: %array",
 | 
	
		
			
				|  |  |          array('%field' => $field, '%table' => $table, '%array' => print_r($values, 1)), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |        return array();
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      $select[] = $field;
 | 
	
		
			
				|  |  |      if (is_array($value)) {
 | 
	
		
			
				|  |  |        // if the user has specified multiple values for matching then this we
 | 
	
	
		
			
				|  | @@ -1119,8 +1132,12 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  | -      //need to catch a 0 and make int if integer field
 | 
	
		
			
				|  |  | -      if ($table_desc['fields'][$field]['type'] == 'int') {
 | 
	
		
			
				|  |  | +      // need to catch a 0 and make int if integer field
 | 
	
		
			
				|  |  | +      // but we don't want to catch a NULL
 | 
	
		
			
				|  |  | +      if ($value === NULL) {
 | 
	
		
			
				|  |  | +      	$where[$field] = NULL;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      elseif ($table_desc['fields'][$field]['type'] == 'int') {
 | 
	
		
			
				|  |  |          $where[$field][] = (int) $value;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        else {
 | 
	
	
		
			
				|  | @@ -1161,6 +1178,13 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |            $prepared = FALSE;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | +      // if we have a null value then we need an IS NULL in our where statement
 | 
	
		
			
				|  |  | +      elseif ($value === NULL) {
 | 
	
		
			
				|  |  | +				$sql .= "$field IS NULL AND ";
 | 
	
		
			
				|  |  | +				$psql .= "$field IS NULL AND ";
 | 
	
		
			
				|  |  | +				// Need to remove one from the argument count b/c nulls don't add an argument
 | 
	
		
			
				|  |  | +				$i--;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        // if we have a single value then we need an = in our where statement
 | 
	
		
			
				|  |  |        else {
 | 
	
		
			
				|  |  |          $operator = '=';
 | 
	
	
		
			
				|  | @@ -1249,7 +1273,6 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |      // if this is the first time we've run this query
 | 
	
		
			
				|  |  |      // then we need to do the prepare, otherwise just execute
 | 
	
		
			
				|  |  |      if ($options['is_prepared'] != TRUE) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |        $status = tripal_core_chado_prepare($options['statement_name'], $psql, $idatatypes);
 | 
	
		
			
				|  |  |        if (!$status) {
 | 
	
		
			
				|  |  |          return FALSE;
 | 
	
	
		
			
				|  | @@ -1262,8 +1285,8 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    else {
 | 
	
		
			
				|  |  |      $resource = chado_query($sql, $args);
 | 
	
		
			
				|  |  | -  } 
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // format results into an array
 | 
	
		
			
				|  |  |    $results = array();
 | 
	
		
			
				|  |  |    while ($r = db_fetch_object($resource)) {
 | 
	
	
		
			
				|  | @@ -1414,19 +1437,19 @@ function tripal_core_chado_get_foreign_key($table_desc, $field, $values, $option
 | 
	
		
			
				|  |  |   *   if more than one are returned.  The options must be compatible with
 | 
	
		
			
				|  |  |   *   the options accepted by the tripal_core_chado_select() function.
 | 
	
		
			
				|  |  |   *   Additionally,  These options are available for this function:
 | 
	
		
			
				|  |  | - *   -return_array: 
 | 
	
		
			
				|  |  | - *     can be provided to force the function to always return an array. Default 
 | 
	
		
			
				|  |  | - *     behavior is to return a single record if only one record exists or to return 
 | 
	
		
			
				|  |  | + *   -return_array:
 | 
	
		
			
				|  |  | + *     can be provided to force the function to always return an array. Default
 | 
	
		
			
				|  |  | + *     behavior is to return a single record if only one record exists or to return
 | 
	
		
			
				|  |  |   *     an array if multiple records exist.
 | 
	
		
			
				|  |  | - *  - include_fk: 
 | 
	
		
			
				|  |  | - *     an array of FK relationships to fallow. By default, the 
 | 
	
		
			
				|  |  | + *  - include_fk:
 | 
	
		
			
				|  |  | + *     an array of FK relationships to fallow. By default, the
 | 
	
		
			
				|  |  |   *     tripal_core_chado_select function will follow all FK relationships but this
 | 
	
		
			
				|  |  |   *     may generate more queries then is desired.  Provide an array specifying the
 | 
	
		
			
				|  |  |   *     fields to include.  For example, if including the cvterm, cv and dbxref records
 | 
	
		
			
				|  |  |   *     for a property the following array would work:
 | 
	
		
			
				|  |  |   *        array('type_id' => array('cv_id' => 1, 'dbxref_id' => 1)).
 | 
	
		
			
				|  |  | - *     Typicall, to expadn a property, this function would also include the db record 
 | 
	
		
			
				|  |  | - *     through the db_id foreign key with the dbxref and db tables, but becuase 
 | 
	
		
			
				|  |  | + *     Typicall, to expadn a property, this function would also include the db record
 | 
	
		
			
				|  |  | + *     through the db_id foreign key with the dbxref and db tables, but becuase
 | 
	
		
			
				|  |  |   *     it is not included in the array it will not be included in the results.
 | 
	
		
			
				|  |  |   * @return
 | 
	
		
			
				|  |  |   *   Either an object (if only one record was selected from the base table)
 | 
	
	
		
			
				|  | @@ -1470,7 +1493,7 @@ function tripal_core_chado_get_foreign_key($table_desc, $field, $values, $option
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_core_generate_chado_var($table, $values, $base_options = array()) {
 | 
	
		
			
				|  |  |    $all = new stdClass();
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    $return_array = 0;
 | 
	
		
			
				|  |  |    if (array_key_exists('return_array', $base_options)) {
 | 
	
		
			
				|  |  |      $return_array = 1;
 | 
	
	
		
			
				|  | @@ -1622,9 +1645,9 @@ function tripal_core_generate_chado_var($table, $values, $base_options = array()
 | 
	
		
			
				|  |  |              if (empty($object->{$foreign_key})) {
 | 
	
		
			
				|  |  |                continue;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              if ($include_fk) {
 | 
	
		
			
				|  |  | -              // don't recurse if the callee has supplied an $fk_include list and this 
 | 
	
		
			
				|  |  | +              // don't recurse if the callee has supplied an $fk_include list and this
 | 
	
		
			
				|  |  |                // FK table is not in the list.
 | 
	
		
			
				|  |  |                if (is_array($include_fk) and !array_key_exists($foreign_key, $include_fk)) {
 | 
	
		
			
				|  |  |                  continue;
 | 
	
	
		
			
				|  | @@ -1632,12 +1655,12 @@ function tripal_core_generate_chado_var($table, $values, $base_options = array()
 | 
	
		
			
				|  |  |                // if we have the option but it is not an array then we don't recurse any furutehr
 | 
	
		
			
				|  |  |                if (!is_array($include_fk)) {
 | 
	
		
			
				|  |  |                  continue;
 | 
	
		
			
				|  |  | -              }  
 | 
	
		
			
				|  |  | -            } 
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |              // get the record from the foreign table
 | 
	
		
			
				|  |  |              $foreign_values = array($primary_key => $object->{$foreign_key});
 | 
	
		
			
				|  |  |              $options = array();
 | 
	
		
			
				|  |  | -            if (is_array($include_fk)) {              
 | 
	
		
			
				|  |  | +            if (is_array($include_fk)) {
 | 
	
		
			
				|  |  |                $options['include_fk'] = $include_fk[$foreign_key];
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              $foreign_object = tripal_core_generate_chado_var($foreign_table, $foreign_values, $options);
 | 
	
	
		
			
				|  | @@ -1743,7 +1766,7 @@ function tripal_core_generate_chado_var($table, $values, $base_options = array()
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_core_expand_chado_vars($object, $type, $to_expand, $table_options = array()) {
 | 
	
		
			
				|  |  |    $base_table = $object->tablename;
 | 
	
		
			
				|  |  | - 
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // check to see if we are expanding an array of objects
 | 
	
		
			
				|  |  |    if (is_array($object)) {
 | 
	
		
			
				|  |  |      foreach ($object as $index => $o) {
 | 
	
	
		
			
				|  | @@ -1787,7 +1810,7 @@ function tripal_core_expand_chado_vars($object, $type, $to_expand, $table_option
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case "table": //--------------------------------------------------------------------------------
 | 
	
		
			
				|  |  |        $foreign_table = $to_expand;
 | 
	
		
			
				|  |  | -      
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        // don't expand the table it already is expanded
 | 
	
		
			
				|  |  |        if (array_key_exists($foreign_table, $object)) {
 | 
	
		
			
				|  |  |          return $object;
 | 
	
	
		
			
				|  | @@ -1808,7 +1831,7 @@ function tripal_core_expand_chado_vars($object, $type, $to_expand, $table_option
 | 
	
		
			
				|  |  |            // if a prepared statement is provide then generate a new name
 | 
	
		
			
				|  |  |            $new_options = $table_options;
 | 
	
		
			
				|  |  |            if (array_key_exists('statement_name', $table_options)) {
 | 
	
		
			
				|  |  | -             $new_options['statement_name'] = "exp_" . $foreign_table . "_" . substr($left, 0, 2) . substr($right, 0, 2); 
 | 
	
		
			
				|  |  | +             $new_options['statement_name'] = "exp_" . $foreign_table . "_" . substr($left, 0, 2) . substr($right, 0, 2);
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |            $foreign_object = tripal_core_generate_chado_var($foreign_table, array($left => $object->{$right}), $new_options);
 | 
	
		
			
				|  |  |            if ($foreign_object) {
 | 
	
	
		
			
				|  | @@ -1830,7 +1853,7 @@ function tripal_core_expand_chado_vars($object, $type, $to_expand, $table_option
 | 
	
		
			
				|  |  |            // if the object returned is NULL then handle that
 | 
	
		
			
				|  |  |            else {
 | 
	
		
			
				|  |  |              if (count($foreign_table_desc['foreign keys'][$base_table]['columns']) > 1) {
 | 
	
		
			
				|  |  | -              $object->{$foreign_table}->{$left} = NULL;                 
 | 
	
		
			
				|  |  | +              $object->{$foreign_table}->{$left} = NULL;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              else {
 | 
	
		
			
				|  |  |                $object->{$foreign_table} = NULL;
 | 
	
	
		
			
				|  | @@ -1854,7 +1877,7 @@ function tripal_core_expand_chado_vars($object, $type, $to_expand, $table_option
 | 
	
		
			
				|  |  |            watchdog('tripal_core', 'tripal_core_expand_chado_vars: Could not expand table, %table. It is ',
 | 
	
		
			
				|  |  |              'not in a foreign key relationship with the base object nor with any other expanded table. ' .
 | 
	
		
			
				|  |  |              'Check the table definition to ensure that a proper foreign key relationship is present.',
 | 
	
		
			
				|  |  | -            array('%table' => $foreign_table), WATCHDOG_ERROR);   
 | 
	
		
			
				|  |  | +            array('%table' => $foreign_table), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        break;
 | 
	
	
		
			
				|  | @@ -2017,7 +2040,7 @@ function chado_query($sql) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Execute the query on the chado database/schema
 | 
	
		
			
				|  |  |    // Use the persistent chado connection if it already exists
 | 
	
		
			
				|  |  | -  $persistent_connection = variable_get('tripal_persistent_chado', NULL);  
 | 
	
		
			
				|  |  | +  $persistent_connection = variable_get('tripal_persistent_chado', NULL);
 | 
	
		
			
				|  |  |    if ($persistent_connection) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      $query = $sql;
 | 
	
	
		
			
				|  | @@ -2054,7 +2077,7 @@ function chado_query($sql) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      // END COPY FROM _db_query in database.pgsql.inc
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  else {    
 | 
	
		
			
				|  |  | +  else {
 | 
	
		
			
				|  |  |      $previous_db = tripal_db_set_active('chado');
 | 
	
		
			
				|  |  |      $results = _db_query($sql);
 | 
	
		
			
				|  |  |      tripal_db_set_active($previous_db);
 | 
	
	
		
			
				|  | @@ -2483,7 +2506,7 @@ function tripal_db_set_active($dbname  = 'default') {
 | 
	
		
			
				|  |  |      // fails then do nothing.
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  |        if (tripal_db_set_chado_search_path($dbname)) {
 | 
	
		
			
				|  |  | -         // if the chado schema is local to Drupal then 
 | 
	
		
			
				|  |  | +         // if the chado schema is local to Drupal then
 | 
	
		
			
				|  |  |           // just return the active database.
 | 
	
		
			
				|  |  |           return 'default';
 | 
	
		
			
				|  |  |        }
 | 
	
	
		
			
				|  | @@ -2547,7 +2570,7 @@ function tripal_db_set_chado_search_path($dbname) {
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_db_set_default_search_path() {
 | 
	
		
			
				|  |  |    // we make the assumption that the default schema is 'public'.
 | 
	
		
			
				|  |  | -  $chado_exists = variable_get('chado_schema_exists', FALSE); 
 | 
	
		
			
				|  |  | +  $chado_exists = variable_get('chado_schema_exists', FALSE);
 | 
	
		
			
				|  |  |    if ($chado_exists) {
 | 
	
		
			
				|  |  |      db_query('set search_path to %s', 'public,chado');
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -2609,12 +2632,12 @@ function tripal_core_is_sql_prepared($statement_name) {
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_core_chado_prepare($statement_name, $psql, $args) {
 | 
	
		
			
				|  |  |    $connection = variable_get('tripal_persistent_chado', NULL);
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if (!$connection) {
 | 
	
		
			
				|  |  |      watchdog('tripal_core', "chado_prepare: not able to prepare '%name' statement as no persistent connection is available", array('%name' => $statement_name, '%sql' => $psql), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |      return FALSE;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // Check to see if this statement was already prepared
 | 
	
		
			
				|  |  |    if (tripal_core_is_sql_prepared($statement_name)) {
 | 
	
		
			
				|  |  |      // check that the arguments are the same
 | 
	
	
		
			
				|  | @@ -2626,8 +2649,8 @@ function tripal_core_chado_prepare($statement_name, $psql, $args) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  |        // Although a statement with this name is already prepared it is not the same!
 | 
	
		
			
				|  |  | -      watchdog('tripal_core', "chado_prepare: '%name' statement already prepared with different arguments! You want to prepare %sql with %values and the existing statement is %esql with %existing", 
 | 
	
		
			
				|  |  | -        array('%name' => $statement_name, '%sql' => $psql, '%values' => print_r($args, TRUE), '%esql' => $prepared_sql, 
 | 
	
		
			
				|  |  | +      watchdog('tripal_core', "chado_prepare: '%name' statement already prepared with different arguments! You want to prepare %sql with %values and the existing statement is %esql with %existing",
 | 
	
		
			
				|  |  | +        array('%name' => $statement_name, '%sql' => $psql, '%values' => print_r($args, TRUE), '%esql' => $prepared_sql,
 | 
	
		
			
				|  |  |            '%existing' => print_r($prepared_args, TRUE)), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |        return FALSE;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -2660,7 +2683,7 @@ function tripal_core_chado_prepare($statement_name, $psql, $args) {
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_core_chado_execute_prepared($statement_name, $sql, $values) {
 | 
	
		
			
				|  |  |    $connection = variable_get('tripal_persistent_chado', NULL);
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    if (!tripal_core_is_sql_prepared($statement_name)) {
 | 
	
		
			
				|  |  |      watchdog('tripal_core', "tripal_core_chado_execute_prepared: Cannot execute an unprepared statement: '%name'", array('%name' => $statement_name), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |      return FALSE;
 | 
	
	
		
			
				|  | @@ -2729,8 +2752,8 @@ function tripal_core_chado_execute_prepared($statement_name, $sql, $values) {
 | 
	
		
			
				|  |  |      return $resource;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    else {
 | 
	
		
			
				|  |  | -    watchdog('tripal_core', "chado_execute_prepared: wrong number of arguments supplied for '%name' statement. Expected %required but recieved %values",
 | 
	
		
			
				|  |  | -      array('%name' => $statement_name, '%required' => print_r($required_values, TRUE), '%values' => print_r($values, TRUE)), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  | +    watchdog('tripal_core', "chado_execute_prepared: wrong number of arguments supplied for '%name' statement. Expected %required but recieved %values. Statement: %statement.",
 | 
	
		
			
				|  |  | +      array('%name' => $statement_name, '%required' => print_r($required_values, TRUE), '%values' => print_r($values, TRUE), '%statement' => $_SESSION['prepared_sql'][$connection][$statement_name]), WATCHDOG_ERROR);
 | 
	
		
			
				|  |  |      return FALSE;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -2749,7 +2772,7 @@ function tripal_db_persistent_chado() {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // get connection if it already exists
 | 
	
		
			
				|  |  |    // Otherwise we need to set it
 | 
	
		
			
				|  |  | -  $sconn = variable_get('tripal_persistent_chado', NULL); 
 | 
	
		
			
				|  |  | +  $sconn = variable_get('tripal_persistent_chado', NULL);
 | 
	
		
			
				|  |  |    if ($sconn) {
 | 
	
		
			
				|  |  |      return $sconn;
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -2768,7 +2791,7 @@ function tripal_db_persistent_chado() {
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        else {
 | 
	
		
			
				|  |  |          $connection = db_connect($db_url);
 | 
	
		
			
				|  |  | -      }      
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        if (!$connection) {
 | 
	
		
			
				|  |  |          variable_set('tripal_persistent_chado', NULL);
 | 
	
		
			
				|  |  |          watchdog('tripal_core', "Could not create persistant connection", array(), WATCHDOG_ERROR);
 | 
	
	
		
			
				|  | @@ -2794,9 +2817,9 @@ function tripal_db_release_persistent_chado() {
 | 
	
		
			
				|  |  |  function tripal_db_start_transaction() {
 | 
	
		
			
				|  |  |    $connection = tripal_db_persistent_chado();
 | 
	
		
			
				|  |  |    if ($connection) {
 | 
	
		
			
				|  |  | -    chado_query("BEGIN");  
 | 
	
		
			
				|  |  | +    chado_query("BEGIN");
 | 
	
		
			
				|  |  |      return $connection;
 | 
	
		
			
				|  |  | -  } 
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    return FALSE;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2988,10 +3011,10 @@ function tripal_core_schema_exists($schema) {
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function tripal_core_get_chado_tables($include_custom = NULL) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // first get the chado version that is installed
 | 
	
		
			
				|  |  |    $v = tripal_core_get_chado_version();
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    $tables = array();
 | 
	
		
			
				|  |  |    if ($v == '1.2') {
 | 
	
		
			
				|  |  |      $tables_v1_2 = tripal_core_chado_get_v1_2_tables();
 | 
	
	
		
			
				|  | @@ -3005,12 +3028,12 @@ function tripal_core_get_chado_tables($include_custom = NULL) {
 | 
	
		
			
				|  |  |        $tables[$table] = $table;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // now add in the custom tables too if requested
 | 
	
		
			
				|  |  |    if ($include_custom) {
 | 
	
		
			
				|  |  |      $sql = "SELECT table_name FROM {tripal_custom_tables}";
 | 
	
		
			
				|  |  |      $resource = db_query($sql);
 | 
	
		
			
				|  |  | -    
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      while ($r = db_fetch_object($resource)) {
 | 
	
		
			
				|  |  |        $tables[$r->table_name] = $r->table_name;
 | 
	
		
			
				|  |  |      }
 |