sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
一、功能
時間time、類型type、主體subject、客體object、結(jié)果result、備注remark
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#./test3、查看數(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)
《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_delete3、運行結(jié)果
3、1 查看數(shù)據(jù)庫
3、2 查看文件
總結(jié)
以上是生活随笔為你收集整理的sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux —— 时间(hwlock设置
- 下一篇: 函数 —— fork()将运行着的程序分