Erlang List 변수 처리-로직 변경
지난번에 만들었던 리스트 변수는 Chat-Server에서 Accepted Socket을 관리하기 위한 용도였다.
이번에는 Web-server에서 해당 Session에서 HTTP Header 정보를 저장하기 위한 용도로 사용하려고 하였다.
Web-server에는 Request Session이 다수 발생하게 된다.
그래서 각 Sesion별 HTTP Header 정보를 저장할 변수가 Session 별로 필요하게 된다.
그런데 RPC형 리스트 변수는 하나만 생성된다.
Chat-Server 에서는 서버 하나당 하나의 변수만 있으면 되었기에 문제가 안되었지만, Web-server 처럼 다수의 변수가 필요한 경우에는 문제가 된다.
그럼 결국엔 하나의 변수에서 Session 별 HTTP Header 정보를 모두 저장하고 있다가, Session이 종료되면 종료된 Session 정보를 삭제해야 한다.
그래서 RPC변수에 각 Session의 생성 P-ID를 키로 해서 저장하고, 이 프로세스가 종료될때 P-ID에 해당하는 정보를 삭제하도록 RPC변수에 로직을 변경했다.
전체적인 흐름은 아래와 같다.
client 에서의 Request 요청시 Web-server는 RPC변수에 key-word (여기서는 Process ID이다.) 로 데이터 추가 요청을 한다.
session종료될 시에는 RPC변수에 key-word에 해당하는 데이터 삭제 요청을 하게 된다.
RPC리스트형 변수에 리스트를 데이터로 저장하고, 삭제도 리스트 단위로 복수개를 해야 한다.
저장된 데이터는 다음과 같다.
["<PID 0.35>", "METHOD", {"GET", "/index.html", "id=123&date=20120312"}],
["<PID 0.35>", "ACCEPT", {"mozila 5.0"}],
["<PID 0.43>", "METHOD", {"GET", "/admin/admin.html", "id=222"}],
["<PID 0.43>", "ACCEPT", {"mozila 5.5"}],
................................
[KEY-WORD, DATA, {DATA}] 이런 형식으로 저장된다.
저장은 사실 별 문제가 안된다.
삭제에는 로직이 필요하다.
일단 검색을 해야 되고, key-word에 해당하는 리스트를 찾았을 경우 삭제 루틴을 타야 한다.
다음은 전체 소스이다.
지난번 리스트와 기본적인 형태는 비슷하므로 중복되는 부분의 설명은 생략한다.
시작시에 시작되는 빈 리스트는 [key-word, data] 형태로 생성한다.
이 역시 시작 후 바로 삭제하도록 한다.
리스트에서 데이터를 삭제하기 위해 delList 함수가 있었으나 이 함수 앞에 새로운 함수를 추가하였다.
ldel 함수는 3개의 parameter를 받는다.
첫번째 파라미터는 온전한 List 값이다
두번째 파라미터는 리스트의 마지막을 찾아서 Search 및 삭제를 끝내기 위해 Tail을 받는 남은 리스트 값이다.
세번째 파라미터는 삭제하기 위한 Key-word 값이다.
if문의 조건은 리스트의 끝을 판단할 남은 리스트 파라미터로 부터 남은 값이 몇개인지 카운트 하는 length 이다.
0 이면 온전한 리스트인 OL을 리턴하고 끝낸다.
0이 아니라면 PID로 Search 및 삭제할 루틴으로 간다.
리스트의 남은 부분인 (함수 호출 맨 처음 루프에서는 온전한 리스트가 넘어올 것이다) L을 Header와 Tail로 분리한다.
Header는 다시 PID를 비교하기 위해
H를 [AID, _, _] 로 대입한다. key-word 이외의 값은 필요없으므로 그냥 버린다.
만약 PID가 맞다면 이 리스트 자체를 삭제한다.
기존에 있던 삭제 함수인 delList 함수를 통해 이 리스트는 삭제하고
다음 삭제할 값을 찾기 위해 ldel 함수를 호출한다.
이때 삭제된 리스트를 오리지널 함수로, 또 남은 리스트 파라미터에도 삭제된 리스트를 넘긴다.
이어서 찾는 값이 아닌 경우
오리지널 리스트는 그대로 넘기고 이번에 검색한 데이터는 검색에서 빠지도록 Tail을 남은 리스트로 넘긴다.
아래는 실행 결과이다.
1> 에서 리스트 변수가 시작되었다.
이 리스트에는 ["0","0",{"0"}] 값이 들어가 있다.
3> 에서 이 리스트를 삭제했다.
4> ~ 7> 까지 위에서 설명한 데이터 4개를 두개의 PID (key-word)로 입력했다.
8> 에서 PID 0.35를 삭제하도록 했다.
삭제 후 데이터는 PID 0.43의 두개의 데이터만 남았다.