~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/mf_tempfile.c

  • Committer: Mark Atwood
  • Date: 2008-10-03 01:39:40 UTC
  • mto: This revision was merged to the branch mainline in revision 437.
  • Revision ID: mark@fallenpegasus.com-20081003013940-mvefjo725dltz41h
rename logging_noop to logging_query

Show diffs side-by-side

added added

removed removed

Lines of Context:
11
11
 
12
12
   You should have received a copy of the GNU General Public License
13
13
   along with this program; if not, write to the Free Software
14
 
   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA */
15
 
 
16
 
#include <config.h>
17
 
 
18
 
#include <drizzled/internal/my_sys.h>
19
 
#include <drizzled/internal/m_string.h>
 
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
 
15
 
 
16
#include "mysys_priv.h"
 
17
#include <mystrings/m_string.h>
20
18
#include "my_static.h"
21
 
#include <drizzled/error.h>
22
 
#include <stdio.h>
 
19
#include "mysys_err.h"
23
20
#include <errno.h>
24
 
#include <string>
25
21
#ifdef HAVE_PATHS_H
26
22
#include <paths.h>
27
23
#endif
28
24
 
29
 
using namespace std;
30
 
namespace drizzled
31
 
{
32
 
namespace internal
33
 
{
 
25
 
34
26
 
35
27
/*
36
28
  @brief
41
33
    to             pointer to buffer where temporary filename will be stored
42
34
    dir            directory where to create the file
43
35
    prefix         prefix the filename with this
 
36
    mode           Flags to use for my_create/my_open
44
37
    MyFlags        Magic flags
45
38
 
46
39
  @return
52
45
    implementation, it's main use is to generate a file with
53
46
    a name that does not already exist.
54
47
 
 
48
    When passing O_TEMPORARY flag in "mode" the file should
 
49
    be automatically deleted
 
50
 
55
51
    The implementation using mkstemp should be considered the
56
52
    reference implementation when adding a new or modifying an
57
53
    existing one
58
54
 
59
55
*/
60
56
 
61
 
int create_temp_file(char *to, const char *dir, const char *prefix,
62
 
                     myf MyFlags)
 
57
File create_temp_file(char *to, const char *dir, const char *prefix,
 
58
                      int mode __attribute__((unused)),
 
59
                      myf MyFlags __attribute__((unused)))
63
60
{
64
 
  int file= -1;
65
 
 
66
 
  int org_file;
67
 
  string prefix_str;
68
 
 
69
 
  prefix_str= prefix ? prefix : "tmp.";
70
 
  prefix_str.append("XXXXXX");
71
 
 
72
 
  if (!dir && ! (dir =getenv("TMPDIR")))
73
 
    dir= P_tmpdir;
74
 
  if (strlen(dir)+prefix_str.length() > FN_REFLEN-2)
75
 
  {
76
 
    errno= ENAMETOOLONG;
77
 
    return(file);
78
 
  }
79
 
  strcpy(convert_dirname(to,dir,NULL),prefix_str.c_str());
80
 
  org_file=mkstemp(to);
81
 
  /* TODO: This was old behavior, but really don't we want to
82
 
   * unlink files immediately under all circumstances?
83
 
   * if (mode & O_TEMPORARY)
84
 
    (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
85
 
  */
86
 
  file=my_register_filename(org_file, to, EE_CANTCREATEFILE, MyFlags);
87
 
 
88
 
  /* If we didn't manage to register the name, remove the temp file */
89
 
  if (org_file >= 0 && file < 0)
90
 
  {
91
 
    int tmp=errno;
92
 
    close(org_file);
93
 
    (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
94
 
    errno=tmp;
95
 
  }
96
 
 
 
61
  File file= -1;
 
62
 
 
63
#if defined(_ZTC__)
 
64
  if (!dir)
 
65
    dir=getenv("TMPDIR");
 
66
  if ((res=tempnam((char*) dir,(char *) prefix)))
 
67
  {
 
68
    strmake(to,res,FN_REFLEN-1);
 
69
    (*free)(res);
 
70
    file=my_create(to, 0, mode | O_EXCL | O_NOFOLLOW, MyFlags);
 
71
  }
 
72
#elif defined(HAVE_MKSTEMP)
 
73
  {
 
74
    char prefix_buff[30];
 
75
    uint pfx_len;
 
76
    File org_file;
 
77
 
 
78
    pfx_len= (uint) (stpcpy(stpncpy(prefix_buff,
 
79
                                    prefix ? prefix : "tmp.",
 
80
                                    sizeof(prefix_buff)-7),"XXXXXX") -
 
81
                     prefix_buff);
 
82
    if (!dir && ! (dir =getenv("TMPDIR")))
 
83
      dir=P_tmpdir;
 
84
    if (strlen(dir)+ pfx_len > FN_REFLEN-2)
 
85
    {
 
86
      errno=my_errno= ENAMETOOLONG;
 
87
      return(file);
 
88
    }
 
89
    stpcpy(convert_dirname(to,dir,NullS),prefix_buff);
 
90
    org_file=mkstemp(to);
 
91
    if (mode & O_TEMPORARY)
 
92
      (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
 
93
    file=my_register_filename(org_file, to, FILE_BY_MKSTEMP,
 
94
                              EE_CANTCREATEFILE, MyFlags);
 
95
    /* If we didn't manage to register the name, remove the temp file */
 
96
    if (org_file >= 0 && file < 0)
 
97
    {
 
98
      int tmp=my_errno;
 
99
      close(org_file);
 
100
      (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
 
101
      my_errno=tmp;
 
102
    }
 
103
  }
 
104
#elif defined(HAVE_TEMPNAM)
 
105
  {
 
106
    char *res,**old_env,*temp_env[1];
 
107
    if (dir && !dir[0])
 
108
    {                           /* Change empty string to current dir */
 
109
      to[0]= FN_CURLIB;
 
110
      to[1]= 0;
 
111
      dir=to;
 
112
    }
 
113
    old_env= (char**) environ;
 
114
    if (dir)
 
115
    {                           /* Don't use TMPDIR if dir is given */
 
116
      environ=(const char**) temp_env;
 
117
      temp_env[0]=0;
 
118
    }
 
119
    if ((res=tempnam((char*) dir, (char*) prefix)))
 
120
    {
 
121
      strmake(to,res,FN_REFLEN-1);
 
122
      (*free)(res);
 
123
      file=my_create(to,0,
 
124
                     (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW |
 
125
                            O_TEMPORARY | O_SHORT_LIVED),
 
126
                     MYF(MY_WME));
 
127
 
 
128
    }
 
129
    environ=(const char**) old_env;
 
130
  }
 
131
#else
 
132
#error No implementation found for create_temp_file
 
133
#endif
 
134
  if (file >= 0)
 
135
    thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
97
136
  return(file);
98
137
}
99
 
 
100
 
} /* namespace internal */
101
 
} /* namespace drizzled */