Vala 是為 GNOME 生態設計的現代語言,編譯為 C 並鏈接 GLib/GObject,語法接近 C#,適合撰寫高效能原生應用。本文展示使用 libmysqlclient Vala 綁定連線 MySQL、執行查詢與結果處理的完整範例。
sudo apt install valacsudo apt install libmysqlclient-devvapi/mysql.vapi(通常隨 libmysqlclient-dev 提供或自行編寫)using MySql;
int main (string[] args) {
int rc = 0;
ClientFlag cflag = 0;
string host = "127.0.0.1";
string user = "root";
string password = "";
string database = "test";
int port = 3306;
string socket = null;
Database mysql = new MySql.Database();
var isConnected = mysql.real_connect(host, user, password, database, port, socket, cflag);
if (!isConnected) {
rc = 1;
stdout.printf("ERROR %u: Connection failed: %s\n", mysql.errno(), mysql.error());
return rc;
}
stdout.printf("Connected to MySQL Server version: %s (%lu)\n",
mysql.get_server_info(), (ulong) mysql.get_server_version());
string sql = "SELECT * FROM test LIMIT 10";
rc = mysql.query(sql);
if (rc != 0) {
stdout.printf("ERROR %u: Query failed: %s\n", mysql.errno(), mysql.error());
return rc;
}
Result resultSet = mysql.use_result();
string[] row;
while ((row = resultSet.fetch_row()) != null) {
stdout.printf("id: %s | data: %s | ts: %s\n", row[0], row[1], row[2]);
}
// free_result & mysql_close 由 GLib 物件自動管理(RAII)
return rc;
}
valac --pkg mysql --pkg glib-2.0 mysql_demo.vala -o mysql_demo
./mysql_demo
--pkg mysql:鏈接 mysql.vapi 並連結 libmysqlclient。--pkg glib-2.0:引入 GLib 核心庫(字串、物件系統、主循環)。| Vala/GLib 方法 | 對應 C API | 說明 |
|---|---|---|
Database() | mysql_init() | 建立連線物件 |
real_connect() | mysql_real_connect() | 建立 TCP/Unix Socket 連線 |
query() | mysql_query() | 執行 SQL 語句 |
use_result() | mysql_use_result() | 取得結果集(流式,逐行讀取) |
store_result() | mysql_store_result() | 取得結果集(緩衝,一次性載入記憶體) |
fetch_row() | mysql_fetch_row() | 取得下一行(字串陣列) |
errno() / error() | mysql_errno() / mysql_error() | 錯誤碼/訊息 |
get_server_info() | mysql_get_server_info() | 伺服器版本字串 |
get_server_version() | mysql_get_server_version() | 版本號整數 |
Vala 綁定若支援 mysql_stmt_prepare 系列,建議使用預處理語句:
var stmt = mysql.prepare("SELECT * FROM users WHERE email = ?");
stmt.bind_param("s", email);
stmt.execute();
var res = stmt.get_result();
整合 GLib 主循環:
var source = mysql.get_socket_source(); // 取得 GSource
source.set_callback(() => {
// 處理非同步事件
});
source.attach(main_context);
MYSQL* 生命週期。Queue + 定時健康檢查)。.so 可被 Python (ctypes)、Node.js (NAPI)、Go (cgo) 直接呼叫。Vala + MySQL 是構建高效能、原生整合 GNOME 生態資料庫應用的優雅選擇。隨著 libmysqlclient 綁定完善,更多進階特性(預處理、非同步、SSL)將原生可用。