/** * Funcao que le de um ficheiro toda a informacao de um determinado distrito * @param ficheiroEscrita e o nome do ficheiro que contem a informacao */ int reloadFilho(char* ficheiroEscrita){ int fdRead = open(ficheiroEscrita,O_RDONLY); if(fdRead>0){ int tamLido = -1; char *buffer=(char*)malloc(256); char *lixo=(char*)malloc(5); char *tmp=(char*)malloc(512); char *localidade=(char*)malloc(1); char *path=(char*)malloc(1); char *pipeResposta=(char*)malloc(1); int nOi=-1; int tipo=-1; int numeroRetorno=0; Localidades *localidades; while((tamLido = read(fdRead, buffer, 256))>0){ tipo = parsingMensagem(buffer, &localidade, &path, &nOi, &pipeResposta); if(tipo==_INCREMENTAR){ //so sao necessarias as mensagens que continham informacao relativa a incrementos localidades = split(localidade, ","); incrementar(localidades->localidades, nOi); } read(fdRead, lixo, 1); } } return 0; }
int reloadLocalization(char* file){ int fdRead = open(file,O_RDONLY); int getmore=0; char *buffer=(char*)malloc(256); char *tmp=(char*)malloc(512); char *localidade=(char*)malloc(1); char *path=(char*)malloc(1); char *pipeResposta=(char*)malloc(1); int nOi=-1; int tamLido=-1; int tipo=-1; int numeroRetorno=0; char* toParse=(char*)malloc(1); char *posnl; Localidades *localidades; clearbuffer(buffer, 256); while((tamLido = read(fdRead, buffer, 256))>0){ getmore=0; strcat(tmp,buffer); while(numeroRetorno<tamLido && !getmore){ //printf("--nr: %d\n'%s'--\n",numeroRetorno,tmp); if((posnl = strstr(tmp,"\n"))!=NULL){ numeroRetorno+=copiaStringAte(tmp,'\n',512,&toParse); tmp = (posnl+1); tipo = parsingMensagem(toParse, &localidade, &path, &nOi, &pipeResposta); if(tipo==_INCREMENTAR){ localidades = split(localidade, ","); incrementar(localidades->localidades, nOi); } } else getmore=1; clearbuffer(toParse, 256); } clearbuffer(buffer,256); } return 0; }
/*Ler e carregar em memória um ficheiro texto com o estado que o programa continha antes de por qualquer motivo ter sido interrompida a sua execução*/ void lerFicheiroECarregarEmMem() { FILE* fd; char* line; char* distrito; char* concelho; char* freguesia; char numero[10]; int valor; int i, j, k; int hashcon; int hashfreg; int flagfound; int id; char **nome; char file[30]; fd = fopen("basededados.txt","r"); line = (char*) malloc(MAX_LINE_SIZE*sizeof(char)); id=0; while( NULL != fgets(line,MAX_LINE_SIZE,fd) ){ /*ignorar comando incrementar + ' '*/ i=12; /*DISTRITO*/ distrito = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); for(j=0; line[i]!=':'; i++, j++){ distrito[j]=line[i]; } distrito[j] = '\0'; /*CONCELHO*/ i++; /*evitamos o carater ' '*/ concelho = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); for(j=0; line[i]!=':'; i++, j++){ concelho[j]=line[i]; } concelho[j]='\0'; /*FREGUESIA*/ i++;/*evitamos o carater ' '*/ freguesia = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); for(j=0; line[i]!=':';i++, j++){ freguesia[j]=line[i]; } freguesia[j]='\0'; /*VALOR*/ i++; for(j=0; line[i]!='\n'; i++, j++){ numero[j]=line[i]; } numero[j]='\0'; valor = atoi(numero); nome = (char**) malloc(4*sizeof(char*)); nome[0] = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); strcpy(nome[0],distrito); nome[1] = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); strcpy(nome[1],concelho); nome[2] = (char*) malloc(MAX_NAME_SIZE*sizeof(char)); strcpy(nome[2],freguesia); nome[3] = NULL; incrementar(nome,(unsigned)valor); for(j=0; j<4; j++) free(nome[j]); free(nome); free(distrito);; free(concelho); free(freguesia); free(line); numero[0]='\0'; line = (char*) malloc(MAX_LINE_SIZE*sizeof(char)); flagEMPTY=0; //após inserirmos qq dado na estrutura esta deixa de estar vazia; } fclose(fd); write(1,"\n$DATA BASE LOAD SUCESS$\n",25); }
/** * Funcao que aglomera todo o trabalho de um processo responsavel por um distrito * @param distrito e a estrutura com toda as bases de um distrito */ int workerFilho(DistritoFluRecord *distrito){ char* msgBuffer = (char*)malloc(256), *ficheiroEscrita = (char*)malloc(128), *localidade, *path, *pipeResposta; int nOi=0; int tamMsg=-1; int fdReg=-1; int tipo=-1; int fdResp=-1; int resp=-1; Localidades *localidades; clearbuffer(ficheiroEscrita,128); strcat(ficheiroEscrita, distrito->nome); strcat(ficheiroEscrita, ".txt"); reloadFilho(ficheiroEscrita); //reler toda a informacao que ja existia no servidor relativamente a este distrito kill(getppid(),SIGUSR1); //enviar ao processo pai um sinal para que ele saiba que este processo esta preparado para receber qualquer mensagem close(distrito->pipe[1]); clearbuffer(msgBuffer, 256); while((tamMsg=read(distrito->pipe[0],msgBuffer,256))>0){ if(fdReg<0){ fdReg = open(ficheiroEscrita, O_CREAT | O_APPEND | O_WRONLY, 0666); } write(fdReg, msgBuffer, tamMsg); write(fdReg, "\n", 1); localidade=(char*)malloc(sizeof(char)); path=(char*)malloc(sizeof(char)); pipeResposta=(char*)malloc(sizeof(char)); tipo = parsingMensagem(msgBuffer, &localidade, &path, &nOi, &pipeResposta); localidades = split(localidade,","); switch (tipo) { case _INCREMENTAR: incrementar(localidades->localidades, nOi); fdResp = open(pipeResposta,O_WRONLY); time_t tempoServidor = time(NULL); write(fdResp,ctime(&tempoServidor),strlen(ctime(&tempoServidor))); break; case _AGREGAR: resp = agregar(localidades->localidades, nOi, path); if (resp>=2000 && !(strcmp(pipeResposta, "null")==0)){ //significa que houve um erro fdResp = open(pipeResposta,O_WRONLY); char *tamanho=(char*)malloc(10); clearbuffer(tamanho, 10); sprintf(tamanho,"%d",resp); write(fdResp,tamanho,strlen(tamanho)); free(tamanho); } else if (!(strcmp(pipeResposta, "null")==0)){ int fdResp = open(pipeResposta,O_WRONLY); time_t tempoServidor = time(NULL); write(fdResp,ctime(&tempoServidor),strlen(ctime(&tempoServidor))); } break; default: break; } if(fdResp>0) close(fdResp); clearbuffer(msgBuffer, 256); } return 0; }