[SimSQL] DDL과 DML구분, SQLProcessor, struct Data

Posted by Sa-gom Blog on May 18, 2018

SimSQL의 중간 개발단계

SQLProcessor

조금씩 가닥이 잡혀가고 있다. 사용자로 부터는 Schema정보와 sql을 받아온다. 구문처리기는 SQLProcessor.Process(sql,schema)로 sql을 처리한다. 가장처음 commit 혹은 read를 구분한다. 이 2개가 아니라면 DDL과 DML을 구분하여 각각의 sql처리를 다르게 한다. DML의 경우는 공백을 기준으로 각각 split해서 처리해도 되지만 create의 경우에는 여러 복잡한 기호와 처리부분이 포함되어있어 다르게 split해 각각에 접근해야한다. 이 부분은 개발을 진행하며 보완해야한다.

void Process(string s, Table& table,Schema& schema) {//매개변수 table는 삭제예정
	string command;
	if (s == "COMMIT") {
		table.Commit();
	}
	else if (s == "READ") {
		table.Read();
	}
	else {
		command = s.substr(0, s.find(" "));
		cout << "log:" << command << endl;
		if (command == "CREATE") {//DDL (create,drop)
			schema.Create_tbl();
		}
		else {//DML (select,insert,update,delete)
			QueType<string> commandQ(StringSplit(s, " "));//공백을 기준으로 구문 분리

			commandQ.Dequeue(command);

			if (command == "INSERT") {//INSERT시에

				commandQ.Dequeue(command);
				QueType<string> subQ(StringSplit(command, ","));//넘길 값들 subQ큐에 넣기

				table.Insert(subQ);
			}
			else if (command == "SELECT") {//SELECT시에
				table.Select(commandQ);
			}
			else if (command == "COMMIT") {//COMMIT시에
				table.Commit();
			}
			else if (command == "READ") {
				table.Read();
			}
		}
	}
}

다음으론 각 테이블의 어트리뷰트로 여러개의 타입을 받을 방법을 모색하고 있었는데 답을 찾았다.

struct Data

struct Data {
	enum { is_int, is_float, is_bool, is_char, is_string } type;
	union {
		int ival;
		float fval;
		bool bval;
		char cval;
		string sval;
	} val;
};

구조체로 각각의 타입을 union으로 묶어 enum으로 플래그를 주고 해당변수에 값을 넣어주는 방법이다. 실제로 구현하진 않았다. 필드길이 동적할당부터 데이터저장방법까지 수정해야할 부분이 많기때문에 시간을 많이 할애 할 예정이다.

앞으로 해야할 일

  • 테이블의 어트리뷰트길이 동적할당
  • SQL처리로 DML,DDL 가름하고 각각 구문처리
  • struct Data 실제로 적용하여 테이블 생성
  • 테이블의 데이터저장 구조 트리로변경
  • schema에 테이블 저장구조 확립
  • schemacommit, read 메서드 만들고 테이블 각각의 정보들 저장
  • sql 수정 (table 이름 받아오도록)