124
124
List<Item> &set_values,
125
125
enum enum_duplicates handle_duplicates, bool ignore)
127
char name[FN_REFLEN];
128
129
Table *table= NULL;
130
131
String *field_term=ex->field_term,*escaped=ex->escaped;
131
132
String *enclosed=ex->enclosed;
134
assert(table_list->getSchemaName()); // This should never be null
134
char *db= table_list->db; // This is never null
137
137
If path for cursor is not defined, we will use the current database.
138
138
If this is not set, we will use the directory where the table to be
139
139
loaded is located
141
util::string::const_shared_ptr schema(session->schema());
142
const char *tdb= (schema and not schema->empty()) ? schema->c_str() : table_list->getSchemaName(); // Result should never be null
141
const char *tdb= session->db.empty() ? db : session->db.c_str(); // Result is never null
144
143
uint32_t skip_lines= ex->skip_lines;
145
144
bool transactional_table;
146
Session::killed_state_t killed_status= Session::NOT_KILLED;
145
Session::killed_state killed_status= Session::NOT_KILLED;
148
147
/* Escape and enclosed character may be a utf8 4-byte character */
149
148
if (escaped->length() > 4 || enclosed->length() > 4)
260
fs::path to_file(ex->file_name);
261
fs::path target_path(fs::system_complete(getDataHomeCatalog()));
262
if (not to_file.has_root_directory())
264
int count_elements= 0;
265
for (fs::path::iterator iter= to_file.begin();
266
iter != to_file.end();
267
++iter, ++count_elements)
270
if (count_elements == 1)
274
target_path /= to_file;
278
target_path= to_file;
281
if (not secure_file_priv.string().empty())
283
if (target_path.file_string().substr(0, secure_file_priv.file_string().size()) != secure_file_priv.file_string())
285
/* Read only allowed from within dir specified by secure_file_priv */
286
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
258
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
259
ex->file_name+=dirname_length(ex->file_name);
261
if (!internal::dirname_length(ex->file_name))
263
strcpy(name, getDataHomeCatalog().c_str());
264
strncat(name, "/", 1);
265
strncat(name, tdb, FN_REFLEN-getDataHomeCatalog().size());
266
(void) internal::fn_format(name, ex->file_name, name, "",
267
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
271
(void) internal::fn_format(name, ex->file_name, getDataHomeCatalog().c_str(), "",
272
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
274
if (opt_secure_file_priv)
276
fs::path secure_file_path(fs::system_complete(fs::path(opt_secure_file_priv)));
277
fs::path target_path(fs::system_complete(fs::path(name)));
278
if (target_path.file_string().substr(0, secure_file_path.file_string().size()) != secure_file_path.file_string())
280
/* Read only allowed from within dir specified by secure_file_priv */
281
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
286
struct stat stat_info;
287
if (stat(name,&stat_info))
289
my_error(ER_FILE_NOT_FOUND, MYF(0), name, errno);
293
// if we are not in slave thread, the cursor must be:
294
if (!((stat_info.st_mode & S_IROTH) == S_IROTH && // readable by others
295
(stat_info.st_mode & S_IFLNK) != S_IFLNK && // and not a symlink
296
((stat_info.st_mode & S_IFREG) == S_IFREG ||
297
(stat_info.st_mode & S_IFIFO) == S_IFIFO)))
299
my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), name);
302
if ((stat_info.st_mode & S_IFIFO) == S_IFIFO)
305
if ((file=internal::my_open(name,O_RDONLY,MYF(MY_WME))) < 0)
307
my_error(ER_CANT_OPEN_FILE, MYF(0), name, errno);
291
struct stat stat_info;
292
if (stat(target_path.file_string().c_str(), &stat_info))
294
my_error(ER_FILE_NOT_FOUND, MYF(0), target_path.file_string().c_str(), errno);
298
// if we are not in slave thread, the cursor must be:
299
if (!((stat_info.st_mode & S_IROTH) == S_IROTH && // readable by others
300
(stat_info.st_mode & S_IFLNK) != S_IFLNK && // and not a symlink
301
((stat_info.st_mode & S_IFREG) == S_IFREG ||
302
(stat_info.st_mode & S_IFIFO) == S_IFIFO)))
304
my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), target_path.file_string().c_str());
307
if ((stat_info.st_mode & S_IFIFO) == S_IFIFO)
311
if ((file=internal::my_open(target_path.file_string().c_str(), O_RDONLY,MYF(MY_WME))) < 0)
313
my_error(ER_CANT_OPEN_FILE, MYF(0), target_path.file_string().c_str(), errno);
317
313
memset(&info, 0, sizeof(info));
318
314
info.ignore= ignore;
319
315
info.handle_duplicates=handle_duplicates;
320
316
info.escape_char=escaped->length() ? (*escaped)[0] : INT_MAX;
322
SchemaIdentifier identifier(*schema);
318
SchemaIdentifier identifier(session->db);
323
319
READ_INFO read_info(file, tot_length,
324
320
ex->cs ? ex->cs : plugin::StorageEngine::getSchemaCollation(identifier),
325
321
*field_term, *ex->line_start, *ex->line_term, *enclosed,
393
389
simulated killing in the middle of per-row loop
394
390
must be effective for binlogging
396
killed_status= (error == 0)? Session::NOT_KILLED : session->getKilled();
392
killed_status= (error == 0)? Session::NOT_KILLED : session->killed;
399
395
error= -1; // Error on read
404
snprintf(msg, sizeof(msg), ER(ER_LOAD_INFO), info.records, info.deleted,
398
snprintf(name, sizeof(name), ER(ER_LOAD_INFO), info.records, info.deleted,
405
399
(info.records - info.copied), session->cuted_fields);
407
401
if (session->transaction.stmt.hasModifiedNonTransData())
408
402
session->transaction.all.markModifiedNonTransData();
410
404
/* ok to client sent only after binlog write and engine commit */
411
session->my_ok(info.copied + info.deleted, 0, 0L, msg);
405
session->my_ok(info.copied + info.deleted, 0, 0L, name);
413
407
assert(transactional_table || !(info.copied || info.deleted) ||
414
408
session->transaction.stmt.hasModifiedNonTransData());
800
794
end_of_buff=buffer+buff_length;
801
if (cache.init_io_cache((false) ? -1 : cursor, 0,
802
(false) ? internal::READ_NET :
803
(is_fifo ? internal::READ_FIFO : internal::READ_CACHE),0L,1,
795
if (init_io_cache(&cache,(false) ? -1 : cursor, 0,
796
(false) ? internal::READ_NET :
797
(is_fifo ? internal::READ_FIFO : internal::READ_CACHE),0L,1,
806
800
free((unsigned char*) buffer);