Oracle을 접근하는 Client를 작업하게 되면, 줄곧 pro*c를 생각해왔었다. 사실 pro*c가 아주 훌륭한 아키텍쳐인 것은 아니다. Precompiler가 가지는 구조적인 한계가 있고, Oracle 관련된 변수들이 함수를 넘어다니면서 영향을 미치는 것을 보면 익숙해지기 꽤나 힘들것 같다는 생각이 들때가 많다.
ORAPP는 C++로 만들어진 API의 일종이며, Oracle OCI API로 만들어져 있다. 2004년 3월 13일날 마지막 릴리즈가 되었으며 (버젼 2.0.3) 더 이상 갱신은 되지 않고 있다. 원본 라이브러리 소스는 Oracle 9에서 마지막 테스트가 된 것으로 알고 있고, 사실상 Oracle 10에 적용하기 위해서는 몇가지 부분을 수정해야 했었다. (Makefile 부분)
ORAPP를 사용해서 Application 작업을 하다가 마주쳤던 문제점 몇개를 간단하게 설명하고자 한다.
첫번째는 내부적으로 FIELD 길이 제한이 명시되어 있다는 것이다. 이것은 소스 내의 DESIGN 파일에 설명되어 있는데, 문서를 꼼꼼히 살펴보지 않으면 사실 찾아내기 힘들다. 문서 파일에 명시되어 있는 4가지 중요한 Constants에 대한 설명을 첨부한다.
1. ORAPP_INFO_BUFSIZ (default 1024)
Represents intermediate buffer size used when retrieving non-error information from Oracle (the version string, for instance).
2. ORAPP_ERR_BUFSIZ (default 1024)
Represents intermediate buffer size used when retrieving error information from Oracle (ORA-ERROR-type information strings).
3. ORAPP_FORMATSTR_BUFSIZ (default 1024)
Represents intermediate buffer size used when doing format-string expansions wherever relevant. Could potentially limit total size of string you're trying to insert in the common case where a ``%s'' format is expanded to something longer than ~1024 bytes.
4. ORAPP_MAX_FIELD_WIDTH (default 100)
Represents the maximum field width the API will allow. This is to say that if you retrieve a field whose width is defined as something greater than this constant (e.g. 200 bytes in the Oracle Schema definition), the API will limit the size of anything retrieved and truncate to the maximum field size.
Note that this is merely a limit; the API will only allocate MIN(fieldsize, max_limit) to receive actual field data, which will rarely be the maximum.
(첨부하자면, 실제 Field 길이가 ORAPP_MAX_FIELD_WIDTH 상수보다 길면 더 늘린다고는 하지만, 실제로 그렇게 적용되고 있는 것은 아니다. 적어도 경험상으론.)
위의 상수들은 constants.hh 파일에 정의되어 있다.
두번째는 앞서도 설명했듯이 Oracle 10에서 Build가 되지 않는 문제이다. 현재 해당 작업내용을 찾을 수가 없어서 자세한 첨부는 할 수 없지만, Oracle 8, 9를 기준으로 ORAPP가 참고하는 Oracle 라이브러리는 아래의 두개이다.