'item', '#title' => t("Current installed version of Chado:"), '#description' => $real_version, ); $form['action_to_do'] = array( '#type' => 'radios', '#title' => 'Installation/Upgrade Action', '#options' => array( 'Install Chado v1.3' => t('New Install of Chado v1.3 (erases all existing Chado data if Chado already exists)'), 'Upgrade Chado v1.2 to v1.3' => t('Upgrade existing Chado v1.2 to v1.3 (no data is lost)'), 'Install Chado v1.2' => t('New Install of Chado v1.2 (erases all existing Chado data if Chado already exists)'), 'Upgrade Chado v1.11 to v1.2' => t('Upgrade existing Chado v1.11 to v1.2 (no data is lost)'), 'Install Chado v1.11' => t('New Install of Chado v1.11 (erases all existing Chado data if Chado already exists)'), ), '#description' => t('Select an action to perform. If you want to install Chado all other Tripal modules must not be installed.'), '#required' => TRUE, ); $form['warning'] = array( '#markup' => "
WARNING:" . t('A new install of Chado will remove and recreate the Chado database if it already exists.') . '
', ); $form['button'] = array( '#type' => 'submit', '#value' => t('Install/Upgrade Chado'), ); return $form; } function tripal_chado_install_form_validate($form, &$form_state) { if ($form_state['values']['action_to_do'] == "Upgrade Chado v1.11 to v1.2") { // Make sure we are already not at v1.2 $real_version = chado_get_version(TRUE); if ($real_version == "1.2") { form_set_error("action_to_do", "You are already at v1.2. There is no need to upgrade."); } } if ($form_state['values']['action_to_do'] == "Upgrade Chado v1.2 to v1.3") { // Make sure we are already not at v1.2 $real_version = chado_get_version(TRUE); if ($real_version == "1.3") { form_set_error("action_to_do", "You are already at v1.3. There is no need to upgrade."); } } } /** * Submit Load Chado Schema Form * * @ingroup tripal_chado */ function tripal_chado_install_form_submit($form, &$form_state) { global $user; $action_to_do = trim($form_state['values']['action_to_do']); $args = array($action_to_do); $includes = array(module_load_include('inc', 'tripal_chado', 'includes/tripal_chado.install')); tripal_add_job($action_to_do, 'tripal_chado', 'tripal_chado_install_chado', $args, $user->uid, 10, $includes); } /** * Install Chado Schema * * @ingroup tripal_chado */ function tripal_chado_install_chado($action) { $vsql = " INSERT INTO {chadoprop} (type_id, value) VALUES ( (SELECT cvterm_id FROM {cvterm} CVT INNER JOIN {cv} CV on CVT.cv_id = CV.cv_id WHERE CV.name = 'chado_properties' AND CVT.name = 'version'), :version) "; $vusql = " UPDATE {chadoprop} SET value = :version WHERE type_id = (SELECT cvterm_id FROM {cvterm} CVT INNER JOIN {cv} CV on CVT.cv_id = CV.cv_id WHERE CV.name = 'chado_properties' AND CVT.name = 'version') "; $transaction = db_transaction(); try { if ($action == 'Install Chado v1.3') { tripal_chado_install_chado_1_3(); chado_query($vsql, array(':version' => '1.3')); } elseif ($action == 'Upgrade Chado v1.2 to v1.3') { tripal_chado_upgrade_chado_1_2_to_1_3(); chado_query($vusql, array(':version' => '1.3')); } elseif ($action == 'Install Chado v1.2') { tripal_chado_install_chado_1_2(); chado_query($vsql, array(':version' => '1.2')); } elseif ($action == 'Upgrade Chado v1.11 to v1.2') { tripal_chado_upgrade_chado_1_11_to_1_2(); chado_query($vsql, array(':version' => '1.2')); } elseif ($action == 'Install Chado v1.11') { tripal_chado_install_chado_1_11(); } } catch (Exception $e) { $transaction->rollback(); tripal_chado_install_done(); tripal_report_error('tripal_chado', TRIPAL_ERROR, $e->getMessage(), array('print' => TRUE)); return FALSE; } return TRUE; // Set a variable to indicate the site is prepared. variable_set('tripal_chado_is_prepared', FALSE); module_load_include('inc', 'tripal_chado', 'includes/tripal_chado.setup'); tripal_chado_set_globals(); tripal_chado_init(); tripal_chado_prepare_chado(); return TRUE; } /** * Installs Chado v1.3. */ function tripal_chado_install_chado_1_3() { // Get the path to the schema and init SQL files. $schema_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/default_schema-1.3.sql'; $init_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/initialize-1.3.sql'; // Erase the Chado schema if it exists and perform the install. if (tripal_chado_reset_chado_schema()) { $success = tripal_chado_install_sql($schema_file); if ($success) { print "Install of Chado v1.3 (Step 1 of 2) Successful!\n"; } else { throw new Exception("Installation (Step 1 of 2) Problems! Please check output above for errors."); } $success = tripal_chado_install_sql($init_file); if ($success) { print "Install of Chado v1.3 (Step 2 of 2) Successful.\nInstallation Complete\n"; } else { throw new Exception("Installation (Step 2 of 2) Problems! Please check output above for errors."); } } else { throw new Exception("ERROR: cannot install chado. Please check database permissions"); } } /** * Installs Chado v1.2. */ function tripal_chado_install_chado_1_2() { // Get the path to the schema and init SQL files. $schema_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/default_schema-1.2.sql'; $init_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/initialize-1.2.sql'; // Erase the Chado schema if it exists and perform the install. if (tripal_chado_reset_chado_schema()) { $success = tripal_chado_install_sql($schema_file); if ($success) { print "Install of Chado v1.2 (Step 1 of 2) Successful!\n"; } else { throw new Exception("Installation (Step 1 of 2) Problems! Please check output above for errors."); } $success = tripal_chado_install_sql($init_file); if ($success) { print "Install of Chado v1.2 (Step 2 of 2) Successful.\nInstallation Complete\n"; } else { throw new Exception("Installation (Step 2 of 2) Problems! Please check output above for errors."); } } else { throw new Exception("ERROR: cannot install chado. Please check database permissions"); } } /** * */ function tripal_chado_install_chado_1_11() { // Get the path to the schema and init SQL files. $schema_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/default_schema-1.11.sql'; $init_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/initialize-1.11.sql'; // Erase the Chado schema if it exists and perform the install. if (tripal_chado_reset_chado_schema()) { $success = tripal_chado_install_sql($schema_file); if ($success) { print "Install of Chado v1.11 (Step 1 of 2) Successful!\n"; } else { throw new Exception("Installation (Step 1 of 2) Problems! Please check output above for errors."); } $success = tripal_chado_install_sql($init_file); if ($success) { print "Install of Chado v1.11 (Step 2 of 2) Successful.\nInstallation Complete!\n"; } else { throw new Exception("Installation (Step 2 of 2) Problems! Please check output above for errors."); } } else { throw new Exception("ERROR: cannot install chado. Please check database permissions"); } } /** * Upgrades Chado from v1.2 to v1.3 */ function tripal_chado_upgrade_chado_1_2_to_1_3() { // Get the path to the diff schema and upgrade SQL files. $diff_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/default_schema-1.2-1.3-diff.sql'; $success = tripal_chado_install_sql($diff_file); if ($success) { print "Upgrade from v1.2 to v1.3 Successful!\n"; } else { throw new Exception("Upgrade problems! Please check output above for errors."); } } /** * Upgrades Chado from v1.11 to v1.2 */ function tripal_chado_upgrade_chado_1_11_to_1_2() { // Get the path to the schema diff and upgarde SQL files. $schema_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/default_schema-1.11-1.2-diff.sql'; $init_file = drupal_get_path('module', 'tripal_chado') . '/chado_schema/upgrade-1.11-1.2.sql'; $success = tripal_chado_install_sql($schema_file); if ($success) { print "Upgrade from v1.11 to v1.2 (Step 1 of 2) Successful!\n"; } else { throw new Exception("Upgrade (Step 1 of 2) problems! Please check output above for errors."); } $success = tripal_chado_install_sql($init_file); if ($success) { print "Upgrade from v1.11 to v1.2 (Step 2 of 2) Successful.\nUpgrade Complete!\n"; } else { throw new Exception("Upgrade (Step 2 of 2) problems! Please check output above for errors."); } } /** * Reset the Chado Schema * This drops the current chado and chado-related schema and re-creates it * * @ingroup tripal_chado */ function tripal_chado_reset_chado_schema() { // drop current chado and chado-related schema if (chado_dbschema_exists('genetic_code')) { print "Dropping existing 'genetic_code' schema\n"; db_query("drop schema genetic_code cascade"); } if (chado_dbschema_exists('so')) { print "Dropping existing 'so' schema\n"; db_query("drop schema so cascade"); } if (chado_dbschema_exists('frange')) { print "Dropping existing 'frange' schema\n"; db_query("drop schema frange cascade"); } if (chado_dbschema_exists('chado')) { print "Dropping existing 'chado' schema\n"; db_query("drop schema chado cascade"); } // create the new chado schema print "Creating 'chado' schema\n"; db_query("create schema chado"); if (chado_dbschema_exists('chado')) { // before creating the plpgsql language let's check to make sure // it doesn't already exists $sql = "SELECT COUNT(*) FROM pg_language WHERE lanname = 'plpgsql'"; $results = db_query($sql); $count = $results->fetchObject(); if (!$count or $count->count == 0) { db_query("create language plpgsql"); } return TRUE; } return FALSE; } /** * Execute the provided SQL * * @param $sql_file * Contains SQL statements to be executed * * @ingroup tripal_chado */ function tripal_chado_install_sql($sql_file) { $chado_local = chado_dbschema_exists('chado'); if ($chado_local) { db_query("set search_path to chado"); } print "Loading $sql_file...\n"; $lines = file($sql_file, FILE_SKIP_EMPTY_LINES); if (!$lines) { return 'Cannot open $schema_file'; } $stack = array(); $in_string = 0; $in_function = FALSE; $query = ''; $i = 0; $success = 1; foreach ($lines as $line_num => $line) { $i++; $type = ''; // find and remove comments except when inside of strings if (preg_match('/--/', $line) and !$in_string and !preg_match("/'.*?--.*?'/", $line)) { $line = preg_replace('/--.*$/', '', $line); // remove comments } if (preg_match('/\/\*.*?\*\//', $line)) { $line = preg_replace('/\/\*.*?\*\//', '', $line); // remove comments } // skip empty lines if (preg_match('/^\s*$/', $line) or strcmp($line, '')==0) { continue; } // Find SQL for new objects if (preg_match('/^\s*CREATE\s+TABLE/i', $line) and !$in_string and !$in_function) { $stack[] = 'table'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*ALTER\s+TABLE\s+/i', $line) and !$in_string and !$in_function) { $stack[] = 'alter_table'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*SET/i', $line) and !$in_string and !$in_function) { $stack[] = 'set'; } if (preg_match('/^\s*CREATE\s+SCHEMA/i', $line) and !$in_string and !$in_function) { $stack[] = 'schema'; } if (preg_match('/^\s*CREATE\s+SEQUENCE/i', $line) and !$in_string and !$in_function) { $stack[] = 'sequence'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*CREATE\s+(?:OR\s+REPLACE\s+)*VIEW/i', $line) and !$in_string and !$in_function) { $stack[] = 'view'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*COMMENT/i', $line) and !$in_string and sizeof($stack)==0 and !$in_function) { $stack[] = 'comment'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*CREATE\s+(?:OR\s+REPLACE\s+)*FUNCTION/i', $line) and !$in_string and !$in_function) { $in_function = TRUE; $stack[] = 'function'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*CREATE\s+INDEX/i', $line) and !$in_string and !$in_function) { $stack[] = 'index'; } if (preg_match('/^\s*INSERT\s+INTO/i', $line) and !$in_string and !$in_function) { $stack[] = 'insert'; $line = preg_replace("/public\./", "chado.", $line); } if (preg_match('/^\s*CREATE\s+TYPE/i', $line) and !$in_string and !$in_function) { $stack[] = 'type'; } if (preg_match('/^\s*GRANT/i', $line) and !$in_string and !$in_function) { $stack[] = 'grant'; } if (preg_match('/^\s*CREATE\s+AGGREGATE/i', $line) and !$in_string and !$in_function) { $stack[] = 'aggregate'; } if (preg_match('/^\s*DROP\s+FUNCTION/i', $line) and !$in_string and !$in_function) { $stack[] = 'drop_function'; } if (preg_match('/^\s*DROP\s+VIEW/i', $line) and !$in_string and !$in_function) { $stack[] = 'drop_view'; } if (preg_match('/^\s*DROP\s+INDEX/i', $line) and !$in_string and !$in_function) { $stack[] = 'drop_index'; } if (preg_match('/^\s*DROP\s+SEQUENCE/i', $line) and !$in_string and !$in_function) { $stack[] = 'drop_seq'; } if (preg_match('/^\s*ALTER\s+TYPE\s+/i', $line) and !$in_string and !$in_function) { $stack[] = 'alter_type'; } if (preg_match('/^\s*ALTER\s+SEQUENCE\s+/i', $line) and !$in_string and !$in_function) { $stack[] = 'alter_seq'; } // determine if we are in a string that spans a line $matches = preg_match_all("/[']/i", $line, $temp); $in_string = $in_string - ($matches % 2); $in_string = abs($in_string); // if we've reached the end of an object then pop the stack if (strcmp($stack[sizeof($stack)-1], 'table') == 0 and preg_match('/\);\s*$/', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'alter_table') == 0 and preg_match('/;\s*$/', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'set') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'schema') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'sequence') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'view') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'comment') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'function') == 0) { if(preg_match('/LANGUAGE.*?;\s*$/i', $line)) { $type = array_pop($stack); $in_function = FALSE; //print "FUNCTION DONE ($i): $line"; } else if(preg_match('/\$_\$;\s*$/i', $line)) { $type = array_pop($stack); $in_function = FALSE; //print "FUNCTION DONE ($i): $line"; } else if(preg_match('/\$\$;\s*$/i', $line)) { $type = array_pop($stack); $in_function = FALSE; // print "FUNCTION DONE ($i): $line"; } else { // print "FUNCTION ($i): $line"; } } if (strcmp($stack[sizeof($stack)-1], 'index') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'insert') == 0 and preg_match('/\);\s*$/', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'type') == 0 and preg_match('/\);\s*$/', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'grant') == 0 and preg_match('/;\s*$/', $line) and !$in_string) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'aggregate') == 0 and preg_match('/\);\s*$/', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'drop_function') == 0 and preg_match('/;\s*$/i', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'drop_view') == 0 and preg_match('/;\s*$/i', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'drop_index') == 0 and preg_match("/;\s*$/i", $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'drop_seq') == 0 and preg_match("/;\s*$/i", $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'alter_type') == 0 and preg_match('/;\s*$/i', $line)) { $type = array_pop($stack); } if (strcmp($stack[sizeof($stack)-1], 'alter_seq') == 0 and preg_match('/;\s*$/i', $line)) { $type = array_pop($stack); } // if we're in a recognized SQL statement then let's keep track of lines if ($type or sizeof($stack) > 0) { $query .= "$line"; } else { throw new Exception("UNHANDLED $i, $in_string: $line"); } if (preg_match_all("/\n/", $query, $temp) > 1000) { throw new Exception("SQL query is too long. Terminating:\n$query\n"); } if ($type and sizeof($stack) == 0) { //print "Adding $type: line $i\n"; // rewrite the set search_path to make 'public' be 'chado', but only if the // chado schema exists if (strcmp($type, 'set') == 0 and $chado_local) { $query = preg_replace("/public/m", "chado", $query); } // execute the statement try { $result = db_query($query); } catch (Exception $e) { $error = $e->getMessage(); throw new Exception("FAILED. Line $i, $in_string\n$error:\n$query\n\n"); } if (!$result) { $error = pg_last_error(); throw new Exception("FAILED. Line $i, $in_string\n$error:\n$query\n\n"); } $query = ''; } } tripal_chado_install_done(); return $success; } /** * Finish the Chado Schema Installation * * @ingroup tripal_chado */ function tripal_chado_install_done() { db_query("set search_path to default"); }