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
에 테이블 저장구조 확립schema
에commit
,read
메서드 만들고 테이블 각각의 정보들 저장- sql 수정 (table 이름 받아오도록)