Copyright (C) 2021Toranoana Inc. All Rights Reserved.
作ったもの
11
const envMysqlPath = Deno.env.get("DENO_LIB_MYSQL_CLIENT_PATH");
if (envMysqlPath !== undefined) {
lib = Deno.dlopen(envMysqlPath, symbols);
} else {
try {
lib = Deno.dlopen(`libmysqlclient.${ffiSuffix()}`, symbols);
} catch (e) {
const error = new Error(
"libmysqlclient is not found.",
);
error.cause = e;
throw error;
}
}
FFI読み込み箇所
ほぼSQLiteのサンプルと同様
前回との違い
⇨Cのラッパーではなくlibmysqlclientを直接deno側から呼
び出すようになった
(↓前回のもの)
const libName = `./ext/mysql/mysql.${ffiSuffix()}`;
this.#dylib = Deno.dlopen(libName, libInterfaces);
12.
Copyright (C) 2021Toranoana Inc. All Rights Reserved.
作ったもの
12
export type mysql = Deno.UnsafePointer;
export type ffi_string = string | null;
export function mysql_init(client: mysql | null): mysql {
return lib.symbols.mysql_init(client) as mysql;
}
mysql構造体を直にやり取りできるように(client変数)
実態は*MYSQLなのでpointerとすれば構造体ポインタな
らやり取りできる
libmysqlclientのインターフェースと全く同じものをdeno側
にも定義できる
this.#dylib.symbols.init(); 前回までは構造体のポインタはNG
なので、C言語内のグローバル変数としてラップしていた
13.
Copyright (C) 2021Toranoana Inc. All Rights Reserved.
作ったもの
13
export function mysql_real_connect(
client: mysql,
host: ffi_string,
user: ffi_string,
passwd: ffi_string,
db: ffi_string,
port: number,
unix_socket: ffi_string,
client_flag: number,
): mysql {
const mysql_host = strToBytesWithTerminated(host);
const mysql_user = strToBytesWithTerminated(user);
const mysql_passwd = strToBytesWithTerminated(passwd);
const mysql_db = strToBytesWithTerminated(db);
const mysql_unix_socket = strToBytesWithTerminated(unix_socket);
return lib.symbols.mysql_real_connect(
client,
mysql_host,
mysql_user,
mysql_passwd,
mysql_db,
port,
mysql_unix_socket,
client_flag,
) as mysql;
}
export function mysql_close(client: mysql): void {
return lib.symbols.mysql_close(client) as void;
}
引数の文字列もpointer型に
14.
Copyright (C) 2021Toranoana Inc. All Rights Reserved.
まとめ
● deno1.17でFFIのインターフェースとしてpointerが入りました
● pointer型を使うことでライブラリを直接denoで扱えるケースが増えた
○ 実質何でもできると思います
● サンプルとして前回まで作っていたlibmysqlclientを置き換えて見ました
● クエリの発行までできると思うのでやってみたいと思います
14