|
@@ -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";
|
|
|
|