Как написать пустой указатель типов в файлы Вапи?
Я пытаюсь написать файл 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 ответ:
Вы можете попробовать прочитать руководство для устаревших файлов 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
; это не делает ничего полезного.