74
76
void end_io_cache()
76
internal::end_io_cache(&cache);
77
79
need_end_io_cache = 0;
81
83
Either this method, or we need to make cache public
82
Arg must be set from mysql_load() since constructor does not see
84
Arg must be set from load() since constructor does not see
83
85
either the table or Session value
85
87
void set_io_cache_arg(void* arg) { cache.arg = arg; }
88
static int read_fixed_length(Session *session, COPY_INFO &info, TableList *table_list,
90
static int read_fixed_length(Session *session, CopyInfo &info, TableList *table_list,
89
91
List<Item> &fields_vars, List<Item> &set_fields,
90
92
List<Item> &set_values, READ_INFO &read_info,
91
93
uint32_t skip_lines,
92
94
bool ignore_check_option_errors);
93
static int read_sep_field(Session *session, COPY_INFO &info, TableList *table_list,
95
static int read_sep_field(Session *session, CopyInfo &info, TableList *table_list,
94
96
List<Item> &fields_vars, List<Item> &set_fields,
95
97
List<Item> &set_values, READ_INFO &read_info,
96
98
String &enclosed, uint32_t skip_lines,
117
119
true - error / false - success
120
int mysql_load(Session *session,file_exchange *ex,TableList *table_list,
122
int load(Session *session,file_exchange *ex,TableList *table_list,
121
123
List<Item> &fields_vars, List<Item> &set_fields,
122
124
List<Item> &set_values,
123
125
enum enum_duplicates handle_duplicates, bool ignore)
125
char name[FN_REFLEN];
127
128
Table *table= NULL;
129
130
String *field_term=ex->field_term,*escaped=ex->escaped;
130
131
String *enclosed=ex->enclosed;
132
char *db= table_list->db; // This is never null
134
assert(table_list->getSchemaName()); // This should never be null
135
137
If path for cursor is not defined, we will use the current database.
136
138
If this is not set, we will use the directory where the table to be
137
139
loaded is located
139
const char *tdb= session->db.empty() ? db : session->db.c_str(); // Result is never null
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
144
uint32_t skip_lines= ex->skip_lines;
142
145
bool transactional_table;
143
Session::killed_state killed_status= Session::NOT_KILLED;
146
Session::killed_state_t killed_status= Session::NOT_KILLED;
145
148
/* Escape and enclosed character may be a utf8 4-byte character */
146
149
if (escaped->length() > 4 || enclosed->length() > 4)
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, drizzle_real_data_home);
262
strncat(name, tdb, FN_REFLEN-strlen(drizzle_real_data_home)-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, drizzle_real_data_home, "",
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);
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");
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);
306
317
memset(&info, 0, sizeof(info));
307
318
info.ignore= ignore;
308
319
info.handle_duplicates=handle_duplicates;
309
320
info.escape_char=escaped->length() ? (*escaped)[0] : INT_MAX;
311
SchemaIdentifier identifier(session->db);
322
SchemaIdentifier identifier(*schema);
312
323
READ_INFO read_info(file, tot_length,
313
324
ex->cs ? ex->cs : plugin::StorageEngine::getSchemaCollation(identifier),
314
325
*field_term, *ex->line_start, *ex->line_term, *enclosed,
377
388
internal::my_close(file,MYF(0));
378
389
free_blobs(table); /* if pack_blob was used */
379
390
table->copy_blobs=0;
380
session->count_cuted_fields= CHECK_FIELD_IGNORE;
391
session->count_cuted_fields= CHECK_FIELD_ERROR_FOR_NULL;
382
393
simulated killing in the middle of per-row loop
383
394
must be effective for binlogging
385
killed_status= (error == 0)? Session::NOT_KILLED : session->killed;
396
killed_status= (error == 0)? Session::NOT_KILLED : session->getKilled();
388
399
error= -1; // Error on read
391
snprintf(name, sizeof(name), ER(ER_LOAD_INFO), (uint32_t) info.records, (uint32_t) info.deleted,
392
(uint32_t) (info.records - info.copied), (uint32_t) session->cuted_fields);
404
snprintf(msg, sizeof(msg), ER(ER_LOAD_INFO), info.records, info.deleted,
405
(info.records - info.copied), session->cuted_fields);
394
407
if (session->transaction.stmt.hasModifiedNonTransData())
395
408
session->transaction.all.markModifiedNonTransData();
397
410
/* ok to client sent only after binlog write and engine commit */
398
session->my_ok(info.copied + info.deleted, 0, 0L, name);
411
session->my_ok(info.copied + info.deleted, 0, 0L, msg);
400
413
assert(transactional_table || !(info.copied || info.deleted) ||
401
414
session->transaction.stmt.hasModifiedNonTransData());
590
604
field->set_null();
591
if (!field->maybe_null())
605
if (not field->maybe_null())
593
if (field->type() == DRIZZLE_TYPE_TIMESTAMP)
594
((Field_timestamp*) field)->set_time();
607
if (field->is_timestamp())
609
((field::Epoch::pointer) field)->set_time();
595
611
else if (field != table->next_number_field)
596
field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN,
597
ER_WARN_NULL_TO_NOTNULL, 1);
613
field->set_warning(DRIZZLE_ERROR::WARN_LEVEL_WARN, ER_WARN_NULL_TO_NOTNULL, 1);
600
617
else if (item->type() == Item::STRING_ITEM)
787
804
end_of_buff=buffer+buff_length;
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,
805
if (cache.init_io_cache((false) ? -1 : cursor, 0,
806
(false) ? internal::READ_NET :
807
(is_fifo ? internal::READ_FIFO : internal::READ_CACHE),0L,1,
793
810
free((unsigned char*) buffer);