Beispiel #1
0
//Εκτελει την εντολη 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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
// 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);	 
	}
}
Beispiel #4
0
//Εκτελει την εντολη 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;
}