[SimSQL] Insert와 Main

Posted by Sa-gom Blog on May 8, 2018

SimSQL의 초기 개발단계

프로젝트 목적

자료구조 수업을 진행하며 나의 실력을 향상, 공부에 목적이 있다. 수업시간에 배운 내용을 바탕으로 간단한 데이터베이스 관리프로그램을 구현하려한다.

프로젝트 진행상황

Main 과 Table를 구현하였다. 현재는 데이터를 추가하고 조회하는 기능만 있으며 구문처리를 구상하는데 많은시간을 들였지만 결과적으론 별거없는 코드를 작성했다..

void SQLProcessor(string s, Table& table){

	QueType<string> commandQ(StringSplit(s, " "));//공백을 기준으로 구문 분리
	string command;
	commandQ.Dequeue(command);
	if (command == "INSERT"){//INSERT시에
		commandQ.Dequeue(command);
		QueType<string> subQ(StringSplit(command, ","));//넘길 값들 subQ큐에 넣기
		table.Insert(subQ);
	}
	else if (command == "SELECT"){//SELECT시에
		commandQ.Dequeue(command);
		if (command == "*"){// 별이라면 모든 tupl 출력
			table.Select();
		}
		else{

		}
	}
}

입력으로 들어오는 SQL을 공백기준으로 split해서 QueueType에 넣어준다. 그리고 큐에서 차례차례 pop하며 구문을 처리한다.

void Table::Select() const{
	Tupl* location = listData;
	for (int i = 0; i < fieldLen; i++){//필드명 출력
		cout << fieldName[i] << ' ';
	}
	cout << endl;

	for (int i = 0; i < length; i++){//테이블의 크기만큼
		for (int i = 0; i < fieldLen; i++){ //튜플 출력
			cout << location->infos[i] << ' ';
		}
		cout << endl;
		location = location->next;
	}
}
void Table::Insert(QueType<string>& sql){
	string value;
	int cnt = 0;
	Tupl* location = new Tupl;
	while (!sql.IsEmpty()){//날아온 순서대로 value값을 tupl에 넣는다.
		sql.Dequeue(value);
		location->infos[cnt] = value;// tupl에 차례로 value 저장
		cnt++;
	}
	location->next = listData;
	listData = location;
	length++;
	cout << "SUCCESS!" << endl;

}

조회와 삽입함수이다. 데이터저장은 단일리스트로 했으며 우선순위 큐 혹은 이진탐색트리로 개선해야할 부분이다.

앞으로 해야할 일

사실 어떻게 해야할지 감도 안잡혔다. SQL구문은 어떻게 처리 할것이며(실제로 DB들은 구문처리기를 따로 구현해 사용한다고 한다..) 필드는 어떻게 동적으로 생성할것이고.., 테이블 생성 SQL은 어떻게 처리할 것인가..

  1. 일단 DML과 DDL을 구분할 수있도록 해야한다. 그리고 SQLProcessor를 결국엔 클래스로 구현해더 다양한 기능들을 처리할 수 있도록 해야할 것이다.
  2. 데이터 제거, 이진파일 write() DB의 기본 파일입출력이 가능해야한다.

여담

DB구현하는 방법을 구글링하면 DB를 코드로 구현하기보단 툴을 사용해 모델링하는 방법밖에 안나와 참고할만한 자료가 없다는게 가장 큰 어려움으로 남는다. 앞으로 얼마만큼의 완성도를 이룰 수 있을지는 미지수이지만 자주자주 코딩함으로써 빨리 기능구현을 완료해야한다.