乙個簡單的支援MySQL和SQLite3的DB介面

2021-09-21 03:42:08 字數 3955 閱讀 8693

c++源**:

#ifndef mooon_sys_******_db_h

#define mooon_sys_******_db_h

#include "sys/db_exception.h"

#include string

>

#include vector>

sys_namespace_begin

typedef std:

:vectorstd:

:string

> dbrow;

// 用來儲存一行所有欄位的值

typedef std:

:vectordbrow> dbtable;

// 用來儲存所有行/*

** 訪問db的介面,是乙個抽象介面,當前只支援mysql

** 使用示例:

dbconnection* db_connection = dbconnection:

:create_connection(

"mysql");

trycatch (cdbexception& db_error)

dbconnection:

:destroy_connection(db_connection);*

/class dbconnection/*

*** 設定需要連線的db的ip和服務埠號

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void set_host(

const std:

:string

& db_ip, uint16_t db_port)

= 0;/*

*** 設定連線的資料庫名

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void set_db_name(

const std:

:string

& db_name)

= 0;/*

*** 設定用來連線db的使用者名稱和密碼

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void set_user(

const std:

:string

& db_user,

const std:

:string

& db_password)

= 0;/*

*** 設定訪問db的字符集

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void set_charset(

const std:

:string

& charset)

= 0;/*

*** 設定為連線斷開後自動重連線,如果不主動設定,預設不自動重連線

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void enable_auto_reconnect(

)= 0;/*

*** 設定用來連線的超時秒數,如果不主動設定,則使用預設的10秒

* 注意,只有在open(

)或reopen(

)之前呼叫才生效*/

virtual void set_timeout_seconds(

int timeout_seconds)

= 0;/*

*** 設定空值,欄位在db表中的值為null時,返回的內容

* 如果不主動設定,則預設空值時被設定為"$null$"。*/

virtual void set_null_value(

const std:

:string

& null_value)

= 0;/*

*** 建立乙個db連線

* 出錯丟擲異常cdbexception*/

virtual void open(

) throw (cdbexception)

= 0;/*

** 關閉乙個db連線

* 使用open(

)建立的連線,在使用完後,要使用close(

)關閉它*/

virtual void close(

) throw (

)= 0;/*

*** 重新建立db連線

* reopen(

)會先呼叫close(

)關閉連線,然後才重新建立連線,

* 因此呼叫reopen(

)之前,可不呼叫close(

),當然即使呼叫了close(

)也不會有問題*/

virtual void reopen(

) throw (cdbexception)

= 0;/*

*** 資料庫查詢類操作,包括:select, show, describe, explain和check table等,

* 如果某字段在db表中為null,則返回結果為"$null$",如果內容剛好為"$null$",則無法區分

* 出錯丟擲cdbexception異常*/

virtual void query(dbtable& db_table,

const char* format,..

.) throw (cdbexception) __attribute__(

(format(printf, 3, 4)))

= 0;/*

** 查詢,期望只返回一行記錄,

* 如果某字段在db表中為null,則返回結果為空字串,因此不能區分欄位無值還是值為空字串

* 如果查詢失敗,丟擲cdbexception異常,異常的錯誤碼為-1,

* 如果查詢實際返回超過一行記錄,丟擲cdbexception異常,異常的錯誤碼為db_error_too_many_rows*/

virtual void query(dbrow& db_row,

const char* format,..

.) throw (cdbexception) __attribute__(

(format(printf, 3, 4)))

= 0;/*

** 查詢,期望只返回單行單列,

* 如果某字段在db表中為null,則返回結果為空字串,因此不能區分欄位無值還是值為空字串

* 如果查詢失敗,丟擲cdbexception異常,異常的錯誤碼為-1,

* 如果查詢實際返回超過一行記錄,丟擲cdbexception異常,異常的錯誤碼為db_error_too_many_rows,

* 如果查詢實際返回只有一行,但超過一列,則丟擲cdbexception異常,異常的錯誤碼為db_error_too_many_cols*/

virtual std:

:string query(

const char* format,..

.) throw (cdbexception) __attribute__(

(format(printf, 2, 3)))

= 0;/*

*** 資料庫insert和update更新操作

* 成功返回受影響的記錄個數,出錯則丟擲cdbexception異常*/

virtual int update(

const char* format,..

.) throw (cdbexception) __attribute__(

(format(printf, 2, 3)))

= 0;/*

** 取得可讀的字串資訊*/

virtual std:

:string str(

) throw (

)= 0;};

sys_namespace_end

#endif /

/ mooon_sys_******_db_h

乙個支援上傳的簡單http server

現在,很多人都知道,python裡有個 httpserver,可以拿來方便地共享檔案。比如,你要傳送某個檔案給區域網裡的同學,你只要cd到所在路徑,然後執行這麼一行 python m httpserver人家就可以訪問 http 你的ip 8000 來訪問你要共享的檔案了。像我早已把這個命令做了al...

EPICS之乙個簡單的裝置支援程式

最近看epics的開發手冊,因為手冊中是分模組介紹的,所以看了一段時間還是寫不出程式來,昨天去讓師兄給我以具體的裝置支援的例子講述了下 因為我們室主要用到的還是裝置支援 下面是構建裝置支援程式的步驟,類似於乙個hello world程式,給同樣在入門道路上的朋友乙個參考。1.像ai bi等這些型別的...

利用php和mysql實現乙個簡單的登入註冊功能

登入介面,login.php doctype html en utf 8 title head 註冊介面,registration.php doctype html en utf 8 title head 提交表單,方便插入資料 註冊之後的要把資料傳入到資料庫,insert.php include ...