YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense alongwiththisprogram;ifnot,writetotheFreeSoftware
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
DBUG_EXECUTE_IF("myisam_pretend_crashed_table_on_usage",
mi_print_error(info->s, HA_ERR_CRASHED);
DBUG_RETURN(my_errno= HA_ERR_CRASHED);); if (!(info->update & HA_STATE_AKTIV))
{
DBUG_RETURN(my_errno=HA_ERR_KEY_NOT_FOUND);
} if (share->options & HA_OPTION_READ_ONLY_DATA)
{
DBUG_RETURN(my_errno=EACCES);
} if (info->state->key_file_length >= share->base.margin_key_file_length)
{
DBUG_RETURN(my_errno=HA_ERR_INDEX_FILE_FULL);
}
pos=info->lastpos; if (_mi_readinfo(info,F_WRLCK,1))
DBUG_RETURN(my_errno);
if (share->calc_checksum)
old_checksum=info->checksum=(*share->calc_checksum)(info,oldrec); if ((*share->compare_record)(info,oldrec))
{
save_errno=my_errno; goto err_end; /* Record has changed */
}
/* Calculate and check all unique constraints */
key_changed=0; for (i=0 ; i < share->state.header.uniques ; i++)
{
MI_UNIQUEDEF *def=share->uniqueinfo+i; if (mi_unique_comp(def, newrec, oldrec,1) &&
mi_check_unique(info, def, newrec, mi_unique_hash(def, newrec),
info->lastpos))
{
save_errno=my_errno; goto err_end;
}
} if (_mi_mark_file_changed(info))
{
save_errno=my_errno; goto err_end;
}
/* Check which keys changed from the original row */
new_key=info->lastkey2;
changed=0; for (i=0 ; i < share->base.keys ; i++)
{ if (mi_is_key_active(share->state.key_map, i))
{ if (share->keyinfo[i].key_alg == HA_KEY_ALG_FULLTEXT )
{ if (_mi_ft_cmp(info,i,oldrec, newrec))
{ if ((int) i == info->lastinx)
{ /* Wearechangeingtheindexwearereadingon.Markthat theindexdatahaschangedandweneedtodoafullsearch whendoingread-next
*/
key_changed|=HA_STATE_WRITTEN;
}
changed|=((ulonglong) 1 << i); if (_mi_ft_update(info,i, old_key,oldrec,newrec,pos)) goto err;
}
} else
{
uint new_length=_mi_make_key(info,i,new_key,newrec,pos);
uint old_length=_mi_make_key(info,i,old_key,oldrec,pos);
/* The above changed info->lastkey2. Inform mi_rnext_same(). */
info->update&= ~HA_STATE_RNEXT_SAME;
if (new_length != old_length ||
memcmp((uchar*) old_key,(uchar*) new_key,new_length))
{ if ((int) i == info->lastinx)
key_changed|=HA_STATE_WRITTEN; /* Mark that keyfile changed */
changed|=((ulonglong) 1 << i);
share->keyinfo[i].version++; if (share->keyinfo[i].ck_delete(info,i,old_key,old_length)) goto err; if (share->keyinfo[i].ck_insert(info,i,new_key,new_length)) goto err; if (share->base.auto_key == i+1)
auto_key_changed=1;
}
}
}
} /* Ifwearerunningwithexternallocking,wemustupdatetheindexfile thatsomethinghaschanged.
*/ if (changed || !my_disable_locking)
key_changed|= HA_STATE_CHANGED;
if (share->calc_checksum)
{
info->checksum=(*share->calc_checksum)(info,newrec); /* Store new checksum in index file header */
key_changed|= HA_STATE_CHANGED;
}
{ /* Don'tupdateindexfileifdatafileisnotextendedandnostatus informationchanged
*/
MI_STATUS_INFO state;
ha_rows org_split;
my_off_t org_delete_link;
memcpy((char*) &state, (char*) info->state, sizeof(state));
org_split= share->state.split;
org_delete_link= share->state.dellink; if ((*share->update_record)(info,pos,newrec)) goto err; if (!key_changed &&
(memcmp((char*) &state, (char*) info->state, sizeof(state)) ||
org_split != share->state.split ||
org_delete_link != share->state.dellink))
key_changed|= HA_STATE_CHANGED; /* Must update index file */
} if (auto_key_changed)
set_if_bigger(info->s->state.auto_increment,
retrieve_auto_increment(info, newrec)); if (share->calc_checksum)
info->state->checksum+=(info->checksum - old_checksum);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.