2008-09-15 7 views
3

통화 대기열에서 상담원의 현재 상태를 수집하는 소프트웨어에 대한 일부 코드를 리팩토링하려고합니다. 현재 각 6 개의 이벤트에 대해 에이전트가 존재하는 경우 Mnesia 테이블을 체크인하고 이벤트에 따라 행의 일부 값을 변경하거나 에이전트가없는 경우 새로운 것으로 추가합니다. 현재 나는 각 이벤트에서이 Mnesia 트랜잭션을 가지고 있으며 물론 에이전트의 존재를 확인하는 반복 된 코드 등이 있습니다.Mnesia에 대한 레코드 병합

change_agent/2과 같은 함수가 있으므로이를 처리하는 이벤트에서 호출하도록 변경하려고합니다.

내 문제는 물론 기록입니다 ... 나는 동적으로 생성하거나 2 개를 병합하는 방법이 없습니다. 가급적이면 다음과 같이 호출 할 수있는 함수가 있어야합니다.

change_agent("001", #agent(id = "001", name = "Steve")). 
change_agent("001", #agent(id = "001", paused = 0, talking_to = "None")). 

답변

2

나는 완전히 동적 아니라, 매크로 아 파크 쉽게 여러 기록을 위해 사용할 수있는 두 개의 레코드를 병합 얼마 전에 몇 가지 코드를 작성

그것은 다음과 같이 작동이 :. 병합/2 기능은 소요 두 개의 레코드를 만들고 빈 레코드와 함께 목록으로 변환합니다 (레코드 유형은 컴파일시 정의되며 반드시 있어야합니다. "동적이지 않은 부분"입니다.) 다음은 일반 함수 merge/4를 통해 실행됩니다 목록이있는 경우 A에서 요소를, 그렇지 않으면 정의 된 경우 B에서 요소를 가져 오거나 항상 정의 된 기본값에서 마지막 요소를 가져옵니다.

다음은 코드입니다 (StackOverflow의 불량한 얼랑 구문 강조 표시) :

원하는대로 자유롭게 사용하십시오.

3

레코드에 대한 일반 액세스 함수를 작성하는 것은 어렵습니다. 이 문제를 해결하는 방법 중 하나는 'exprecs' 라이브러리이며 은 저수준 레코드 액세스 기능을위한 코드를 생성합니다.

당신이해야 할 것은 에 모듈에 다음 줄을 추가하는 것입니다 : 액세스 기능의 이름 지정 규칙 이상하게 보일 수 있습니다

-compile({parse_transform, exprecs}). 
-export_records([...]). % name the records that you want to 'export' 

을하지만, 리처드 오키프의 제안에 의해 영감을했다 . 최소한 일관되고 기존 기능과 충돌하지는 않습니다. (:.

+0

훑어보기가 정확하지 않을 수도 있습니다. 그럼에도 불구하고 나는 재미있을 것이다. –