~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/discover.cc

  • Committer: Brian Aker
  • Date: 2008-12-15 07:35:25 UTC
  • mfrom: (673.3.1 drizzle-nopath)
  • Revision ID: brian@tangent.org-20081215073525-gzec3o8z2d15oqgn
Merge from Stewart.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Copyright (C) 2004 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
 
/**
17
 
  @file
18
 
 
19
 
  @brief
20
 
  Functions for discover of frm file from handler
21
 
*/
22
 
#include <drizzled/server_includes.h>
23
 
 
24
 
extern char reg_ext[FN_EXTLEN];
25
 
 
26
 
/**
27
 
  Read the contents of a .frm file.
28
 
 
29
 
  frmdata and len are set to 0 on error.
30
 
 
31
 
  @param name           path to table-file "db/name"
32
 
  @param frmdata        frm data
33
 
  @param len            length of the read frmdata
34
 
 
35
 
  @retval
36
 
    0   ok
37
 
  @retval
38
 
    1   Could not open file
39
 
  @retval
40
 
    2    Could not stat file
41
 
  @retval
42
 
    3    Could not allocate data for read.  Could not read file
43
 
*/
44
 
int readfrm(const char *name, unsigned char **frmdata, size_t *len)
45
 
{
46
 
  int    error;
47
 
  char   index_file[FN_REFLEN];
48
 
  File   file;
49
 
  size_t read_len;
50
 
  unsigned char *read_data;
51
 
  struct stat state;
52
 
 
53
 
  *frmdata= NULL;      // In case of errors
54
 
  *len= 0;
55
 
  error= 1;
56
 
  if ((file=my_open(fn_format(index_file,name,"",reg_ext,
57
 
                              MY_UNPACK_FILENAME|MY_APPEND_EXT),
58
 
                    O_RDONLY,
59
 
                    MYF(0))) < 0)
60
 
    goto err_end;
61
 
 
62
 
  // Get length of file
63
 
  error= 2;
64
 
  if (fstat(file, &state))
65
 
    goto err;
66
 
  read_len= state.st_size;
67
 
 
68
 
  // Read whole frm file
69
 
  error= 3;
70
 
  read_data= 0;                                 // Nothing to free
71
 
  if (read_string(file, &read_data, read_len))
72
 
    goto err;
73
 
 
74
 
  // Setup return data
75
 
  *frmdata= (unsigned char*) read_data;
76
 
  *len= read_len;
77
 
  error= 0;
78
 
 
79
 
 err:
80
 
  if (file > 0)
81
 
    my_close(file,MYF(MY_WME));
82
 
 
83
 
 err_end:                     /* Here when no file */
84
 
  return(error);
85
 
} /* readfrm */
86
 
 
87
 
 
88
 
/*
89
 
  Write the content of a frm data pointer
90
 
  to a frm file.
91
 
 
92
 
  @param name           path to table-file "db/name"
93
 
  @param frmdata        frm data
94
 
  @param len            length of the frmdata
95
 
 
96
 
  @retval
97
 
    0   ok
98
 
  @retval
99
 
    2    Could not write file
100
 
*/
101
 
int writefrm(const char *name, const unsigned char *frmdata, size_t len)
102
 
{
103
 
  File file;
104
 
  char   index_file[FN_REFLEN];
105
 
  int error;
106
 
 
107
 
  error= 0;
108
 
  if ((file=my_create(fn_format(index_file,name,"",reg_ext,
109
 
                      MY_UNPACK_FILENAME|MY_APPEND_EXT),
110
 
                      CREATE_MODE,O_RDWR | O_TRUNC,MYF(MY_WME))) >= 0)
111
 
  {
112
 
    if (my_write(file, frmdata, len,MYF(MY_WME | MY_NABP)))
113
 
      error= 2;
114
 
    my_close(file,MYF(0));
115
 
  }
116
 
  return(error);
117
 
} /* writefrm */