123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364 |
- <?php
- function tripal_chado_field_storage_info() {
- return array(
- 'field_chado_storage' => array(
- 'label' => t('Chado storage'),
- 'description' => t('Stores fields in the local Chado database.'),
- 'settings' => array(),
- ),
- );
- }
- function tripal_chado_field_storage_query($query) {
-
- }
- function tripal_chado_field_storage_write($entity_type, $entity, $op, $fields) {
-
- $base_table = $entity->chado_table;
- $type_field = $entity->chado_field;
- $record_id = property_exists($entity, 'chado_record_id') ? $entity->chado_record_id : NULL;
-
- $field_vals = tripal_chado_field_storage_unnest_fields($fields, $entity_type, $entity);
-
- $record_id = tripal_chado_field_storage_write_recursive($entity_type, $entity,
- $op, $field_vals, $base_table, $base_table, $type_field, $record_id);
-
- if ($op == FIELD_STORAGE_INSERT) {
-
-
- $record = array(
- 'entity_id' => $entity->id,
- 'record_id' => $record_id,
- 'data_table' => $entity->chado_table,
- 'type_table' => $entity->chado_table,
- 'field' => $entity->chado_field,
- );
- $success = drupal_write_record('chado_entity', $record);
- if (!$success) {
- drupal_set_message('Unable to insert new Chado entity.', 'error');
- }
- }
-
-
- foreach ($fields as $field_id) {
-
- $field = field_info_field_by_id($field_id);
- $field_name = $field['field_name'];
-
- if (array_key_exists('settings', $field) and array_key_exists('chado_table', $field['settings'])) {
-
- if ($field['settings']['chado_table'] != $base_table){
- $field_table = $field['settings']['chado_table'];
-
- foreach ($field_vals[$field_name] as $delta => $fvals) {
- tripal_chado_field_storage_write_recursive($entity_type, $entity,
- $op, $fvals, $base_table, $field_table);
- }
- }
- }
- }
- }
- function tripal_chado_field_storage_write_recursive($entity_type, $entity,
- $op, $field_vals, $base_table, $tablename, $type_field = NULL,
- $record_id = NULL, $depth = 0) {
-
- $values = array();
-
-
- $schema = chado_get_schema($tablename);
- $pkey_field = $schema['primary key'][0];
- $fkey_fields = $schema['foreign keys'];
- $fkey_fields_list = array();
- $fkey_base_linker = NULL;
-
-
- foreach ($fkey_fields as $fk_table => $details) {
- foreach ($details['columns'] as $local_id => $remote_id) {
-
- if ($tablename == $base_table && $local_id == $type_field) {
- $values[$local_id] = $entity->cvterm_id;
- continue;
- }
-
-
- if ($tablename != $base_table && $details['table'] == $base_table) {
- $fkey_base_linker = $local_id;
- continue;
- }
-
- $fk_val = NULL;
- $fk_vals = array();
- $fk_field_name = $tablename . '__' . $local_id;
- if (array_key_exists($fk_field_name, $field_vals)) {
- $fk_val = $field_vals[$fk_field_name][0]['value'];
- $fk_vals = $field_vals[$fk_field_name][0];
- unset($fk_vals['value']);
- }
-
-
- if ($fk_val == "__NULL__") {
- $values[$local_id] = $fk_val;
- continue;
- }
-
- if (count(array_keys($fk_vals)) == 0) {
- continue;
- }
-
-
- $fkey_fields_list[] = $local_id;
-
-
- $fk_val = tripal_chado_field_storage_write_recursive($entity_type,
- $entity, $op, $fk_vals, $base_table, $fk_table, NULL, $fk_val, $depth + 1);
- if (isset($fk_val) and $fk_val != '' and $fk_val != 0) {
- $values[$local_id] = $fk_val;
- }
- }
- }
-
-
-
- foreach ($field_vals as $field_name => $items) {
- if (preg_match('/^' . $tablename . '__(.*)/', $field_name, $matches)) {
- $chado_field = $matches[1];
-
-
-
- if ($chado_field == $pkey_field) {
- continue;
- }
-
-
- if (in_array($chado_field, $fkey_fields_list)) {
- continue;
- }
-
- if (!$items[0]['value']) {
- continue;
- }
-
- $values[$chado_field] = $items[0]['value'];
- }
- }
-
-
- if (count($values) == 0) {
- return $record_id;
- }
-
- if ($record_id == NULL) {
-
-
- $options = array('is_duplicate' => TRUE);
- $is_duplicate = chado_select_record($tablename, array('*'), $values, $options);
- if($is_duplicate) {
- $record = chado_select_record($tablename, array('*'), $values);
- return $record[0]->$pkey_field;
- }
-
-
- $record = chado_insert_record($tablename, $values);
- if ($record === FALSE) {
- throw new Exception('Could not insert Chado record into table: "' . $tablename . '".');
- }
- $record_id = $record[$pkey_field];
- }
-
- else {
- $match[$pkey_field] = $record_id;
- if (!chado_update_record($tablename, $match, $values)) {
- drupal_set_message("Could not update Chado record in table: $tablename.", 'error');
- }
- }
- return $record_id;
- }
- function tripal_chado_field_storage_load($entity_type, $entities, $age,
- $fields, $options) {
- $load_current = $age == FIELD_LOAD_CURRENT;
- global $language;
- $langcode = $language->language;
- foreach ($entities as $id => $entity) {
-
- $details = db_select('chado_entity', 'ce')
- ->fields('ce')
- ->condition('entity_id', $entity->id)
- ->execute()
- ->fetchObject();
- if (!$details) {
-
- }
-
- $base_table = $details->data_table;
- $type_field = $details->field;
- $record_id = $details->record_id;
-
- $schema = chado_get_schema($base_table);
- $pkey_field = $schema['primary key'][0];
-
- $columns = array('*');
- $match = array($pkey_field => $record_id);
- $record = chado_select_record($base_table, $columns, $match);
- $record = $record[0];
-
-
- $tables = array();
- foreach ($fields as $field_id => $ids) {
-
-
-
-
- $field = field_info_field_by_id($field_id);
- $field_name = $field['field_name'];
- $field_type = $field['type'];
- $field_module = $field['module'];
-
- if (!array_key_exists('settings', $field) or !array_key_exists('chado_table', $field['settings'])) {
- continue;
- }
-
- $field_table = $field['settings']['chado_table'];
- $field_column = $field['settings']['chado_column'];
-
-
-
-
- if ($field_table == $base_table) {
-
- $entity->{$field_name}['und'][0]['value'] = '';
- if ($record and property_exists($record, $field_column)) {
- $entity->{$field_name}['und'][0]['value'] = $record->$field_column;
- }
-
-
-
- $load_function = $field_module . '_' . $field_type . '_field_load';
- module_load_include('inc', $field_module, 'includes/fields/' . $field_type);
- if (function_exists($load_function)) {
- $load_function($field, $entity, $base_table, $record);
- }
- }
-
-
-
- if ($field_table != $base_table) {
-
- $entity->{$field_name}['und'][0]['value'] = '';
- $load_function = $field_module . '_' . $field_type . '_field_load';
- module_load_include('inc', $field_module, 'includes/fields/' . $field_type);
- if (function_exists($load_function)) {
- $load_function($field, $entity, $base_table, $record);
- }
- }
- }
- }
- }
- function tripal_chado_field_storage_unnest_fields($fields, $entity_type, $entity) {
- $new_fields = array();
-
- foreach ($fields as $field_id => $ids) {
-
- $field = field_info_field_by_id($field_id);
- $field_name = $field['field_name'];
- $items = field_get_items($entity_type, $entity, $field_name);
-
-
- foreach ($items as $delta => $item) {
- foreach ($item as $item_name => $value) {
- if ($item_name == 'value') {
- $new_fields[$field_name][$delta]['value'] = $value;
- continue;
- }
- $matches = array();
- if (preg_match('/^(.*?)__.*?$/', $item_name, $matches)) {
- $table_name = $matches[1];
- $new_fields[$field_name][$delta][$item_name][0]['value'] = $value;
- }
- }
- }
- }
- return $new_fields;
- }
|