//Εκτελει την εντολη delete from where του DML t_rc SSQLM::runDelete(string tableName, queue<std::string> comp) { t_rc rc; string path = "data/"; path.append(sysm->getCurdbName()); path.append("/"); path.append(tableName); queue<REM_RecordID> ridQ; //Βαλε στο ridQ ολα τα records που ικανοποιουν τις συνθηκες comp rc = executeWhere(tableName, comp, ridQ); if(rc!=OK) return rc; STORM_StorageManager *sm = new STORM_StorageManager(); REM_RecordFileManager rm = REM_RecordFileManager(sm); REM_RecordFileHandle rfh; rc = rm.OpenRecordFile(path.c_str(),rfh); if(rc != OK) return rc; int destinationSize = ridQ.size(); //Για καθε rid της ουρας που ικανοποιει τις συνθηκες for(int i=0;i<destinationSize;i++) { //Διαγραψε το rc = rfh.DeleteRecord(ridQ.front()); if(rc!=OK) return rc; ridQ.pop(); } rm.CloseRecordFile(rfh); return OK; }
int executeIfBuildInSameShellCommand(Cmd c){ //printf("checking for %s\n",c->args[0]); if (strcmp(c->args[0], LOGOUT) == 0) { exit(0); } if (strcmp(c->args[0], SETENV) == 0) { return executeSetEnv(c); } if (strcmp(c->args[0], UNSETENV) == 0) { return executeUnsetEnv(c); } if (strcmp(c->args[0], ECHO) == 0) { return executeEcho(c); } if (strcmp(c->args[0], WHERE) == 0) { return executeWhere(c); } if(strcmp(c->args[0],CD) == 0){ return cd(c); } if (strcmp(c->args[0], PWD) == 0) { return pwd(); } if (strcmp(c->args[0], NICE) == 0) { return executeNice(c); } return -1; }
// Common function to call all command handlers void builtInCmdExecutor(Cmd c) { if(!strcmp(c->args[0],"cd")) { executeCD(c); } else if(!strcmp(c->args[0],"echo")) { executeEcho(c); } else if(!strcmp(c->args[0],"logout")) { executeLogout(c); } else if(!strcmp(c->args[0],"nice")) { executeNice(c); } else if(!strcmp(c->args[0],"pwd")) { executePwd(c); } else if(!strcmp(c->args[0],"setenv")) { executeSetenv(c); } else if(!strcmp(c->args[0],"unsetenv")) { executeUnsetenv(c); } else if(!strcmp(c->args[0],"where")) { executeWhere(c); } }
//Εκτελει την εντολη update tableName where του DML t_rc SSQLM::runUpdate(string tableName, string attrName, string VALUE, queue<std::string> comp) { t_rc rc; struct relAttr RAttr; //παρε τη στηλη που δωθηκε στα ορισματα getAttr((char*)tableName.c_str(), (char*)attrName.c_str(), RAttr); queue<REM_RecordID> ridQ; //Ενημερωσε την ουρα με τα rids που ικανοποιουν τις συνθηκες rc = executeWhere(tableName, comp, ridQ); if(rc!=OK) return rc; int sizeToRun = ridQ.size(); REM_RecordHandle rh; relMet relm; SSQLM::getTable(tableName.c_str(),relm); STORM_StorageManager *sm = new STORM_StorageManager(); REM_RecordFileManager rm(sm); REM_RecordFileHandle rfh; string path="data/"; path.append(sysm->getCurdbName()); path.append("/"); path.append(tableName); rc = rm.OpenRecordFile(path.c_str(), rfh); if(rc!=OK) return rc; //Για καθε rid στην ουρα, ικανοποιει τις συνθηκες for(int i=0; i<sizeToRun; i++) { //Παρε τα δεδομενα του, επεξεργασου τα καταλληλα και αντικαταστησε την εγγραφη με μια καινουργια rc = rfh.ReadRecord(ridQ.front(),rh); if(rc!=OK) return rc; char* data; rc = rh.GetData(data); if(rc!=OK) return rc; char* toadd = new char[relm.record_Length]; memcpy(toadd, data, relm.record_Length); if(RAttr.type == TYPE_INT) { int thechar = atoi(VALUE.c_str()); memcpy(toadd + RAttr.offset,&thechar,RAttr.attr_Length); } else if(RAttr.type == TYPE_STRING) { char* thechar = (char*) VALUE.c_str(); memcpy(toadd + RAttr.offset,thechar,RAttr.attr_Length); } REM_RecordID uselessRid; //Δε με ενδιαφερει να ξερω το rid του εισαχθεν record rc = rfh.InsertRecord(toadd, uselessRid); if(rc!=OK) return rc; rc = rfh.DeleteRecord(ridQ.front()); if(rc!=OK) return rc; ridQ.pop(); } rc = rm.CloseRecordFile(rfh); return rc; }