日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息

發(fā)布時間:2025/10/17 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、功能

  • 在開機啟動時候,給sqlite3數(shù)據(jù)庫內(nèi),添加 ’固定’?信息的運行日志;
  • 并把日志寫入[.log]文件內(nèi);
  • 日志信息的6個字段為:
    時間time、類型type、主體subject、客體object、結(jié)果result、備注remark
  • 數(shù)據(jù)庫顯示為:
    time ???????????????type ??????subject ?????object ??result ???????remark?
    -------------------------------------------------------------------------------------------
    2019-05-28 10:49:13 系統(tǒng)日志 ????系統(tǒng) ???????硬件 ????成功 ?????完成硬件自檢
  • 日志顯示為:
    2019-05-28 11:18:18 localhost :內(nèi)容: '系統(tǒng)日志','系統(tǒng)','硬件','成功','系統(tǒng)完成硬件自檢'
  • 二、準備工作:

    1、創(chuàng)建數(shù)據(jù)庫test.db;

    # cd /home/workspace/

    # touch test.db

    # chmod 777 test.db

    # sqlite3 test.db

    2、創(chuàng)建表testlog,保存日志的文件;

    sqlite>CREATE TABLE testlog(time text,type text,subject text,object text,result text,remark text);

    三、為表內(nèi)添加信息----C實現(xiàn)【增加】:

    1、代碼實現(xiàn)

    #include <stdio.h> #include <string.h> #include <sqlite3.h> #include <time.h> #include <unistd.h>#define SUCCESS 0 #define FAILED -1 #define SQL_COMMON_LEN 1024 #define TEST_LOG_NAME "testlog"/*使用前先建立fw.db數(shù)據(jù)庫,建立syslog表:create table syslog(time text,type text,subject text,object text,result text,remark text);編譯時候:gcc operation_log.c -lsqlite3 -o operation_log*/int main() {int iOpenVal = 0;char acSql[SQL_COMMON_LEN] = {0};char acTime[SQL_COMMON_LEN] = {0};char *fwdb="/home/workspace/test.db";sqlite3 *db = NULL;time_t stTime = {0};struct tm *stTmpPtr = NULL;//獲取本地時間stTime = time(NULL);stTmpPtr = localtime(&stTime);sprintf(acTime, "%04d-%02d-%02d %02d:%02d:%02d",stTmpPtr->tm_year+1900, stTmpPtr->tm_mon+1, stTmpPtr->tm_mday,stTmpPtr->tm_hour, stTmpPtr->tm_min, stTmpPtr->tm_sec);//連接sqlite3數(shù)據(jù)庫iOpenVal = sqlite3_open(fwdb, &db);if(iOpenVal != SQLITE_OK){return FAILED;}//拼接日志信息,并加入數(shù)據(jù)庫sprintf(acSql, "insert into %s values('%s','系統(tǒng)日志','系統(tǒng)','硬件','成功','系統(tǒng)完成硬件自檢')", TEST_LOG_NAME, acTime);iOpenVal = sqlite3_exec(db, acSql, NULL, NULL, NULL);if(iOpenVal != SQLITE_OK){printf("出錯:執(zhí)行插入數(shù)據(jù)出錯!\n");return FAILED;}sqlite3_close(db);//找出所有日志文件sprintf(acSql, "sudo sqlite3 %s \"select * from %s\"", fwdb, TEST_LOG_NAME);//把每行的豎線變?yōu)榭崭駍trcat(acSql, "| sed -r 's/\\|/ /g'");//重新拼接strcat(acSql, "| awk '{print $1,$2,\"localhost :內(nèi)容:\",\"'\\''\"$3\"'\\''\"\",\"\"'\\''\"$4\"'\\''\"\",\"\"'\\''\"$5\"'\\''\"\",\"\"'\\''\"$6\"'\\''\"\",\"\"'\\''\"$7\"'\\''\"}'");//重定向strcat(acSql, "> /home/workspace/test.log");system(acSql);return SUCCESS; }

    2、代碼編譯執(zhí)行

    # gcc test.c -lsqlite3 -o test#./test

    3、查看數(shù)據(jù)庫[testlog表]

    # sqlite3 /home/workspace/test.dbsqlite> .du testlogPRAGMA foreign_keys=OFF;BEGIN TRANSACTION;CREATE TABLE testlog(time text,type text,subject text,object text,result text,remark text);INSERT INTO "testlog" VALUES('2019-05-28 11:18:18','系統(tǒng)日志','系統(tǒng)','硬件','成功','系統(tǒng)完成硬件自檢');

    4、查看日志文件[/home/workspace/test.log]

    # cat /home/workspace/test.log2019-05-28 11:18:18 localhost :內(nèi)容: '系統(tǒng)日志','系統(tǒng)','硬件','成功','系統(tǒng)完成硬件自檢'

    四、【增加】代碼解釋說明

    《1》Linux —— 時間問題(localtime和gmtime)

  • localtime是把從1970-1-1零點零分到當前時間系統(tǒng)所偏移的秒數(shù)時間轉(zhuǎn)換為本地時間;
  • 而gmtime函數(shù)轉(zhuǎn)換后的時間沒有經(jīng)過時區(qū)變換,是UTC時間;
  • Gmtime獲取的時間比localtime獲取的時間少8個小時;
  • Localtime例子點擊上方的鏈接。。即可查看。。
  • 《2》sqlite的語句-數(shù)據(jù)操作語言

    ? ? ?1、INSERT(插入)

    insert into testlog?values('時間','系統(tǒng)日志','系統(tǒng)','硬件','成功','系統(tǒng)完成硬件自檢')

    ? ? ? 2、SELECT(查詢)

    2、1 ?System命令,在控制臺直接執(zhí)行sqlite的查詢select語句:

    sprintf(acSql, "sudo sqlite3?test.db \"select * from %s\"", fwdb,?/home/workspace/test.gb);

    2、2? 直接在命令行執(zhí)行sqlite的查詢語句:

    # sudo sqlite3 /home/workspace/test.db "select * from testlog"

    《3》Sed命令使得所有的’|’變?yōu)椤?’空格

    3、1 控制臺執(zhí)行:

    sed??-r ?'s/\|/ /g'???注意:豎線前不加轉(zhuǎn)義字符或者不加-r,都不能匹配中文;

    3、2 代碼內(nèi)寫為:

    strcat(acSql, "| sed -r 's/\\|/ /g'");??注意:再加一個轉(zhuǎn)義字符,用來轉(zhuǎn)義反斜杠;

    《4》使用awk命令重新排布信息

    [root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'

    2019-05-28 15:31:15 系統(tǒng)日志 系統(tǒng) 硬件 成功 系統(tǒng)完成硬件自檢

    [root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2,$3,$1}'

    15:31:15 系統(tǒng)日志 2019-05-28

    《5》使用awk命令在輸出語句中有單引號’’,有逗號

    [root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'

    2019-05-28 15:42:48 系統(tǒng)日志 系統(tǒng) 硬件 成功 系統(tǒng)完成硬件自檢

    [root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2","$3"'\''",$1}'

    15:31:15,系統(tǒng)日志' 2019-05-28

    五、刪除表內(nèi)內(nèi)容,并刪除日志文件---C實現(xiàn)【刪除】:

    1、插入代碼

    [root@localhost workspace]# cat sql_lite_delete.c #include <stdio.h> #include <unistd.h>#define SUCCESS 0 #define FAILED -1#define DATABASE_TEST_LOG_PATH "/home/workspace/test.db" #define DATABASE_TEST_LOG_NAME "testlog" #define TEST_LOG_PATH "/home/workspace/test.log" #define COM_LEN 1024int main(void) {FILE *pf = NULL;char acSql[COM_LEN] = {0};//清空數(shù)據(jù)庫 popen()函數(shù)執(zhí)行sql語句sprintf(acSql, "sudo sqlite3 %s \"delete from %s\"", DATABASE_TEST_LOG_PATH, DATABASE_TEST_LOG_NAME);pf = popen(acSql, "r");if(NULL == pf){printf("執(zhí)行sql語句失敗!\n");return FAILED;}pclose(pf);//刪除日志文件 remove()函數(shù)remove(TEST_LOG_PATH);return SUCCESS; }

    2、編譯執(zhí)行

    # gcc sql_lite_delete.c -lsqlite3 -o sql_lite_delete

    3、運行結(jié)果

    3、1 查看數(shù)據(jù)庫

    3、2 查看文件

    總結(jié)

    以上是生活随笔為你收集整理的sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。