~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/function/str/load_file.cc

  • Committer: lbieber
  • Date: 2010-10-07 15:39:23 UTC
  • mfrom: (1819.1.2 build)
  • Revision ID: lbieber@orisndriz08-20101007153923-e9rwa9ha5oyhjdc2
Merge Monty - Bug 655294: load_data() function returns null if file is invalid 
Merge Monty - Bug 655342: select into outfile creates a garbage file on no results
Merge Monty - Fixes the haildb build

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
#include <drizzled/session.h>
26
26
#include "drizzled/internal/my_sys.h"
27
27
 
 
28
#include <boost/filesystem.hpp>
 
29
 
28
30
#include <fcntl.h>
29
31
#include <sys/stat.h>
 
32
#include <iostream>
 
33
 
 
34
namespace fs=boost::filesystem;
 
35
using namespace std;
30
36
 
31
37
namespace drizzled
32
38
{
37
43
  String *file_name;
38
44
  int file;
39
45
  struct stat stat_info;
40
 
  char path[FN_REFLEN];
41
46
 
42
47
  if (!(file_name= args[0]->val_str(str)))
43
 
    goto err;
 
48
  {
 
49
    null_value = 1;
 
50
    return(0);
 
51
  }
44
52
 
45
 
  (void) internal::fn_format(path, file_name->c_ptr(), getDataHome().c_str(), "",
46
 
                   MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
 
53
  fs::path target_path(fs::system_complete(getDataHomeCatalog()));
 
54
  fs::path to_file(file_name->c_ptr());
 
55
  if (not to_file.has_root_directory())
 
56
  {
 
57
    target_path /= to_file;
 
58
  }
 
59
  else
 
60
  {
 
61
    target_path= to_file;
 
62
  }
47
63
 
48
64
  /* Read only allowed from within dir specified by secure_file_priv */
49
 
  if (opt_secure_file_priv &&
50
 
      strncmp(opt_secure_file_priv, path, strlen(opt_secure_file_priv)))
51
 
    goto err;
 
65
  if (not secure_file_priv.string().empty())
 
66
  {
 
67
    fs::path secure_file_path(fs::system_complete(secure_file_priv));
 
68
    if (target_path.file_string().substr(0, secure_file_path.file_string().size()) != secure_file_path.file_string())
 
69
    {
 
70
      /* Read only allowed from within dir specified by secure_file_priv */
 
71
      my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv"); 
 
72
      null_value = 1;
 
73
      return 0;
 
74
    }
 
75
  }
52
76
 
53
 
  if (stat(path, &stat_info))
 
77
  if (stat(target_path.file_string().c_str(), &stat_info))
 
78
  {
 
79
    my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr());
54
80
    goto err;
 
81
  }
55
82
 
56
83
  if (!(stat_info.st_mode & S_IROTH))
57
84
  {
58
 
    /* my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr()); */
 
85
    my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), file_name->c_ptr());
59
86
    goto err;
60
87
  }
 
88
 
61
89
  if (stat_info.st_size > (long) session.variables.max_allowed_packet)
62
90
  {
63
91
    push_warning_printf(&session, DRIZZLE_ERROR::WARN_LEVEL_WARN,
66
94
                        func_name(), session.variables.max_allowed_packet);
67
95
    goto err;
68
96
  }
 
97
 
 
98
  if (stat_info.st_size == 0)
 
99
  {
 
100
    goto err;
 
101
  }
 
102
 
69
103
  if (tmp_value.alloc((size_t)stat_info.st_size))
70
104
    goto err;
71
 
  if ((file = internal::my_open(file_name->c_ptr(), O_RDONLY, MYF(0))) < 0)
 
105
  if ((file = internal::my_open(target_path.file_string().c_str(), O_RDONLY, MYF(0))) < 0)
72
106
    goto err;
73
107
  if (internal::my_read(file, (unsigned char*) tmp_value.ptr(), (size_t)stat_info.st_size, MYF(MY_NABP)))
74
108
  {
75
109
    internal::my_close(file, MYF(0));
76
110
    goto err;
77
111
  }
 
112
  if (strlen(tmp_value.ptr()) == 0)
 
113
  {
 
114
    goto err;
 
115
  }
78
116
  tmp_value.length((size_t)stat_info.st_size);
79
117
  internal::my_close(file, MYF(0));
80
118
  null_value = 0;