int my_rename_with_symlink(const char *from, const char *to, myf MyFlags) { #ifndef HAVE_READLINK return my_rename(from, to, MyFlags); #else char link_name[FN_REFLEN], tmp_name[FN_REFLEN]; int was_symlink= (!my_disable_symlinks && !my_readlink(link_name, from, MYF(0))); int result=0; int name_is_different; DBUG_ENTER("my_rename_with_symlink"); if (!was_symlink) DBUG_RETURN(my_rename(from, to, MyFlags)); /* Change filename that symlink pointed to */ strmov(tmp_name, to); fn_same(tmp_name,link_name,1); /* Copy dir */ name_is_different= strcmp(link_name, tmp_name); if (name_is_different && !access(tmp_name, F_OK)) { my_errno= EEXIST; if (MyFlags & MY_WME) my_error(EE_CANTCREATEFILE, MYF(0), tmp_name, EEXIST); DBUG_RETURN(1); } /* Create new symlink */ if (my_symlink(tmp_name, to, MyFlags)) DBUG_RETURN(1); /* Rename symlinked file if the base name didn't change. This can happen if you use this function where 'from' and 'to' has the same basename and different directories. */ if (name_is_different && my_rename(link_name, tmp_name, MyFlags)) { int save_errno=my_errno; my_delete(to, MyFlags); /* Remove created symlink */ my_errno=save_errno; DBUG_RETURN(1); } /* Remove original symlink */ if (my_delete(from, MyFlags)) { int save_errno=my_errno; /* Remove created link */ my_delete(to, MyFlags); /* Rename file back */ if (strcmp(link_name, tmp_name)) (void) my_rename(tmp_name, link_name, MyFlags); my_errno=save_errno; result= 1; } DBUG_RETURN(result); #endif /* HAVE_READLINK */ }
int myrg_create(const char *name, const char **table_names, uint insert_method, my_bool fix_names) { int save_errno; uint errpos; File file; char buff[FN_REFLEN],*end; DBUG_ENTER("myrg_create"); errpos=0; if ((file= mysql_file_create(rg_key_file_MRG, fn_format(buff, name, "", MYRG_NAME_EXT, MY_UNPACK_FILENAME|MY_APPEND_EXT), 0, O_RDWR | O_EXCL | O_NOFOLLOW, MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) { for ( ; *table_names ; table_names++) { my_stpcpy(buff,*table_names); if (fix_names) fn_same(buff,name,4); *(end=strend(buff))='\n'; end[1]=0; if (mysql_file_write(file, (uchar*) buff, (uint) (end-buff+1), MYF(MY_WME | MY_NABP))) goto err; } } if (insert_method != MERGE_INSERT_DISABLED) { end=strxmov(buff,"#INSERT_METHOD=", get_type(&merge_insert_method,insert_method-1),"\n",NullS); if (mysql_file_write(file, (uchar*) buff, (uint) (end-buff), MYF(MY_WME | MY_NABP))) goto err; } if (mysql_file_close(file, MYF(0))) goto err; DBUG_RETURN(0); err: save_errno=my_errno() ? my_errno() : -1; switch (errpos) { case 1: (void) mysql_file_close(file, MYF(0)); } set_my_errno(save_errno); DBUG_RETURN(save_errno); } /* myrg_create */
int myrg_create(const char *name, const char **table_names, uint insert_method, my_bool fix_names) { int save_errno; uint errpos; File file; char buff[FN_REFLEN],*end; DBUG_ENTER("myrg_create"); errpos=0; if ((file = my_create(fn_format(buff,name,"",MYRG_NAME_EXT,4),0, O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) { for ( ; *table_names ; table_names++) { strmov(buff,*table_names); if (fix_names) fn_same(buff,name,4); *(end=strend(buff))='\n'; end[1]=0; if (my_write(file,buff,(uint) (end-buff+1), MYF(MY_WME | MY_NABP))) goto err; } } if (insert_method != MERGE_INSERT_DISABLED) { end=strxmov(buff,"#INSERT_METHOD=", get_type(&merge_insert_method,insert_method-1),"\n",NullS); if (my_write(file,buff,(uint) (end-buff),MYF(MY_WME | MY_NABP))) goto err; } if (my_close(file,MYF(0))) goto err; DBUG_RETURN(0); err: save_errno=my_errno ? my_errno : -1; switch (errpos) { case 1: VOID(my_close(file,MYF(0))); } DBUG_RETURN(my_errno=save_errno); } /* myrg_create */
int mrg_create(const char *name, const char**table_names) { int save_errno; uint errpos; File file; char buff[FN_REFLEN],*end; DBUG_ENTER("mrg_create"); errpos=0; if ((file = my_create(fn_format(buff,name,"",MRG_NAME_EXT,4),0, O_RDWR | O_TRUNC,MYF(MY_WME))) < 0) goto err; errpos=1; if (table_names) for ( ; *table_names ; table_names++) { strmov(buff,*table_names); fn_same(buff,name,4); *(end=strend(buff))='\n'; if (my_write(file,*table_names,(uint) (end-buff+1), MYF(MY_WME | MY_NABP))) goto err; } if (my_close(file,MYF(0))) goto err; DBUG_RETURN(0); err: save_errno=my_errno; switch (errpos) { case 1: VOID(my_close(file,MYF(0))); } my_errno=save_errno; /* Return right errocode */ DBUG_RETURN(-1); } /* mrg_create */