首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

C 語言輕量 MySQL 封裝庫 dmysql:結構體設計、三大介面與編譯測試

     編輯:MySQL 資料庫相關知識

專案簡介

dmysql 是一個極簡 C 語言 MySQL 客戶端封裝,僅三個公開函數,適合嵌入式、CGI、高效能服務端直接呼叫。

核心資料結構

/* 連線資訊 */
typedef struct _dmysql_info {
    char *host;   // 伺服器位址
    char *user;   // 用戶名
    char *pswd;   // 密碼
    char *dbbs;   // 資料庫名
} dmysql_info;

/* 單一欄位值 */
typedef struct _dmysql_record {
    char *s_str;
} dmysql_record;

/* 單列(多欄位) */
typedef struct _dmysql_row {
    dmysql_record *s_record;
} dmysql_row;

/* 結果集 */
typedef struct _d_mysql_res {
    int row;      // 列數
    int field;    // 欄位數
    dmysql_row *s_row; // 列陣列
} dmysql_res;

錯誤代碼定義

#define DMYSQL_QUERY_OKAY      0
#define DMYSQL_SELECT_OKAY     0
#define DMYSQL_CONNECT_ERROR  -1
#define DMYSQL_INIT_ERROR     -2
#define DMYSQL_QUERY_ERROR    -3
#define DMYSQL_RES_ERROR      -4

三大公開 API

函數用途參數回傳
dmysql_query執行非查詢 SQL(INSERT/UPDATE/DELETE/DDL)const char *sql, const dmysql_info info0 成功,負值錯誤碼
dmysql_select執行查詢並回傳結果集dmysql_res **out, const char *sql, const dmysql_info info0 成功,負值錯誤碼
dmysql_free釋放結果集記憶體dmysql_res *res無

編譯與安裝

# 解壓後
make
make install   # 複製 libdmysql.so/.a 至 /usr/local/lib,頭文件至 /usr/local/include

# 專案編譯連結
gcc -Wall -O3 -o myapp main.c -ldmysql `mysql_config --libs --cflags`

範例程式:授權與查詢

#include 
#include 

int main(void) {
    dmysql_info db = {
        .host = "127.0.0.1",
        .user = "root",
        .pswd = "",
        .dbbs = "mysql"
    };

    const char *grant_sql = "GRANT ALL ON *.* TO 'dorainm'@'127.0.0.1' IDENTIFIED BY '******';";
    const char *select_sql = "SELECT `user`,`host`,`password` FROM `user`;";

    dmysql_res *res = NULL;
    int i, j;

    // 執行 GRANT
    if (dmysql_query(grant_sql, db) != DMYSQL_QUERY_OKAY) {
        fprintf(stderr, "GRANT failed\n");
        return 1;
    }

    // 查詢
    int rc = dmysql_select(&res, select_sql, db);
    printf("select out: %d\n", rc);

    if (rc == DMYSQL_SELECT_OKAY && res) {
        for (i = 0; i < res->row; i++) {
            for (j = 0; j < res->field; j++) {
                printf("%s\t", ((res->s_row + i)->s_record + j)->s_str);
            }
            printf("\n");
        }
        dmysql_free(res);
    }
    return 0;
}

測試輸出

select out: 5
root	localhost	%^$#!@%*&!
root	desktop.dorainm.org	%^$#!@%*&!
	desktop.dorainm.org	%^$#!@%*&!
	localhost	%^$#!@%*&!
dorainm	127.0.0.1	%^$#!@%*&!

設計考量與擴充建議

  • 記憶體管理:結果集由庫內部 malloc,呼叫端務必呼叫 dmysql_free。
  • 錯誤資訊:目前僅回傳代碼,建議擴充 dmysql_error() 回傳詳細訊息。
  • 預處理支援:可新增 dmysql_prepare、dmysql_bind_param、dmysql_execute 介面。
  • 連線池/重連:長連場景需自行管理連線生命週期。
  • 執行緒安全:現設計非執行緒安全,多執行緒需每執行緒獨立 dmysql_info 或加鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved