sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息
一、功能
時間time、類型type、主體subject、客體object、結果result、備注remark
time ???????????????type ??????subject ?????object ??result ???????remark?
-------------------------------------------------------------------------------------------
2019-05-28 10:49:13 系統日志 ????系統 ???????硬件 ????成功 ?????完成硬件自檢
2019-05-28 11:18:18 localhost :內容: '系統日志','系統','硬件','成功','系統完成硬件自檢'
二、準備工作:
1、創建數據庫test.db;
# cd /home/workspace/
# touch test.db
# chmod 777 test.db
# sqlite3 test.db
2、創建表testlog,保存日志的文件;
sqlite>CREATE TABLE testlog(time text,type text,subject text,object text,result text,remark text);
三、為表內添加信息----C實現【增加】:
1、代碼實現
#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數據庫,建立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數據庫iOpenVal = sqlite3_open(fwdb, &db);if(iOpenVal != SQLITE_OK){return FAILED;}//拼接日志信息,并加入數據庫sprintf(acSql, "insert into %s values('%s','系統日志','系統','硬件','成功','系統完成硬件自檢')", TEST_LOG_NAME, acTime);iOpenVal = sqlite3_exec(db, acSql, NULL, NULL, NULL);if(iOpenVal != SQLITE_OK){printf("出錯:執行插入數據出錯!\n");return FAILED;}sqlite3_close(db);//找出所有日志文件sprintf(acSql, "sudo sqlite3 %s \"select * from %s\"", fwdb, TEST_LOG_NAME);//把每行的豎線變為空格strcat(acSql, "| sed -r 's/\\|/ /g'");//重新拼接strcat(acSql, "| awk '{print $1,$2,\"localhost :內容:\",\"'\\''\"$3\"'\\''\"\",\"\"'\\''\"$4\"'\\''\"\",\"\"'\\''\"$5\"'\\''\"\",\"\"'\\''\"$6\"'\\''\"\",\"\"'\\''\"$7\"'\\''\"}'");//重定向strcat(acSql, "> /home/workspace/test.log");system(acSql);return SUCCESS; }2、代碼編譯執行
# gcc test.c -lsqlite3 -o test#./test3、查看數據庫[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','系統日志','系統','硬件','成功','系統完成硬件自檢');4、查看日志文件[/home/workspace/test.log]
# cat /home/workspace/test.log2019-05-28 11:18:18 localhost :內容: '系統日志','系統','硬件','成功','系統完成硬件自檢'四、【增加】代碼解釋說明
《1》Linux —— 時間問題(localtime和gmtime)
《2》sqlite的語句-數據操作語言
? ? ?1、INSERT(插入)
insert into testlog?values('時間','系統日志','系統','硬件','成功','系統完成硬件自檢')
? ? ? 2、SELECT(查詢)
2、1 ?System命令,在控制臺直接執行sqlite的查詢select語句:
sprintf(acSql, "sudo sqlite3?test.db \"select * from %s\"", fwdb,?/home/workspace/test.gb);
2、2? 直接在命令行執行sqlite的查詢語句:
# sudo sqlite3 /home/workspace/test.db "select * from testlog"
《3》Sed命令使得所有的’|’變為’?’空格
3、1 控制臺執行:
sed??-r ?'s/\|/ /g'???注意:豎線前不加轉義字符或者不加-r,都不能匹配中文;
3、2 代碼內寫為:
strcat(acSql, "| sed -r 's/\\|/ /g'");??注意:再加一個轉義字符,用來轉義反斜杠;
《4》使用awk命令重新排布信息
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'
2019-05-28 15:31:15 系統日志 系統 硬件 成功 系統完成硬件自檢
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2,$3,$1}'
15:31:15 系統日志 2019-05-28
《5》使用awk命令在輸出語句中有單引號’’,有逗號
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g'
2019-05-28 15:42:48 系統日志 系統 硬件 成功 系統完成硬件自檢
[root@localhost sqlite]# sqlite3 ./test.db "select * from testlog" | sed -r 's/\|/ /g' | awk '{print $2","$3"'\''",$1}'
15:31:15,系統日志' 2019-05-28
五、刪除表內內容,并刪除日志文件---C實現【刪除】:
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};//清空數據庫 popen()函數執行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("執行sql語句失敗!\n");return FAILED;}pclose(pf);//刪除日志文件 remove()函數remove(TEST_LOG_PATH);return SUCCESS; }2、編譯執行
# gcc sql_lite_delete.c -lsqlite3 -o sql_lite_delete3、運行結果
3、1 查看數據庫
3、2 查看文件
總結
以上是生活随笔為你收集整理的sqlite库——C实现,给sqlite数据库添加信息并把信息写入文件,删除日志和库中的日志信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux —— 时间(hwlock设置
- 下一篇: 函数 —— fork()将运行着的程序分