TRUE)); } } /** * Implementation of hook_requirements(). * * @ingroup tripal_contact */ function tripal_contact_requirements($phase) { $requirements = array(); if ($phase == 'install') { // make sure chado is installed if (!$GLOBALS["chado_is_installed"]) { $requirements ['tripal_contact'] = array( 'title' => "tripal_contact", 'value' => "ERROR: Chado must be installed before this module can be enabled", 'severity' => REQUIREMENT_ERROR, ); } } return $requirements; } /** * Implementation of hook_install(). * * @ingroup tripal_contact */ function tripal_contact_install() { // Create the module's data directory. tripal_create_files_dir('tripal_contact'); // Add the contactprop table to Chado. tripal_contact_add_custom_tables(); // Add loading of the the tripal contact ontology to the job queue. $obo_path = '{tripal_contact}/files/tcontact.obo'; $obo_id = tripal_insert_obo('Tripal Contacts', $obo_path); tripal_submit_obo_job(array('obo_id' => $obo_id)); // Add cvterms for relationship types. tripal_contact_add_cvs(); tripal_contact_add_cvterms(); // Set the default vocabularies. tripal_set_default_cv('contact', 'type_id', 'tripal_contact'); tripal_set_default_cv('contactprop', 'type_id', 'tripal_contact'); tripal_set_default_cv('contact_relationship', 'type_id', 'contact_relationship'); } /** * Implementation of hook_uninstall(). * * @ingroup tripal_contact */ function tripal_contact_uninstall() { /* // remove our custom block visibility settings per node type db_delete('block_node_type') ->condition('module', 'chado_contact') ->condition('delta', 'contbase') ->execute(); */ } /** * Adds any cvs needed by this module. * * @ingroup tripal_contact */ function tripal_contact_add_cvs() { // Add the cv for contact properties. This is a default vocabulary in the event // that a user does not want to use the tripal_contact vocabulary tripal_insert_cv( 'contact_property', 'Contains properties for contacts. This can be used if the tripal_contact vocabulary (which is default for contacts in Tripal) is not desired.' ); // add the cv for the contact type. This is a default vocabulary in the event // that a user does not want to use the tripal_contact vocabulary tripal_insert_cv( 'contact_type', 'Contains types of contacts. This can be used if the tripal_contact vocabulary (which is default for contacts in Tripal) is not desired.' ); // Add the cv for the tripal_contact vocabulary which is loaded via the OBO tripal_insert_cv( 'tripal_contact', 'A heirarchical set of terms for describing a contact. It is intended to be used as the default vocabularies in Tripal for contact types and contact properties.' ); // add the cv for contact relationships tripal_insert_cv( 'contact_relationship', 'Contains types of relationships between contacts.' ); } /** * Adds any cvterms needed by this module. * * @ingroup tripal_contact */ function tripal_contact_add_cvterms() { } /** * Implementation of hook_schema(). * * @ingroup tripal_contact */ function tripal_contact_schema() { $schema['chado_contact'] = array( 'fields' => array( 'vid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0 ), 'nid' => array( 'type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0 ), 'contact_id' => array( 'type' => 'int', 'not null' => TRUE, 'default' => 0 ) ), 'indexes' => array( 'contact_id' => array('contact_id') ), 'unique keys' => array( 'nid_vid' => array('nid', 'vid'), 'vid' => array('vid') ), 'primary key' => array('nid'), ); return $schema; } /** * Add any custom tables needed by this module. * - Contactprop: keep track of properties of contact * * @ingroup tripal_contact */ function tripal_contact_add_custom_tables(){ $schema = array ( 'table' => 'contactprop', 'fields' => array ( 'contactprop_id' => array ( 'type' => 'serial', 'not null' => true, ), 'contact_id' => array ( 'type' => 'int', 'not null' => true, ), 'type_id' => array ( 'type' => 'int', 'not null' => true, ), 'value' => array ( 'type' => 'text', 'not null' => false, ), 'rank' => array ( 'type' => 'int', 'not null' => true, 'default' => 0, ), ), 'primary key' => array ( 0 => 'contactprop_id', ), 'unique keys' => array ( 'contactprop_c1' => array ( 0 => 'contact_id', 1 => 'type_id', 2 => 'rank', ), ), 'indexes' => array ( 'contactprop_idx1' => array ( 0 => 'contact_id', ), 'contactprop_idx2' => array ( 0 => 'type_id', ), ), 'foreign keys' => array ( 'cvterm' => array ( 'table' => 'cvterm', 'columns' => array ( 'type_id' => 'cvterm_id', ), ), 'contact' => array ( 'table' => 'contact', 'columns' => array ( 'contact_id' => 'contact_id', ), ), ), ); chado_create_custom_table('contactprop', $schema, TRUE); } /** * This is the required update for tripal_contact when upgrading from Drupal core API 6.x. * */ function tripal_contact_update_7200() { // We cannot use the Tripal API calls in the 7200 update // because during upgrade the tripal_core will be disabled // add the contact_type CV try { $cv_id = db_query("SELECT cv_id FROM chado.cv WHERE name = 'tripal_contact'")->fetchField(); if (!$cv_id) { // add the vocabulary $cv_id = db_insert('chado.cv') ->fields(array( 'name' => 'tripal_contact', 'definition' => 'A heirarchical set of terms for describing a contact. It is intended to be used as the default vocabularies in Tripal for contact types and contact properties.' )) ->execute(); } // make this CV the defaults for the contact properties and contact types db_insert('tripal_cv_defaults') ->fields(array( 'table_name' => 'contact', 'field_name' => 'type_id', 'cv_id' => $cv_id )) ->execute(); db_insert('tripal_cv_defaults') ->fields(array( 'table_name' => 'contactprop', 'field_name' => 'type_id', 'cv_id' => $cv_id )) ->execute(); } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to add tripal_contact vocabulary: '. $error); } // add the contact_relationship CV try { $cv_id = db_query("SELECT cv_id FROM chado.cv WHERE name = 'contact_relationship'")->fetchField(); if (!$cv_id) { // add the vocabulary $cv_id = db_insert('chado.cv') ->fields(array( 'name' => 'contact_relationship', 'definition' => 'Contains types of relationships between contacts.' )) ->execute(); } // add the default db_insert('tripal_cv_defaults') ->fields(array( 'table_name' => 'contact_relationship', 'field_name' => 'type_id', 'cv_id' => $cv_id )) ->execute(); } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to add contact_type vocabulary: '. $error); } // add the contact_type CV try { $cv_id = db_query("SELECT cv_id FROM chado.cv WHERE name = 'contact_type'")->fetchField(); if (!$cv_id) { // add the vocabulary $cv_id = db_insert('chado.cv') ->fields(array( 'name' => 'contact_type', 'definition' => 'Contains types of contacts. This can be used if the tripal_contact vocabulary (which is default for contacts in Tripal) is not desired.' )) ->execute(); } } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to add contact_type vocabulary: '. $error); } // add the contact_property CV try { $cv_id = db_query("SELECT cv_id FROM chado.cv WHERE name = 'contact_property'")->fetchField(); if (!$cv_id) { // add the vocabulary $cv_id = db_insert('chado.cv') ->fields(array( 'name' => 'contact_property', 'definition' => 'Contains properties for contacts. This can be used if the tripal_contact vocabulary (which is default for contacts in Tripal) is not desired.' )) ->execute(); } } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to add contact_property vocabulary: '. $error); } } /** * Implementation of hook_update_dependencies(). It specifies a list of * other modules whose updates must be run prior to this one. */ function tripal_contact_update_dependencies() { $dependencies = array(); // the tripal_cv update 7200 must run prior to update 7200 of this module $dependencies['tripal_contact'][7200] = array( 'tripal_cv' => 7200 ); return $dependencies; } /** * Adds missing foreign key constraints * */ function tripal_contact_update_7201() { // there was a bug in the function for creating a custom table that // kept foreign key constraints from being added. So, we need to add those // to keep from error messages appear, we will drop the FK if it already // exists and then re-add it. try { $fkey_exists = db_query('SELECT TRUE FROM pg_constraint WHERE conname = :constraint', array(':constraint' => 'contactprop_type_id_fkey'))->fetchField(); if ($fkey_exists) { db_query(' ALTER TABLE chado.contactprop DROP CONSTRAINT contactprop_type_id_fkey CASCADE '); db_query(' ALTER TABLE chado.contactprop DROP CONSTRAINT contactprop_contact_id_fkey CASCADE '); } db_query(' ALTER TABLE chado.contactprop ADD CONSTRAINT contactprop_type_id_fkey FOREIGN KEY (type_id) REFERENCES chado.cvterm (cvterm_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED '); db_query(' ALTER TABLE chado.contactprop ADD CONSTRAINT contactprop_contact_id_fkey FOREIGN KEY (contact_id) REFERENCES chado.contact (contact_id) ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED '); } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to update foriegn key: '. $error); } } /** * Updates path of tripal_contact OBO to be relative. */ function tripal_contact_update_7202() { try { // Remove duplicates. db_delete('tripal_cv_obo') ->condition('name', 'Tripal Contacts') ->execute(); // Add in the updated path. $obo_path = '{tripal_contact}/files/tcontact.obo'; $obo_id = tripal_insert_obo('Tripal Contacts', $obo_path); } catch (\PDOException $e) { $error = $e->getMessage(); throw new DrupalUpdateException('Failed to update tripal_contact OBO path: '. $error); } }