124
122
List<Item> &set_values,
125
123
enum enum_duplicates handle_duplicates, bool ignore)
125
char name[FN_REFLEN];
128
127
Table *table= NULL;
130
129
String *field_term=ex->field_term,*escaped=ex->escaped;
131
130
String *enclosed=ex->enclosed;
134
assert(table_list->getSchemaName()); // This should never be null
132
char *db= table_list->db; // This is never null
137
135
If path for cursor is not defined, we will use the current database.
138
136
If this is not set, we will use the directory where the table to be
139
137
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
139
const char *tdb= session->db.empty() ? db : session->db.c_str(); // Result is never null
144
141
uint32_t skip_lines= ex->skip_lines;
145
142
bool transactional_table;
146
Session::killed_state_t killed_status= Session::NOT_KILLED;
143
Session::killed_state killed_status= Session::NOT_KILLED;
148
145
/* Escape and enclosed character may be a utf8 4-byte character */
149
146
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");
256
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
257
ex->file_name+=dirname_length(ex->file_name);
259
if (!internal::dirname_length(ex->file_name))
261
strcpy(name, data_home_real);
262
strncat(name, tdb, FN_REFLEN-strlen(data_home_real)-1);
263
(void) internal::fn_format(name, ex->file_name, name, "",
264
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
268
(void) internal::fn_format(name, ex->file_name, data_home_real, "",
269
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
271
if (opt_secure_file_priv &&
272
strncmp(opt_secure_file_priv, name, strlen(opt_secure_file_priv)))
274
/* Read only allowed from within dir specified by secure_file_priv */
275
my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--secure-file-priv");
279
struct stat stat_info;
280
if (stat(name,&stat_info))
282
my_error(ER_FILE_NOT_FOUND, MYF(0), name, errno);
286
// if we are not in slave thread, the cursor must be:
287
if (!((stat_info.st_mode & S_IROTH) == S_IROTH && // readable by others
288
(stat_info.st_mode & S_IFLNK) != S_IFLNK && // and not a symlink
289
((stat_info.st_mode & S_IFREG) == S_IFREG ||
290
(stat_info.st_mode & S_IFIFO) == S_IFIFO)))
292
my_error(ER_TEXTFILE_NOT_READABLE, MYF(0), name);
295
if ((stat_info.st_mode & S_IFIFO) == S_IFIFO)
298
if ((file=internal::my_open(name,O_RDONLY,MYF(MY_WME))) < 0)
300
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
306
memset(&info, 0, sizeof(info));
318
307
info.ignore= ignore;
319
308
info.handle_duplicates=handle_duplicates;
320
309
info.escape_char=escaped->length() ? (*escaped)[0] : INT_MAX;
322
SchemaIdentifier identifier(*schema);
311
SchemaIdentifier identifier(session->db);
323
312
READ_INFO read_info(file, tot_length,
324
313
ex->cs ? ex->cs : plugin::StorageEngine::getSchemaCollation(identifier),
325
314
*field_term, *ex->line_start, *ex->line_term, *enclosed,
393
382
simulated killing in the middle of per-row loop
394
383
must be effective for binlogging
396
killed_status= (error == 0)? Session::NOT_KILLED : session->getKilled();
385
killed_status= (error == 0)? Session::NOT_KILLED : session->killed;
399
388
error= -1; // Error on read
404
snprintf(msg, sizeof(msg), ER(ER_LOAD_INFO), info.records, info.deleted,
391
snprintf(name, sizeof(name), ER(ER_LOAD_INFO), info.records, info.deleted,
405
392
(info.records - info.copied), session->cuted_fields);
407
394
if (session->transaction.stmt.hasModifiedNonTransData())
408
395
session->transaction.all.markModifiedNonTransData();
410
397
/* ok to client sent only after binlog write and engine commit */
411
session->my_ok(info.copied + info.deleted, 0, 0L, msg);
398
session->my_ok(info.copied + info.deleted, 0, 0L, name);
413
400
assert(transactional_table || !(info.copied || info.deleted) ||
414
401
session->transaction.stmt.hasModifiedNonTransData());
800
787
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,
788
if (init_io_cache(&cache,(false) ? -1 : cursor, 0,
789
(false) ? internal::READ_NET :
790
(is_fifo ? internal::READ_FIFO : internal::READ_CACHE),0L,1,
806
793
free((unsigned char*) buffer);