~ubuntu-branches/ubuntu/saucy/drizzle/saucy-proposed

« back to all changes in this revision

Viewing changes to plugin/myisam/mi_delete_all.cc

  • Committer: Bazaar Package Importer
  • Author(s): Monty Taylor
  • Date: 2010-03-18 12:12:31 UTC
  • Revision ID: james.westby@ubuntu.com-20100318121231-k6g1xe6cshbwa0f8
Tags: upstream-2010.03.1347
ImportĀ upstreamĀ versionĀ 2010.03.1347

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (C) 2000-2003, 2005 MySQL AB
 
2
 
 
3
   This program is free software; you can redistribute it and/or modify
 
4
   it under the terms of the GNU General Public License as published by
 
5
   the Free Software Foundation; version 2 of the License.
 
6
 
 
7
   This program is distributed in the hope that it will be useful,
 
8
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
   GNU General Public License for more details.
 
11
 
 
12
   You should have received a copy of the GNU General Public License
 
13
   along with this program; if not, write to the Free Software
 
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
15
 
 
16
/* Remove all rows from a MyISAM table */
 
17
/* This clears the status information and truncates files */
 
18
 
 
19
#include "myisam_priv.h"
 
20
 
 
21
int mi_delete_all_rows(MI_INFO *info)
 
22
{
 
23
  uint32_t i;
 
24
  MYISAM_SHARE *share=info->s;
 
25
  MI_STATE_INFO *state=&share->state;
 
26
 
 
27
  if (share->options & HA_OPTION_READ_ONLY_DATA)
 
28
  {
 
29
    return(errno=EACCES);
 
30
  }
 
31
  if (_mi_readinfo(info,F_WRLCK,1))
 
32
    return(errno);
 
33
  if (_mi_mark_file_changed(info))
 
34
    goto err;
 
35
 
 
36
  info->state->records=info->state->del=state->split=0;
 
37
  state->dellink = HA_OFFSET_ERROR;
 
38
  state->sortkey=  UINT16_MAX;
 
39
  info->state->key_file_length=share->base.keystart;
 
40
  info->state->data_file_length=0;
 
41
  info->state->empty=info->state->key_empty=0;
 
42
  info->state->checksum=0;
 
43
 
 
44
  for (i=share->base.max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH ; i-- ; )
 
45
    state->key_del[i]= HA_OFFSET_ERROR;
 
46
  for (i=0 ; i < share->base.keys ; i++)
 
47
    state->key_root[i]= HA_OFFSET_ERROR;
 
48
 
 
49
  /*
 
50
    If we are using delayed keys or if the user has done changes to the tables
 
51
    since it was locked then there may be key blocks in the key cache
 
52
  */
 
53
  flush_key_blocks(share->key_cache, share->kfile, FLUSH_IGNORE_CHANGED);
 
54
  if (ftruncate(info->dfile, 0) || ftruncate(share->kfile, share->base.keystart))
 
55
    goto err;
 
56
  _mi_writeinfo(info,WRITEINFO_UPDATE_KEYFILE);
 
57
  return(0);
 
58
 
 
59
err:
 
60
  {
 
61
    int save_errno=errno;
 
62
    _mi_writeinfo(info,WRITEINFO_UPDATE_KEYFILE);
 
63
    info->update|=HA_STATE_WRITTEN;     /* Buffer changed */
 
64
    return(errno=save_errno);
 
65
  }
 
66
} /* mi_delete */