2010-05-06 4 views
2

C의 libpq 라이브러리를 사용하여 PostgreSQL 데이터베이스에 액세스하고 있습니다. 그래서, 내가 res = PQexec (conn, "SELECT point FROM test_point3d"); PGresult를 사용자 정의 데이터 유형으로 변환하는 방법을 모르겠습니다.PGresult를 libpq (PostgreSQL)로 사용자 정의 데이터 형식으로 변환하는 방법

내가 PQgetValue 함수를 사용할 수 있지만 다시 사용자 지정 데이터 형식으로 반환하는 문자열을 변환하는 방법을 모르겠다.

+0

사용자 지정 데이터 형식이란 무엇입니까? –

+0

다음과 같음 : typedef struct Point3D { \t char id [50]; \t int idnull; \t double x; \t double y; \t double z; \t } \t Point3D; 나는 PQgetValue의 반환 문자열을 구문 분석해야한다고 생각합니다. 나는 이것에 일하고있다. 그래서 그것이 작동하면 나는 그것을 여기에 게시 할 것이다. : D – mocopera

+0

거의 모든 것이 문자열로 반환됩니다. Postgres의 [arrays] (http://www.postgresql.org/docs/current/static/arrays.html#ARRAYS-IO)는 문자열로 반환되는 유용한 예제이며 응용 프로그램에서 유용하게 사용하려면 구문 분석해야합니다 . "test_point3d.point"의 내용과 Postgres에 의해 /로 변환되는 것으로 표현되는 방식에 따라 문자열을 구문 분석하고 데이터 유형으로 변환해야합니다. –

답변

4

가장 좋은 방법은 데이터 형식이 텍스트 인터페이스를 통해 응용 프로그램과 상호 작용한다는 것입니다. Libpq는 무엇이든에서 문자열을 반환합니다. 프로그래머는 문자열을 파싱하고 그 문자열을 데이터 형식으로 만들 책임이 있습니다. 나는 저자가 아마도 질문을 포기했음을 안다. 그러나 나는 비슷한 무엇인가를 연구 중이다. 그리고 몇몇 경우에 도움이되는 몇 가지 중요한 트릭을 문서화하는 것이 가치가있다.

분명히 이것이 C 언어 유형이고, 내부 및 외부 표현이있는 경우, 평소대로 문자열을 구문 분석해야합니다.

(35,65,1111111,f,f,2011-10-06,"2011-10-07 13:11:24.324195",186,chris,f,,,,f) 

이 쉽게 분석 할 수 있습니다 :

그러나 배열과 튜플에 대한 표기는 예를 들어 튜플이 표시 될 수있다 기본적으로

[open_type_identifier][csv_string][close_type_identifier] 

입니다. 첫 번째 및 마지막 문자를 벗어나면 일반적으로 기존 csv 프로세서를 사용할 수 있습니다. 또한, 고려 :

select row('test', 'testing, inc', array['test', 'testing, inc']); 
         row      
------------------------------------------------- 
(test,"testing, inc","{test,""testing, inc""}") 
(1 row) 

을이 보듯이, 사실, 그 다음 세 번째 속성이 배열 인 것을 결정하고, 할 수 있도록, 중첩 된 속성 안에 탈출 표준 CSV를 (따옴표를 undoubled 한), 구문 분석 배열로. 이러한 방식으로 중첩 된 데이터 구조는 JSON과 같은 형식으로 예상되는 것과 비슷한 방식으로 처리 할 수 ​​있습니다. 트릭은 중첩 된 CSV라는 것입니다.

+0

'('및')'가 사용자 정의 데이터에 사용됩니다 유형도 있지만 기본 유형에는 해당하지 않습니다. – user3791372