123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- <?php
- // This script will add FK relatinsions to an existing schema API array for each
- // Chado table. It requires Chado is installed in a 'chado' schema of
- // the drupal database. It also requires existing schema hooks for
- // version of Chado. The goal is to use the output of this script to
- // update the existing schema hooks. Redirect the output of this script to
- // a file and then replace the existing schema API include file (e.g.
- // tripal_core.schema_v1.2.api.inc). Be sure to check it before replacing
- // this script requires a single argument (-v) which is the Chado version
- //
- // example usage in drupal directory root:
- //
- // php ./sites/all/modules/tripal/tripal_core/api/get_FKs.php -v 1.11 > \
- // ./sites/all/modules/tripal/tripal_core/apitripal_core.schema_v1.11.api.inc.new
- //
- // php ./sites/all/modules/tripal/tripal_core/api/get_FKs.php -v 1.2 > \
- // ./sites/all/modules/tripal/tripal_core/api/tripal_core.schema_v1.2.api.inc.new
- $arguments = getopt("v:");
- if (isset($arguments['v'])) {
- $drupal_base_url = parse_url('http://www.example.com');
- $_SERVER['HTTP_HOST'] = $drupal_base_url['host'];
- $_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] = $_SERVER['PHP_SELF'];
- $_SERVER['REMOTE_ADDR'] = NULL;
- $_SERVER['REQUEST_METHOD'] = NULL;
- require_once 'includes/bootstrap.inc';
- drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
- $version = $arguments['v'];
- get_chado_fk_relationships($version);
- }
- /**
- *
- */
- function get_chado_fk_relationships($version) {
- // convert the version to a form suitable for function names
- $v = $version;
- $v = preg_replace("/\./","_",$v);
-
- $tables = tripal_core_get_chado_tables();
- $sql ="
- SELECT
- tc.constraint_name, tc.table_name, kcu.column_name,
- ccu.table_name AS foreign_table_name,
- ccu.column_name AS foreign_column_name
- FROM
- information_schema.table_constraints AS tc
- JOIN information_schema.key_column_usage AS kcu ON tc.constraint_name = kcu.constraint_name
- JOIN information_schema.constraint_column_usage AS ccu ON ccu.constraint_name = tc.constraint_name
- WHERE constraint_type = 'FOREIGN KEY' AND tc.table_name='%s'
- ";
-
- // iterate through the tables and get the foreign keys
- print "<?php
- /* @file: This file contains default schema definitions for all chado v$version tables
- * to be used by other function. Specifically these functions are used
- * by the tripal_core select/insert/update API functions and by
- * the Tripal Views module.
- *
- * These schema definitions can be augmented by another modules
- * (specifically to add missing definitions) by implementing
- * hook_chado_schema_v" . $v . "_<table name>().
- *
- * @defgroup tripal_schema_api Core Module Schema API
- * @{
- * Provides an application programming interface (API) for describing Chado tables.
- * This API consists of a set of functions, one for each table in Chado. Each
- * function simply returns a Drupal style array that defines the table.
- *
- * Because Drupal 6 does not handle foreign key (FK) relationships, however FK
- * relationships are needed to for Tripal Views. Therefore, FK relationships
- * have been added to the schema defintitions below.
- *
- * The functions provided in this documentation should not be called as is, but if you need
- * the Drupal-style array definition for any table, use the following function
- * call:
- *
- * \$table_desc = tripal_core_get_chado_table_schema(\$table)
- *
- * where the variable \$table contains the name of the table you want to
- * retireve. The tripal_core_get_chado_table_schema function determines the appropriate version of
- * Chado and uses the Drupal hook infrastructure to call the appropriate
- * hook function to retrieve the table schema.
- *
- * @}
- * @ingroup tripal_api
- */
- ";
- $referring = array();
- $tables_def = array();
- foreach ($tables as $table) {
- // get the existing table array
- $table_arr = tripal_core_get_chado_table_schema($table);
-
- if (empty($table_arr)) {
- print "ERROR: empty table definition $table\n";
- continue;
- }
-
- // add the table name to the array
- $table_arr['table'] = $table;
-
- // get the foreign keys and add them to the array
- $fks = db_query($sql,$table);
- while ($fk = db_fetch_object($fks)) {
- $table_arr['foreign keys'][$fk->foreign_table_name]['table'] = $fk->foreign_table_name;
- $table_arr['foreign keys'][$fk->foreign_table_name]['columns'][$fk->column_name] = $fk->foreign_column_name;
- $reffering[$fk->foreign_table_name][] = $table;
- }
- $tables_def[] = $table_arr;
- }
-
- // now add in the referring tables and print
- foreach ($tables_def as $table_arr) {
- $table = $table_arr['table'];
-
- // add in the referring tables
- $table_referring = array_unique($reffering[$table]);
- $table_arr['referring_tables'] = $table_referring;
-
- // reformat the array to be more legible
- $arr = var_export($table_arr, 1);
- $arr = preg_replace("/\n\s+array/","array", $arr); // move array( to previous line
- $arr = preg_replace("/\n/","\n ", $arr); // add indentation
- $arr = preg_replace("/true/","TRUE", $arr); // add indentation
- $arr = preg_replace("/false/","FALSE", $arr); // add indentation
- $arr = preg_replace("/array \(/","array(", $arr); // add indentation
-
- // print out the new Schema API function for this table
- print "/**
- * Implements hook_chado_schema_v".$v."_".$table."()
- * Purpose: To describe the structure of '$table' to tripal
- * @see tripal_core_chado_insert()
- * @see tripal_core_chado_update()
- * @see tripal_core_chado_select()
- *
- * @return
- * An array describing the '$table' table
- *
- * @ingroup tripal_chado_v".$version."_schema_api
- *
- */
- function tripal_core_chado_schema_v".$v."_".$table."() {
- \$description = $arr;
- return \$description;
- }
- ";
- }
- }
|