| 1 | /* Copyright (c) 2000, 2001, 2003-2007 MySQL AB, 2009 Sun Microsystems, Inc. |
| 2 | Use is subject to license terms. |
| 3 | |
| 4 | This program is free software; you can redistribute it and/or modify |
| 5 | it under the terms of the GNU General Public License as published by |
| 6 | the Free Software Foundation; version 2 of the License. |
| 7 | |
| 8 | This program is distributed in the hope that it will be useful, |
| 9 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 | GNU General Public License for more details. |
| 12 | |
| 13 | You should have received a copy of the GNU General Public License |
| 14 | along with this program; if not, write to the Free Software |
| 15 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ |
| 16 | |
| 17 | /* Return useful base information for an open table */ |
| 18 | |
| 19 | #include "myisamdef.h" |
| 20 | #ifdef __WIN__ |
| 21 | #include <sys/stat.h> |
| 22 | #endif |
| 23 | |
| 24 | /* Get position to last record */ |
| 25 | |
| 26 | my_off_t mi_position(MI_INFO *info) |
| 27 | { |
| 28 | return info->lastpos; |
| 29 | } |
| 30 | |
| 31 | |
| 32 | /* Get information about the table */ |
| 33 | /* if flag == 2 one get current info (no sync from database */ |
| 34 | |
| 35 | int mi_status(MI_INFO *info, register MI_ISAMINFO *x, uint flag) |
| 36 | { |
| 37 | MY_STAT state; |
| 38 | MYISAM_SHARE *share=info->s; |
| 39 | DBUG_ENTER("mi_status" ); |
| 40 | |
| 41 | x->recpos = info->lastpos; |
| 42 | if (flag == HA_STATUS_POS) |
| 43 | DBUG_RETURN(0); /* Compatible with ISAM */ |
| 44 | if (!(flag & HA_STATUS_NO_LOCK)) |
| 45 | { |
| 46 | mysql_mutex_lock(&share->intern_lock); |
| 47 | (void) _mi_readinfo(info,F_RDLCK,0); |
| 48 | fast_mi_writeinfo(info); |
| 49 | mysql_mutex_unlock(&share->intern_lock); |
| 50 | } |
| 51 | if (flag & HA_STATUS_VARIABLE) |
| 52 | { |
| 53 | x->records = info->state->records; |
| 54 | x->deleted = info->state->del; |
| 55 | x->delete_length = info->state->empty; |
| 56 | x->data_file_length =info->state->data_file_length; |
| 57 | x->index_file_length=info->state->key_file_length; |
| 58 | |
| 59 | x->keys = share->state.header.keys; |
| 60 | x->check_time = share->state.check_time; |
| 61 | x->mean_reclength= x->records ? |
| 62 | (ulong) ((x->data_file_length - x->delete_length) / x->records) : |
| 63 | (ulong) share->min_pack_length; |
| 64 | } |
| 65 | if (flag & HA_STATUS_ERRKEY) |
| 66 | { |
| 67 | x->errkey = info->errkey; |
| 68 | x->dupp_key_pos= info->dupp_key_pos; |
| 69 | } |
| 70 | if (flag & HA_STATUS_CONST) |
| 71 | { |
| 72 | x->reclength = share->base.reclength; |
| 73 | x->max_data_file_length=share->base.max_data_file_length; |
| 74 | x->max_index_file_length=info->s->base.max_key_file_length; |
| 75 | x->filenr = info->dfile; |
| 76 | x->options = share->options; |
| 77 | x->create_time=share->state.create_time; |
| 78 | x->reflength= mi_get_pointer_length(share->base.max_data_file_length, |
| 79 | myisam_data_pointer_size); |
| 80 | x->record_offset= ((share->options & |
| 81 | (HA_OPTION_PACK_RECORD | HA_OPTION_COMPRESS_RECORD)) ? |
| 82 | 0L : share->base.pack_reclength); |
| 83 | x->sortkey= -1; /* No clustering */ |
| 84 | x->rec_per_key = share->state.rec_per_key_part; |
| 85 | x->key_map = share->state.key_map; |
| 86 | x->data_file_name = share->data_file_name; |
| 87 | x->index_file_name = share->index_file_name; |
| 88 | } |
| 89 | if ((flag & HA_STATUS_TIME) && !mysql_file_fstat(info->dfile, &state, MYF(0))) |
| 90 | x->update_time=state.st_mtime; |
| 91 | else |
| 92 | x->update_time=0; |
| 93 | if (flag & HA_STATUS_AUTO) |
| 94 | { |
| 95 | x->auto_increment= share->state.auto_increment+1; |
| 96 | if (!x->auto_increment) /* This shouldn't happen */ |
| 97 | x->auto_increment= ~(ulonglong) 0; |
| 98 | } |
| 99 | DBUG_RETURN(0); |
| 100 | } |
| 101 | |
| 102 | |
| 103 | /* |
| 104 | Write a message to the error log. |
| 105 | |
| 106 | SYNOPSIS |
| 107 | mi_report_error() |
| 108 | file_name Name of table file (e.g. index_file_name). |
| 109 | errcode Error number. |
| 110 | |
| 111 | DESCRIPTION |
| 112 | This function supplies my_error() with a table name. Most error |
| 113 | messages need one. Since string arguments in error messages are limited |
| 114 | to 64 characters by convention, we ensure that in case of truncation, |
| 115 | that the end of the index file path is in the message. This contains |
| 116 | the most valuable information (the table name and the database name). |
| 117 | |
| 118 | RETURN |
| 119 | void |
| 120 | */ |
| 121 | |
| 122 | void mi_report_error(int errcode, const char *file_name) |
| 123 | { |
| 124 | size_t lgt; |
| 125 | DBUG_ENTER("mi_report_error" ); |
| 126 | DBUG_PRINT("enter" ,("errcode %d, table '%s'" , errcode, file_name)); |
| 127 | |
| 128 | if ((lgt= strlen(file_name)) > 64) |
| 129 | file_name+= lgt - 64; |
| 130 | my_error(errcode, MYF(ME_NOREFRESH), file_name); |
| 131 | DBUG_VOID_RETURN; |
| 132 | } |
| 133 | |
| 134 | |