/* {{{ ma_open */ MA_FILE *ma_open(const char *location, const char *mode, MYSQL *mysql) { int CodePage= -1; FILE *fp= NULL; MA_FILE *ma_file= NULL; if (!location || !location[0]) return NULL; #ifdef HAVE_REMOTEIO if (strstr(location, "://")) goto remote; #endif #ifdef _WIN32 if (mysql && mysql->charset) CodePage= madb_get_windows_cp(mysql->charset->csname); #endif if (CodePage == -1) { if (!(fp= fopen(location, mode))) { #ifdef _WIN32 my_errno= GetLastError(); #else my_errno= errno; #endif return NULL; } } #ifdef _WIN32 /* See CONC-44: we need to support non ascii filenames too, so we convert current character set to wchar_t and try to open the file via _wsopen */ else { wchar_t *w_filename= NULL; wchar_t *w_mode= NULL; int len; DWORD Length; len= MultiByteToWideChar(CodePage, 0, location, (int)strlen(location), NULL, 0); if (!len) return NULL; if (!(w_filename= (wchar_t *)my_malloc((len + 1) * sizeof(wchar_t), MYF(MY_ZEROFILL)))) { my_set_error(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); return NULL; } Length= len; len= MultiByteToWideChar(CodePage, 0, location, (int)strlen(location), w_filename, (int)Length); if (!len) { /* todo: error handling */ my_free(w_filename); return NULL; } len= (int)strlen(mode); if (!(w_mode= (wchar_t *)my_malloc((len + 1) * sizeof(wchar_t), MYF(MY_ZEROFILL)))) { my_set_error(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); my_free(w_filename); return NULL; } Length= len; len= MultiByteToWideChar(CodePage, 0, mode, (int)strlen(mode), w_mode, (int)Length); if (!len) { /* todo: error handling */ my_free(w_filename); my_free(w_mode); return NULL; } fp= _wfopen(w_filename, w_mode); my_errno= GetLastError(); my_free(w_filename); my_free(w_mode); } #endif if (fp) { ma_file= (MA_FILE *)my_malloc(sizeof(MA_FILE), MYF(0)); if (!ma_file) { my_set_error(mysql, CR_OUT_OF_MEMORY, SQLSTATE_UNKNOWN, 0); return NULL; } ma_file->type= MA_FILE_LOCAL; ma_file->ptr= (void *)fp; } return ma_file; #ifdef HAVE_REMOTEIO remote: /* check if plugin for remote io is available and try * to open location */ { MYSQL mysql; if (rio_plugin ||(rio_plugin= (struct st_mysql_client_plugin_REMOTEIO *) mysql_client_find_plugin(&mysql, NULL, MARIADB_CLIENT_REMOTEIO_PLUGIN))) return rio_plugin->methods->open(location, mode); return NULL; } #endif }
/* {{{ mysql_local_infile_init */ static int mysql_local_infile_init(void **ptr, const char *filename, void *userdata) { MYSQL_INFILE_INFO *info; int CodePage= -1; #ifdef _WIN32 MYSQL *mysql= (MYSQL *)userdata; wchar_t *w_filename= NULL; int Length; #endif DBUG_ENTER("mysql_local_infile_init"); info = (MYSQL_INFILE_INFO *)my_malloc(sizeof(MYSQL_INFILE_INFO), MYF(MY_ZEROFILL)); if (!info) { DBUG_RETURN(1); } *ptr = info; info->filename = filename; #ifdef _WIN32 if (mysql) CodePage= madb_get_windows_cp(mysql->charset->csname); #endif if (CodePage == -1) { #ifdef _WIN32 info->fd= sopen(info->filename, _O_RDONLY | _O_BINARY, _SH_DENYNO , _S_IREAD | _S_IWRITE); #else info->fd = open(info->filename, O_RDONLY | O_BINARY, my_umask); #endif my_errno= errno; } #ifdef _WIN32 else { if ((Length= MultiByteToWideChar(CodePage, 0, info->filename, (int)strlen(info->filename), NULL, 0))) { if (!(w_filename= (wchar_t *)my_malloc((Length + 1) * sizeof(wchar_t), MYF(MY_ZEROFILL)))) { info->error_no= CR_OUT_OF_MEMORY; my_snprintf((char *)info->error_msg, sizeof(info->error_msg), ER(CR_OUT_OF_MEMORY)); DBUG_RETURN(1); } Length= MultiByteToWideChar(CodePage, 0, info->filename, (int)strlen(info->filename), w_filename, (int)Length); } if (Length == 0) { my_free(w_filename); info->error_no= CR_UNKNOWN_ERROR; my_snprintf((char *)info->error_msg, sizeof(info->error_msg), "Character conversion error: %d", GetLastError()); DBUG_RETURN(1); } info->fd= _wsopen(w_filename, _O_RDONLY | _O_BINARY, _SH_DENYNO , _S_IREAD | _S_IWRITE); my_errno= errno; my_free(w_filename); } #endif if (info->fd < 0) { info->error_no = my_errno; my_snprintf((char *)info->error_msg, sizeof(info->error_msg), EE(EE_FILENOTFOUND), filename, info->error_no); DBUG_RETURN(1); } DBUG_RETURN(0); }