--- nodereference.module.orig 2008-04-28 18:50:29.000000000 -0500 +++ nodereference.module 2008-05-18 03:39:37.000000000 -0500 @@ -111,6 +111,7 @@ * Implementation of hook_field(). */ function nodereference_field($op, &$node, $field, &$items, $teaser, $page) { + $db_info = content_database_info($field); switch ($op) { case 'validate': $refs = _nodereference_potential_references($field, TRUE); @@ -124,6 +125,67 @@ } } return; + + case 'load': + $additions = array(); + + $query = 'SELECT '. $field['field_name'] .'_nid AS nid FROM {'. $db_info['table'] .'} WHERE vid = %d'; + if ($field['multiple']) { + $result = db_query($query .' ORDER BY delta', $node->vid); + } + else { + $result = db_query_range($query, $node->vid, 0, 1); + } + $nids=""; + while ($value = db_fetch_array($result)) { + $additions[$field['field_name']][] = $value; + $nids.=$value['nid'].","; + } + $nids.="0"; + + $query = 'SELECT nid FROM {'. $db_info['table'] .'} WHERE '. $field['field_name'] .'_nid = %d AND nid NOT IN ('.$nids.') AND vid IN (SELECT vid FROM node)'; + if ($field['multiple']) { + $result = db_query($query .' ORDER BY delta', $node->nid); + } + else { + $result = db_query_range($query, $node->nid, 0, 1); + } + while ($value = db_fetch_array($result)) { + $additions[$field['field_name']][] = $value; + } + + return $additions; + + case 'update': + if ($field['multiple']) + db_query('DELETE FROM {'. $db_info['table'] .'} WHERE vid = %d OR '. $field['field_name'] .'_nid = %d', $node->vid, $node->nid); + else + db_query('UPDATE {'. $db_info['table'] .'} SET '. $field['field_name'] .'_nid = 0 WHERE vid = %d OR '. $field['field_name'] .'_nid = %d', $node->vid, $node->nid); + + + + foreach ($items as $delta => $item) { + if ($field['multiple']) { + db_query('INSERT INTO {'. $db_info['table'] .'} ('. $field['field_name'] .'_nid, vid, nid, delta) VALUES (%d, %d, %d, %d)', $item['nid'],$node->vid, $node->nid, $delta); + } + else { + db_query('UPDATE {'. $db_info['table'] .'} SET '. $field['field_name'] .'_nid = %d WHERE vid = %d', $item['nid'], $node->vid); + } + } + // clear old data + db_query('DELETE FROM {cache}'); + db_query('DELETE FROM {cache_content}'); + db_query('DELETE FROM {cache_filter}'); + db_query('DELETE FROM {cache_menu}'); + db_query('DELETE FROM {cache_page}'); + db_query('DELETE FROM {cache_views}'); + + return; + + case 'delete': + db_query('DELETE FROM {'. $db_info['table'] .'} WHERE nid = %d OR '. $field['field_name'] .'_nid = %d', $node->nid, $node->nid); + return; + } }