int mi_rsame(MI_INFO * info, byte * record, int inx) { DBUG_ENTER("mi_rsame"); if (inx != -1 && !(((ulonglong) 1 << inx) & info->s->state.key_map)) { DBUG_RETURN(my_errno = HA_ERR_WRONG_INDEX); } if (info->lastpos == HA_OFFSET_ERROR || info->update & HA_STATE_DELETED) { DBUG_RETURN(my_errno = HA_ERR_KEY_NOT_FOUND); /* No current record */ } info->update &= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* Read row from data file */ if (_mi_readinfo(info, F_RDLCK, 1)) DBUG_RETURN(my_errno); if (inx >= 0) { info->lastinx = inx; info->lastkey_length = _mi_make_key(info, (uint) inx, info->lastkey, record, info->lastpos); if (info->s->concurrent_insert) rw_rdlock(&info->s->key_root_lock[inx]); VOID(_mi_search(info, info->s->keyinfo + inx, info->lastkey, 0, SEARCH_SAME, info->s->state.key_root[inx])); if (info->s->concurrent_insert) rw_unlock(&info->s->key_root_lock[inx]); } if (!(*info->read_record) (info, info->lastpos, record)) DBUG_RETURN(0); if (my_errno == HA_ERR_RECORD_DELETED) my_errno = HA_ERR_KEY_NOT_FOUND; DBUG_RETURN(my_errno); } /* mi_rsame */
int mi_rsame_with_pos(MI_INFO *info, uchar *record, int inx, my_off_t filepos) { DBUG_ENTER("mi_rsame_with_pos"); DBUG_PRINT("enter",("index: %d filepos: %ld", inx, (long) filepos)); if (inx < -1 || (inx >= 0 && ! mi_is_key_active(info->s->state.key_map, inx))) { DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); } info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); if ((*info->s->read_rnd)(info,record,filepos,0)) { if (my_errno == HA_ERR_RECORD_DELETED) my_errno=HA_ERR_KEY_NOT_FOUND; DBUG_RETURN(my_errno); } info->lastpos=filepos; info->lastinx=inx; if (inx >= 0) { info->lastkey_length=_mi_make_key(info,(uint) inx,info->lastkey,record, info->lastpos); info->update|=HA_STATE_KEY_CHANGED; /* Don't use indexposition */ } DBUG_RETURN(0); } /* mi_rsame_pos */
int mi_rsame_with_pos(MI_INFO *info, byte *record, int inx, my_off_t filepos) { DBUG_ENTER("mi_rsame_with_pos"); if (inx < -1 || ! (((ulonglong) 1 << inx) & info->s->state.key_map)) { DBUG_RETURN(my_errno=HA_ERR_WRONG_INDEX); } info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); if ((*info->s->read_rnd)(info,record,filepos,0)) { if (my_errno == HA_ERR_RECORD_DELETED) my_errno=HA_ERR_KEY_NOT_FOUND; DBUG_RETURN(my_errno); } info->lastpos=filepos; info->lastinx=inx; if (inx >= 0) { info->lastkey_length=_mi_make_key(info,(uint) inx,info->lastkey,record, info->lastpos); info->update|=HA_STATE_KEY_CHANGED; /* Don't use indexposition */ } DBUG_RETURN(0); } /* mi_rsame_pos */
uint _ft_make_key(MI_INFO *info, uint keynr, uchar *keybuf, FT_WORD *wptr, my_off_t filepos) { uchar buf[HA_FT_MAXBYTELEN+16]; DBUG_ENTER("_ft_make_key"); #if HA_FT_WTYPE == HA_KEYTYPE_FLOAT { float weight=(float) ((filepos==HA_OFFSET_ERROR) ? 0 : wptr->weight); mi_float4store(buf,weight); } #else #error #endif int2store(buf+HA_FT_WLEN,wptr->len); memcpy(buf+HA_FT_WLEN+2,wptr->pos,wptr->len); DBUG_RETURN(_mi_make_key(info,keynr,(uchar*) keybuf,buf,filepos)); }
int mi_rsame(MI_INFO *info, uchar *record, int inx) { DBUG_ENTER("mi_rsame"); if (inx != -1 && ! mi_is_key_active(info->s->state.key_map, inx)) { set_my_errno(HA_ERR_WRONG_INDEX); DBUG_RETURN(HA_ERR_WRONG_INDEX); } if (info->lastpos == HA_OFFSET_ERROR || info->update & HA_STATE_DELETED) { set_my_errno(HA_ERR_KEY_NOT_FOUND); DBUG_RETURN(HA_ERR_KEY_NOT_FOUND); /* No current record */ } info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED); /* Read row from data file */ if (fast_mi_readinfo(info)) DBUG_RETURN(my_errno()); if (inx >= 0) { info->lastinx=inx; info->lastkey_length=_mi_make_key(info,(uint) inx,info->lastkey,record, info->lastpos); if (info->s->concurrent_insert) mysql_rwlock_rdlock(&info->s->key_root_lock[inx]); (void) _mi_search(info,info->s->keyinfo+inx,info->lastkey, USE_WHOLE_KEY, SEARCH_SAME, info->s->state.key_root[inx]); if (info->s->concurrent_insert) mysql_rwlock_unlock(&info->s->key_root_lock[inx]); } if (!(*info->read_record)(info,info->lastpos,record)) DBUG_RETURN(0); if (my_errno() == HA_ERR_RECORD_DELETED) set_my_errno(HA_ERR_KEY_NOT_FOUND); DBUG_RETURN(my_errno()); } /* mi_rsame */
int mi_write(MI_INFO * info, byte * record) { uint i; int save_errno; my_off_t filepos; uchar *buff; MYISAM_SHARE *share = info->s; DBUG_ENTER("mi_write"); DBUG_PRINT("enter", ("isam: %d data: %d", info->s->kfile, info->dfile)); if (share->options & HA_OPTION_READ_ONLY_DATA) { DBUG_RETURN(my_errno = EACCES); } if (_mi_readinfo(info, F_WRLCK, 1)) DBUG_RETURN(my_errno); dont_break(); /* Dont allow SIGHUP or SIGINT */ #if !defined(NO_LOCKING) && defined(USE_RECORD_LOCK) if (!info->locked && my_lock(info->dfile, F_WRLCK, 0L, F_TO_EOF, MYF(MY_SEEK_NOT_DONE) | info->lock_wait)) goto err; #endif filepos = ((share->state.dellink != HA_OFFSET_ERROR) ? share->state.dellink : info->state->data_file_length); if (share->base.reloc == (ha_rows) 1 && share->base.records == (ha_rows) 1 && info->state->records == (ha_rows) 1) { /* System file */ my_errno = HA_ERR_RECORD_FILE_FULL; goto err2; } if (info->state->key_file_length >= share->base.margin_key_file_length) { my_errno = HA_ERR_INDEX_FILE_FULL; goto err2; } if (_mi_mark_file_changed(info)) goto err2; /* Calculate and check all unique constraints */ for (i = 0; i < share->state.header.uniques; i++) { if (mi_check_unique(info, share->uniqueinfo + i, record, mi_unique_hash(share->uniqueinfo + i, record), HA_OFFSET_ERROR)) goto err2; } /* Write all keys to indextree */ buff = info->lastkey2; for (i = 0; i < share->base.keys; i++) { if (((ulonglong) 1 << i) & share->state.key_map) { if (share->concurrent_insert) { rw_wrlock(&share->key_root_lock[i]); share->keyinfo[i].version++; } if (share->keyinfo[i].flag & HA_FULLTEXT) { /* SerG *//* SerG */ if (_mi_ft_add(info, i, (char *)buff, record, filepos)) { /* SerG *//* SerG */ if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); DBUG_PRINT("error", ("Got error: %d on write", my_errno)); /* SerG */ goto err; /* SerG */ } /* SerG */ } /* SerG */ else { /* SerG */ uint key_length = _mi_make_key(info, i, buff, record, filepos); if (_mi_ck_write(info, i, buff, key_length)) { if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); DBUG_PRINT("error", ("Got error: %d on write", my_errno)); goto err; } } if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); } } if (share->calc_checksum) info->checksum = (*share->calc_checksum) (info, record); if (!(info->opt_flag & OPT_NO_ROWS)) { if ((*share->write_record) (info, record)) goto err; share->state.checksum += info->checksum; } if (share->base.auto_key) update_auto_increment(info, record); info->update = (HA_STATE_CHANGED | HA_STATE_AKTIV | HA_STATE_WRITTEN | HA_STATE_ROW_CHANGED); info->state->records++; info->lastpos = filepos; myisam_log_record(MI_LOG_WRITE, info, record, filepos, 0); VOID(_mi_writeinfo(info, WRITEINFO_UPDATE_KEYFILE)); allow_break(); /* Allow SIGHUP & SIGINT */ DBUG_RETURN(0); err: save_errno = my_errno; if (my_errno == HA_ERR_FOUND_DUPP_KEY || my_errno == HA_ERR_RECORD_FILE_FULL) { info->errkey = (int)i; while (i-- > 0) { if (((ulonglong) 1 << i) & share->state.key_map) { if (share->concurrent_insert) rw_wrlock(&share->key_root_lock[i]); /* * The following code block is for text * searching by SerG */ if (share->keyinfo[i].flag & HA_FULLTEXT) { if (_mi_ft_del(info, i, (char *)buff, record, filepos)) { if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); break; } } else { uint key_length = _mi_make_key(info, i, buff, record, filepos); if (_mi_ck_delete(info, i, buff, key_length)) { if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); break; } } if (share->concurrent_insert) rw_unlock(&share->key_root_lock[i]); } } } else mi_mark_crashed(info); info->update = (HA_STATE_CHANGED | HA_STATE_WRITTEN | HA_STATE_ROW_CHANGED); my_errno = save_errno; err2: save_errno = my_errno; myisam_log_record(MI_LOG_WRITE, info, record, filepos, my_errno); VOID(_mi_writeinfo(info, WRITEINFO_UPDATE_KEYFILE)); allow_break(); /* Allow SIGHUP & SIGINT */ DBUG_RETURN(my_errno = save_errno); } /* mi_write */