void print_cities(IPDB * db){ int i; for(i = 0; i < db->cities_count; ++i) { print_city(&(db->cities[i])); } }
void print_cities(city* cities[], int city_c) { for(int i = 0; i < city_c; ++i) { print_city(cities[i]); } return; }
int main(void) { int n; FILE* fptr = fopen("input.in", "r"); assert(fptr != NULL); n = count_lines(fptr); printf("\nNumber of cities: %i\n",n); /*Init cities*/ City* cities[n]; read_cities(fptr, cities); printf("Init cities succesful... \n"); /*Init distances*/ double** distances; distances=calculate_distances(distances,cities, n); printf("Init distances succesful... \n"); /*Init GA config*/ Config config; config.populationSize=1000; config.mutationRate=0.2; config.numGenerations=6000; config.numElitism=1; config.mutationSize=1; config.maxBreeding=10; config.numGenes=n; printf("Init GA config succesful... \n"); /*Init random seed*/ srand ( time(NULL) ); printf("Init random seed succesful... \n"); /*Init population*/ Population population; generate_random_population(&population, distances, &config); printf("Init population succesful... \n"); int numGenerations = 0; /*Start evolution*/ while(numGenerations < config.numGenerations){ numGenerations++; if (numGenerations%1000==0) printf("Shortest path of %ith generation: %i\n", numGenerations, population.path[0].fitness); /*Sort population*/ qsort(population.path, population.numPaths, sizeof(Path), compare_population); /*Breed population*/ simple_breed_population(&population, config.numGenes, distances); /*Mutate population*/ mutate_population(&population, distances, &config); } /*Sort population*/ qsort(population.path, population.numPaths, sizeof(Path), compare_population); printf("Shortest path is %i\n", population.path[0].fitness); int i; for(i=0;i<config.numGenes;i++){ print_city(cities[population.path[0].combination[i]]); } return 0; }
/*** End of Protocol Prototype ***/ int handle_command(int sock, char *cmd, FILE *fptr, struct config_params *params, struct city **headlist, int *auth_success) { int counter; char commandname[MAXLEN];//also used for return:command char tablename[MAXLEN];//also used for return:status char keyname[MAXLEN]; char valuename[MAXLEN];//also used for return:secondstatus (may be detail OR value) char retline[MAXLEN]; char encoded_value[MAXLEN]; //char returncmd[MAXLEN+1]; //To send back to client time_t rawtime; struct tm * timeinfo; int index = 0; int tempcmd = 1; int tempcommand = 0; int i = 0;//common-purpose counter printf("command received: %s\n", cmd); while(cmd[tempcmd] != '&'){ if(cmd[tempcmd] != '&'){ commandname[tempcommand] = cmd[tempcmd]; tempcommand++; tempcmd++; } } commandname[tempcommand] = '\0'; tempcommand = 0; tempcmd++; tempcmd++; while(cmd[tempcmd] != '^'){ tablename[tempcommand] = cmd[tempcmd]; tempcommand++; tempcmd++; } tablename[tempcommand] = '\0'; tempcommand = 0; tempcmd++; while(cmd[tempcmd] != '\0'){ valuename[tempcommand] = cmd[tempcmd]; tempcommand++; tempcmd++; } valuename[tempcommand] = '\0'; tempcommand = 0; if(strcmp(commandname, "QUERY") == 0){ printf("command is: %s\n", commandname); printf("table is: %s\n", tablename); printf("valuename: %s\n", valuename); } else { decode_line(cmd, commandname, tablename, keyname, valuename, &counter); } //printf("commandname: %s\n", commandname); //printf("tablename: %s\n", tablename); //printf("keyname: %s\n", keyname); //printf("valuename: %s\n", valuename); char namegen[MAXLEN+1]; if(LOGGING==2){ char tempstr[MAXLEN+1]; time(&rawtime); timeinfo=localtime(&rawtime); sprintf(namegen,"%.4d-%.2d-%.2d-%.2d-%.2d-%.2d: ",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); //sprintf(tempstr,"Processing command '%s'\n",commandname); printf("Processing line \"%s\"\n", cmd); logger(fptr,namegen);//Timestamp logger(fptr,tempstr); } else if(LOGGING==1){ time(&rawtime); timeinfo=localtime(&rawtime); sprintf(namegen,"%.4d-%.2d-%.2d-%.2d-%.2d-%.2d: ",timeinfo->tm_year+1900,timeinfo->tm_mon+1,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec); printf("%s",namegen);//Timestamp //printf("Processing command '%s'\n",commandname); printf("Processing line \"%s\"\n", cmd); } if (strcmp(commandname, "SET") == 0){ pthread_mutex_lock( &setMutex ); //SET below // check if authorized if ((*auth_success) == 0){ //printf("inside if statement.\n"); //strncpy(success, "AUTH", sizeof(success)); //sendall(sock, success, sizeof(success)); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "AUTH"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else { index = find_index(params->tablelist, tablename); if(index != -1){ //name found struct city *head = headlist[index]; struct city *temp = find_city(head, keyname); printf("valuename: %s\n", valuename); if(temp == NULL){ //entry doesn't exist if(strcmp(valuename, "@NULL@?") == 0){ //deleting a key that doesn't exist //sprintf(success, "SET$KEY"); //sendall(sock, success, sizeof(success)); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "KEY"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else{ int column_count = 0; column_count = count_column(valuename); if (params->num_columns[index] == column_count) { insert_city(headlist[index], keyname, valuename); //VALUE IS INSERTED AS A STRING cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "SUCCESS"); sprintf(valuename, "CREATE"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else { sprintf(retline, "SET FAIL COLUMN\n"); sendall(sock, retline, sizeof(retline)); } } } else { //entry exists, temp != NULL if(strcmp(valuename, "@NULL@?") == 0){ //delete //printf("delete entry\n"); delete_city(&head, keyname); temp = NULL; //sprintf(success, "SET$SUCCESS"); //sendall(sock, success, sizeof(success)); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "SUCCESS"); sprintf(valuename, "DELETE"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else{ //modify record //strncpy(temp->population, , sizeof(temp->population)); //sprintf(success, "SET$SUCCESS"); //sendall(sock, success, sizeof(success)); //printf("valuename: %s\n", valuename); if (counter == temp->counter || counter == 0) { int column_count = 0; temp = find_city(headlist[index], keyname); column_count = count_column(valuename); if (temp->numocolumns == column_count) { modify_city(temp, valuename); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "SUCCESS"); sprintf(valuename, "MODIFY"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else { sprintf(retline, "SET FAIL COLUMN\n"); sendall(sock, retline, sizeof(retline)); } } else { char temp[100]; sprintf(temp, "%s", "SET FAIL COUNTER"); sendall(sock, temp, sizeof(temp)); } } } } else { //table doesn't exist //strncpy(fail, "SET$TABLE", sizeof(fail)); //sendall(sock, fail, sizeof(fail)); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "TABLE"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } } pthread_mutex_unlock( &setMutex ); } // For now, just send back the command to the client. //command cases: get, set else if(strcmp(commandname, "AUTH") == 0){ //AUTH below if(strcmp(tablename, params->username) == 0){ if (strcmp(keyname, params->password) == 0){ (*auth_success) = 1; printf("authenticated\n"); //strncpy(success, "AUTH$SUCCESS", sizeof(success)); //sendall(sock, success, sizeof(success)); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "SUCCESS"); sprintf(valuename, " "); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else { printf("authenticated\n"); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, " "); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); //strncpy(fail, "AUTH$FAIL", sizeof(fail)); //sendall(sock, fail, sizeof(fail)); } } else { cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, ""); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); //strncpy(fail, "AUTH$FAIL", sizeof(fail)); //sendall(sock, fail, sizeof(fail)); } } else if(strcmp(commandname, "GET") == 0){ // check if authenticated if ((*auth_success) == 0){ //not authenticated cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "AUTH"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); //strncpy(success, "AUTH", sizeof(success)); //sendall(sock, success, sizeof(success)); } printf("tablename: %s\n", tablename); index=find_index(params->tablelist, tablename); printf("index: %d\n", index); if(index != -1) { //name found struct city *head = (headlist)[index]; print_city(head); struct city *temp = find_city(head, keyname); //printf("temp key: %s\n", temp->name); //printf("temp colnum: %d\n", temp->numocolumns); if(temp == NULL){ //key doesn't exist //strncpy(fail, "GET$KEY$FAIL$FAIL", sizeof(fail)); //sendall(sock, fail, sizeof(fail)) cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "KEY"); //printf("key doesn't exist\n"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); } else { //key exists //printf("columnlist: %s\n", temp->columnlist); //printf("encoded_value: %s\n", encoded_value); //printf("temp->numocolumns: %d\n", temp->numocolumns); cleanstring(encoded_value); encode_retval(temp->columnlist, encoded_value, temp->numocolumns); cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "SUCCESS"); sprintf(valuename, "%s", encoded_value); printf("serverside\n"); printf("tablename: %s\n", tablename); printf("valuename: %s\n", valuename); encode_line(commandname, tablename, valuename, retline); char temp_str[100]; char number[100]; strcpy(temp_str, " COUNTER "); sprintf(number, "%d", temp->counter); strcat(temp_str, number); strcat(retline, temp_str); sendall(sock, retline, sizeof(retline)); //sprintf(success, "GET$SUCCESS$%s$%s", temp->name, temp->population); //sendall(sock, success, sizeof(success)); } } else { //table doesn't exist cleanstring(tablename); cleanstring(valuename); sprintf(tablename, "FAIL"); sprintf(valuename, "TABLE"); encode_line(commandname, tablename, valuename, retline); sendall(sock, retline, sizeof(retline)); //strncpy(fail, "GET$TABLE$FAIL$FAIL", sizeof(fail)); //sendall(sock, fail, sizeof(fail)); } } else if(strcmp(commandname, "QUERY") == 0) {//query //what to do? //first allocate a keylist //then do searching //when done, encode the keylist and send back to client puts("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$HANDLEQUERY$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); struct queryarg *testque = (struct queryarg *)malloc(sizeof(struct queryarg)); int numque = 0; int questatus = 0; char server_keylist[1000][1024]; for(i = 0; i < 1000; i++){ cleanstring(server_keylist[i]); } strncpy(server_keylist[0], "testcopy", sizeof(server_keylist[0])); index = find_index(params->tablelist, tablename); //printf("index is %d\n", index); if(index != -1){ //found matching name in tablelist struct city *node = (headlist)[index]; numque = query_argument(testque, valuename); //printf("numque = %d\n", numque); testque->max_keys++; questatus = query_write(server_keylist, testque, node, &testque->max_keys, &numque); if(questatus == -1) { //printf("query incorrect\n"); } else if(questatus == 0) { //printf("query correct\n"); i = 1; if(server_keylist[i][0] == '\0') { printf("no matching keys detected.\n"); } while(server_keylist[i][0] != '\0'){ printf("keylist[%d]: %s\n", i, server_keylist[i]); i++; } if(i > testque->max_keys){ i = testque->max_keys; } encode_queryret(i, server_keylist, retline); //printf("query retline: %s\n", retline); sendall(sock, retline, sizeof(retline)); } free(testque); testque = NULL; } else{ //table doesn't exist printf("table doesn't exist\n"); cleanstring(retline); sprintf(retline, "&QUERY&$FAIL$^TABLE^"); sendall(sock, retline, sizeof(retline)); } puts("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%HANDLEQUERY_END%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"); } sendall(sock, "\n", 1); return 0; }