|
@@ -1450,9 +1450,16 @@ function chado_select_record_check_value_type(&$op, &$value, $type) {
|
|
|
|
|
|
/**
|
|
|
* Use this function instead of db_query() to avoid switching databases
|
|
|
- * when making query to the chado database
|
|
|
+ * when making query to the chado database.
|
|
|
*
|
|
|
- * Will use a chado persistent connection if it already exists
|
|
|
+ * Will use a chado persistent connection if it already exists.
|
|
|
+ *
|
|
|
+ * NOTE: When writting SQL queries it is important to enclose the chado table name in
|
|
|
+ * curley brackets (ie: {feature}) in order to enusure proper prefixing. Furthermore,
|
|
|
+ * if you need to join between tables in separate schemas (ie: chado and drupal) then
|
|
|
+ * you should enclose the drupal table in square brackets (ie: [chado_feature]).
|
|
|
+ * Keep in mind JOINING BETWEEN SCHEMA'S IS NOT RECOMMENDED since it will break functionality
|
|
|
+ * for sites with external chado databases.
|
|
|
*
|
|
|
* @param $sql
|
|
|
* The sql statement to execute
|
|
@@ -1494,8 +1501,17 @@ function chado_query($sql, $args = array()) {
|
|
|
// if Chado is local to the database then prefix the Chado table
|
|
|
// names with 'chado'.
|
|
|
if ($is_local) {
|
|
|
+
|
|
|
+ // Remove carriage returns from the SQL.
|
|
|
$sql = preg_replace('/\n/', '', $sql); // remove carriage returns
|
|
|
+
|
|
|
+ // 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] ).
|
|
|
+ // @todo: remove assumption that the chado schema is called 'chado' and the
|
|
|
+ // drupal schema is called 'public'.
|
|
|
$sql = preg_replace('/\{(.*?)\}/', 'chado.$1', $sql);
|
|
|
+ $sql = preg_replace('/\[(\w+)\]/', 'public.$1', $sql);
|
|
|
|
|
|
// 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
|
|
@@ -1510,6 +1526,18 @@ function chado_query($sql, $args = array()) {
|
|
|
$results = db_query($sql, $args);
|
|
|
}
|
|
|
}
|
|
|
+ // Check for any cross schema joins (ie: both drupal and chado tables represented
|
|
|
+ // and if present don't execute the query but instead warn the administrator.
|
|
|
+ elseif (preg_match('/\[(\w*?)\]/', $sql)) {
|
|
|
+ tripal_report_error(
|
|
|
+ 'chado_query',
|
|
|
+ TRIPAL_ERROR,
|
|
|
+ 'The following query does not support external chado databases. Please file an issue
|
|
|
+ with the Drupal.org Tripal Project. Query: @query',
|
|
|
+ array('@query' => $sql)
|
|
|
+ );
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
// if Chado is not local to the Drupal database then we have to
|
|
|
// switch to another database
|
|
|
else {
|