|
@@ -44,34 +44,91 @@ require_once 'tripal_core.schema_v1.11.api.inc';
|
|
* Set the Tripal Database
|
|
* Set the Tripal Database
|
|
*
|
|
*
|
|
* The chado_set_active function is used to prevent namespace collisions
|
|
* The chado_set_active function is used to prevent namespace collisions
|
|
- * when chado and drupal are installed in the same database but in different
|
|
|
|
- * schemas. It is also used for backwards compatibility with older versions
|
|
|
|
- * of tripal or in cases where chado is located outside of the Drupal database.
|
|
|
|
- * or when using Drupal functions such as db_table_exists()
|
|
|
|
|
|
+ * when Chado and Drupal are installed in the same database but in different
|
|
|
|
+ * schemas. It is also used when using Drupal functions such as
|
|
|
|
+ * db_table_exists().
|
|
|
|
+ *
|
|
|
|
+ * The connection settings can be altered through the hook
|
|
|
|
+ * hook_chado_connection_alter.
|
|
|
|
+ *
|
|
|
|
+ * Current active connection name is stored in the global variable
|
|
|
|
+ * $GLOBALS['chado_active_db'].
|
|
|
|
+ *
|
|
|
|
+ * @see hook_chado_connection_alter()
|
|
*
|
|
*
|
|
* @ingroup tripal_chado_api
|
|
* @ingroup tripal_chado_api
|
|
*/
|
|
*/
|
|
-function chado_set_active($dbname = 'default') {
|
|
|
|
- global $databases, $active_db;
|
|
|
|
|
|
+function chado_set_active($dbname = 'default') {
|
|
|
|
|
|
- if ($dbname ) {
|
|
|
|
- if ($dbname == 'chado') {
|
|
|
|
- db_query('set search_path to chado,public');
|
|
|
|
- return 'default';
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- db_query('set search_path to public');
|
|
|
|
- return 'chado';
|
|
|
|
- }
|
|
|
|
|
|
+ // Check if the chado_active_db has been set yet.
|
|
|
|
+ if (!array_key_exists('chado_active_db', $GLOBALS)) {
|
|
|
|
+ $GLOBALS['chado_active_db'] = 'default';
|
|
}
|
|
}
|
|
- // if the 'chado' database is in the $db_url variable then chado is
|
|
|
|
- // not in the same Drupal database, so we don't need to set any
|
|
|
|
- // search_path and can just change the database
|
|
|
|
- elseif (array_key_exists($dbname, $databases)) {
|
|
|
|
- return db_set_active($dbname);
|
|
|
|
|
|
+
|
|
|
|
+ $previous_db = $active_db = $GLOBALS['chado_active_db'];
|
|
|
|
+ $search_path = 'public';
|
|
|
|
+
|
|
|
|
+ // Change only if 'chado' has been specified.
|
|
|
|
+ if ($dbname == 'chado') {
|
|
|
|
+ $active_db = 'chado';
|
|
|
|
+ $search_path = 'chado,public';
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ $settings = array(
|
|
|
|
+ 'dbname' => $dbname,
|
|
|
|
+ 'new_active_db' => &$active_db,
|
|
|
|
+ 'new_search_path' => &$search_path,
|
|
|
|
+ );
|
|
|
|
+
|
|
|
|
+ // Will call all modules implementing hook_chado_search_path_alter
|
|
|
|
+ // note: hooks can alter $active_db and $search_path. This hook can be
|
|
|
|
+ // useful in multi-chado instances because Tripal core functions call it
|
|
|
|
+ // (e.g. chado_query) but there is no opportunity elsewhere to set the
|
|
|
|
+ // active database. This is useful in two cases: 1) Users are managed at
|
|
|
|
+ // the database level as in the case of SouthGreen Bioinformatics
|
|
|
|
+ // Platform tools (e.g. Banana Genone Hub). This allows custom modules
|
|
|
|
+ // to change the database connections on a per-user basis, and each
|
|
|
|
+ // user permissions is managed at the database level. Users are managed
|
|
|
|
+ // at the database level to provid the same access restrictions across
|
|
|
|
+ // various tools that use Chado (e,g, Artemis) 2) When there are simply
|
|
|
|
+ // two Chado instances housed in different Chado databases and the module
|
|
|
|
+ // needs to control which one is being used at any given time.
|
|
|
|
+ drupal_alter('chado_connection', $settings);
|
|
|
|
+
|
|
|
|
+ // set chado_active_db to remember active db
|
|
|
|
+ $GLOBALS['chado_active_db'] = $active_db;
|
|
|
|
+
|
|
|
|
+ // set PostgreSQL search_path
|
|
|
|
+ db_query('SET search_path TO ' . $search_path);
|
|
|
|
+
|
|
|
|
+ return $previous_db;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Alter Chado connection settings.
|
|
|
|
+ *
|
|
|
|
+ * Allows modules to change Chado connection settings.
|
|
|
|
+ *
|
|
|
|
+ * @param $settings
|
|
|
|
+ * An array containing
|
|
|
|
+ *
|
|
|
|
+ * @see chado_set_active()
|
|
|
|
+ *
|
|
|
|
+ * @ingroup tripal_chado_api
|
|
|
|
+ */
|
|
|
|
+function hook_chado_connection_alter(&$settings) {
|
|
|
|
+ // this example shows how we could make sure no table of the 'public' schema
|
|
|
|
+ // would be allowed in the coming queries:
|
|
|
|
+ // to do so, the caller will call "chado_set_active('chado_only');"
|
|
|
|
+ // and the hook will remove 'public' from the search path
|
|
|
|
+ if ('chado_only' == $settings['dbname']) {
|
|
|
|
+ $settings['new_active_db'] = 'chado';
|
|
|
|
+ $settings['new_search_path'] = 'chado'; # we don't include 'public' in search path
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Get max rank for a given set of criteria
|
|
* Get max rank for a given set of criteria
|
|
* This function was developed with the many property tables in chado in mind but will
|
|
* This function was developed with the many property tables in chado in mind but will
|