Details for $custom_table->table_name:
"; $output .= "| Table Name | ". "$custom_table->table_name | ". "
|---|---|
| Table Field Definitions | ". "" . var_export(unserialize($custom_table->schema),1) . " | ".
"
| Actions | ". "". " Edit, ". " Delete |
array (
'table' => 'library_stock',
'fields' => array (
'library_stock_id' => array(
'type' => serial,
'not null' => TRUE,
),
'library_id' => array(
'type' => 'int',
'not null' => TRUE,
),
'stock_id' => array(
'type' => 'int',
'not null' => TRUE,
),
),
'primary key' => array(
'library_stock_id'
),
'unique keys' => array(
'library_stock_c1' => array(
'library_id',
'stock_id'
),
),
'foreign keys' => array(
'library' => array(
'table' => 'library',
'columns' => array(
'library_id' => 'library_id',
),
),
'stock' => array(
'table' => 'stock',
'columns' => array(
'stock_id' => 'stock_id',
),
),
),
)
",
);
return $form;
}
/**
* Validate the Create/Edit custom table form
* Implements hook_form_validate().
*
* @ingroup tripal_core
*/
function tripal_custom_tables_form_validate($form, &$form_state) {
$action = $form_state['values']['action'];
$table_id = $form_state['values']['table_id'];
$schema = $form_state['values']['schema'];
$force_drop = $form_state['values']['force_drop'];
if (!$schema) {
form_set_error($form_state['values']['schema'],
t('Schema array field is required.'));
}
// make sure the array is valid
$schema_array = array();
if ($schema) {
$success = preg_match('/^\s*array/', $schema);
if (!$success) {
form_set_error($form_state['values']['schema'],
t("The schema array should begin with the word 'array'."));
}
else {
$success = eval("\$schema_array = $schema;");
if ($success === FALSE) {
$error = error_get_last();
form_set_error($form_state['values']['schema'],
t("The schema array is improperly formatted. Parse Error : " . $error["message"]));
}
if (is_array($schema_array) and !array_key_exists('table', $schema_array)) {
form_set_error($form_state['values']['schema'],
t("The schema array must have key named 'table'"));
}
// check to see if the table name matches an existing table
// if this is an add
if ($action == 'Add') {
$previous_db = tripal_db_set_active('chado');
$exists = db_table_exists($schema_array['table']);
tripal_db_set_active($previous_db);
if ($exists) {
form_set_error($form_state['values']['schema'],
t("The table name already exists, please choose a different name."));
}
}
if ($action == 'Edit') {
// see if the table name has changed. If so, then check to make sure
// it doesn't already exists. We don't want to drop a table we didn't mean to
$sql = "SELECT * FROM {tripal_custom_tables} WHERE table_id = %d";
$ct = db_fetch_object(db_query($sql, $table_id));
if ($ct->table_name != $schema_array['table']) {
$previous_db = tripal_db_set_active('chado');
$exists = db_table_exists($schema_array['table']);
tripal_db_set_active($previous_db);
if ($exists) {
form_set_error($form_state['values']['schema'],
t("The table name already exists, please choose a different name."));
}
}
}
}
}
}
/**
* Submit the Create/Edit Custom table form
* Implements hook_form_submit().
*
* @ingroup tripal_core
*/
function tripal_custom_tables_form_submit($form, &$form_state) {
$ret = array();
$action = $form_state['values']['action'];
$table_id = $form_state['values']['table_id'];
$schema = $form_state['values']['schema'];
$force_drop = $form_state['values']['force_drop'];
$skip_creation = 1;
if ($force_drop) {
$skip_creation = 0;
}
// conver the schema into a PHP array
$schema_arr = array();
eval("\$schema_arr = $schema;");
if (strcmp($action, 'Edit') == 0) {
tripal_core_edit_custom_table($table_id, $schema_arr['table'], $schema_arr, $skip_creation);
}
elseif (strcmp($action, 'Add') == 0) {
tripal_core_create_custom_table($ret, $schema_arr['table'], $schema_arr, $skip_creation);
}
else {
drupal_set_message(t("No action performed."));
}
return '';
}
/**
* Does the specified action for the specified custom table
*
* @param $op
* The action to be taken. Currenly only delete is available
* @param $table_id
* The unique ID of the custom table for the action to be performed on
* @param $redirect
* TRUE/FALSE depending on whether you want to redirect the user to admin/tripal/custom_tables
*
* @ingroup tripal_core
*/
function tripal_custom_tables_action($op, $table_id, $redirect = FALSE) {
global $user;
$args = array("$table_id");
if (!$table_id) {
return '';
}
// get this table details
$sql = "SELECT * FROM {tripal_custom_tables} WHERE table_id = %d";
$custom_table = db_fetch_object(db_query($sql, $table_id));
if ($op == 'delete') {
// remove the entry from the tripal_custom tables table
$sql = "DELETE FROM {tripal_custom_tables} ".
"WHERE table_id = $table_id";
db_query($sql);
// drop the table from chado if it exists
if (db_table_exists($custom_table->table_name)) {
$success = chado_query("DROP TABLE %s", $custom_table->table_name);
if($success){
drupal_set_message(t("Custom Table '%name' dropped", array('%name' => $custom_table->table_name)));
}
}
}
// Redirect the user
if ($redirect) {
drupal_goto("admin/tripal/custom_tables");
}
}