Как написать пустой указатель типов в файлы Вапи?


Я пытаюсь написать файл VAPI для использования unixODBC, одна из функций называется SQLAllocHandle:

// 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)
  ...
}
В частности, я хотел бы знать, как преобразовать Тип SQLHANDLE, который на самом деле является просто void * (непрозрачный указатель void). Другими словами, как будет выглядеть Тип UnixOdbc.Handle в файле Вапи?

Мой нынешний подход заключается в том, чтобы сделать вид, что это длинный:

[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);
}
1 2

1 ответ:

Вы можете попробовать прочитать руководство для устаревших файлов VAPI. Я бы сделал:

[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; это не делает ничего полезного.