638
636
return mi_write(file,buf);
641
int ha_myisam::check(Session* session, HA_CHECK_OPT* check_opt)
643
if (!file) return HA_ADMIN_INTERNAL_ERROR;
646
MYISAM_SHARE* share = file->s;
647
const char *old_proc_info= session->get_proc_info();
649
session->set_proc_info("Checking table");
650
myisamchk_init(¶m);
651
param.session = session;
652
param.op_name = "check";
653
param.db_name= table->s->db.str;
654
param.table_name= table->alias;
655
param.testflag = check_opt->flags | T_CHECK | T_SILENT;
656
param.stats_method= MI_STATS_METHOD_NULLS_NOT_EQUAL;
658
if (!(table->db_stat & HA_READ_ONLY))
659
param.testflag|= T_STATISTICS;
660
param.using_global_keycache = 1;
662
if (!mi_is_crashed(file) &&
663
(((param.testflag & T_CHECK_ONLY_CHANGED) &&
664
!(share->state.changed & (STATE_CHANGED | STATE_CRASHED |
665
STATE_CRASHED_ON_REPAIR)) &&
666
share->state.open_count == 0) ||
667
((param.testflag & T_FAST) && (share->state.open_count ==
668
(uint) (share->global_changed ? 1 : 0)))))
669
return HA_ADMIN_ALREADY_DONE;
671
error = chk_status(¶m, file); // Not fatal
672
error = chk_size(¶m, file);
674
error |= chk_del(¶m, file, param.testflag);
676
error = chk_key(¶m, file);
679
if ((!(param.testflag & T_QUICK) &&
681
(HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ||
682
(param.testflag & (T_EXTEND | T_MEDIUM)))) ||
685
uint32_t old_testflag=param.testflag;
686
param.testflag|=T_MEDIUM;
687
if (!(error= init_io_cache(¶m.read_cache, file->dfile,
688
my_default_record_cache_size, READ_CACHE,
689
share->pack.header_length, 1, MYF(MY_WME))))
691
error= chk_data_link(¶m, file, param.testflag & T_EXTEND);
692
end_io_cache(&(param.read_cache));
694
param.testflag= old_testflag;
699
if ((share->state.changed & (STATE_CHANGED |
700
STATE_CRASHED_ON_REPAIR |
701
STATE_CRASHED | STATE_NOT_ANALYZED)) ||
702
(param.testflag & T_STATISTICS) ||
705
file->update|=HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
706
pthread_mutex_lock(&share->intern_lock);
707
share->state.changed&= ~(STATE_CHANGED | STATE_CRASHED |
708
STATE_CRASHED_ON_REPAIR);
709
if (!(table->db_stat & HA_READ_ONLY))
710
error=update_state_info(¶m,file,UPDATE_TIME | UPDATE_OPEN_COUNT |
712
pthread_mutex_unlock(&share->intern_lock);
713
info(HA_STATUS_NO_LOCK | HA_STATUS_TIME | HA_STATUS_VARIABLE |
717
else if (!mi_is_crashed(file) && !session->killed)
719
mi_mark_crashed(file);
720
file->update |= HA_STATE_CHANGED | HA_STATE_ROW_CHANGED;
723
session->set_proc_info(old_proc_info);
724
return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK;
729
analyze the key distribution in the table
730
As the table may be only locked for read, we have to take into account that
731
two threads may do an analyze at the same time!
734
int ha_myisam::analyze(Session *session,
739
MYISAM_SHARE* share = file->s;
741
myisamchk_init(¶m);
742
param.session = session;
743
param.op_name= "analyze";
744
param.db_name= table->s->db.str;
745
param.table_name= table->alias;
746
param.testflag= (T_FAST | T_CHECK | T_SILENT | T_STATISTICS |
747
T_DONT_CHECK_CHECKSUM);
748
param.using_global_keycache = 1;
749
param.stats_method= MI_STATS_METHOD_NULLS_NOT_EQUAL;
751
if (!(share->state.changed & STATE_NOT_ANALYZED))
752
return HA_ADMIN_ALREADY_DONE;
754
error = chk_key(¶m, file);
757
pthread_mutex_lock(&share->intern_lock);
758
error=update_state_info(¶m,file,UPDATE_STAT);
759
pthread_mutex_unlock(&share->intern_lock);
761
else if (!mi_is_crashed(file) && !session->killed)
762
mi_mark_crashed(file);
763
return error ? HA_ADMIN_CORRUPT : HA_ADMIN_OK;
767
int ha_myisam::repair(Session* session, HA_CHECK_OPT *check_opt)
771
ha_rows start_records;
773
if (!file) return HA_ADMIN_INTERNAL_ERROR;
775
myisamchk_init(¶m);
776
param.session = session;
777
param.op_name= "repair";
778
param.testflag= ((check_opt->flags & ~(T_EXTEND)) |
779
T_SILENT | T_FORCE_CREATE | T_CALC_CHECKSUM |
780
(check_opt->flags & T_EXTEND ? T_REP : T_REP_BY_SORT));
781
param.sort_buffer_length= (size_t)sort_buffer_size;
783
// Release latches since this can take a long time
784
ha_release_temporary_latches(session);
786
start_records=file->state->records;
787
while ((error=repair(session,param,0)) && param.retry_repair)
789
param.retry_repair=0;
790
if (test_all_bits(param.testflag,
791
(uint) (T_RETRY_WITHOUT_QUICK | T_QUICK)))
793
param.testflag&= ~T_RETRY_WITHOUT_QUICK;
794
errmsg_printf(ERRMSG_LVL_INFO, "Retrying repair of: '%s' without quick",
798
param.testflag&= ~T_QUICK;
799
if ((param.testflag & T_REP_BY_SORT))
801
param.testflag= (param.testflag & ~T_REP_BY_SORT) | T_REP;
802
errmsg_printf(ERRMSG_LVL_INFO, "Retrying repair of: '%s' with keycache",
808
if (!error && start_records != file->state->records &&
809
!(check_opt->flags & T_VERY_SILENT))
811
char llbuff[22],llbuff2[22];
812
errmsg_printf(ERRMSG_LVL_INFO, "Found %s of %s rows when repairing '%s'",
813
llstr(file->state->records, llbuff),
814
llstr(start_records, llbuff2),
820
int ha_myisam::optimize(Session* session, HA_CHECK_OPT *check_opt)
823
if (!file) return HA_ADMIN_INTERNAL_ERROR;
826
myisamchk_init(¶m);
827
param.session = session;
828
param.op_name= "optimize";
829
param.testflag= (check_opt->flags | T_SILENT | T_FORCE_CREATE |
830
T_REP_BY_SORT | T_STATISTICS | T_SORT_INDEX);
831
param.sort_buffer_length= (size_t)sort_buffer_size;
832
if ((error= repair(session,param,1)) && param.retry_repair)
834
errmsg_printf(ERRMSG_LVL_WARN, "Warning: Optimize table got errno %d on %s.%s, retrying",
835
my_errno, param.db_name, param.table_name);
836
param.testflag&= ~T_REP_BY_SORT;
837
error= repair(session,param,1);
843
640
int ha_myisam::repair(Session *session, MI_CHECK ¶m, bool do_optimize)