#include "write_file.h" int open_file(FILE ** fp,char *file_path,int flag,void *logger) { //*fp = NULL; if(flag == INDEX_FILE) *fp= fopen(file_path, "a+"); else if(flag == NORMAL_FILE) *fp= fopen(file_path, "w+"); else return -1; if (*fp == NULL) { MESA_HANDLE_RUNTIME_LOG(logger,RLOG_LV_FATAL,"[open_file]","can not open file :%s, err info:%s!", file_path, strerror(errno)); return -1; } return 0; } int append_to_write_file(FILE *fp, char *msg, void *logger) { //int ret = fseek(fp,0,SEEK_END); if (fp == NULL) { MESA_HANDLE_RUNTIME_LOG(logger,RLOG_LV_FATAL,"[write_file]","append_to_write_file error (fp is null)"); return -1; } int ret = fwrite(msg, strlen(msg),1,fp); return ret; } int write_file_add_num(FILE *fp,int total_line_num) { int ret =0; if(fp != NULL) { ret = fseek(fp,0,SEEK_SET); if (ret <0) { printf("write_file_add_num error:%s",strerror(errno)); //MESA_HANDLE_RUNTIME_LOG(logger,RLOG_LV_FATAL,"[write_file]","write_file_add_num error:%s",strerror(errno)); return -1; } fprintf (fp, "%010d\n", total_line_num); } return ret; } int close_file(FILE **fp) { //solve the problem multiple call of notify_table_update_end to double close if(*fp!=NULL) { fclose(*fp); } *fp=NULL; return 0; } int rename_file (char *src, char *dest,void *logger) { if (0 != rename(src, dest)) { MESA_HANDLE_RUNTIME_LOG(logger,RLOG_LV_FATAL,"[write_file]","rename (%s, %s) fail: %s", src, dest, strerror(errno)); return -1; } return 0; } int status_for_persistence::write_file_create_file_name(char *part_path_name,char *part_time_name) { char com[MAX_PATH_LENGTH] = {0};int ret = 0; void *err_logger=common->error_logger; //DETERMINANT : generate tmp_file_name ret = snprintf(tmp_file_name,MAX_PATH_LENGTH, "%s%s/%s.%010lld", tmp_path,part_path_name,file_name, index_version); if (ret >= MAX_PATH_LENGTH) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","file path too long:%s, should not bigger than %d!",tmp_file_name, MAX_PATH_LENGTH); return -1; } sprintf(com, "%s/%s", tmp_path,part_path_name); ret = create_path_p(com); if(ret != 0) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","can not create dir, com:%s!", com); return -1; } //DETERMINANT : generate dest_path_dir if(common->pz_type == PZ_TYPE_DETERMINANT) sprintf(com, "%s/%s/%s", dest_path,part_path_name,time_str); else sprintf(com, "%s/%s", dest_path,part_path_name); ret = create_path_p(com); if(ret != 0) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","can not create dir, com:%s!", com); return -1; } //DETERMINANT generate dest_file_name if(common->pz_type == PZ_TYPE_DETERMINANT) ret = snprintf(dest_file_name,MAX_PATH_LENGTH, "%s/%s/%s/%s.%010lld", dest_path,part_path_name,part_time_name,file_name,index_version); else ret = snprintf(dest_file_name,MAX_PATH_LENGTH, "%s/%s/%s.%010lld", dest_path,part_path_name,file_name,index_version); if (ret >= MAX_PATH_LENGTH) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","file path too long:%s, should not bigger than %d!",dest_file_name, MAX_PATH_LENGTH); return -1; } return 0; } int status_for_persistence::write_file_create_index_name(char *part_path_name,char *part_index_name) { char com[MAX_PATH_LENGTH];int ret = 0; void *err_logger=common->error_logger; // tmp_dir: derterminnant: tmp/full ; /tmp/inc // inderterminnant: tmp sprintf(com, "%s/%s",tmp_path,part_path_name); ret = create_path_p(com); if(ret != 0) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","can not create dir, com:%s!", com); return -1; } // dest_dir: derterminnant: dest/inc/index ; dest/full/index // inderterminnant: dest/index sprintf(com, "%s/%s/index", dest_path,part_path_name); ret = create_path_p(com); if(ret != 0) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","can not create dir, com:%s!", com); return -1; } //tmp_index_file_name: //derterminnant: tmp/full/full_config_index.0000000 ; tmp/inc/inc_config_index.0000000 //inderterminnant: tmp/full_config_index.000000 ret = snprintf(tmp_index_file_name, MAX_PATH_LENGTH, "%s/%s/%s.%010lld", tmp_path,part_path_name,part_index_name,index_version); if (ret >= MAX_PATH_LENGTH) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","file path too long:%s, should not bigger than %d!",tmp_index_file_name, MAX_PATH_LENGTH); return -1; } //dest_index_file_name: //derterminnant: dest/full/full_config_index.0000000 ; dest/inc/inc_config_index.0000000 //inderterminnant: dest/full_config_index.000000 ret = snprintf(dest_index_file_name, MAX_PATH_LENGTH, "%s/%s/index/%s.%010lld", dest_path,part_path_name,part_index_name,index_version); if (ret >= MAX_PATH_LENGTH) { MESA_HANDLE_RUNTIME_LOG(err_logger,RLOG_LV_FATAL,"[write_file]","file path too long:%s, should not bigger than %d!",dest_index_file_name, MAX_PATH_LENGTH); return -1; } return 0; } int status_for_persistence::write_file_init(int update_type) { int ret = 0;time_t rawtime; char part_path_name[10] = {0}; char part_index_name[20] ={0},part_time_name[20] ={0}; struct tm *timeinfo = NULL; rawtime = time(NULL);timeinfo = localtime(&rawtime); strftime(time_str, sizeof(time_str), "%F", timeinfo); // PZ_TYPE_INDETERMINANT :prefix is null // PZ_TYPE_INDETERMINANT :part_index_name is full_config_index // PZ_TYPE_INDETERMINANT :part_time_name s null strncpy(part_time_name,time_str,10); if (update_type == UPDATE_TYPE_FULL) { strncpy(part_path_name,"full",5); strncpy(part_index_name,"full_config_index",18); } else { strncpy(part_path_name,"inc",4); strncpy(part_index_name,"inc_config_index",17); } //get index file path if(common->pz_type == PZ_TYPE_DETERMINANT) ret = write_file_create_index_name(part_path_name,part_index_name); if (ret != 0) { MESA_HANDLE_RUNTIME_LOG(common->error_logger,RLOG_LV_FATAL,"[write_file]","create:%s name fail",tmp_index_file_name); return -1; } MESA_HANDLE_RUNTIME_LOG(common->runtime_logger,RLOG_LV_FATAL,"[write_file]","create:%s name suceess",tmp_index_file_name); //get file path ret = write_file_create_file_name(part_path_name,part_time_name); if (ret != 0) { MESA_HANDLE_RUNTIME_LOG(common->error_logger,RLOG_LV_FATAL,"[write_file]","create:%s fail",tmp_file_name); return -1; } MESA_HANDLE_RUNTIME_LOG(common->runtime_logger,RLOG_LV_FATAL,"[write_file]","create:%s suceess",tmp_file_name); return 0; }