Sfoglia il codice sorgente

Fixed a bug when registering a new analysis module. If the module already existed in the table it threw an error. Now it checks first. Also fixed bug with chado_query to not add a 'chado.' prefix in the 'substring' psql function. Also updated the tripal_core_chado_update module to return the primary key if a single record is updated and if the return_record option is given.

spficklin 12 anni fa
parent
commit
48631d702c

+ 5 - 2
tripal_analysis/tripal_analysis.module

@@ -23,8 +23,11 @@ require('includes/tripal_analysis_privacy.inc');
  * @ingroup tripal_analysis
  */
 function tripal_analysis_register_child($modulename) {
-  $sql = "INSERT INTO {tripal_analysis} (modulename) VALUES ('%s')";
-  db_query($sql, $modulename);
+  $sql = "SELECT * FROM {tripal_analysis} WHERE modulename = '%s'";
+  if(!db_result($sql, $modulename)) {
+    $sql = "INSERT INTO {tripal_analysis} (modulename) VALUES ('%s')";
+    db_query($sql, $modulename);
+  }
 }
 
 /**

+ 44 - 18
tripal_core/api/tripal_core.api.inc

@@ -403,8 +403,12 @@ function tripal_core_chado_insert($table, $values, $options = array()) {
  *     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_record: by default, the function will return the TRUE if the record
+ *     was succesfully updated.  However, set this option to TRUE to return the
+ *     record that was updated.  The returned record will have the fields provided
+ *     but the primary key (if available for the table) will be added to the record.
  * @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
@@ -458,7 +462,7 @@ function tripal_core_chado_update($table, $match, $values, $options = NULL) {
     $options['statement_name'] = FALSE;
   }
   if (!array_key_exists('return_record', $options)) {
-    $options['return_record'] = TRUE;
+    $options['return_record'] = FALSE;
   }
 
   $update_values = array();   // contains the values to be updated
@@ -484,9 +488,31 @@ function tripal_core_chado_update($table, $match, $values, $options = NULL) {
     //print "NO STATEMENT (update): $table\n";
     //debug_print_backtrace();
   }
-
+  
   // get the table description
   $table_desc = tripal_core_get_chado_table_schema($table);
+  
+  // if the user wants us to return the record then we need to get the 
+  // unique primary key if one exists.  That way we can add it to the 
+  // values that get returned at the end of the function
+  $pkeys = array();
+  if ($options['return_record'] == TRUE) {
+    if (array_key_exists('primary key', $table_desc) and is_array($table_desc['primary key'])) {
+      $columns = array();
+      $stmt_suffix = '';
+      foreach ($table_desc['primary key'] as $field) {
+        $columns[] = $field;
+        $stmt_suffix .= substr($field, 0, 2);
+      }
+      $options2 = array('statement_name' => 'sel_' . $table . '_' . $stmt_suffix);
+      $results = tripal_core_chado_select($table, $columns, $match, $options2);
+      if (count($results) > 0) {
+        foreach ($results as $index => $pkey) {
+          $pkeys[] = $pkey;
+        }
+      }
+    }
+  }
 
   // get the values needed for matching in the SQL statement
   foreach ($match as $field => $value) {
@@ -714,21 +740,16 @@ function tripal_core_chado_update($table, $match, $values, $options = NULL) {
   else {
     $result = chado_query($sql, $uargs);
   }
-
-    // if we have a result then add primary keys to return array
+  // if we have a result then add primary keys to return array
   if ($options['return_record'] == TRUE and $result) {
-    if (array_key_exists('primary key', $table_desc) and is_array($table_desc['primary key'])) {
-      foreach ($table_desc['primary key'] as $field) {
-        $psql = "PREPARE currval_" . $table . "_" . $field . " AS SELECT CURRVAL('" . $table . "_" . $field . "_seq')";
-        $is_prepared = tripal_core_chado_prepare("currval_" . $table . "_" . $field, $psql, array());
-        if ($is_prepared) {
-           $value = db_result(chado_query("EXECUTE currval_". $table . "_" . $field));
-        }
-        else {
-          $sql = "SELECT CURRVAL('" . $table . "_" . $field . "_seq')";
-          $value =  db_result(chado_query($sql));
+    // only if we have a single result do we want to add the primary keys to the values
+    // array.  If the update matched many records we can't add the pkeys
+
+    if (count($pkeys) == 1) {      
+      foreach ($pkeys as $index => $pkey) {
+        foreach ($pkey as $field => $fvalue) {
+          $values[$field] = $fvalue;
         }
-        $values[$field] = $value;
       }
     }
     return $values;
@@ -2213,8 +2234,13 @@ function chado_query($sql) {
   // add the chado schema to the table names if Chado is local to the Drupal database
   if ($is_local) {
     $sql = preg_replace('/\n/', '', $sql);  // remove carriage returns
-    $sql = preg_replace('/FROM\s+([^\.]*?)\s/i', 'FROM chado.\1 ', $sql);
-    $sql = preg_replace('/INNER\s+JOIN\s+([^\.]*?)\s/i', 'INNER JOIN chado.\1 ', $sql);
+    // in the statement below we want to add 'chado.' to the beginning of each table
+    // we use the FROM keyword to look for tables, but FROM is also used in the 
+    // 'substring' function of postgres. But since table names can't start with 
+    // a number we exclude words numeric values. We also exclude tables that
+    // already have a schema prefix.
+    $sql = preg_replace('/FROM\s+([^0123456789][^\.]*?)\s/i', 'FROM chado.\1 ', $sql);
+    $sql = preg_replace('/INNER\s+JOIN\s+([^0123456789][^\.]*?)\s/i', 'INNER JOIN chado.\1 ', $sql);
   }
   //print "$sql\n";
 

+ 4 - 3
tripal_feature/tripal_feature.module

@@ -518,10 +518,11 @@ function chado_feature_update($node) {
       'type_id' => $type[0]->cvterm_id,
       'md5checksum' => md5($residues)
     );
-      $status = tripal_core_chado_update('feature', $match, $values);
+    $options = array('return_record' => TRUE);
+    $status = tripal_core_chado_update('feature', $match, $values, $options);
 
-      // add the genbank synonyms
-      chado_feature_add_synonyms($node->synonyms, $feature_id);
+    // add the genbank synonyms
+    chado_feature_add_synonyms($node->synonyms, $feature_id);
   }
   else {
     drupal_set_message(t('Unable to update feature.'), 'warning');