int CSample::LoadPattern(const char* strFile) { FILE* fp = fopen(strFile, "r"); char line[32768]; char tmp[32768]; if (fp == NULL) { fprintf(stderr, "can't open file %s for loading samples\n", strFile); exit(1); } //fprintf(stderr, "Loading samples from file ... \n"); while(!feof(fp)) { line[0] = 0; fgets(line, 32768, fp); if (strlen(line) < 2) { continue; } CPattern* pPattern = new CPattern(); chompstr(line); memcpy(tmp, line, 32768); char tmpbuffer[512]; char* pbuffer = tmp; int iColumn = count_column(line, ','); pbuffer = getnextstring(pbuffer, tmpbuffer, ','); pPattern->m_original = FindSoS(tmpbuffer); for (int k = 0; k < iColumn - 1; k ++) { pbuffer = getnextstring(pbuffer, tmpbuffer, ','); CSetOfSeq* pSS = FindSoS(tmpbuffer); // fprintf(stderr, " %s, %d, %d ", tmpbuffer,pSS->m_iShapeID, pSS->m_iClassID); pPattern->m_vShapeClass[pSS->m_iClassID].push_back(pSS); } m_vPatterns.push_back(pPattern); } fclose(fp); fprintf(stderr, " done! %d patterns loaded\n", (int)m_vPatterns.size()); m_vActive.clear(); for (int i = 0; i < (int) m_vPatterns.size(); i ++) { m_vActive.push_back(1); } return (int) m_vPatterns.size(); }
/*** 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; }