void extend_tmp_file(int extend_portion) { int64_t fileSizeCurrent; int64_t fileSizeNew; fileSizeCurrent = mb->tmp_file_cur_size; fileSizeNew = fileSizeCurrent + (int64_t)extend_portion * PAGE_SIZE; /* if mb->data_file_max_size == 0 than size is unlimited */ if (mb->tmp_file_max_size > 0 && fileSizeNew > mb->tmp_file_max_size * PAGE_SIZE) throw USER_EXCEPTION(SE1012); /* Extend the file. */ if (!uSetEndOfFile( tmp_file_handler, fileSizeNew, U_FILE_BEGIN, __sys_call_error)) throw USER_EXCEPTION(SE1014); mb->tmp_file_cur_size = fileSizeNew; mb->free_tmp_blocks = extend_file_helper( tmp_file_handler, fileSizeCurrent, fileSizeNew, mb->free_tmp_blocks, TMP_LAYER_STARTS_WITH, 0, false); elog(EL_LOG, ("Temp file has been extended, size: %" PRIx64 "", fileSizeNew)); // !!! MASTER BLOCK HAS BEEN CHANGED }
int uCopyFile(const char *existing_file, const char *new_file, int fail_if_exists, sys_call_error_fun fun) { #ifdef _WIN32 BOOL res = CopyFile(existing_file, new_file, fail_if_exists); if (res == 0) sys_call_error("CopyFile"); return res; #else #define BUFFLEN 32768 int c = 0; int des = 0; int src = 0; char buf[BUFFLEN]; __int64 src_file_size = (__int64) 0; if (fail_if_exists) des = open(new_file, O_CREAT | O_EXCL | O_LARGEFILE | O_WRONLY | O_SYNC | O_TRUNC, U_SEDNA_DEFAULT_ACCESS_PERMISSIONS_MASK); else des = open(new_file, O_CREAT | O_LARGEFILE | O_WRONLY | O_SYNC | O_TRUNC, U_SEDNA_DEFAULT_ACCESS_PERMISSIONS_MASK); if (des == -1) { sys_call_error("open"); return 0; } src = open(existing_file, O_LARGEFILE | O_RDONLY, U_SEDNA_DEFAULT_ACCESS_PERMISSIONS_MASK); if (src == -1) { sys_call_error("open"); return 0; } if (uGetFileSize(src, &src_file_size, __sys_call_error) == 0) return 0; if (uSetEndOfFile(des, src_file_size, U_FILE_BEGIN, __sys_call_error) == 0) return 0; while ((c = read(src, buf, BUFFLEN)) > 0) { if (write(des, buf, c) != c) { sys_call_error("write"); return 0; } } if (c < 0) { sys_call_error("read"); return 0; } return 1; #endif }
void extend_data_file(int extend_portion) { int64_t fileSizeCurrent; int64_t fileSizeNew; fileSizeCurrent = mb->data_file_cur_size; fileSizeNew = fileSizeCurrent + (int64_t)extend_portion * PAGE_SIZE; /* if mb->data_file_max_size == 0 than size is unlimited */ if (mb->data_file_max_size > 0 && fileSizeNew > mb->data_file_max_size * PAGE_SIZE) throw USER_EXCEPTION(SE1011); llLogDecrease(fileSizeCurrent); /* Extend the file. */ if (!uSetEndOfFile( data_file_handler, fileSizeNew, U_FILE_BEGIN, __sys_call_error)) throw USER_EXCEPTION(SE1013); mb->data_file_cur_size = fileSizeNew; mb->free_data_blocks = extend_file_helper( data_file_handler, fileSizeCurrent, fileSizeNew, mb->free_data_blocks, 1, /* 0-layer is reserved */ -PAGE_SIZE, /* since first block is master-block */ false); elog(EL_LOG, ("Data file has been extended, size: %" PRIx64 "", fileSizeNew)); // !!! MASTER BLOCK HAS BEEN CHANGED }