2013-09-26 2 views
2

나는 인 unixODBC 기능 중 하나를 사용하는 VAPI 파일을 작성하기 위해 노력하고있어이 SQLAllocHandle라고 :vapi 파일에 무효 포인터 typedef를 쓰는 방법은 무엇입니까?

// From <sqltypes.h> 
#define SQL_API 
typedef signed short int SQLSMALLINT; 
typedef SQLSMALLINT  SQLRETURN; 
typedef void *   SQLHANDLE; 

// From <sql.h> 
#define SQL_SUCCESS    0 
#define SQL_SUCCESS_WITH_INFO  1 
#define SQL_ERROR     (-1) 
#define SQL_INVALID_HANDLE  (-2) 

#define SQL_HANDLE_ENV    1 
#define SQL_HANDLE_DBC    2 
#define SQL_HANDLE_STMT   3 
#define SQL_HANDLE_DESC   4 

#define SQL_NULL_HANDLE   0 

SQLRETURN SQL_API SQLAllocHandle(SQLSMALLINT HandleType, SQLHANDLE InputHandle, SQLHANDLE *OutputHandle); 

그것은 VAPI 파일을 작성하는 내 첫 번째 시도,하지만 문서는 순간에 부족 (Vala vapi files documentation).

호출 코드는 다음에 비슷한 같아야합니다

using UnixOdbc; 

int main(string[] args) { 
    Handle h; 
    if (AllocHandle (HandleType.ENV, NullHandle, out h) == Return.SUCCESS) 
    ... 
} 

특히 난 정말 그냥 void * (불투명 무효 포인터)입니다 SQLHANDLE 형식을 변환하는 방법을 알고 싶습니다.

즉, UnixOdbc.Handle 유형은 vapi 파일에서 어떤 모양입니까?

내 현재의 접근 방식은 그것이 긴 척하는 것입니다

[CCode (cheader_filename = "sql.h, sqltypes.h")] 
namespace UnixOdbc { 
    [CCode (cname = "SQLRETURN", cprefix = "SQL_")] 
    public enum Return { 
     SUCCESS, 
     SUCCESS_WITH_INFO, 
     ERROR, 
     INVALID_HANDLE 
    } 
    [CCode (cname = "SQLSMALLINT", cprefix = "SQL_HANDLE_")] 
    public enum HandleType { 
     ENV, 
     DBC, 
     STMT, 
     DESC 
    } 
    [CCode (cname = "SQLHANDLE")] 
    public struct Handle: long {} 

    [CCode (cname = "SQL_NULL_HANDLE")] 
    public const Handle NULL_HANDLE; 

    [CCode (cname = "SQLAllocHandle")] 
    public static Return AllocHandle (HandleType handle_type, Handle input_handle, out Handle output_handle); 
} 
+0

코드에 인터 레스트 된 사용자를 위해 github 저장소를 만들었습니다. https://github.com/antiochus/unixodbc-vala –

답변

3

하는 당신은 guide for legacy VAPI files을 읽는 시도 할 수 있습니다. 나는 만들 것입니다 :

[CCode(cname = "void")] 
[Compact] 
public class Handle { 
    [CCode(cname = "SQLAllocHandle")] 
    public static Return alocate_handle(HandleType type, Handle? input_handle, out Handle? output_handle); 
... 
} 

단순히 바인딩을 무시하십시오 SQL_NULL_HANDLE; 유용하지 않습니다.

+0

Null 모드에서 작동합니까? 파괴는 어떻게 처리됩니까? unixODBC에서 핸들은'SQLFreeHandle'로 할당 해제되어야합니다. 컴파일러에서'unix_odbc_Handle_free'에 대한 불만이 있습니다. –

+0

클래스의'CCode' 속성에'free_function = "SQLFreeHandle"을 추가해야합니다. 예. 변수의 null이 아닌 값은 순전히 Vala 구조입니다. 적절한'? '수식어를 넣으면 예상대로 동작합니다. – apmasell

+0

그럴 것이지만,'SQLFreeHandle'은 추가 핸들 타입 매개 변수를 기대합니다. 그 문제를 해결할 수는 있지만, 작업하기가 훨씬 쉽기 때문에 '긴'접근 방식을 유지할 것입니다. –