示例#1
0
/**
 * 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;
}
示例#2
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;
}
示例#3
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);
}
示例#4
0
/**
 * 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;
}