|
@@ -349,9 +349,9 @@ function chado_set_active($dbname = 'default') {
|
|
|
$search_path = chado_get_schema_name('drupal');
|
|
|
|
|
|
// Change only if 'chado' has been specified.
|
|
|
- // Notice that we leave the active_db set as chado but use the possibly
|
|
|
- // user-altered schema name for the actual search path. This is to keep
|
|
|
- // outward facing mentions of chado as "chado" while still allowing the user
|
|
|
+ // Notice that we leave the active_db set as chado but use the possibly
|
|
|
+ // user-altered schema name for the actual search path. This is to keep
|
|
|
+ // outward facing mentions of chado as "chado" while still allowing the user
|
|
|
// to alter the schema name used.
|
|
|
if ($dbname == 'chado') {
|
|
|
$active_db = 'chado';
|
|
@@ -490,7 +490,7 @@ function chado_insert_record($table, $values, $options = []) {
|
|
|
// that has all the values needed for insert with all foreign relationsihps
|
|
|
// resolved.
|
|
|
foreach ($values as $field => $value) {
|
|
|
- // Make sure the field is in the table description. If not then return an
|
|
|
+ // Make sure the field is in the table description. If not then return an
|
|
|
// error message.
|
|
|
if (!array_key_exists($field, $table_desc['fields'])) {
|
|
|
tripal_report_error('tripal_chado', TRIPAL_ERROR,
|
|
@@ -640,7 +640,7 @@ function chado_insert_record($table, $values, $options = []) {
|
|
|
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) {
|
|
|
- $sql = "SELECT CURRVAL('{" . $table . "_" . $field . "_seq}')";
|
|
|
+ $sql = "SELECT CURRVAL('{" . $table . "}_" . $field . "_seq')";
|
|
|
$results = chado_query($sql);
|
|
|
$value = $results->fetchField();
|
|
|
if (!$value) {
|
|
@@ -910,7 +910,7 @@ function chado_update_record($table, $match, $values, $options = NULL) {
|
|
|
|
|
|
// If we have a result then add primary keys to return array.
|
|
|
if ($options['return_record'] == TRUE and $result) {
|
|
|
- // Only if we have a single result do we want to add the primary keys to the
|
|
|
+ // 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) {
|
|
@@ -1430,7 +1430,7 @@ function chado_select_record($table, $columns, $values, $options = NULL) {
|
|
|
$where[] = $value;
|
|
|
}
|
|
|
// CASE 1c: If we have an integer indexed array and the first element is
|
|
|
- // not an array then we have a simple array of values to be used for an
|
|
|
+ // not an array then we have a simple array of values to be used for an
|
|
|
// IN clause.
|
|
|
elseif (is_int(key($value)) AND !is_array(current($value))) {
|
|
|
|
|
@@ -1453,7 +1453,7 @@ function chado_select_record($table, $columns, $values, $options = NULL) {
|
|
|
$where[] = $subvalue;
|
|
|
}
|
|
|
}
|
|
|
- // CASE 1e: We have a multi-dimensional array that doesn't fit any of
|
|
|
+ // CASE 1e: We have a multi-dimensional array that doesn't fit any of
|
|
|
// the above cases then we have a foreign key definition to follow.
|
|
|
else {
|
|
|
|
|
@@ -1701,7 +1701,7 @@ function chado_select_record_check_value_type(&$op, &$value, $type) {
|
|
|
* $args = array( ':feature_uniquename' => $form_state['values']['uniquename']
|
|
|
* );
|
|
|
* $result = chado_query($sql, $args);
|
|
|
- * while ($r = $results->fetchObject()) {
|
|
|
+ * while ($r = $results->fetchObject()) {
|
|
|
* // Do something with the record object $r
|
|
|
* }
|
|
|
* @endcode
|
|
@@ -1728,30 +1728,51 @@ function chado_query($sql, $args = []) {
|
|
|
// Remove carriage returns from the SQL.
|
|
|
$sql = preg_replace('/\n/', ' ', $sql);
|
|
|
|
|
|
+ // Get the current default Chado and Drupal schema prefixes.
|
|
|
+ $chado_schema_name = chado_get_schema_name('chado');
|
|
|
+ $drupal_schema_name = chado_get_schema_name('drupal');
|
|
|
+
|
|
|
// Prefix the tables with their correct schema.
|
|
|
// Chado tables should be enclosed in curly brackets (ie: {feature} )
|
|
|
// and Drupal tables should be enclosed in square brackets
|
|
|
// (ie: [tripal_jobs] ).
|
|
|
- $chado_schema_name = chado_get_schema_name('chado');
|
|
|
- $drupal_schema_name = chado_get_schema_name('drupal');
|
|
|
- $sql = preg_replace('/\{(.*?)\}/', $chado_schema_name . '.$1', $sql);
|
|
|
- $sql = preg_replace('/\[(\w+)\]/', $drupal_schema_name . '.$1', $sql);
|
|
|
+ $matches = [];
|
|
|
+ if (preg_match_all('/\{(.*?)\}/', $sql, $matches)) {
|
|
|
+ $matches = $matches[1];
|
|
|
+ $chado_tables = array_unique(array_keys(chado_get_table_names(TRUE)));
|
|
|
+ foreach ($matches as $match) {
|
|
|
+ if (in_array($match, $chado_tables)) {
|
|
|
+ $sql = preg_replace("/\{$match\}/", $chado_schema_name . '.' . $match, $sql);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now set the Drupal prefix if the table is surrounded by square brackets.
|
|
|
+ if (preg_match_all('/\[(.*?)\]/', $sql, $matches)) {
|
|
|
+ $matches = $matches[1];
|
|
|
+ $drupal_tables = array_unique(array_keys(drupal_get_schema()));
|
|
|
+ foreach ($matches as $match) {
|
|
|
+ if (in_array($match, $drupal_tables)) {
|
|
|
+ $sql = preg_replace("/\[$match\]/", $drupal_schema_name . '.' . $match, $sql);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // Add an alter hook to allow module developers to change the query right
|
|
|
+ // Add an alter hook to allow module developers to change the query right
|
|
|
// before it's executed. Since all queriying of chado by Tripal eventually
|
|
|
// goes through this function, we only need to provide an alter hook at this
|
|
|
- // point in order to ensure developers have complete control over the query
|
|
|
- // being executed. For example, a module developer might want to remove
|
|
|
- // schema prefixing from queries and rely on the search path. This alter
|
|
|
+ // point in order to ensure developers have complete control over the query
|
|
|
+ // being executed. For example, a module developer might want to remove
|
|
|
+ // schema prefixing from queries and rely on the search path. This alter
|
|
|
// hook would allow them to do that by implementing
|
|
|
- // mymodule_chado_query_alter($sql, $args) and using a regular expression
|
|
|
+ // mymodule_chado_query_alter($sql, $args) and using a regular expression
|
|
|
// to remove table prefixing from the query.
|
|
|
// @see hook_chado_query_alter().
|
|
|
drupal_alter('chado_query', $sql, $args);
|
|
|
|
|
|
// The featureloc table has some indexes that use function that call other
|
|
|
- // functions and those calls do not reference a schema, therefore, any
|
|
|
- // tables with featureloc must automaticaly have the chado schema set as
|
|
|
+ // functions and those calls do not reference a schema, therefore, any
|
|
|
+ // tables with featureloc must automaticaly have the chado schema set as
|
|
|
// active to find.
|
|
|
if (preg_match('/' . $chado_schema_name . '.featureloc/i', $sql) or preg_match('/' . $chado_schema_name . '.feature/i', $sql)) {
|
|
|
$previous_db = chado_set_active('chado');
|
|
@@ -1763,7 +1784,7 @@ function chado_query($sql, $args = []) {
|
|
|
throw $e;
|
|
|
}
|
|
|
}
|
|
|
- // For all other tables we should have everything in scope so just run the
|
|
|
+ // For all other tables we should have everything in scope so just run the
|
|
|
// query.
|
|
|
else {
|
|
|
$results = db_query($sql, $args);
|
|
@@ -1817,11 +1838,11 @@ function hook_chado_query_alter(&$sql, &$args) {
|
|
|
|
|
|
// The following code is an example of how this alter function might be used.
|
|
|
// Say you would like only a portion of node => feature connections available
|
|
|
- // for a period of time or under a specific condition. To "hide" the other
|
|
|
- // connections you might create a temporary view of the chado_feature table
|
|
|
+ // for a period of time or under a specific condition. To "hide" the other
|
|
|
+ // connections you might create a temporary view of the chado_feature table
|
|
|
// that only includes the connections you would like to be available. In order
|
|
|
- // to ensure this view is used rather than the original chado_feature table
|
|
|
- // you could alter all Tripal queries referring to chado_feature to instead
|
|
|
+ // to ensure this view is used rather than the original chado_feature table
|
|
|
+ // you could alter all Tripal queries referring to chado_feature to instead
|
|
|
//refer to your view.
|
|
|
if (preg_match('/(\w+)\.chado_feature/', $sql, $matches)) {
|
|
|
|