| 
					
				 | 
			
			
				@@ -117,17 +117,37 @@ require_once "tripal_core.schema_v1.11.api.inc"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @ingroup tripal_chado_api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $insert_values = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // we need to get a persistent connection.  If one exists this function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // will not recreate it, but if not it will create one and store it in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // a Drupal variable for reuse later. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tripal_db_persistent_chado(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // set defaults for options. If we don't set defaults then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // we get memory leaks when we try to access the elements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!is_array($options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('is_prepared', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['is_prepared'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('statement_name',$options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['statement_name'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('skip_validation',$options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['skip_validation'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $insert_values = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Determine plan of action 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // we have a prepared statment (or want to create one) so set $prepared = TRUE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $prepared = TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // we need to get a persistent connection.  If one exists this function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     print "NO STATEMENT (insert): $table\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     debug_print_backtrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (array_key_exists('skip_validation', $options)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -148,8 +168,16 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // resolved. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (is_array($value)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $foreign_options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // add the fk relationship info to the prepared statement name so that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // we can prepare the selects run by the recrusive tripal_core_chado_get_foreign_key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $foreign_options['statement_name'] = "fk_" . $table . "_" . $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // select the value from the foreign key relationship for this value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value, $foreign_options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         watchdog('tripal_core', 'tripal_core_chado_insert: Too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -175,11 +203,12 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       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_cols[] = $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $ukselect_vals[$field] = $insert_values[$field]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // now check the constraint 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (tripal_core_chado_select($table, $ukselect_cols, $ukselect_vals)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $coptions = array('statement_name' => 'uqsel_' . $table . '_' . implode('_',$ukselect_cols)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        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: " . print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -189,7 +218,8 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // 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]))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $coptions = array('statement_name' => 'pqsel_' . $table . '_' . $pkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (tripal_core_chado_select($table, array($pkey), array($pkey => $insert_values[$pkey]), $coptions)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         watchdog('tripal_core', "tripal_core_chado_insert: Cannot insert duplicate primary key into $table table: " . print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -211,11 +241,11 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } //end of validation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Now build the insert SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ifields = array(); //contains the names of the fields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $ivalues = array(); //contains the values of the fields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $itypes = array(); // contains %d/%s placeholders for the sql query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $ifields = array();       // contains the names of the fields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $ivalues = array();       // contains the values of the fields 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $itypes = array();        // contains %d/%s placeholders for the sql query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $iplaceholders = array(); // contains $1/$2 placeholders for the prepare query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $idatatypes = array(); //contains the data type of the fields (int, text, etc.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $idatatypes = array();    // contains the data type of the fields (int, text, etc.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $i = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($insert_values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $ifields[] = $field; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -227,8 +257,8 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $idatatypes[] = "NULL"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     elseif (strcasecmp($table_desc['fields'][$field]['type'], 'serial')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      strcasecmp($table_desc['fields'][$field]['type'], 'int')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      strcasecmp($table_desc['fields'][$field]['type'], 'integer')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            strcasecmp($table_desc['fields'][$field]['type'], 'int')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            strcasecmp($table_desc['fields'][$field]['type'], 'integer')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $itypes[] = "%d"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $idatatypes[] = 'int'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -236,6 +266,10 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $itypes[] = "%s"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $idatatypes[] = 'bool'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elseif (strcasecmp($table_desc['fields'][$field]['type'], 'float')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $itypes[] = "%s"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'numeric'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $itypes[] = "'%s'"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $idatatypes[] = 'text'; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -292,22 +326,33 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Provides a generic function for deleting a record(s) from any chado table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Provides a generic routine for updating into any Chado table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Use this function to delete a record(s) in any Chado table.  The first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * argument specifies the table to delete from and the second is an array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * of values to match for locating the record(s) to be deleted.  The arrays 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * are mutli-dimensional such that foreign key lookup values can be specified. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Use this function to update a record in any Chado table.  The first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * argument specifies the table for inserting, the second is an array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * of values to matched for locating the record for updating, and the third 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * argument give the values to update.  The arrays are mutli-dimensional such 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * that foreign key lookup values can be specified. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @param $table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  The name of the chado table for inserting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @param $match 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  An associative array containing the values for locating a record to update. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param $values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  An associative array containing the values for updating. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * @param $options 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  An array of options such as: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - statement_name: the name of the prepared statement to use. If the statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     has not yet been prepared it will be prepared automatically. On subsequent 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     calls with the same statement_name only an execute on the previously 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     prepared statement will occur. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  - is_prepared: TRUE or FALSE. Whether or not the statement is prepared. By 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     default if the statement is not prepared it will be automatically. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     However to avoid this check, which requires a database query you can 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *     set this value to true and the check will not be performed. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *   On success this function returns TRUE. On failure, it returns FALSE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *  On success this function returns TRUE. On failure, it returns FALSE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Example usage: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @code 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -338,17 +383,46 @@ function tripal_core_chado_insert($table, $values, $options = array()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *   $result = tripal_core_chado_update('feature',$umatch,$uvalues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * The above code species that a feature with a given uniquename, organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * and type_id (the unique constraint for the feature table) will be deleted. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * and type_id (the unique constraint for the feature table) will be updated. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * The organism_id is specified as a nested array that uses the organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * foreign key constraint to lookup the specified values to find the exact 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * organism_id. The same nested struture is also used for specifying the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * values to update.  The function will find all records that match the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * columns specified and delete them. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * values to update.  The function will find the record that matches the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * columns specified and update the record with the avlues in the $uvalues array. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @ingroup tripal_chado_api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_core_chado_delete($table, $match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $delete_matches = array();  // contains the values for the where clause 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_core_chado_update($table, $match, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // set defaults for options. If we don't set defaults then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // we get memory leaks when we try to access the elements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!is_array($options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('is_prepared', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['is_prepared'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('statement_name',$options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['statement_name'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $update_values = array();   // contains the values to be updated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $update_matches = array();  // contains the values for the where clause 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Determine plan of action 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // we have a prepared statment (or want to create one) so set $prepared = TRUE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $prepared = TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // we need to get a persistent connection.  If one exists this function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     print "NO STATEMENT (update): $table\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     debug_print_backtrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get the table description 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $table_desc = tripal_core_get_chado_table_schema($table); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -356,87 +430,249 @@ function tripal_core_chado_delete($table, $match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get the values needed for matching in the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($match as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (is_array($value)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // if the user has specified an array of values to delete rather than 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      // FK relationships the keep those in our match 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (array_values($value) === $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $delete_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $foreign_options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // add the fk relationship info to the prepared statement name so that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // we can prepare the selects run by the recrusive tripal_core_chado_get_foreign_key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $foreign_options['statement_name'] =  "fk_" . $table . "_" . $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value, $foreign_options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        watchdog('tripal_core', 'tripal_core_chado_update: When trying to find record to update, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //watchdog('tripal_core', 'tripal_core_chado_update: When trying to find record to update, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          watchdog('tripal_core', 'tripal_core_chado_delete: When trying to find record to delete, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          //watchdog('tripal_core', 'tripal_core_chado_delete: When trying to find record to delete, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value,TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          $delete_matches[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $update_matches[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $delete_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $update_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // now build the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "DELETE FROM {$table} WHERE "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $dargs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($delete_matches as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (count($value) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= "$field IN (" . db_placeholders($value, 'varchar') . ") AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      foreach ($value as $v) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $dargs[] = $v; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // get the values used for updating 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  foreach ($values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (is_array($value)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $foreign_options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // select the value from the foreign key relationship for this value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // add the fk relationship info to the prepared statement name so that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // we can prepare the selects run by the recrusive tripal_core_chado_get_foreign_key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         // function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         $foreign_options['statement_name'] = "fk_" . $table . "_" . $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value, $foreign_options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        watchdog('tripal_core', 'tripal_core_chado_update: When trying to find update values, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //watchdog('tripal_core', 'tripal_core_chado_update: When trying to find update values, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value,TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $update_values[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $update_values[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // now build the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $sql  = "UPDATE {$table} SET "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $psql = "UPDATE {$table} SET "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $uargs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $idatatypes = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $pvalues = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $ivalues = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $i = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  foreach ($update_values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (strcasecmp($table_desc['fields'][$field]['type'], 'serial')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        strcasecmp($table_desc['fields'][$field]['type'], 'int')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        strcasecmp($table_desc['fields'][$field]['type'], 'integer')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (strcmp($value, '__NULL__') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $sql .= " $field = NULL AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %s, "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%s'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (strcmp($fields[$field]['type'], 'serial') == 0 or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        strcmp($fields[$field]['type'], 'int') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %d, "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%d'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'int'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elseif (strcasecmp($table_desc['fields'][$field]['type'], 'boolean')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " $field = %s, ";    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $pvalues[] = '%s';    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'bool'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elseif (strcasecmp($table_desc['fields'][$field]['type'], 'float')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " $field = %s, ";  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $pvalues[] = '%s';      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'numeric'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else {       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %s, "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%s'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = '%s', "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = "'%s'"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'text'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $psql .= "$field = \$" . $i . ", "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $sql = drupal_substr($sql, 0, -2);  // get rid of the trailing comma & space 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $psql = drupal_substr($psql, 0, -2);  // get rid of the trailing comma & space 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $sql .= " WHERE "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $psql .= " WHERE "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  foreach ($update_matches as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (strcasecmp($table_desc['fields'][$field]['type'], 'serial')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        strcasecmp($table_desc['fields'][$field]['type'], 'int')==0 OR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        strcasecmp($table_desc['fields'][$field]['type'], 'integer')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %s AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%s'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $sql .= " $field = %d AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value;  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%s';        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'int';      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elseif (strcasecmp($table_desc['fields'][$field]['type'], 'boolean')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " $field = %s AND ";      
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $pvalues[] = '%s';  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'bool'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    elseif (strcasecmp($table_desc['fields'][$field]['type'], 'float')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= " $field = %s AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $pvalues[] = '%s';       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'numeric'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else {       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %s AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = 'NULL'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = '%s'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $sql .= " $field = '%s' AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $ivalues[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $uargs[] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $pvalues[] = "'%s'"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      array_push($dargs, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $idatatypes[] = 'text';       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $psql .= "$field = \$" . $i . " AND ";     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $i++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $sql = drupal_substr($sql, 0, -4);  // get rid of the trailing 'AND' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $psql = drupal_substr($psql, 0, -4);  // get rid of the trailing 'AND' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // finish constructing the prepared SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $psql =  "PREPARE " . $options['statement_name'] . " (" . implode(', ', $idatatypes) . ") AS " . $psql; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // finally perform the delete.  If successful, return the updated record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = db_query($sql, $dargs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // finally perform the update.  If successful, return the updated record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if ($prepared) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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 and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        !tripal_core_is_sql_prepared($options['statement_name'])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $status = chado_query($psql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (!$status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        watchdog('tripal_core', "tripal_core_chado_update: not able to prepare '%name' statement for: %sql", array('%name' => $options['statement_name'], '%sql' => $sql), 'WATCHDOG ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $sql = "EXECUTE " . $options['statement_name'] . "(" . implode(", ", $pvalues) . ")"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $resource = chado_query($sql, $ivalues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // if it's not a prepared statement then insert normally 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $resource = db_query($sql, $uargs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if ($resource) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdog('tripal_core', "Cannot delete record in $table table.  Match:" . print_r($match, 1) . ". Values: ". print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    watchdog('tripal_core', "Cannot update record in $table table.  Match:" . print_r($match, 1) . ". Values: ". print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Provides a generic routine for updating into any Chado table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Provides a generic function for deleting a record(s) from any chado table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * Use this function to update a record in any Chado table.  The first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * argument specifies the table for inserting, the second is an array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * of values to matched for locating the record for updating, and the third 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * argument give the values to update.  The arrays are mutli-dimensional such 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * that foreign key lookup values can be specified. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Use this function to delete a record(s) in any Chado table.  The first 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * argument specifies the table to delete from and the second is an array 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * of values to match for locating the record(s) to be deleted.  The arrays 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * are mutli-dimensional such that foreign key lookup values can be specified. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @param $table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  The name of the chado table for inserting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @param $match 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *  An associative array containing the values for locating a record to update. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * @param $values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *  An associative array containing the values for updating. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *  On success this function returns TRUE. On failure, it returns FALSE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ *   On success this function returns TRUE. On failure, it returns FALSE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Example usage: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @code 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -467,18 +703,17 @@ function tripal_core_chado_delete($table, $match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *   $result = tripal_core_chado_update('feature',$umatch,$uvalues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @endcode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * The above code species that a feature with a given uniquename, organism_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * and type_id (the unique constraint for the feature table) will be updated. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * and type_id (the unique constraint for the feature table) will be deleted. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * The organism_id is specified as a nested array that uses the organism_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * foreign key constraint to lookup the specified values to find the exact 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * organism_id. The same nested struture is also used for specifying the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * values to update.  The function will find the record that matches the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * columns specified and update the record with the avlues in the $uvalues array. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * values to update.  The function will find all records that match the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * columns specified and delete them. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @ingroup tripal_chado_api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function tripal_core_chado_update($table, $match, $values) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $update_values = array();   // contains the values to be updated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $update_matches = array();  // contains the values for the where clause 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function tripal_core_chado_delete($table, $match) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $delete_matches = array();  // contains the values for the where clause 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get the table description 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $table_desc = tripal_core_get_chado_table_schema($table); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -486,90 +721,71 @@ function tripal_core_chado_update($table, $match, $values) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get the values needed for matching in the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($match as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (is_array($value)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        watchdog('tripal_core', 'tripal_core_chado_update: When trying to find record to update, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //watchdog('tripal_core', 'tripal_core_chado_update: When trying to find record to update, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // if the user has specified an array of values to delete rather than 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // FK relationships the keep those in our match 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (array_values($value) === $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $delete_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $update_matches[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          watchdog('tripal_core', 'tripal_core_chado_delete: When trying to find record to delete, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          //watchdog('tripal_core', 'tripal_core_chado_delete: When trying to find record to delete, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value,TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $delete_matches[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $update_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $delete_matches[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the values used for updating 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (is_array($value)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      if (sizeof($results) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        watchdog('tripal_core', 'tripal_core_chado_update: When trying to find update values, too many records match the criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value, TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // now build the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $sql = "DELETE FROM {$table} WHERE "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $dargs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  foreach ($delete_matches as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (count($value) > 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      $sql .= "$field IN (" . db_placeholders($value, 'varchar') . ") AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      foreach ($value as $v) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $dargs[] = $v; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      elseif (sizeof($results) < 1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //watchdog('tripal_core', 'tripal_core_chado_update: When trying to find update values, no record matches criteria supplied for !foreign_key foreign key constraint (!criteria)', array('!foreign_key' => $field, '!criteria' => print_r($value,TRUE)), WATCHDOG_ERROR); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if (strcmp($value, '__NULL__') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = NULL AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      elseif (strcmp($fields[$field]['type'], 'serial') == 0 or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              strcmp($fields[$field]['type'], 'int') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = %d AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $update_values[$field] = $results[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $sql .= " $field = '%s' AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      array_push($dargs, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $update_values[$field] = $value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // now build the SQL statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = "UPDATE {$table} SET "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $fields = $table_desc['fields']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $uargs = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($update_values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($value, '__NULL__') == 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = NULL, "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    elseif (strcmp($fields[$field]['type'], 'serial')==0 or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      strcmp($fields[$field]['type'], 'int')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = %d, "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = '%s', "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    array_push($uargs, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql = drupal_substr($sql, 0, -2);  // get rid of the trailing comma & space 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $sql .= " WHERE "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  foreach ($update_matches as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (strcmp($value, '__NULL__')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = NULL AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    elseif (strcmp($fields[$field]['type'], 'serial')==0 or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      strcmp($fields[$field]['type'], 'int')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = %d AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      $sql .= " $field = '%s' AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    array_push($uargs, $value); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $sql = drupal_substr($sql, 0, -4);  // get rid of the trailing 'AND' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // finally perform the update.  If successful, return the updated record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // finally perform the delete.  If successful, return the updated record 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = db_query($sql, $uargs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $result = db_query($sql, $dargs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tripal_db_set_active($previous_db);  // now use drupal database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    watchdog('tripal_core', "Cannot update record in $table table.  Match:" . print_r($match, 1) . ". Values: ". print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    watchdog('tripal_core', "Cannot delete record in $table table.  Match:" . print_r($match, 1) . ". Values: ". print_r($values, 1), array(), 'WATCHDOG_ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Provides a generic routine for selecting data from a Chado table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -654,28 +870,44 @@ function tripal_core_chado_update($table, $match, $values) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // we need to get a persistent connection.  If one exists this function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // will not recreate it, but if not it will create one and store it in 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // a Drupal variable for reuse later. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tripal_db_persistent_chado(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // get the options for this query 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // set defaults for options. If we don't set defaults then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // we get memory leaks when we try to access the elements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!is_array($options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$options['case_insensitive_columns']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('case_insensitive_columns', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options['case_insensitive_columns'] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$options['regex_columns']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('regex_columns', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options['regex_columns'] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$options['order_by']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('order_by', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options['order_by'] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('is_prepared', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['is_prepared'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('return_sql', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['return_sql'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('has_record', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['has_record'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('statement_name',$options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $options['statement_name'] = FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // if this is a prepared statement check to see if it has already been prepared 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($options['statement_name']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $prepared = TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // we need to get a persistent connection.  If one exists this function 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     print "NO STATEMENT (select): $table\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     debug_print_backtrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // check that our columns and values arguments are proper arrays 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -694,6 +926,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $from = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $where = ''; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $args = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   foreach ($values as $field => $value) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $select[] = $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (is_array($value)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -713,11 +946,9 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // add the fk relationship info to the prepared statement name so that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // we can prepare the selects run by the recrusive tripal_core_chado_get_foreign_key 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            // function. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $foreign_options['statement_name'] = $options['statement_name'] . "fk_" . $table . "_" . $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if ($options['prepare']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-           $foreign_options['prepare'] = $options['prepare']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           $foreign_options['statement_name'] = "fk_" . $table . "_" . $field; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $results = tripal_core_chado_get_foreign_key($table_desc, $field, $value, $foreign_options); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!$results or count($results) ==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -807,6 +1038,14 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $idatatypes[] = 'bool'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           $pvalues[] = $value[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        elseif (strcasecmp($table_desc['fields'][$field]['type'], 'float')==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $sql .= "$field $operator %s AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $psql .= "$field $operator \$" . $i . " AND "; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $args[] = $value[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          // set the variables needed for the prepared statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $idatatypes[] = 'numeric'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          $pvalues[] = $value[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // else the type is a text 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           if (in_array($field, $options['case_insensitive_columns'])) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -848,7 +1087,7 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // if the caller has requested the SQL rather than the results... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // which happens in the case of wanting to use the Drupal pager, then do so 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if ($options['return_sql']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if ($options['return_sql'] == TRUE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return array('sql' => $sql, 'args' => $args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -859,16 +1098,16 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if ($options['is_prepared'] != TRUE and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         !tripal_core_is_sql_prepared($options['statement_name'])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $status = chado_query($psql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#      print "$psql\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (!$status) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         watchdog('tripal_core', "tripal_core_chado_select: not able to prepare '%name' statement for: %sql", array('%name' => $options['statement_name'], '%sql' => $sql), 'WATCHDOG ERROR'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $sql = "EXECUTE " . $options['statement_name'] . "(" . implode(", ", $pvalues) . ")"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#    print "$sql\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // WARNING: This call creates a memory leak:  if you remove the $ivalues it doesn't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // do this. Got to find out what's causing this. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $resource = chado_query($sql, $ivalues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $previous_db = tripal_db_set_active('chado');  // use chado database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $resource = db_query($sql, $args); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -880,12 +1119,10 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   while ($r = db_fetch_object($resource)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $results[] = $r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($options['has_record']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return count($results); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#  print "$psql\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#  print "$sql\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#  print '$results = ' . print_r($results, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return $results; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -938,16 +1175,19 @@ function tripal_core_chado_select($table, $columns, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * @ingroup tripal_chado_api 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_core_chado_get_foreign_key($table_desc, $field, $values, $options = NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // set defaults for options. If we don't set defaults then 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // we get memory leaks when we try to access the elements 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!is_array($options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$options['case_insensitive_columns']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('case_insensitive_columns', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options['case_insensitive_columns'] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (!$options['regex_columns']) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!array_key_exists('regex_columns', $options)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $options['regex_columns'] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get the list of foreign keys for this table description and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // iterate through those until we find the one we're looking for 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1540,17 +1780,18 @@ function tripal_core_exclude_field_from_feature_by_default() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function chado_query($sql) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $args = func_get_args(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  array_shift($args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  array_shift($args); // remove the $sql from the argument list 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $sql = db_prefix_tables($sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $args = $args[0]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   _db_query_callback($args, TRUE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $sql = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback', $sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Execute the query on the chado database/schema 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Use the persistent chado connection if it already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $persistent_connection = variable_get('tripal_perisistent_chado', NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $persistent_connection = unserialize(variable_get('tripal_perisistent_chado', NULL)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($persistent_connection) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     $query = $sql; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2034,12 +2275,32 @@ function tripal_db_set_active($dbname) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  *   TRUE if the statement is preapred, FALSE otherwise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_core_is_sql_prepared($statement_name) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // to reduce the need for a database query we will check the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // session variable for this connection to see if the statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // has been prepared. If it has then we won't do the database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // query to find out.  If it hasn't then we'll query the database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // to see if it is prepared. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $connection = variable_get('tripal_perisistent_chado', NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!isset($_SESSION[$connection])) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    $_SESSION[$connection] = array(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(in_array($statement_name,$_SESSION[$connection])){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     //print "Is Prepared and in Session var: $statement_name\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     return TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  }  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // @coder-ignore: acting on postgres tables rather then drupal schema therefore, table prefixing does not apply 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $sql = "SELECT name FROM pg_prepared_statements WHERE name = '%s'"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $result = db_fetch_object(chado_query($sql, $statement_name)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // do not use 'chado_query' here or it causes memory-leaks 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $result = db_fetch_object(db_query($sql, $statement_name)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($result) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     $_SESSION[$connection][] = $statement_name; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     //print "Is Prepared but in DB: $statement_name\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      return TRUE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  //print "Is Not prepared: $statement_name\n"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return FALSE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2055,12 +2316,11 @@ function tripal_db_persistent_chado() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   global $db_url; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // get connection if it already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  $connection = variable_get('tripal_perisistent_chado', NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Otherwise we need to set it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  $connection = unserialize(variable_get('tripal_perisistent_chado', NULL)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if ($connection) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return $connection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  // Otherwise we need to set it 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (is_array($db_url) && isset($db_url['chado'])) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2069,9 +2329,8 @@ function tripal_db_persistent_chado() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       $connection = db_connect($db_url); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      variable_set('tripal_perisistent_chado', $connection); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      variable_set('tripal_perisistent_chado', serialize($connection)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return $connection; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return FALSE; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2089,7 +2348,7 @@ function tripal_db_release_persistent_chado() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 function tripal_db_start_transaction() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   $connection = tripal_db_persistent_chado(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  chado_query("BEGIN"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  chado_query("BEGIN");   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 |