1 #include "../include/load.h" 2 3 status_t load_users_to_vector(ADT_Vector_t **v, cla_t cla) 4 { 5 status_t st; 6 char buffer[IN_FILE_MAX_LEN]; 7 char *endptr1, *endptr2, **data; 8 user_t *u1, *u2, *u3; 9 time_t epoch; 10 long long amount; 11 size_t user_pos, parsed_lines, users_created; 12 ulong id, c, d; 13 14 if(v == NULL || cla == NULL) return ERROR_NULL_POINTER; 15 16 if((st = create_2darray(&data, IN_FILE_FIELDS, IN_FILE_FIELDS_MAX_LEN)) != OK) 17 return st; 18 19 parsed_lines = 0; 20 users_created = 0; 21 while(fgets(buffer, IN_FILE_MAX_LEN, cla->fi)) { 22 if((st = user_create(&u1)) != OK) { 23 destroy_2darray(data, IN_FILE_FIELDS); 24 return st; 25 } 26 27 if((st = string_split(buffer, data, IN_FILE_DELIM)) != OK) { 28 free(u1); 29 destroy_2darray(data, IN_FILE_FIELDS); 30 return st; 31 } 32 33 id = strtol(data[POS_USER_ID], &endptr1, 10); 34 amount = strtol(data[POS_AMOUNT], &endptr2, 10); 35 36 if(*endptr1 || *endptr2) { 37 free(u1); 38 destroy_2darray(data, IN_FILE_FIELDS); 39 return ERROR_CORRUPT_DATA; 40 } 41 42 if(amount > 0) { c = amount; d = 0; } 43 else if(amount < 0) { c = 0; d = -amount; } 44 45 if((st = user_set_data(u1, id, c, d)) != OK) { 46 free(u1); 47 destroy_2darray(data, IN_FILE_FIELDS); 48 return ERROR_CORRUPT_DATA; 49 } 50 51 if((st = get_date(&epoch, data[POS_TXN_DATE])) != OK){ 52 free(u1); 53 destroy_2darray(data, IN_FILE_FIELDS); 54 return ERROR_CORRUPT_DATA; 55 } 56 57 /* Comprueba el que el tiempo este dentro de los valores pasados como argumentos */ 58 if(epoch < cla->ti) continue; 59 else if(epoch > cla->tf) break; 60 61 /* Comprueba que la tarjeta usada en la transaccion sea la correcta */ 62 if(!is_valid_card(data[POS_CARD_NUMBER])) { 63 fprintf(stderr, "%s: %s\n", STR_INVALID_CARD_NUMBER, data[POS_CARD_NUMBER]); 64 continue; 65 } 66 67 /* Busca el id del usuario en el vector */ 68 if((st = ADT_Vector_get_elem_pos(*v, u1, &user_pos)) == OK) { 69 /* Si llega aca lo encontrĂ³, entonces se lo asigna a un usuario temporal */ 70 if((st = ADT_Vector_get_elem(*v, (void **)&u2, user_pos) != OK)) { 71 destroy_2darray(data, IN_FILE_FIELDS); 72 free(u1); 73 return st; 74 } 75 76 /* Crea un usuario nuevo para almacenar la copia */ 77 if((st = user_create(&u3)) != OK) { 78 destroy_2darray(data, IN_FILE_FIELDS); 79 free(u1); 80 return st; 81 } 82 83 /* Copia el contenido del usuario */ 84 *u3 = *u2; 85 86 /* Asigna a la copia el nuevo monto */ 87 if(amount > 0) u3->c += amount; 88 else if(amount < 0) u2->d -= amount; 89 90 /* Asigna la copia al vector en el lugar que estaba el usuario original */ 91 if((st = ADT_Vector_set_elem(v, u3, user_pos)) != OK) { 92 destroy_2darray(data, IN_FILE_FIELDS); 93 free(u1); 94 } 95 96 free(u1); 97 free(u2); 98 } 99 100 /* Hubo un error distinto a no encontrar el usuario */ 101 else if(st != ELEM_NOT_FOUND) { 102 destroy_2darray(data, IN_FILE_FIELDS); 103 return st; 104 } 105 106 else { 107 /* Si no lo encuentra entonces lo agrega al vector */ 108 if((st = ADT_Vector_add(v, u1)) != OK){ 109 destroy_2darray(data, IN_FILE_FIELDS); 110 return st; 111 } 112 users_created++; 113 } 114 clean_buffer(buffer); clean_array(data); 115 parsed_lines++; 116 } /* End while */ 117 118 destroy_2darray(data, IN_FILE_FIELDS); 119 printf("%s\n%s%11ld\n%s%8ld\n", STR_MSG_END_PROCSS_ES, STR_MSG_LINES_PROCSSD_ES, parsed_lines, STR_MSG_USRS_REGISTERD_ES, users_created); 120 121 return OK; 122 }