bool addTestSignature(FCGI_Stream &stream, jsonParser &jSON) { //string session = jSON.getObject("session", false).asString(); int task = jSON.getAsIntS("task");//jSON.getObject("task", false).asInt(); string lang = jSON.getAsString("lang"); //string signature = jSON.getObject("tests_signatures",false).asString(); string etalon = jSON.getAsString("etalon"); Json::FastWriter fastWriter; Json::Value signatureValue = jSON.getObject("signature",false); std::string signature = fastWriter.write(signatureValue); vector<string> labl; labl.push_back("task_id"); labl.push_back("lang"); labl.push_back("signature"); labl.push_back("etalon"); SqlConnectionPool sql; bool taskComp = true; if (sql.connectToTable(string("tests_signatures"), labl)) { DEBUG("no threa2"); vector<map<int, string> > records = sql.getAllRecordsFromTable( "`task_id`='"+std::to_string(task)+"'"); if ((int)records.size()==0) taskComp=true; else taskComp = false; vector <map<int, string> > rec; map<int, string> temp; temp.insert( { 0, std::to_string(task)}); temp.insert( { 1, lang}); temp.insert( { 2, str_with_spec_character(signature) }); temp.insert( { 3, etalon }); //rec.push_back(temp); //MyConnectionPool::getInstance().getAllRecordsFromTable(); bool res = sql.addRecordsInToTable(temp); //MyConnectionPool::getInstance().tt(); if(!taskComp) { stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; JsonValue res; res["status"] = "already exist"; stream << res.toStyledString(); } else //204 stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n" <<"success:"<<to_string(res)<<"signature:"<<signature; } else { return false; } return true; // string ip_usera = FCGX_GetParam( "REMOTE_ADDR", request->envp ); }
bool retreiveTests(FCGI_Stream &stream, jsonParser &jSON) { //string session = jSON.getObject("session", false).asString(); int task = jSON.getAsIntS("task");//jSON.getObject("task", false).asInt(); vector<string> labl; labl.push_back("task_id"); bool taskComp = true; SqlConnectionPool sql; if (sql.connectToTable(string("tests"), labl)) { /*l12("no threa2"); vector<map<int, string> > records = SqlConnectionPool::getInstance().getAllRecordsFromTable( "`task_id`='"+std::to_string(task)+"'"); if ((int)records.size()==0) taskComp=true; else taskComp = false; */ vector<map<int, string> > records = sql.getAllRecordsFromTable("`task_id`='"+std::to_string(task)+"'"); //MyConnectionPool::getInstance().tt(); bool recordsEmpty = records.size() == 0; if (recordsEmpty)stream << "Status: 204\r\n Content-type: text/html\r\n" << "\r\n" <<"task with this id doesn't excist"; else { stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; JsonValue res; res["json"] = records[0][1]; stream << res.toStyledString(); } } else { return false; } return true; // string ip_usera = FCGX_GetParam( "REMOTE_ADDR", request->envp ); }
bool addNewtask( FCGI_Stream &stream, jsonParser &jSON, int thread_id, string &error, bool &need_stream)//*** { cout.flush(); cout << jSON.getParsedFromString().toStyledString(); //return false; JsonValue res; stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; if ( !jSON.isJson() ) { string error = "ERROR: json format is not correct. it isn`t json"; res["status"] = error; stream << res.toStyledString(); stream.close(); return false; } if ( !jSON.isValidFields() ) { string error = jSON.getLastError(); res["status"] = error; stream << res.toStyledString(); stream.close(); return false; } string lang = jSON.getAsStringS("lang"); string table; table=ConnectorSQL::getAssignmentTable(lang); vector<string> labl; labl.push_back("ID"); labl.push_back("header"); labl.push_back("etalon"); labl.push_back("footer"); labl.push_back("json"); SqlConnectionPool sql; DEBUG("before connectToTable"); if (sql.connectToTable(table, labl)) { DEBUG("connectedToTable"); map<int, string> temp; //new code for testcases part int id = jSON.getAsIntS("task");//t("task",false)); DEBUG("task"); DEBUG(std::to_string(id)); TaskCodeGenerator generator(jSON, thread_id); /*{ string etalona = generator.getEtalon(); int pre_last_return_pos = 0; int last_return_pos = 0; while(true) { int pos = etalona.find("return", last_return_pos + 2); if (pos == -1) break; pre_last_return_pos = last_return_pos; last_return_pos = pos; } etalona.erase(pre_last_return_pos, last_return_pos ); }*/ LangCompiler compiler(thread_id); string code = sql.generateProgramCode(generator.getHeader(), string(""), generator.getFooter(), lang); compiler.compile(code, true, LangCompiler::convertFromName(lang), 1); string errors = compiler.getWarningErr(); int lang_int = jSON.getAsIntS("lang"); if (errors.size() == 0) { if (lang_int == (int) LangCompiler::Flag_JS) { errors = compiler.getResult(); if (errors.find("error") == -1) errors = ""; } } if (errors.size() ) { error = "failed code compilation: " + errors ; //res["status"] = "failed"; res["status"] = error; stream << res.toStyledString(); stream.close(); need_stream = false; return false; /* res["status"] = "failed 0000"; res["table"] = table; res["id"] = to_string(id); stream << res.toStyledString(); stream.close(); return true;*/ } string footer = generator.getFooter(); if (lang_int != LangCompiler::Flag_Java) footer.erase(0, footer.find("\n")); int valuesCount = 0; temp.insert( { valuesCount++, std::to_string(id) }); temp.insert( { valuesCount++, (generator.getHeader())}); temp.insert( { valuesCount++, (generator.getEtalon())}); DEBUG("qwe33"); temp.insert( { valuesCount++, (footer)}); temp.insert({valuesCount++, (jSON.getJson())}); DEBUG("temp.insert"); map<int,string> where; where.insert({0,temp[0]}); int status = generator.getStatus(); if (status == 0 && sql.addRecordsInToTable(temp)) { res["status"] = "success"; res["table"] = table; res["id"] = to_string(id); } else if (generator.getStatus() == 0 && sql.updateRecordsInToTable(temp, where)) { res["status"] = "updated"; res["table"] = table; res["id"] = to_string(id); } else res["status"] = "failed"; stream << res.toStyledString(); stream.close(); need_stream = false; return true; } else { res["status"] = "failed"; stream << res.toStyledString(); stream.close(); need_stream = false; return false; } }
bool addTestsToTask( FCGI_Stream &stream, jsonParser &jSON, int thread_id, string &error, bool &need_stream) { //string lang = jSON.getAsStringS("lang"); string table; table = ConnectorSQL::getAssignmentTable(" hahaha dont need"); vector<string> labl = ConnectorSQL::getAssignmentTableLabels(); /*labl.push_back("ID"); labl.push_back("header"); labl.push_back("etalon"); labl.push_back("footer"); labl.push_back("json");*/ SqlConnectionPool sql; //stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; JsonValue res; if (sql.connectToTable(table, labl)) { if (!jSON.mustExistBeInt(jSON.getParsedFromString()[FIELD_TASK_ID], "task")) { stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; res["status"] = "failed"; res["error"] = jSON.getLastError(); stream << res.toStyledString(); stream.close(); return false; } int task = jSON.getAsIntS("task"); string json_prev_task = sql.getJsonFromTable(task); jsonParser parse(json_prev_task); if (!(parse.isValidFields() && parse.isJson() )) { stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; res["status"] = "failed"; res["error"] = "Task jsonf from DB invalid"; stream << res.toStyledString(); stream.close(); return false; } Value json_db(parse.getParsedFromString()); if ( !jSON.parseAddUtest(json_db)) { stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; string last_err = jSON.getLastError(); last_err = last_err.erase(0, last_err.find("correct") + 8); res["json"] = ""; res["status"] = "failed"; res["error"] = "Unit tests don`t match structure of task: " + last_err; stream << res.toStyledString(); stream.close(); return false; } Value json_tests = jSON.getJsonValue(); Value res_value = mergeUtestsAndTask(json_tests, json_db); string res_value_str = res_value.toStyledString(); res_value_str = replaceSlashTabsParagBreakets( res_value_str ); Value val; //(res_value_str); Json::Reader reader; reader.parse( res_value_str.c_str(), val ); jsonParser merged_json; //merged_json.setParsedFromString(val); merged_json.setJson(res_value_str); //setJson(res_value_str); cout.flush(); //cout << val.toStyledString(); //cout << res_value_str; // cout << merged_json.getParsedFromString().toStyledString(); //merged_json.setParsedFromString(Json(res_value.toStyledString()); //cout << merged_json.getParsedFromString(); /* map<int, string> temp; int valuesCount = 0; temp.insert( { valuesCount++, std::to_string(task) }); temp.insert( { valuesCount++, (generator.getHeader())}); temp.insert( { valuesCount++, (generator.getEtalon())}); DEBUG("qwe33"); temp.insert( { valuesCount++, (footer)}); temp.insert({valuesCount++, (jSON.getJson())}); */ //return false; return addNewtask(stream, merged_json, thread_id, error, need_stream); //string json_utest = jSON.getJson(); //json_db[FUNCTION]{FIELD_UNIT_TESTS_NUM] = "5"; // json_db.append(jSON.getJsonValue()); //cout << json_tests.toStyledString(); } else { res["json"] = ""; res["status"] = "failed"; res["error"] = "Connection to assignment table failed"; stream << res.toStyledString(); stream.close(); return false; } }
/* * * RESULT_STATUS * */ bool result_status(FCGI_Stream &stream, jsonParser &jSON, string operation) { string session = jSON.getAsStringS("session"); string jobid = jSON.getAsStringS("jobid");// Object("jobid", false).asUInt();578565 //TO BE CONTINUED ... vector<string> labl; labl.push_back("id"); labl.push_back("session"); labl.push_back("jobid"); labl.push_back("status"); labl.push_back("date"); labl.push_back("result"); labl.push_back("warning"); SqlConnectionPool sql; if (sql.connectToTable("results", labl) == true) { string s_datime = getDateTime(); //'YYYY-MM-DD HH:MM:SS' map<int, string> temp; temp.insert( { 1, session }); temp.insert( { 2, (jobid) }); //3,skip temp.insert( { 4, s_datime }); //4 vector<map<int, string> > records = sql.getAllRecordsFromTable( "`session`='"+session+"' AND `jobid`='"+(jobid)+"'"); // logfile::addLog(std::to_string(records.size())); //for (int i=0; i< records.size(); i++) /*Cool start for future code, NO delete * logfile::addLog("Id:"+records[i][0]); logfile::addLog("Session:"+records[i][1]); logfile::addLog("jobId:"+records[i][2]); logfile::addLog("requested status for session:"+session+":"+records[i][3]); logfile::addLog("date:"+records[i][4]); logfile::addLog("result:"+records[i][5]); logfile::addLog("warning:"+records[i][6]); */ /*Cool code no delete stream << "Id:"+records[i][0] << "\n"; stream << "Session:"+records[i][1] << "\n"; stream << "jobId:"+records[i][2] << "\n"; */ //stream << "status:" + records[i].find(keys[r])->second ; /* * RESULT */ //cerr << "before write to stream"; stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; //cerr << "after write to stream"; JsonValue res; if(records.size() > 0) { res["status"] = records[0][3]; if (operation == "result" || operation == "r") { res["date"] = records[0][4]; res["warning"] = records[0][6]; //////////////////////////////////////////////////NEW//17.11.15 /* string result = records[0][5]; smatch m; regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub" while (std::regex_search (result,m,e)) { for (auto x:m) std::cout << x << " "; std::cout << std::endl; result = m.suffix().str(); } */ res["testResult"] = JsonValue(arrayValue); string part = records[0][5]; int start = part.find('@'); if(start == string::npos) { int position = records[0][5].find("exception"); if( string::npos != position) { int p = records[0][5].substr(0, position).find_last_of("\n"); res["result"] = records[0][5].substr(p + 1);//records[0][5].substr(0, p - 1); res["done"] = false;//records[0][5].substr(p); } else res["result"] = records[0][5]; } else { res["result"] = part.substr(0, start); int count = 0; bool done = true; while(start++ != string::npos)// need test after first fail? { int next = part.substr(start).find('@'); string number; if(next != string::npos) { if(next -1 >= 0 && part[start + next - 1] == '!') { number = part.substr(start, next - 1); res["testResult"][count] = JsonValue(false); done = false; } else { number = part.substr(start, next ); res["testResult"][count] = JsonValue(true); } } part = part.substr(start + next + 1); count++; start = part.find('@'); } res["done"] = JsonValue(done); } } } else res["status"] = "not found"; stream << res.toStyledString(); // stream << "status:" + records[0][3] << "\n\n"; /*Cool code no delete stream << "date:"+records[i][4] << "\n"; stream << "result:"+records[i][5] << "\n"; stream << "warning:"+records[i][6] << "\n"; */ //logfile::addLog("Table 'results' outputed"); cout.flush(); } else return false; return true; }
void processTask(int id,Job job) { // logfile::addLog("Connection"); // ConnectorSQL connector ; // int id = ((int *)a)[0]; //char * inputSTR; LangCompiler compiler(id); /* * input from PHP form // not use * * stream >> inputSTR; // test input char *code = stream.getFormParam("text"); char *name = stream.getFormParam("name"); */ /* * problem with CodeClear need fix * CodeClear clr; string outStr = code; clr.ClearText(outStr);*/ DEBUG("before code empty check"); if (!job.code.empty()) { vector<string> labl; //ADD NEW STARTED COMPILING INFO TO DATABASE DEBUG("Before connect to results"); SqlConnectionPool sql; labl.push_back("ID"); labl.push_back("header"); labl.push_back("etalon"); labl.push_back("footer"); string table; table = ConnectorSQL::getAssignmentTable(job.lang); if (sql.connectToTable(table, labl)) { job.code = sql.getCustomCodeOfProgram( to_string(job.task), job.code, id,job.lang); DEBUG(job.code); } INFO(to_string(id)+ " Start compiler"); JsonValue res; compiler.compile(job.code, true, LangCompiler::convertFromName(job.lang),0); string date = logfile::getDateStamp(); res["date"] = date; string rezulta = compiler.getResult(); res["result"] = rezulta; string warning = compiler.getWarningErr(); res["warnings"] = warning; DEBUG( res.toStyledString()); labl.clear(); //UPDATE COMPILING INFO IN DB labl.push_back("id"); labl.push_back("session"); labl.push_back("jobid"); labl.push_back("status"); labl.push_back("date"); labl.push_back("result"); labl.push_back("warning"); if (sql.connectToTable("results", labl)) { string s_datime = getDateTime(); //'YYYY-MM-DD HH:MM:SS' map<int, string> temp; temp.insert( { 1, job.session }); temp.insert( { 2, (job.jobid) }); if(compiler.getResult().size() == 0) temp.insert( { 3, "failed"}); else temp.insert( { 3, "done"}); temp.insert( { 4, s_datime }); temp.insert( { 5, compiler.getResult()}); temp.insert( { 6, compiler.getWarningErr() }); //4j //string where = "`results`.`jobid`='"+to_string(job.jobid)+"' AND `results`.`session`='"+job.session+"'"; map<int,string> where; where.insert({1,job.session}); where.insert({2,(job.jobid)}); //ConnectorSQL::getInstance().updateRecordsInToTable(temp,wher); sql.updateRecordsInToTable(temp,where); } INFO(to_string(id) + " Stop compiler"); } }
void *receiveTask(void *a) { DEBUG("void *receiveTask(void *a) "); ThreadArguments argumento = ((ThreadArguments *) a)[0]; int rc, i; int id = argumento.id; char * inputSTR; FCGX_Request *request; FCGI_Stream stream(socketId); ErrorResponder errorResponder(&stream); request = stream.getRequest(); INFO("Thread: " + argumento.id); //string lang; for (;;) { if (stream.multiIsRequest()) { /////////////!!!!!!!!!!!!!!!!!!! // break; if (strcmp(stream.getRequestMethod(), "OPTIONS") == 0) { string headers; char* accessControlRequestHeaders = FCGX_GetParam("HTTP_ACCESS_CONTROL_REQUEST_HEADERS", request->envp); if(accessControlRequestHeaders != NULL) headers += "Access-Control-Request-Headers: " + string(accessControlRequestHeaders) + "\r\n"; char* accessControlRequestMethod = FCGX_GetParam("HTTP_ACCESS_CONTROL_REQUEST_METHOD", request->envp); if(accessControlRequestMethod != NULL) headers += "Access-Control-Request-Method: " + string(accessControlRequestMethod) + "\r\n"; stream << headers << ("Access-Control-Max-Age: 86400\r\nStatus: 200\r\nContent-type: text/plain\r\n") << "\r\n"; //stream.showHeaders(); stream.close(); continue; } else if (strcmp(stream.getRequestMethod(), "GET") == 0) { //logfile::addLog(id, "Request Method don't POST !!!"); string current = stream.getSenderAdress(); if (current == "/version") { errorResponder.showString(999, VERSION_INTERPRETATOR); } else errorResponder.showError(404); //INFO("session closed"); stream.close(); continue; } if(!SqlConnectionPool::getInstance().isConnected()) { INFO("Try reconect to DB"); if(!SqlConnectionPool::getInstance().reconect()) { errorResponder.showError(505, "DataBaseERR"); stream.close(); continue; ////////////////////////////// } } DEBUG("Before jsonParser jSON(stream.getRequestBuffer());"); jsonParser jSON(stream.getRequestBuffer()); DEBUG("Before parsing successful check"); bool isValidFields = jSON.isValidFields(); bool parsingSuccessful = jSON.isJson() && isValidFields; DEBUG("Before jSON.isJson()"); if (parsingSuccessful) DEBUG("Before jSON.isValidFields()"); //parsingSuccessful = jSON.isValidFields(); //reader.parse( str, parsedFromString, false);// IsJSON DEBUG("Before parsing"); /* * ALL OK STARTif (SqlConnectionPool::getInstance().connectToTable(string("results"), labl)) */ string errora = ""; bool need_stream = true; if (parsingSuccessful) { string ip_usera = FCGX_GetParam("REMOTE_ADDR", request->envp); cout.flush(); INFO("Parsing successful"); string operation = jSON.getAsStringS("operation"); bool succsesful = true; /* * OPERATION ADDTASK */ if (operation == "addtask") { /*if(!addNewtask(stream, jSON, id, errora)) succsesful = false;*/ addNewtask(stream, jSON, id, errora, need_stream); } else if (operation == "getJson") { if(!getJson(stream, jSON, id)) succsesful = false; } else if (operation == "copyTask") { if(!copyTask(stream, jSON, id, errora, need_stream)) succsesful = false; } else if (operation == "start" || operation == "s") { if(!start(stream, jSON, FCGX_GetParam("REMOTE_ADDR", request->envp), errora, need_stream)) succsesful = false; } else if (operation == "addUtest" || operation == "u") { addTestsToTask(stream, jSON, id, errora, need_stream); } else if (operation == "addtestsig") { if(!addTestSignature(stream, jSON)) succsesful = false; } else if (operation == "addtestval") { if (!addTestValues(stream,jSON)) succsesful = false; } else if (operation == "add_tests") { if (!addTests(stream,jSON)) succsesful = false; } else if (operation == "retreive_tests") { if (!retreiveTests(stream,jSON)) succsesful = false; } else if (operation == "result" || operation == "status" || operation == "r" ) { if(!result_status(stream, jSON, operation)) succsesful = false; } else if (operation == "getToken") { if(!TokenSystem::getObject()->generationToken(stream, jSON)) succsesful = false; } else if (operation == "getFromToken") { if(!TokenSystem::getObject()->getFromToken(stream, jSON)) succsesful = false; } else { errorResponder.showError(505, "operation is invalid"); } if(!succsesful) { if (need_stream) { JsonValue res; stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; string error = jSON.getLastError() + "\n" + errora; /* errorResponder.showError(400, error); stream.close();*/ res["status"] = error; stream << res.toStyledString(); stream.close(); } continue; } } else { if (need_stream) { JsonValue res; stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; //logfile::addLog(id, "Json format is not correct!!! \n::::::::::::::::::::::::\n" + stream.getRequestBuffer() + "\n::::::::::::::::::::::::"); /*errorResponder.showError(400, jSON.getLastError()); stream.close();*/ res["status"] = jSON.getLastError(); stream << res.toStyledString(); stream.close(); } continue; } } } //close session INFO("session closed"); stream.close(); return NULL; }
bool copyTask( FCGI_Stream &stream, jsonParser &jSON, int thread_id, string &error, bool &need_stream) { cout.flush(); JsonValue res; stream << "Status: 200\r\n Content-type: text/html\r\n" << "\r\n"; if ( !jSON.isJson() ) { string error = "ERROR: json format is not correct. it isn`t json"; res["status"] = error; stream << res.toStyledString(); stream.close(); return false; } if ( !jSON.isValidFields() ) { string error = jSON.getLastError(); res["status"] = error; stream << res.toStyledString(); stream.close(); return false; } string table; table=ConnectorSQL::getAssignmentTable(""); vector<string> labl; labl.push_back("ID"); labl.push_back("header"); labl.push_back("etalon"); labl.push_back("footer"); labl.push_back("json"); SqlConnectionPool sql; if (sql.connectToTable(table, labl)) { int id = jSON.getAsIntS("task"); int new_id = jSON.getAsIntS("new_task"); if ( sql.copyRecordFromIdToNewId(id, new_id)) { res["status"] = "success"; res["table"] = table; res["id"] = to_string(id); } else { if ( sql.updateRecordFromIdToNewId(id, new_id)) { res["status"] = "updated"; res["table"] = table; res["id"] = to_string(id); } else res["status"] = "failed"; } stream << res.toStyledString(); stream.close(); need_stream = false; return true; } else { res["status"] = "failed"; stream << res.toStyledString(); stream.close(); need_stream = false; return false; } }